跟着李老师敲了一遍代码,结合评论和弹幕的各位dl,对代码进行了初学者水平的注释,跑出来的最简单的线性回归模型。当然这个就是面对和我一样刚入门的小白,对于python也可以说是零基础,非常非常非常通俗了。
如有错误欢迎指正。print就是最有用的代码(bushi
基础优化算法最常见:梯度下降 梯度下降的cost很大,故步长不能太短,步长是超参数hyperparameter,自己设置
最常见:小批量梯度下降mini-batch 随机取b个样本来近似损失,因为损失是所有样本的平均值 b 是batch size,是超参数
代码开始,先import
%matplotlib inline
import random
# import os;os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" # jupyter运行d2l内核挂掉解决方法
import torch
from d2l import torch as d2l
构造人造数据集,带有噪声的线性模型 w = [2,-3.4]T b=4.2和噪声c
这里我print了很多数据,有助于理解维度
首先对dataset有一个理解。
这里的def 了synthetic_data函数,他的返回值X存到了features里,y存到了labels里。
X是1000*2的二维张量,这里1000指1000个样本,2指每个样本的特征数量,这个矩阵的每个值,都表示X中某个样本的某个特征值。
y是1000*1的一维列向量,表示每个样本的真实回归值。
这里的回归模型就是特征值乘以权重加上偏置,最后再加一个噪声是为了让数据更加复杂。
def synthetic_data(w, b, num_examples): # 生成 y = Xw + b + 噪声 y就是label,X 是特征组成的矩阵
X = torch.normal(0,1,(num_examples,len(w)))
# X是随机数,均值为0,方差为1,列是w长度,行是num_sample长度
print('X',X.shape) # X是1000行2列的二维张量,指1000个样本,两个特征
# print(X)
print('w',w.shape)
y = torch.matmul(X,w)+b # Xw
print('y',y.shape)
y += torch.normal(0, 0.01, y.shape) # 加噪音,均值为0,方差为1
#print('label:', y)
return X, y.reshape((-1,1))
# reshape(-1,1) 指把所有元素排成一个单列元素,-1代表y里的所有元素,等于reshape((n,1))
true_w = torch.tensor([2,-3.4]) # w是权重,是两个特征分别的权重
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000) # 生成特征和标签 1000个样本
features和labels的每一个数据都可以被访问,这里print他们的值,[]中表示行数
print('features:',features[999,1],'\nlabel:',labels[999])
这里plot一下散点图,可以看出两个特征值关于回归值的正负相关
d2l.set_figsize()
d2l.plt.scatter(features[:, 1].detach().numpy(), # 特征的第一列 detach分离出数值,不再含有梯度
labels.detach().numpy(), 1); # 最后一个1绘制点直径大小
d2l.plt.scatter(features[:, 0].detach().numpy(), # 特征的第一列 detach分离出数值,不再含有梯度
labels.detach().numpy(), 1); # 最后一个1绘制点直径大小
定义data_iter函数,批量大小,特征矩阵(特征值组成的矩阵),标签向量 作为输入。
生成大小为batch_size的批量,这里如果不懂,就全print出来,print出来立马明白