问题与解答
1.已经手动实现了线性回归,为什么要用pytorch来实现线性回归?
pytorch提供许多方法,用起来比较方便。使用pytorch之后我们可以把重点放在神经网络的构建上,而不是python的基础语法上。
pytorch实现线性回归的步骤
1.准备数据集
2.设计模型
理解:究竟要采用什么样的模型来求解线性问题
3.构造loss损失函数和optimizer优化器
4.训练模型
前馈计算loss损失,反馈计算梯度gradient,最后更新权重w
5.预测
最初的目的就是为了预测,希望输入一个x后可以预测输出y的值是多少。所以我们将已知的数据作为训练集、自己设计模型、训练数据,得到一个y和x的关系。最终输入一个x,输出y完成预测。
1.准备数据集
import torch
# 自定义数据集
x_data = torch.tensor([[1.0], [2.0], [3.0]])
y_data = torch.tensor([[2.0], [4.0], [6.0]])
2.设计模型
设计模型的含义:就是要建立哪种模型来实现问题的求解。
一般从最简单的线性模型入手,y=wx或者y=wx+b。
class LinearModel(torch.nn.Module):
def __init__(self):
# __init__是构造函数
# super函数继承父类的__init__()方法
super(LinearModel, self).__init__()
# torch.nn.Linear(m, n)表示输入的x是m维的,输出的y是n维的
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
# forward定义前馈需要进行哪些计算
y_pred = self.linear(x) # liear()是对y_pred做计算 y_pred=wx+b
return y_pred
model = LinearModel() # 实例化类,创建一个线性模型。
【注】torch.nn.Linear(in_features, out_features, bias=True)
文档中标注:Applies a linear transformation to the incoming data:y=Ax+b 。
传参in_features表示输入x的维度,传参out_features表示输出y的维度。
3.定义损失函数和优化器
criterion = torch.nn.MSELoss(size_average=False) # 定义损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 定义优化器,lr指的学习率=0.01
4.训练
for epoch in range(10):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss.item())
optimizer.zero_grad() # 梯度清零
loss.backward() # 自动反向传播
optimizer.step() # 更新权重
# 最后打印经过训练之后得到的w和b的值
print("w=", model.linear.weight.item())
print("b=", model.linear.bias.item())
5.预测
我们之所以要构建模型,进行训练,最终的目的是为了预测。所以输入任意x的值,调用model类,预测y的值并输出。
x_test = torch.tensor([[4.0]])
y_test = model(x_test)
print('y_pred=', y_test.data.item())