人脸表情识别PaddlePaddle学习3

目录

项目回顾

调参过程

发现问题

其他问题

引用概念 

总结



项目回顾

在上一次的学习中,数据集使用各有一百多张数据的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。

人脸表情识别PaddlePaddle学习3_第1张图片

epoch10,batch size16

准确度降低到0.63,说明batch size8的效果更好。

epoch15,batch size8

准确率升到0.77,改变epoch的思路是对的。

epoch20,batch size8

准确率升到0.81。

人脸表情识别PaddlePaddle学习3_第2张图片

最终将epoch改为25,batch size8

准确率为0.86

人脸表情识别PaddlePaddle学习3_第3张图片

发现问题

虽然准确率达到了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的准确率。

人脸表情识别PaddlePaddle学习3_第4张图片

人脸表情识别PaddlePaddle学习3_第5张图片

其他问题

在运行速度上,使用paddle平台的cpu速度很慢,25轮需要20-30分钟来训练,即使用paddle.set_device(‘gpu:0’)或paddle.set_device(‘gpu’)设置成GPU模式,运行时也总会报错。因此上述过程均在cpu下进行,速度很慢,这个问题目前得不到解决。

人脸表情识别PaddlePaddle学习3_第6张图片

人脸表情识别PaddlePaddle学习3_第7张图片

引用概念 

 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平台十二生肖的例子的代码,在训练和预测的结果就可以看出,例子中模型已经很成熟了。但仍然不是自己的东西,接下来还是要进一步理解网络,多多调整,明白为什么这样的网络和数据处理能够达到更好的效果。

你可能感兴趣的:(暑期实习,python,网络,机器学习)