• 6李沐动手学深度学习v2/线性回归的简洁实现


    import numpy as np
    import torch
    from torch.utils import data
    from d2l import torch as d2l
    
    true_w=torch.tensor([2,-3.4])
    true_b=4.2
    features,labels=d2l.synthetic_data(true_w,true_b,1000)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    # 调用torch中现有的API
    # 随机从样本中选取batch_size的数据,所有样本都会取到。知识对所有样本进行了shuffle
    def load_array(data_arrays,batch_size,is_train=True):
        # 使用features和labels即X和y构建dataset
        # *变量 *data_arrays 变量拆开
        dataset=data.TensorDataset(*data_arrays)
        # 使用dataLoader对象随机的从dataset中取1小批量的数据
        return data.DataLoader(dataset,batch_size,shuffle=is_train)
    
    batch_size=10
    data_iter=load_array((features,labels),batch_size)
    
    # 每次调用yield会暂停,使用next()和send()恢复生成器
    # next()调用生成器生成1次数据
    next(iter(data_iter))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    [tensor([[-0.2995,  0.8167],
             [-0.7327,  0.2537],
             [ 0.1009, -0.5376],
             [-1.1368, -0.8702],
             [-0.7915,  0.0309],
             [-1.3095, -0.3649],
             [ 1.3855, -2.0293],
             [ 0.9794, -1.5986],
             [-0.9072, -0.2279],
             [ 0.0075, -0.4216]]),
     tensor([[ 0.8310],
             [ 1.8819],
             [ 6.2155],
             [ 4.8751],
             [ 2.5102],
             [ 2.8166],
             [13.8560],
             [11.5803],
             [ 3.1607],
             [ 5.6510]])]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    # 使用torch定义好的层
    from torch import nn
    # linear层 全连接层 2,1 输入维度,输出维度
    # Sequential 神经网络层的容器
    net=nn.Sequential(nn.Linear(2,1))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    # 初始化模型参数
    net[0].weight.data.normal_(0,0.01)
    net[0].bias.data.fill_(0)
    
    • 1
    • 2
    • 3
    tensor([0.])
    
    • 1
    # 损失函数 MSE 均方误差
    loss=nn.MSELoss()
    
    • 1
    • 2
    # 实例化小批量梯度下降SGD
    # parameters所有参数包括w和b
    # SGD,随机梯度下降
    trainer=torch.optim.SGD(net.parameters(),lr=0.03)
    
    • 1
    • 2
    • 3
    • 4
    # 开始训练
    num_epochs=3
    for epoch in range(num_epochs):
        # 获取小批量样本
        for X,y in data_iter:
            # net中带有w和b,传入x即可
            l=loss(net(X),y)
            # 梯度请0
            trainer.zero_grad()
            # 后向传播,内部torch帮助求sum()了
            l.backward()
            # 走一步 更新1次w和b
            trainer.step()
        l=loss(net(features),labels)
        # {1:f} 把l用浮点数方式表示
        print(f'epoch {epoch+1}, loss {l:f}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    epoch 1, loss 0.000225
    epoch 2, loss 0.000103
    epoch 3, loss 0.000103
    
    • 1
    • 2
    • 3

    query
    怎么找到合适的学习率?

    • 存在对学习率不敏感的算法

    batchsize的合适大小

    • 大小波动性很大
    • 由于现在的神经网络深度很大,因此存在一定的噪声可以防止过度拟合,鲁棒性,泛化能力强

    随机梯度下降的随机是指?

    • 随即从样本中采样batch_size大小的数据

    正则

    机器学习都采用一阶导算法(梯度下降),不使用二阶导算法(牛顿法)?

    • 二阶导计算量大,损失函数一阶导是n维向量,二阶导是n*n的矩阵

    收敛判断:

    • 两个epoch之间参数w和b的变化不大
    • 也可以使用验证数据集
    • 直觉画损失曲线

    机器学习应用在NP-complete

    网络输出会出现NAN?

    • 求导中有除法,出现inf
  • 相关阅读:
    Servlet学习日志
    # Dasctf 7月赋能赛 WP
    MQTT X v1.8.3 正式发布
    sam_out 应用到时序分类
    [Kettle] 获取系统信息
    【浙政钉】第二篇:获取浙政钉单位组织结构
    【设计模式实战】状态模式:原理篇
    数字图像处理——大作业 基于车道信息的违法车辆车牌识别
    Android JNI代码语法解释
    AI推荐算法的演进之路
  • 原文地址:https://blog.csdn.net/baidu_35805755/article/details/126609915