[Pytorch]机器学习入门项目笔记:利用优化器和自动微分构建神经网络实现线性回归(4)

发布于 2022-09-02  364 次阅读


上一节《[Pytorch]机器学习入门项目笔记:手动实现线性回归(3)》写过手动实现线性回归,其实是半自动啦,因为使用了自动微分,但是却没有自动优化,也没有神经网络。只有单个的w和b,这样的网络容易出现过拟合或者无法拟合的问题,这一节写一下利用NN(神经网络)来实现线性回归。

首先引入需要的库文件

import torch
from torch import nn
from torch import optim
from matplotlib import pyplot as plt  # 用于画图

定义数据

# 1. 定义数据
x = torch.rand([50, 1])
y = x * 3.2 + 2.1

这一步是创建出两个tensor,x是一个50 x 1的列向量,每个元素取值范围是[0, 1],y就是根据表达式得出的一个50 x 1的列向量。

定义模型

# 2 .定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)

这里定义了一个简单的线性层,只有一个神经元,一个输入一个输出。

也就是传入一个参数x,输出w * x + b。

定义self.linear时无需设置参数requires_grad,默认为True。

将各个工具实例化

# 3. 实例化模型,loss,和优化器
model = Net()

# 损失函数
criterion = nn.MSELoss()

# 优化器
optimizer = optim.SGD(model.parameters(), lr=1e-3)

解释其中的一些参数:

MSELoss()是一个均方损失函数\(loss(x,y)=(x−y)^2\)。

optim.SGD表示使用梯度下降的优化器,model.parameters()获取被跟踪的变量,加入到优化器中,会在后续的训练中优化,lr是学习率。

训练模型

# 4. 训练模型
for i in range(50000):
    out = model(x)  # 4.1 获取预测值
    # out 和 y都是一个50 x 1的tensor张量
    loss = criterion(y, out)  # 4.2 计算损失
    optimizer.zero_grad()  # 4.3 梯度归零
    loss.backward()  # 4.4 计算梯度
    optimizer.step()  # 4.5 更新梯度
    if (i + 1) % 20 == 0:  # 每20次训练输出一次
        print('Epoch[{}/{}], loss: {:.6f}'.format(i, 50000, loss.data))

每次通过传入x到model里,得到一个预测的tensor,也就是out,再将out放入criterion得到损失,将梯度归零后反向传播得到所有变量的梯度,再通过optimizer.step()进行梯度更新。

评估模型并绘图

# 5. 模型评估、画图
predict = model(x)
plt.scatter(x.data.numpy(), y.data.numpy(), c="r")
plt.plot(x.data.numpy(), predict.data.numpy())
plt.show()


# 输出w和b
for name, parameters in model.named_parameters():
    print(name, float(parameters))

这个就没啥好说的了。