1、 Prepare data set 准备数据集
2、Design model using Class 设计模型
3、 Construct loss and optimizer —using PyTorch API 用 using PyTorch的应用接口API,构造损失函数loss和优化器optimizer
4、Training cycle----forward, backward, update 训练过程
代码
import torch
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
Design Model 主要任务就是构造计算图来设计模型
通过X,Y的维度可知W和b的维度
注意:loss最终必须是一个标量,如下图,一开始loss是一个3x1的一个矩阵,但最终要对loss求和必须是一个标量。最后看loss的需求看是否需要求均值。只有loss的标量才可以用调用backward的。
代码片
class LinearModel(torch.nn.Module): #模型 class LinearModel(自己起的类的名字)类都要继承nn.Module的类,因为nn.Module中的好多方法我们训练模型时可以用到。
def __init__(self): # __init__(self)这个函数为构造函数,初始化的作用
super(LinearModel, self).__init__() #LinearModel我定义的名称,后面跟一个self,后面的__init__()是继承父类nn.Module的__init__()的构造资源
self.linear = torch.nn.Linear(1, 1)#torch.nn.Linear在构造对象包括两个Tensor类型的成员two member Tensors: weight and bias,torch.nn.Linear也是继承nn.Module的,所以linear也可以进行反向传播。(1, 1)代表的意思是第一个参数1代表输入的维度是1、第二个参数1代表输出的维度为1
def forward(self, x): #forward(self, x)这个函数是进行前馈计算的作用
y_pred = self.linear(x)
return y_pred
model = LinearModel()
#会发现咱们这里面没有写后弦传播的函数,这是因为用nn.Module构造的计算图,会自动的计算出反馈传播的过程
代码解释
首先要定义成一个类class,实际上我们到后面无论是构造多层的感知机还是RNN等其他神经网络模型,我们在构造模型的时候使用的都是的一种类的模板。所以必须掌握这种类class的编写方式,以后咱们可以扩展模型。
self.linear = torch.nn.Linear(1, 1)的任务就是构造下图中的Linear Unit
torch.nn.Linear的说明
实例化model = LinearModel()后,调用model(x)即可,就将x传入forward()函数中
代码
criterion = torch.nn.MSELoss(size_average=False)
代码
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
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)
optimizer.zero_grad() #梯度归0
loss.backward() #反向传播Backward: Autograd
optimizer.step()#更新Update
代码
# 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)
import torch
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
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(1000):
y_pred = model(x_data) l
oss = 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)
如图: