以下内容为Pytorch官网教程的翻译简化和一些自己的总结:
神经网络模型的一般训练过程:
- 定义网络模型
- 在输入数据集上迭代
- 通过模型处理输入数据
- 计算损失函数
- 将梯度传播回模型参数
- 更新模型参数
使用torch.nn定义函数,一个torch.nn.Module对象包含网络层和forward(input)方法返回output。
定义模型:
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module): # 继承nn.Module
def __init__(self): # 定义网络层
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5) # 二维卷积层
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120) # 全连接层
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x): # 前向传播计算,将层连接起来构建模型
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = torch.flatten(x, 1) # 特征图压缩成一维
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net() # 创建模型实例
print(net) # 模型可直接打印查看层构造
net.parameters() # 查看模型可训练参数
out = net(input) # 调用模型实例,传入输入数据,得到输出数据
值得注意的是,torch.nn只支持mini-batch训练方式,如果输入数据样本是单个的,需要使用input.unsqueeze(0)来添加一个假的批维度。
模型定义完成后,还需要定义优化器,并启动学习过程:
import torch.optim as optim
# 定义优化器,输入模型参数和学习率
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 训练循环过程中
optimizer.zero_grad() # 梯度缓存清零
output = net(input) # 模型输出
loss = criterion(output, target) # 计算损失函数
loss.backward() # 反向传播
optimizer.step() # 更新参数
接下来是一些常用函数的介绍,包括模型层,优化器,损失函数
模型层
卷积池化:
nn.Conv1d(in_channels, out_channels, kernel_size) # 一维卷积层
nn.Conv2d(in_channels, out_channels, kernel_size) # 二维卷积层
nn.MaxPool1d(kernel_size) # 一维最大池化层
nn.MaxUnpool1d(kernel_size) # 逆最大池化层,不能还原的部分默认置零
nn.AvgPool1d(kernel_size) # 平均池化层
非线性层:
nn.ReLu
nn.Sigmoid
nn.Tanh
nn.Threshold
nn.Softmax
nn.MultiheadAttention
标准化层:
nn.BatchNorm1d() # 一维批标准化
nn.LayerNorm() # 层标准化
Transformer层:
nn.Transformer() # Transformer模型
nn.TransformerEncoder() # Transformer编码器
nn.TransformerEncoderLayer() # Transformer编码层
优化器
# 如果要将模型通过.cuda()移至GPU,需要在构建优化器之前迁移
# 需要保证优化参数与优化器在相同的位置
optim.Adam
optim.Adagrad
optim.RMSprop
optim.SGD
损失函数
nn.L1loss() # 绝对值损失
nn.MSEloss() # 均方损失
nn.CrossEntropyLoss() # 交叉熵损失
nn.SmoothL1loss() # 平滑L1损失