线性回归的从零开始实现
本文将从零开始实现整个方法, 包括数据流水线、模型、损失函数和小批量随机梯度下降优化器。
这样做事有意义的,可以知道更深的原理,同时,了解更细致的工作原理将方便我们自定义模型、自定义层或自定义损失函数
当然我们以后都是使用深度学习里面的框架
本文将只使用简单的tensor的计算和自动求导来演示线性回归
先导入random的包,因为我们要随机梯度下降和随机化初始化我们的权重
%matplotlib inline #意思是我们在plot的时候嵌入到matnotebook里面
import random
import torch
from d2l import torch as d2l
生成数据集
为了简单起见,我们将根据带有噪声的线性模型构造一个人造数据集。
我们的任务是使用这个有限样本的数据集来恢复这个模型的参数。
我们将使用低维数据,这样可以很容易地将其可视化。
在下面的代码中,生成一个包含1000个样本的数据集, 每个样本包含从标准正态分布中采样的2个特征。
我们的合成数据集是一个矩阵𝐗∈ℝ1000×2
可以将ϵ视为模型预测和标签时的潜在观测误差。
在这里我们认为标准假设成立,即ϵ服从均值为0的正态分布。
为了简化问题,我们将标准差设为0.01。 下面的代码生成合成数据集。
w, b, num_examples的意思是在给定w和b和我们要生成的n个样本
y += torch.normal(0, 0.01, y.shape)的目的是为了让这个问题难一点,我们加入了随机噪音,均值为0,标准差是0.01,y.shape意思是形状跟y的长度是一样
def synthetic_data(w, b, num_examples): #@save
"""生成y=Xw+b+噪声"""
X = torch.normal(0, 1, (num_examples, len(w)))#首先生成x,是均值为0,标准差为1的随机数,num_examples就是n个样本,列数就是w的长度
y = torch.matmul(X, w) + b#y就是x乘以w了,再加上偏差b
y += torch.normal(0, 0.01, y.shape)
return X, y.reshape((-1, 1))#最后我们把x和y做成一个列向量返回
然后定义我们真实的w和真实的b
features, labels = synthetic_data(true_w, true_b, 1000)的意思是:可以通过synthetic_data函数来生成我们的特征和标签了
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
这样我们就有了我们的训练样本
注意,features中的每一行都包含一个二维数据样本, labels中的每一行都包含一维标签值(一个标量)。
print('features:', features[0],'\nlabel:', labe