《PyTorch深度学习实践》5.用PyTorch实现线性模型

用PyTorch实现线性模型

四个步骤:

  • Prepare dataset
  • Design model using Class
    • Inherit from nn.Module
  • Construct loss and optimizer
  • Training cycle
    • forward, backward, update

Design model using Class

演示所用的线性模型:

$\hat{y}=\omega*x+b$

线性模型类的定义:

1
2
3
4
5
6
7
8
9
10
11
12
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = torch.nn.Linear(1, 1) # 分别为输入的维度数(n*x)和输出的维度数(n*y),
# 在输入和输出维度确定的情况下可以直接推出权重w矩阵的维度
# 缺省情况下还会自己补一个偏置矩阵b

def forward(self, x):
y_pred = self.linear(x)
return y_pred # 没有backward,因为构建的计算图会自动计算

model = LinearModel()

补充Python的callable知识点:

1
2
3
4
5
6
7
8
class Foobar:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print("hello" + str(args[0]))

foobar = Foobar()
foobar(1, 2, 3) # 输出: hello1

当一个类定义了__call__(self, *args, **kwargs)函数,这个类的实例(上例中为foobar)就可以直接调用了

nn.Linear类也执行了__call__()函数,并在这个函数调用了forward()函数

所以说用model=LinearModel()声明了model之后,就可以用model(x)来对输入数据进行变换了,LinearModel__call__()函数会调用对应的forward()函数

Construct loss and optimizer

1
2
criterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

Training Cycle

前馈,反馈,更新

1
2
3
4
5
6
7
8
9
10
11
12
for epoch in range(100):
"""
基本步骤是:先forward再backward最后更新
"""
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss) # 前面到这里是forward部分

optimizer.zero_grad() # The grad computed by .backward() will be accumulated.
# So after update, remember set the grad to ZERO!
loss.backward() # backward部分
optimizer.step() # update部分

补充:PyTorch中常用的优化器:

1
2
3
4
5
6
7
8
torch.optim.Adagrad
torch.optim.Adam
torch.optim.Adamax
torch.optim.ASGD
torch.optim.LBFGS
torch.optim.RMSprop
torch.optim.Rprop
torch.optim.SGD

在Colab上运行

课程来源:《PyTorch深度学习实践》完结合集