1.选择趁手的工具(损失函数、优化器)
1. nn.CrossEntropyLoss() 交叉熵损失函数
交叉熵损失函数是分类中最常用的损失函数,交叉熵是用来度量两个概率分布差异性的,用来衡量学习模型学习的分布和真实分布的差异。
实例化工具:
import torch.nn as nn
loss_func = torch.nn.CrossEntropyLoss()
具体计算过程不予深究,知道是个损失就行。具体研究过程见手册。
注意输入张量尺寸,和目标尺寸要求:
1. 具有类别索引的目标示例
输入(即从神经网络最后出来的东西):
tensor([[ 1.0420, -0.4564, -0.2856, 0.8285, 0.1561],
[-0.1080, -0.0666, 0.1174, -0.2689, 0.1834],
[ 1.0693, 0.7028, 1.5643, -0.0080, 1.3160]], requires_grad=True)
3个列表对应batchsize=3,5个值代表5分类
大列表中的每个小列表中的五个值,代表对应索引类型的概率,
target目标:
tensor([2, 0, 3])
就是第一个列表里,第(2+1)个是正确的选项
第二个列表,第(0+1)个是正确选项
第三个列表,第(3+1)个是正确选项
由此计算损失值
2.具有类概率的目标示例:
tensor([[ 1.0420, -0.4564, -0.2856, 0.8285, 0.1561],
[-0.1080, -0.0666, 0.1174, -0.2689, 0.1834],
[ 1.0693, 0.7028, 1.5643, -0.0080, 1.3160]], requires_grad=True)
大列表中的每个小列表中的五个值,代表对应索引类型的概率
输入相同
target:
tensor([[0.2239, 0.1132, 0.4353, 0.0853, 0.1423],
[0.3158, 0.0500, 0.0854, 0.5009, 0.0480],
[0.0994, 0.1691, 0.2386, 0.2697, 0.2232]])
目标概率格式也相同。
2.优化器
优化器的作用就是在反向传播获取梯度后,对网络模型根据获取的进行优化的工具。
实例化工具
import torch.nn as nn
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)
↑指向训练模型的参数 ↑学习率
我们运用常用的SGD(随机梯度下降算法)进行梯度下降。
2.撰写训练过程
for epoch in range(10): ---训练的次数
for data in train_iter: ---对数据集里的每个图片及标签迭代
imgs,targets = data
outpus = model(imgs) ---图片进网络
result_loss = loss_func(outpus,targets)--计算网络输出和实际之间的损失
optimizer.zero_grad() ---梯度清空,不清空的话梯度会累加
result_loss.backward() ---反向传播获取梯度
optimizer.step() ---通过获取的梯度更新网络参数
这只是一次训练所必要的步骤罗列,实际训练中为了可以更好的观察训练步骤1,需要写很多优化步骤。