回归
y^=x×w loss=(y^−y)2=(x⋅w−y)2 训练步骤:
数据
在PyTorch中,计算图是小批量的,所以$X$和$Y$是$3 \times 1$张量。
import torch
import numpy as np
data = np.array([
[1.0,2.0],
[2.0,4.0],
[3.0,6.0]
])
data = torch.Tensor(data)
x_data,y_data = data[:,:-1],data[:,-1]
x_data,y_data
设计模型
在以前的学习中,重点是求导数,现在学习pytorch后,重点是如何构造计算图。
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
lm = LinearModel()
首先我们的模型类应该继承自nn.Module
,它是所有神经网络模块的基类。
class LinearModel(torch.nn.Module):
...
然后必须实现成员方法__init__()
和forward()
class LinearModel(torch.nn.Module):
def __init__(self,):
super(LinearModel,self).__init__()
...
def forward(self,x):
...
self.linear = torch.nn.Linear(1,1)
类神经网络。Linear
实现了神奇的__call__()
方法,使类的实例可以像函数一样被调用,且通常会调用forward()
。
def forward(self,x):
y_pred = self.linear(x) # 里面做了wx+b的运算
return y_pred
损失函数和优化器
criterion = torch.nn.MSELoss(reduction='sum') # 损失函数
optimizer = torch.optim.SGD(lm.parameters(),lr=0.01) # 优化器
torch.optim.Adagrad
torch.optim.Adam
torch.optim.Adamax
torch.optim.ASGD
torch.optim.RMSprop
* torch.optim.Rprop
torch.optim.SGD
前馈与反馈
for epoch in range(100):
y_pred = lm(x_data)
loss = criterion(y_pred,y_data)
print(epoch,loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
注意:由于.backward()
计算的级将被累积。所以在使用backward
之前,请记住将grad
设置为0
!
print("w=",lm.linear.weight.item())
print("b=",lm.linear.bias.item())
x_test = torch.Tensor([[4.0]])
y_test = lm(x_test)
print("y_pred=",y_test.data)