夹克的机器学习入门记 — 第1弹
第1幕 初识
初识机器学习是在14年。为了优化word内容的结构化和富文本导入功能,在网上疯狂查找相关的资料,偶然发现了机器学习。
那时的机器学习远不如现在这样火爆,作为门外汉只能从吴恩达老师的公开课开始(感谢网易 Orz)。
随着业务产品的封版,自学机器的脚步就此止步...
第2幕 重逢
随着手写识别、面部识别、表情检测等概念的兴起,公司业务不可避免的需要用到相关的技术。
我也有机会重新开始对大神们的追随~ 有了上次的些许经验,这次选择的是更加细分的深度学习。
在一通不要脸的模仿、山寨操作下,我先用caffe实现了业务所需的模型,然后投入了无尽的理论学习中。。。
凑巧的是,华为ARM云训练营让我开始接触华为云这个“宝藏男孩”,ModelArts的训练营可谓是久旱逢甘露。
第3幕 纠葛
猫狗、手写数字、参数调优,一步步按照案例步骤,一点点理解源码和模型,让我从一个深度学习的门外汉渐渐的成长为一名合格菜鸡。
经验是还不够资格谈的,教训和纠葛的故事确实不少:
样本数量,样本数量,样本数量:
用曲线拟合问题能够很好的解释:点数少,容易拟合出九曲回肠的夸张曲线;点数多,才好拟合出合适能反应一般规律的正常曲线。
在实际业务场景下,考虑样本的采集成本,最终拿到手上的样本很有可能数量和质量都不行。
图像增强处理和数据集增益可以在一定程度上缓解这种相对恶劣的客观条件。
除了总数,样本数量是否均衡也很重要。
举个栗子:如果手写数字有1000个7,100个2,实际应用时2很有可能会识别为7。
优化器选择:
上图是sgd和rmsprop在相同数据集和相同轮次下不同表现。
先不论训练本身的样本选取造成的不同结果,不同的优化器由于其内部实现不同,实际效果是不同的,可多尝试根据实际效果进行最终的选择。
预训练参数:
在相同的样本集和训练轮次下,使用合适的预训练参数能够让模型快速的达到较好的效果。
正确率0.5与震荡:
首先检查样本标注是否正确,确认测试和训练样本对于均值的处理是否一致,然后可以对数据进行标准化处理(图像数据可以转换成0-1之间的float32类型),最后是学习率的调整和反复尝试(一般使用了优化器后,这一步之前问题就已经解决了)。
实际调用与正确率数值异常:
模型训练出来以后,最终需要外部调用使用。以Caffe图像分类模型为例,一般的方式是将训练和验证层替换为相同尺寸的输入层,将准确率和损失率替换为Softmax,输出分类概率。
如遇到分类概率大部分为1、0、...、0 这样的情况,可以检查模型调用时是否对均值进行了对应的设置。
即:训练、验证时,如果没有设置均值,实际调用时也不应该设置均值,反之也要相同(否则会出准确率为0.5的现象)。
数学基础:
1) 关于神经网络,网易公开课《MIT 人工智能》的数学推导是目前见到最清晰的描述;
2) 张量大小(图像尺寸)公式:
卷积层: (O=输出图像的尺寸;I=输入图像的尺寸;K=卷积层的核尺寸;N=核数量;S=移动步长;P =填充数)
以AlexNet为例:conv1输入227*227*3,第一层卷积尺寸11*11*3,步长4,填充0,输出尺寸:
池化层: (O=输出图像的尺寸;I=输入图像的尺寸;S=移动步长;Ps = 池化层尺寸)
同一个例子,pool1尺寸3*3,步长2,输出尺寸:
框架的选择:
目前实际使用到的框架只有Caffe和Keras,有一点感触:对于计算速度与内存占用有严格要求的客户端或手机端应用场景,Caffe是一个很好的选择,opencv能够直接调用caffe模型;
(当然,模型的层数和参数数量与上面的指标直接相关,Caffe-GPU环境搭建的坑是非踩不可的,注意版本对应关系~~)
珍惜GPU资源:
拿到GPU资源,珍惜,珍惜,珍惜!!!(有矿的壕可以略过...)
未完待续...
- 点赞
- 收藏
- 关注作者
评论(0)