ML2021Spring-Pytorch Turial中的Overview of the DNN Training Procedure图太清晰啦,记录一下:
1. Load Data
需要对数据进行加载、处理,创建DataLoader,可以将整块数据用DataLoader
类处理成小块batch_size
形式,后续进行迭代循环,并输入到模型中进行训练。
2. Define Neural Network
随后定义自己的模型,并实例化。
随后定义使用的Loss Function、优化器Optimizer。
3. Training、Validation、Testing
紧接着开始循环训练、验证这两个步骤,当找到合适的参数之后,对模型进行测试。
(1) 训练部分
其中,epoch
是希望整块数据循环多少次,tr_set
已经是一个小批次的数据了,(数据大小为batch_size
)。
训练之前:
- 设置随机固定的随机种子,保证可复现性。
- get device(CPU or GPU)
- 实例化模型 to.(device)
- 定义loss(train类中、epoch循环之前,方便使用)
- 定义优化器optimizer(train类中、epoch循环之前,方便使用)
epoch循环,分为3个小步:训练模型、get loss、loss优化。
传入的训练的train_data数据,是一个batch_size的大小。
epoch = 0
while epoch < n_epochs:
train_loss = 0.0
model.train()
for i, data in enumerate(train_data):
# 1. 得到数据,并输入模型进行训练
inputs, labels = data # inputs, labels
inputs, labels = inputs.to(device), labels.to(device) # 得到数据
outputs = model(inputs) # 模型 # outputs
# 如果需要计算acc等指标,将输出结果通过max转为实际推荐的index
_, train_pred = torch.max(outputs, 1) # 得到训练中最大概率的那个输出index
# 2. get loss
optimizer.zero_grad()
batch_loss = model.cal_loss(outputs, labels)
# 3. loss优化
batch_loss.backward()
optimizer.step()
# 计算指标
train_acc += (train_pred.cpu() == labels.cpu()).sum().item()
train_loss += batch_loss.item()
loss_record['train'].append(batch_loss.detach().cpu().item())
train_acc = train_acc / len(train_dataset) # 整个数据长度
train_loss = train_loss / len(train_dataloader) # 一个batch数据长度
除了loss.backward()
之外的loss调用都改成loss.item()
取值
避免显存爆炸,否则保留的是计算图非常庞大。
指标是该epoch中每个item的结果累加,所以除以整个数据的长度
loss是该epoch中切分成多个batch之后,各个batch的loss累加,所以除以batch的个数(iterate)
(2)验证部分
一个(或几个)epoch
训练完之后,可以进入验证部分,这时循环的是验证数据集,同样是小批次的进行,区别是不计算梯度,因此没有loss优化的步骤。
因此:验证模型、get loss。
(全部验证数据的loss累加
后,除以验证集的数据长度
,得到平均loss)
Note:这里累加的loss是x个batch的loss,x=len(整个数据)/batch_size=iterate(整个数据循环多少个batch可以全部跑完)
因此除以的验证集的数据长度
,是x
,即iterate
的值。
total_loss = 0
model.eval()
with torch.no_grad():
for i, data in enumerate(val_set):
inputs, labels = inputs.to(device), labels.to(device)
pred = model(x) # 模型
batch_loss = model.cal_loss(outputs, labels)
total_loss += batch_loss.detach().cpu().item()
total_loss = total_loss / len(val_set)
(3)测试部分
model.eval()
preds = []
for x in tt_set:
x = x.to(device) # 得到数据
with torch.no_grad():
pred = model(x) # 模型
preds.append(pred.detach().cpu())
preds = torch.cat(preds, dim=0).numpy()
测试模型
参考:
- Pytorch_Tutorial_1.pdf:https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/hw/Pytorch/Pytorch_Tutorial_1.pdf