线性回归的从零开始实现

torch的一些基本函数

参考torch的官方文档
torch.normal(means, std, out=None)
返回一个满足正态分布的张量,means是正态函数的平均数,std是正态函数的标准差,out是可选的输出张量

torch.matmul()

矩阵积

  • 梯度下降通过不断沿着反梯度方向更新算法

  • 两个重要的超参数分别是批量大小和学习率

线性回归的步骤(简洁形式)

  1. 生成数据集

    1
    2
    3
    4
    5
    6
    7
    8
    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)
  2. 读取数据集

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def load_array(data_arrays, batch_size, is_train=True): #@save
    """构建一个PyTorch数据迭代器"""
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

    batch_size = 10
    data_iter = load_array((features, labels), batch_size)

    next(iter(data_iter))
  3. 定义模型

    1
    2
    3
    # nn是神经网络的缩写
    from torch import nn
    net = nn.Sequential(nn.Linear(2, 1))
  4. 初始化模型参数

    1
    2
    net[0].weight.data.normal_(0, 0.01)
    net[0].bias.data.fill_(0)
  5. 定义损失函数

    1
    2
    3
    4
    5
    6
       loss = nn.MSELoss()

    6. 定义优化算法

    ```python
    trainer = torch.optim.SGD(net.parameters(), lr=0.03)
  6. 训练

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    num_epochs = 3
    for epoch in range(num_epochs):
    for X, y in data_iter:
    l = loss(net(X), y)
    trainer.zero_grad()
    l.backward()
    trainer.step()
    l = loss(net(features), labels)
    print(f'epoch{epoch + 1}, loss {l:f}')

    w = net[0].weight.data
    print('w的估计误差:', true_w - w.reshape(true_w.shape))
    b = net[0].bias.data
    print('b的估计误差:', true_b - b)

反思

  • 看视频的时候很多地方都有点反应不过来,”为什么这个地方是这样子“这个用的是什么功能“。这个时候可能就需要辅助参考一些文档才能之间理解,但实际上的原理大概已经了解了。

  • 而自己上手实践的时候,才发现自己很多地方都会犯一些自己都意识不多的低级错误,比如一直报错,甚至要通过逐行检测,才会发现是自己的拼写错误,或者是符号用了中文的,又或者是括号之类的错了

    在动手实践之后,自己动手能力的孱弱,要多多敲代码,更加深入了解报错的原因,以及了解更多库函数的意义,加油!