train和val数据处理函数FashionMNIST 下载train输入大小28*28输入格式Tensorsplit 分割数据集train_data0.8trainval_data0.2trainDataLoader 打包两个数据集 batch_size32train_model 训练模型函数设置设备为GPU模式设置Adam优化器学习率0.001 用于梯度下降法损失函数为交叉熵函数将模型放入训练设备中for 循环设置20轮for循环每次读取32张图片次数train_data数据量/batch_sizemodel.train()开始训练得到输出数据是32*10矩阵torch.argmax(输出数据dim1)按照行读取最大值经过计算得到这个batch的loss累加每个batch的loss用于计算一个epoch的loss累加每个batch预测正确的个数用于计算一个epoch的计算精确度acc将梯度初始化为0反向传播梯度下降法更新参数for循环每次读取32张图片次数val_data数据量/batch_sizemodel.eval()开始验证得到输出数据是32*10矩阵torch.argmax(输出数据dim1)按照行读取最大值经过计算得到这个batch的loss累加每个batch的loss用于计算一个epoch的loss累加每个batch预测正确的个数用于计算一个epoch的计算精确度acc计算每个epoch中train和val的loss和acc用于比较最优模型和绘图保存最高精度模型参数在train_model 训练模型函数中第一个 for 循环控制训练多少个 epoch。第二个 for 循环是训练循环。如果训练集有 8000 张图片batch_size32那么每个 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 更高 保存当前参数