pytorch的简单线性回归

koukoucheng / 2023-08-10 / 原文

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()更新关联的netw, b模型,所以第一个mini batch走完以后print的 l 中用的net是已更新过的参数

所以每跑完一组mini batch要运行trainer.zero_grad()将记录的当前梯度清零从而区记录当前参数 w,b的梯度

总体跑三次