Pytorch Tutorial - DNN模型训练流程

ML2021Spring-Pytorch Turial中的Overview of the DNN Training Procedure图太清晰啦,记录一下:
Pytorch Tutorial - DNN模型训练流程_第1张图片

1. Load Data

需要对数据进行加载、处理,创建DataLoader,可以将整块数据用DataLoader类处理成小块batch_size形式,后续进行迭代循环,并输入到模型中进行训练。
在这里插入图片描述

2. Define Neural Network

随后定义自己的模型,并实例化。
随后定义使用的Loss Function、优化器Optimizer。
在这里插入图片描述

3. Training、Validation、Testing

紧接着开始循环训练、验证这两个步骤,当找到合适的参数之后,对模型进行测试。

(1) 训练部分
Pytorch Tutorial - DNN模型训练流程_第2张图片
其中,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)验证部分
Pytorch Tutorial - DNN模型训练流程_第3张图片

一个(或几个)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)测试部分
Pytorch Tutorial - DNN模型训练流程_第4张图片

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()

测试模型

参考:

  1. Pytorch_Tutorial_1.pdf:https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/hw/Pytorch/Pytorch_Tutorial_1.pdf

你可能感兴趣的:(model-pytorch,机器学习,深度学习,python,pytorch)