问题与解答
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())