• 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
  • 相关阅读:
    【Redis】基础数据结构-字典
    给github项目贡献代码
    【GlobalMapper精品教程】023:Excel数据通过相同字段连接到属性表中(气温降水连接到气象台站)
    wasm-在浏览器中使用python
    数据结构·分糖果
    PHP 电竞网站系统mysql数据库web结构apache计算机软件工程网页wamp
    抖音短视频账号矩阵seo分发系统--开发源代
    MinIO与MySQL对比以及存储的相关知识
    IIC/I2C总线实验
    万里路,咫尺间:汽车与芯片的智能之遇
  • 原文地址:https://blog.csdn.net/baidu_35805755/article/details/126609915