目录
项目回顾
调参过程
发现问题
其他问题
引用概念
总结
在上一次的学习中,数据集使用各有一百多张数据的7种表情的数据集, 并且调用两次,即训练集和验证集是同一个数据集。在epoch为20,batch size为64的参数下,我们的准确率达到了0.65,接近目标0.80。和老师与队友讨论后,知道了数据集越小会更容易拟合,于是尝试将数据集进行缩减。
打开数据集后发现,每个人脸的照片会重复3次,即数据集可以缩减为原来的1/3,于是将重复的数据删减后,把剩下的图片分为两个集,每种表情在训练集中20-30张,在验证集中10-20张,且不相同。在这种情况下,没有改变网络,考虑到数据集比较小,将epoch改为10,batch size 改为8,最后的准确率仍然很低,只有0.3左右,尝试将batch size改大为16,准确率还是很低0.18,epoch次数改变几次,也都没有达到好的效果。
于是决定换回原来的数据集,在0.65准确率的基础上进行调试。但是batch size和epoch忘记改变了,准确率出来的时候,发现是0.71,比之前0.65好一点,看到了胜利的曙光,这时epoch和batch size分辨是10和8。
epoch10,batch size16
准确度降低到0.63,说明batch size8的效果更好。
epoch15,batch size8
准确率升到0.77,改变epoch的思路是对的。
epoch20,batch size8
准确率升到0.81。
最终将epoch改为25,batch size8
准确率为0.86
虽然准确率达到了0.80以上,但是上图可以看到, 训练的loss和accuracy与验证的loss和accuracy相差甚远,我以为这是正常的,只要准确率可以上升就好了。在老师和队友的帮助下,我们发现在预处理的部分确实存在问题。
# 图像处理部分
if mode == 'train':
self.transforms = T.Compose([
T.RandomResizedCrop(IMAGE_SIZE), # 随机裁剪大小
T.RandomHorizontalFlip(0.5), # 随机水平翻转
T.ToTensor(), # 数据的格式转换和标准化 HWC => CHW
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 图像归一化
])
else:
self.transforms = T.Compose([
T.Resize(256), # 图像大小修改
T.RandomCrop(IMAGE_SIZE), # 随机裁剪,
T.ToTensor(), # 数据的格式转换和标准化 HWC => CHW
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 图像归一化
])
可以看到,在训练模式下,通过随机剪裁和随机水平翻转可以增大数据量,然而在验证模式下的处理是不同的,因为后者的效果更好些,我们将两段处理统一。
if mode == 'train':
self.transforms = T.Compose([
T.Resize(256), # 图像大小修改
T.RandomCrop(IMAGE_SIZE), # 随机裁剪
T.ToTensor(), # 数据的格式转换和标准化 HWC => CHW
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 图像归一化
])
else:
self.transforms = T.Compose([
T.Resize(256), # 图像大小修改
T.RandomCrop(IMAGE_SIZE), # 随机裁剪
T.ToTensor(), # 数据的格式转换和标准化 HWC => CHW
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 图像归一化
])
此时的训练和验证效果直接起飞了,5轮训练就达到了之前的效果,并且25轮训练后,达到0.96的准确率。
在运行速度上,使用paddle平台的cpu速度很慢,25轮需要20-30分钟来训练,即使用paddle.set_device(‘gpu:0’)或paddle.set_device(‘gpu’)设置成GPU模式,运行时也总会报错。因此上述过程均在cpu下进行,速度很慢,这个问题目前得不到解决。
loss和accuracy之间存在关系,但并不对等;从模型角度出发,loss是衡量标准;但是好的模型最终还是要提现到accuracy上。
学习成绩打比方, loss是全班平均分, accuracy是90分以上的比率
简单来说loss是给深度学习看的,用来优化参数,实现梯度下降。acc是给人看的,用来衡量网络的指标,其实召回率,f1,ap等都是给人看的。
一般来说loss越小,表示网络优化程度高,acc就会越多。但有时也会acc略有下降,总体的趋势是loss下降,acc上升
accurac评价模型的好坏,loss评价模型的训练程度。loss越小只能说你的模型训练的程度越来越好,但是accuracy是一个模型的上限,loss小到一定程度accuracy还不提高,就只能换模型了。所以说loss和accuracy所评价的对象不同,loss可以很大,但是accuracy只能0-1。
学习率减小的时候,1到0.5是1/2,0.5到0.1是1/5,不是均匀下降,相差两倍多,所以最好是使用1,0.3,0.1,0.03这样设置,每次大概都是1/3;这是吴恩达入门课程里说的
引用详见https://www.zhihu.com/question/264892967
https://aistudio.baidu.com/aistudio/projectdetail/2182529
虽然准确率达到了目标,但是代码部分基本都是paddle平台十二生肖的例子的代码,在训练和预测的结果就可以看出,例子中模型已经很成熟了。但仍然不是自己的东西,接下来还是要进一步理解网络,多多调整,明白为什么这样的网络和数据处理能够达到更好的效果。