训练过程
在这里会使用 mini-batch风格!!!
其中_init_函数必须实现,第一句调用父类方法
第二句,用自带的Linear(1,1)构造w = 1,b = 1的函数
forward方法必须实现
在其中实现__call__方法相当于重载了 (),在pythorch的__call__方法中定义了forward。所以我们继承父类,需要将froward方法实例化
这里面的model可以直接被调用
代码如下
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):
###继承torch.nn.Module
def __init__(self):
super(LinearModel,self).__init__()
self.linear = torch.nn.Linear(1,1)
###对象初始化的时候,就是w = 1 ,b = 1的线性模型
###获取w/b的方式分别是~linear.weight/linear.bias
def forward(self,x):
#Module实现了魔法函数__call__(),call()里面有一条语句是要调用forward()。因此新写的类中需要重写forward()覆盖掉父类中的forward()
#call函数的另一个作用是可以直接在对象后面加(),例如实例化的model对象,和实例化的linear对象。相当于重载了()
#本算法的forward体现是通过以下语句实现的:
#y_pred = model(x_data)
y_pred = self.linear(x)
return y_pred
###定义模型
model = LinearModel()
# 构造 loss and optimizer
criterion = torch.nn.MSELoss(size_average = False)
#criterion = torch.nn.MSEloss(reduction = 'sum')
###
optimizer = torch.optim.SGD(model.parameters(),lr = 0.01)
for epoch in range(1000):
y_pred = model(x_data)
#相当于调用了forward(),计算出了y_pred = w*x + b
loss = criterion(y_pred,y_data)
#计算loss,如果size_average = True,则会计算平均值
print(epoch,loss.item())
#由于这个loss是一个计算图
optimizer.zero_grad()
#一轮之后将梯度降为0
loss.backward()
#计算图中的梯度全部放在optimizer中
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)