train和val数据处理函数
FashionMNIST 下载train,输入大小28*28,输入格式Tensor
split 分割数据集,train_data=0.8train,val_data=0.2train
DataLoader 打包两个数据集 batch_size=32
train_model 训练模型函数
设置设备为GPU模式
设置Adam优化器,学习率=0.001 (用于梯度下降法)
损失函数为交叉熵函数
将模型放入训练设备中
for 循环设置20轮
for循环每次读取32张图片,次数=train_data数据量/batch_size
model.train(),开始训练
得到输出数据是32*10矩阵
torch.argmax(输出数据,dim=1),按照行读取最大值
经过计算得到这个batch的loss
累加每个batch的loss(用于计算一个epoch的loss)
累加每个batch预测正确的个数(用于计算一个epoch的计算精确度acc)
将梯度初始化为0
反向传播,梯度下降法更新参数
for循环每次读取32张图片,次数=val_data数据量/batch_size
model.eval(),开始验证
得到输出数据是32*10矩阵
torch.argmax(输出数据,dim=1),按照行读取最大值
经过计算得到这个batch的loss
累加每个batch的loss(用于计算一个epoch的loss)
累加每个batch预测正确的个数(用于计算一个epoch的计算精确度acc)
计算每个epoch中train和val的loss和acc(用于比较最优模型和绘图)
保存最高精度模型参数
在train_model 训练模型函数中
第一个 for 循环控制训练多少个 epoch。
第二个 for 循环是训练循环。
如果训练集有 8000 张图片,batch_size=32,
那么每个 epoch 会循环 250 次。
这 250 次不是得到 250 组参数,
而是对同一个模型参数连续更新 250 次。
第三个 for 循环是验证循环。
验证集不更新参数,只用来评价当前模型参数的效果。
每个 epoch 结束后,用验证集准确率判断当前这套参数是不是目前最好的。
如果是,就用 best_model_wts 保存下来。
最终得到的是验证集表现最好的那一套模型参数。
流程类似于
epoch 1: train loop: 8000/32 = 250 次 模型参数被更新 250 次 val loop: 2000/32 ≈ 63 次 模型参数不变,只计算 val_loss 和 val_acc 如果 val_acc 是目前最高: 保存当前参数 epoch 2: train loop: 继续在 epoch 1 的参数基础上更新 250 次 val loop: 测试当前参数 如果 val_acc 更高: 保存当前参数 epoch 3: train loop: 继续更新 250 次 val loop: 测试当前参数 如果 val_acc 更高: 保存当前参数