一、理论知识git
选择了吴恩达的https://www.deeplearning.ai/github
二、机器学习框架框架
考虑到要在手机上跑模型,tensorflow+snpe机器学习
三、模型学习
https://github.com/tensorflow/models/tree/master/research/slim测试
仍是考虑到要在手机上跑模型,选择了MobileNet_224调试
四、数据预处理接口
因为使用tensorflow,数据都处理成tfrecords图片
数据预处理时,对数据进行镜像,旋转操做it
考虑到存储空间,RGB分别使用8位去保存
将数据分红训练集,验证集和测试集。验证集和测试集数量取min(10%, 10000)
五、模型训练
使用tensorflow自带的tensorboard调试模型,打印训练集每步的batch的损失和准确率,每必定步数(十步)从验证集中取一个batch计算损失和准确率,再经过tensorboard显示成曲线图
训练开始时,保证损失在降低,而后训练三四十个epochs后跟进这四个曲线肯定模型是过拟合、拟合不足仍是恰好。若是最后训练准确率比验证准确率高不少,训练损失比验证损失低,应该是过拟合,特别是验证损失曲线出现先降低再上升,也是过拟合的特征。
我的技巧:先不要使用正则化和dropout等防过拟合的手段,甚至能够增长模型复杂度,获得一个过拟合的结果,再在这个结果上添加dropout去防过拟合。不论是提升模型复杂度和添加dropout都要小步进行,指望是模型稍过拟合,训练时添加dropout后拟合正好。每次修改后,在上一次训练的结果上继续训练,即模型重复参数保留上次训练的结果。
六、模型最后的分类回归
图片分类模型最后通常会使用softmax回归,但使用softmax回归有一个前提是输入图片必须属于某一个分类,而大部分状况下用户使用时输入的图片不属于任何一个分类。即便添加“其余”分类也不能解决这个问题,由于“其余”这个分类永远没法表明哪怕接近在现实中的”其余“。解决方法:改为多二分类,输出结果变成,输入图片属于每一个分类的可能性,互不影响。当全部分类的可能性都低于阀值时,就能够认为图片属于”其余“。注意:使用sigmoid计算损失会出现梯度消失或梯度爆炸,可使用tensorflow的tf.nn.sigmoid_cross_entropy_with_logits接口解决,它使用近似结果避免了那种状况。
七、迁移学习
因为最终训练的结果不理想(100分类,30万的图片,top1:72.1%,top5:92.6%),在tensorflow提供的已经训练好的MobileNet模型上进行迁移学习,保留卷积层(不训练卷积层的参数),替换全链接层,结果(top1:77.2%,top5:95.2%)。