简介
PyTorch提供的autogard包,可以根据输入和前馈过程自动构建计算图,并执行反向传播。这里简要介绍一下PyTorch的简要流程。
流程
1、构造数据
- 构造合适的数据集,训练集(train)与测试集(test)。
- 数据读取可以使用torch的数据读取工具`torch.utils.data.DataLoader`。
train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers)
test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)
2、定义模型结构
- 继承
Modoule
类来构造模型。 - 如果没有特殊的梯度计算需求,模型中不需要自己定义反向传播
backward
函数。
class MLP(nn.Module):
# 声明带有模型参数的层,这里声明了两个全连接层
def __init__(self, **kwargs):
# 调用MLP父类Module的构造函数来进行必要的初始化。这样在构造实例时还可以指定其他函数
super(MLP, self).__init__(**kwargs)
self.hidden = nn.Linear(784, 256) # 隐藏层
self.act = nn.ReLU()
self.output = nn.Linear(256, 10) # 输出层
# 定义模型的前向计算,即如何根据输入x计算返回所需要的模型输出
def forward(self, x):
a = self.act(self.hidden(x))
return self.output(a)
3、定义损失函数
- 如无特殊需求,直接使用torch的损失函数即可。
# 分类问题
loss = torch.nn.CrossEntropyLoss()
# 回归问题
loss = torch.nn.MSELoss()
4、定义优化算法
# 初始化模型
net = MLP()
# 定义优化算法
optimizer = torch.optim.Adam(net.parameters())
5、构造评测函数
# 例如
def evaluate_accuracy(data_iter, net):
acc_sum, n = 0.0, 0
for X, y in data_iter:
acc_sum += (net(X).argmax(dim=1) == y).float().sum().item()
n += y.shape[0]
return acc_sum / n
6、模型训练
# epoch迭代
for epoch in range(num_epochs):
train_l_sum, train_acc_sum, n = 0.0, 0.0, 0
for X, y in train_iter:
# 利用构造的网络,对X进行计算预测,得到y_hat
y_hat = net(X)
# 通过y_hat与测试集中的y,进行loss计算
l = loss(y_hat, y).sum()
# 梯度清零,防止梯度进行累加计算
optimizer.zero_grad()
# 反向传播
l.backward()
# 梯度自动计算
optimizer.step()
train_l_sum += l.item()
# 按指定的维度返回最大元素的坐标
train_acc_sum += (y_hat.argmax(dim=1) == y).sum().item()
n += y.shape[0]
# 可在模型训练时,在每个epoch中,增加提前停止early stop的判别。
test_acc = evaluate_accuracy(test_iter, net)
print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f'
% (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))
参考资料
- 1、《动手学深度学习》PyTorch实现:https://github.com/ShusenTang/Dive-into-DL-PyTorch
网友评论