深度学习预测过程
深度学习训练过程
根据误差调解全中参数,直到收敛。
【图4】
落地方案
服务端训练 + 移动端识别
移动端:搭建网络模型可以运行的框架
【图五】
模型选择 CNN卷积和池化
处理前一个输入,通过滑动窗口进行移动,当滑动窗口窗口进行移动的过程中,观察窗口下面所覆盖的节点在做什么运算
当为线性运算,为卷积运算;
最大值运算等则为池化运算;
CNN
第一层不停做卷积和池化运算,可看坐在做特征提取。
第二层根据上一层提取的特征进行拟合,得到想要输出。
框架:
基于Caffe进行二次开发
- 可读性
- 通用性
- 图像领域应用已久
根据GPU的内存拷贝成本与运算效率综合考量,对MDL框架针对CPU做主要优化。
落地难点
服务端 | 移动端 | |
---|---|---|
so体积 | 不限制 | 特定App下严格限制 |
模型体积 | 500M+ | <10M |
加密 | 无需考量 | 特定App下严禁泄漏 |
预测速度 | 类库成熟 | 有待填补 |
内存限制 | 无严格限制 | 内存极其有限 |
耗电量 | 不限制 | 严格限制 |
so体积:代码剪枝
Before | After |
---|---|
OpenBals(一套计算接口) | 手工实现 |
Glog、Gflag | 摘除 |
Protobuf(caffe模型使用进行持久化) | 手工实现json解析 |
后向传播(训练过程需要) | 摘除 |
层 | 缩减数量 |
模型体积:权值共享,通过量化进行减少
- 纠正量化误差:分层对权重进行量化
- 纠正量化偏好:引入随机化方案
加密:不对整个模型文件进行加密
速度优化
- 调整overhead,在线操作放到离线来做
- 常规优化:数值计算(高数太差……,总的来说通过技巧绕过复杂过程)
- CPU Affinity:安卓8核手机,四大四小。设置亲密度来减少线程切换,强制使用大核。
- NEON 向量运算器引入,自己写头文件intrinsics,不能过分使用,因为需要不停load,reload,导致延迟。
- 对intrinsics使用内联汇编,循环展开。
- 利用拓扑结构执行多线程:利用SplitLayer和ConcatLayer自动进行多线程分配。
- 改用MobileNet模型
耗电量:精准确定预测时机
在移动客户端运行神经网络耗电量巨大:
- 用户手机达到稳定一段时间开始识别
- 通过选取合适的识别间隔
网友评论