上一节《[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))
这个就没啥好说的了。
Comments NOTHING