用PyTorch实现线性回归
本文的内容为用PyTorch完成线性模型,包括:
- 如何构造自己的神经网络
- 如何构造损失函数
- 如何构造随机梯度下降的优化器
使用PyTorch解决问题的四步:
- 准备数据集
- 设计模型,计算y_pred
- 构造Loss、optimizer(损失函数和优化器)
- Training cycle(前馈 -> 反馈 -> 更新)
forward:算出损失;backward:求出梯度
一、准备数据集:
需要的数据都得是Tensor(张量)
二、设计模型 构造计算图
所有模型都要继承自Model
最少实现两个成员方法
构造函数 初始化:__init__()
前馈:forward()
- 先构造计算图
- 通过
输入x 和输出y_pred 的维度,确定计算图中w 和b 的维度 - 计算出
loss ,然后进行backward
最终的Loss 是一个0维的张量,可能需要对向量Loss 取平均或求和。
Linear()方法:
torch.nn.Linear(in_features, out_features, bias = True) :
in_features:输入x的维度
out_features:输出y的维度
bias:是否有偏置b
三、构造Loss和Optimizer
四、训练迭代
- Forward()
- 梯度清零
- 反馈
- 更新优化器
代码:
import torch
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
"""
所有模型都要继承自Model
最少实现两个成员方法
构造函数 初始化:__init__()
前馈:forward()
Model自动实现backward
可以在Functions中构建自己的计算块
"""
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = self.linear(x)
return y_pred
model = LinearModel()
criterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)
for epoch in range(100):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
print('w = ', model.linear.weight.item())
print('b = ', model.linear.bias.item())
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred = ', y_test.data)
当训练100次时,通过4.0测试模型,结果输出为7.8969,比较接近8。如果你把训练次数改成1000次,就会发现输出变成了8。
小知识点:
如果要使用一个可调用对象,那么在类的声明的时候要定义一个call() 函数就OK了,就像这样
class Foobar:
def __init__(self):
pass
def __call__(self,*args,**kwargs):
pass
其中参数*args代表把前面n个参数变成n元组,**kwargsd会把参数变成一个词典,举个例子:
def func(*args,**kwargs):
print(args)
print(kwargs)
func(1,2,3,4,x=3,y=5)
说在最后的话:编写实属不易,若喜欢或者对你有帮助记得点赞 + 关注或者收藏哦~
|