图片分类

1、理论知识

选择了吴恩达的https://www.deeplearning.ai/

2、机器学习框架

考虑到要在手机上跑模型,tensorflow+snpe

3、模型

https://github.com/tensorflow/models/tree/master/research/slim

还是考虑到要在手机上跑模型,选择了MobileNet_224

4、数据预处理

由于使用tensorflow,数据都处理成tfrecords

数据预处理时,对数据进行镜像,旋转操作

考虑到存储空间,RGB分别使用8位去保存

将数据分成训练集,验证集和测试集。验证集和测试集数量取min(10%, 10000)

5、模型训练

使用tensorflow自带的tensorboard调试模型,打印训练集每步的batch的损失和准确率,每一定步数(十步)从验证集中取一个batch计算损失和准确率,再通过tensorboard显示成曲线图

训练开始时,保证损失在下降,然后训练三四十个epochs后跟进这四个曲线确定模型是过拟合、拟合不足还是刚好。如果最后训练准确率比验证准确率高很多,训练损失比验证损失低,应该是过拟合,特别是验证损失曲线出现先下降再上升,也是过拟合的特征。

个人技巧:先不要使用正则化和dropout等防过拟合的手段,甚至可以增加模型复杂度,得到一个过拟合的结果,再在这个结果上添加dropout去防过拟合。不管是提高模型复杂度和添加dropout都要小步进行,期望是模型稍过拟合,训练时添加dropout后拟合正好。每次修改后,在上一次训练的结果上继续训练,即模型重复参数保留上次训练的结果。

6、模型最后的分类回归

图片分类模型最后一般会使用softmax回归,但使用softmax回归有一个前提是输入图片必须属于某一个分类,而大部分情况下用户使用时输入的图片不属于任何一个分类。即使添加“其他”分类也不能解决这个问题,因为“其他”这个分类永远无法代表哪怕接近在现实中的”其他“。解决方法:改成多二分类,输出结果变成,输入图片属于每个分类的可能性,互不影响。当所有分类的可能性都低于阀值时,就可以认为图片属于”其他“。注意:使用sigmoid计算损失会出现梯度消失或梯度爆炸,可以使用tensorflow的tf.nn.sigmoid_cross_entropy_with_logits接口解决,它使用近似结果避免了那种情况。

7、迁移学习

由于最终训练的结果不理想(100分类,30万的图片,top1:72.1%,top5:92.6%),在tensorflow提供的已经训练好的MobileNet模型上进行迁移学习,保留卷积层(不训练卷积层的参数),替换全连接层,结果(top1:77.2%,top5:95.2%)。

猜你喜欢

转载自my.oschina.net/u/1270234/blog/1619146