代码中定义了一个线性模型的类,通过MSE计算损失,通过优化器SGD更新w和b的值,最后输出结果
import torch
x_data=torch.tensor([[1.0],[2.0],[3.0]])
y_data=torch.tensor([[3.0],[5.0],[7.0]])
class LinearnModel(torch.nn.Module):
def __init__(self):
# 构造函数
super(LinearnModel,self).__init__()
# super用于调用父类,super(A,self)._init_()这其中self表示从self开始的方法解析序列,而A是从A开始向父类中寻找_init_()方法
self.linear=torch.nn.Linear(1,1)
# nn.Linear(in_featrue,out_featrue,bias),第一个是输入Tensor最后一维的通道数,第二个是输出的通道数,第三个(bool型)是是否添加bias默认为true
def forward(self,x):
y_pred=self.linear(x)
# 也就是=y=wx+b
return y_pred
model=LinearnModel()
criterion=torch.nn.MSELoss(size_average=False)
# MSRLoss(size_acerage,reduce=True),第一个参数是否求均值,第二个参数考虑是否求和降维
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
# model.parameters()会自动更新weight和bias的值,lr是学习率
for epoch in range(100):
y_pred=model(x_data)
# 开始用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)