pytorch的简单线性回归
2023-08-09
本节课视频:https://www.bilibili.com/video/BV1PX4y1g7KC?p=4&spm_id_from=pageDriver&vd_source=bd35cfd68e5bfc28dcf5a57f74e25ae3
首先是创建数据迭代器
def load_array(data_arrays, batch_size, is_train = True): 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))
其中data.TensorDataset是将data_arrays中的数据拼接(训练样本的f与l,要不要对齐未验证,ps:猜测必须对齐行数)形成一个新的矩阵
data.DataLoader是将拼接的数据样本打乱并抽取batch_size个为一组,dataset为对象,其中shuffle的定义为是否随机抽取,在函数定义的时候赋予了默认值,所以return时输入is_train(训练样本)
其次创建layer
from torch import nn net = nn.Sequential(nn.Linear(2, 1)) net[0].weight.data.normal_(0, 0.01) net[0].bias.data.fill_(0) print (net[0].weight, net[0].bias)
nn为线性回归,Sequential为layer的容器,此处调用第一层为net[0]
创建损失函数和随机梯度下降函数
loss = nn.MSELoss()
trainer = torch.optim.SGD(net.parameters(), lr = 0.03)
MSEloss为nn内置函数
SGD为梯度下降,其中必填项的参数选择如何定位层级和层中的每一级?未知
lr为学习超参
最后整体运行
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}')
epoch设定跑轮次
X,y从数据迭代器中取数值,并将X放入net中进行计算(net自带权重),并与真实y计算loss值
trainer.step()更新关联的net中w, b模型,所以第一个mini batch走完以后print的 l 中用的net是已更新过的参数
所以每跑完一组mini batch要运行trainer.zero_grad()将记录的当前梯度清零从而区记录当前参数 w,b的梯度
总体跑三次