使用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 # mini-batch需要的数据是Tensor x_data = torch.Tensor([[1.0], [2.0], [3.0]]) y_data = torch.Tensor([[2.0], [4.0], [6.0]]) # Design Model 重点目标在于构造计算图 """ 所有模型都要继承自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) # 构造了一个包含 w和 b的对象 def forward(self, x): y_pred = self.linear(x) # linear成为了可调用的对象 直接计算forward return y_pred model = LinearModel() # 创建类的实例 # 3.Construct Loss(MSE (y_pred - y)**2 ) and Optimizer # 构造计算图就需要集成Model模块 criterion = torch.nn.MSELoss(size_average=False) #需要的参数是y_pred和y optimizer = torch.optim.SGD(model.parameters(), lr = 0.01) # 4.Training Cycle for epoch in range(100): y_pred = model(x_data) # Forward loss = criterion(y_pred, y_data) print(epoch, loss.item()) optimizer.zero_grad() # 梯度清零 loss.backward() # 反馈 optimizer.step() # 更新 #Output weight and bias print('w = ', model.linear.weight.item()) print('b = ', model.linear.bias.item()) #Test Model x_test = torch.Tensor([[4.0]]) y_test = model(x_test) print('y_pred = ', y_test.data)
结果:
-
小知识点:
-
如果要使用一个可调用对象,那么在类的声明的时候要定义一个
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)