3 构建模型
这里大家可以使用自己在项目 2 中寻找到的最好的模型结构,做为示例,这里以实验2-3 中的 snet 模型为基础,并进行细微的调整。
样例代码:
需要注意的是,我们在第一层卷基层之后增加了一层池化层,主要是为了降低图像的宽高。同时需要修改最后线性层,需要从 Linear(512, 10)修改为 Linear(512*3*3, 6),输出从 10 改为 6,是因为我们的数据集只有 6 类。而 512 改为 512x3x3 是因为我们输入的图像从 32x32 变成了 224x224,所以经过卷积网络的特征尺寸也发生了变化。大家可以用 summary 函数来查看尺寸的变化。
样例代码:
summary(snet_v2, input_size=(3, 224, 224))
运行结果:
4 模型训练
同样使用 fit 函数设置 validation_split 为 0.3,epoch 设为 5,进行训练。
因为计算时间比较长,这里我们推荐使用’gpu’。
与项目一二不同的地方在于,train_dataset 中包含了图像 tensor 和图像标签,所以只将 train_dataset 传入 fit 即可。
样例代码:
model = fit(snet_v2, train_dataset, validation_split=0.3, epoch=5, device='gpu')
运行结果:
大家可以训练更多的周期来查看模型是否收敛,我们提供 200 个周期训练的损失函数变化曲线供大家参考。
注:如果大家训练 200 个周期,不一定会得到如上图的结果。这与参数的初始化值有关,每次初始化的值有不一样损失曲线变化也会略有不同。大家可以多训练几次,或者训练 200 个周期以上。
5 测试神经网络模型
然后用 evaluate 函数实现在训练集和训练集正确率的计算。eveluate 与 fit 一样,只需要将 train_dataset 或 test_dataset 传入。
样例代码:
train_acc = evaluate(model, train_dataset, device='gpu')
print(train_acc)
运行结果:
0.6889549281822684
样例代码:
test_acc = evaluate(model, test_dataset, device='gpu')
print(test_acc)
运行结果:
0.610236220472441
可以看到在训练上的结果能够达到 60%以上的正确率,测试集也在 60%左右。而经过200 个周期的训练,测试集上的结果也只有 58%。这就出现了与实验 2-1 一样的情况,欠拟合(under fitting)。面对这种情况,根据我们前面项目的学习经验,最直接的方法是增加模型的层数,或者进一步增加参数,从而增强模型的拟合能力。