基本配置 如下是一些需要导入的包
import os
import numpy as np
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
import torch.optim as optimizer
对如下超参数进行统一设置:
batch size
- 初始学习率(初始)
- 训练次数(max_epochs)
- GPU配置
batch_size = 16
lr = 1e-4
max_epochs = 100
GPU配置方法有两种:
方案一:使用os.environ,这种情况如果使用GPU不需要设置
os.environ[‘CUDA_VISIBLE_DEVICES’] = ‘0,1’
方案二:使用“device”,后续对要使用GPU的变量用.to(device)即可
device = torch.device(“cuda:1” if torch.cuda.is_available() else “cpu”)
2.数据读入 PyTorch数据读入是通过Dataset+Dataloader的方式完成的,Dataset定义好数据的格式和数据变换形式,Dataloader用iterative的方式不断读入批次数据。其中Dataset类可自定义,同时定义的类需要继承pytorch自身的Dataset类。 构建好Datadet后,就可以使用DataLoader来按批次读入数据了。 3.模型构建
import torch
from torch import nn
class MLP(nn.Module):
def __init__(self, **kwargs):
super(MLP, self).__init__(**kwargs)
self.hidden = nn.Linear(784, 256)
self.act = nn.ReLU()
self.output = nn.Linear(256,10)
def forward(self, x):
o = self.act(self.hidden(x))
return self.output(o)
这部分关于神经网络的介绍非常丰富,让我有点头脑风暴,还需要再吸收一下。 5.损失函数 一个好的训练离不开优质的负反馈,这里的损失函数就是模型的负反馈。 这里介绍的损失函数一共15个常用的损失函数,,并详细介绍每个损失函数的功能介绍、数学公式和调用代码。当然,PyTorch的损失函数还远不止这些,在解决实际问题的过程中需要进一步探索、借鉴现有工作,或者设计自己的损失函数。 6.优化器 优化器就是根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值,使得模型输出更加接近真实标签。 Pytorch很人性化的给我们提供了一个优化器的库torch.optim,在这里面给我们提供了十种优化器。
- torch.optim.ASGD
- torch.optim.Adadelta
- torch.optim.Adagrad
- torch.optim.Adam
- torch.optim.AdamW
- torch.optim.Adamax
- torch.optim.LBFGS
- torch.optim.RMSprop
- torch.optim.Rprop
- torch.optim.SGD
- torch.optim.SparseAdam
而以上这些优化算法均继承于Optimizer 注意:
-
每个优化器都是一个类,我们一定要进行实例化才能使用。 -
optimizer在一个神经网络的epoch中需要实现下面两个步骤: 梯度置零 梯度更新 -
优化器的选择是需要根据模型进行改变的,不存在绝对的好坏之分,我们需要多进行一些测试。 训练与评估 完成了上述设定后就可以加载数据开始训练模型了。首先应该设置模型的状态:如果是训练状态,那么模型的参数应该支持反向传播的修改;如果是验证/测试状态,则不应该修改模型参数。在PyTorch中,模型的状态设置非常简便,如下的两个操作二选一即可:
model.train()
model.eval()
步骤: 读取数据
for data, label in train_loader:
数据放到GPU上用于后续计算,以.cuda()为例
data, label = data.cuda(), label.cuda()
做训练前先将优化器梯度置零
optimizer.zero_grad()
之后将data送入模型中训练:
output = model(data)
根据预先定义的criterion计算损失函数:
loss = criterion(output, label)
将loss反向传播回网络:
loss.backward()
使用优化器更新模型参数:
optimizer.step()
至此训练完成。 验证/测试的流程基本与训练过程一致,不同点在于:
- 需要预先设置torch.no_grad,以及将model调至eval模式
- 不需要将优化器的梯度置零
- 不需要将loss反向回传到网络
- 不需要更新optimizer
完整训练过程如下:
def train(epoch):
model.train()
train_loss = 0
for data, label in train_loader:
data, label = data.cuda(), label.cuda()
optimizer.zero_grad()
output = model(data)
loss = criterion(label, output)
loss.backward()
optimizer.step()
train_loss += loss.item()*data.size(0)
train_loss = train_loss/len(train_loader.dataset)
print('Epoch: {} \tTraining Loss: {:.6f}'.format(epoch, train_loss))
完整验证过程如下:
```python
def val(epoch):
model.eval()
val_loss = 0
with torch.no_grad():
for data, label in val_loader:
data, label = data.cuda(), label.cuda()
output = model(data)
preds = torch.argmax(output, 1)
loss = criterion(output, label)
val_loss += loss.item()*data.size(0)
running_accu += torch.sum(preds == label.data)
val_loss = val_loss/len(val_loader.dataset)
print('Epoch: {} \tTraining Loss: {:.6f}'.format(epoch, val_loss))
8.可视化 在PyTorch深度学习中,可视化是一个可选项,指的是某些任务在训练完成后,需要对一些必要的内容进行可视化。
|