移动端深度学习感想

导语:这几年,人工智能(AI)的概念全面进入大众的视野,国内外科技巨头纷纷重点布局,如谷歌,微软,IBM,BAT及华为等等,AI 貌似将成为互联网的下一个风口。

很多人对人工智能非常感兴趣,但却不知从何入手进行学习,我也同样被这个问题困扰。那么作为普通开发工程师的我,又应该以何种态度和方式应对这场时代洪流的冲击呢?我不断的搜索资料,不断的学习和探索,让我坚定地迈向成为“AI 工程师”的第一步!

深度学习技术

这一轮AI的技术突破,主要源于深度学习技术突破,而关于AI和深度学习的发展历史我们这里不再重复讲述,大家可自行查阅。

人工智能和深度学习技术并不神秘,深度学习的基础是机器学习,事实上深度学习只是机器学习的一个分支,更像是一个新型的工具,通过喂数据给它,然后,它能发现这些数据背后的规律,并为我们所用。

数学基础比较重要,这样有助于理解模型背后的数学原理,不过,从纯应用角度来说,并不一定需要完全掌握数学,也可以提前开始做一些尝试和学习。

移动端深度学习技术

作为一名移动开发者,最关注的是如何将机器学习、深度学习应用在移动端,因为机器学习是人工智能的前沿,深度学习是机器学习的前沿。

随着移动设备的推广,能够快速高效地在移动端部署深度学习模型就变成亟待解决的问题了。

目前,移动端深度学习SDK有:

  • 谷歌的TensorFlow终端版本TensorFlow Lite
  • 百度的MDL框架
  • 腾讯发布的NCNN

相同点:

  • 只含推理(inference)功能,使用的模型文件需要通过离线的方式训练得到
  • 最终生成的库尺寸较小,均小于500kB
  • 为了提升执行速度,都使用了ARM NEON指令进行加速
  • 跨平台,iOS和Android系统都支持

不同点:

  • MDL和NCNN均是只支持Caffe框架生成的模型文件,而TfLite则毫无意外的只支持自家大哥TensorFlow框架生成的模型文件
  • MDL支持利用iOS系统的Matal框架进行GPU加速,能够显著提升在iPhone上的运行速度,达到准实时的效果。而NCNN和TFLite还没有这个功能

移动端深度学习目标:把机器学习的模型看作一个黑盒函数,你给定一些输入 (可能是一段文字,或者一张图片),这个函数会给出特定的输出 (比如这段文字中的人名地名,或者图片中出现的商店名牌等)。一开始这个模型可能非常粗糙,完全不能给出正确的结果,但是你可以使用大量已有的数据和正确的结果,来对模型进行训练,甚至改进。在所使用的模型足够优化,以及训练量足够大的情况下,这个黑盒模型将不仅对训练数据有较高的准确率,也往往能对未知的实际输入给出正确的返回。这样的模型就是一个训练好的可以实际使用的模型。

AI最终要想落地,还是要往移动端上靠;所以我认为往移动端的深度学习发展,还是很有前途的,呵呵。

展望

我不知道人工智能的时代是否真的会来临,也不知道它将要走向何方,但是,毫无疑问,它是一种全新的技术思维模式。更好的探索和学习这种新技术,然后在业务应用场景寻求结合点,最终达到帮助我们的业务获得更好的成果,一直以来,就是我们工程师的核心宗旨。

另一方面,对发展有重大推动作用的新技术,通常会快速的发展并且走向普及,就如同我们的编程一样。

因此,人人都可以做深度学习应用,并非只是一句噱头。


移动深度学习计划
第一章,基础篇
第1课 入门
1.1 机器学习概述
1.1.1 通过机器学习解决问题
1.1.2 机器学习的场景和前景
1.2基本机器学习算法和模型
1.2.1常见机器学习算法
算法简介
应用场合
1.2.2基本机器学习模型
1.2.3学习和掌握机器学习
机器学习学习曲线
技术栈
1.2.4常见框架简介
1.3为什么选择深度学习
1.3.1瓶颈和深度学习之路
1.3.2深度学习框架简介
1.4走进移动世界深度学习

第2课 机器学习基础
2.1机器学习基础
2.1.1机器学习概述
2.1.2机器学习的主要任务
2.1.3基本算法
2.2 Logistic回归
2.2.1线性回归
2.2.2Sigmoid
2.2.3Logistic回归
2.2.4实现Logistic回归
2.3数据预处理
2.3.1引子
2.3.2框架实践

第3课 人工神经网络
3.1神经网络
3.1.1神经网络简介
3.1.2正向传播算法
3.1.3Softmax回归
3.1.4反向传播算法
3.1.5实现前向神经网络
3.2稀疏自编码器
3.2.1稀疏自编码器简介
3.2.2自编码算法与稀疏性
3.3神经网络数据预处理
3.3.1简单的数据预处理
3.3.2实现数据预处理

第4课 走进深度学习世界
4.1深度网络简介
4.1.1自我学习
4.1.2深度神经网络
4.1.3逐层贪婪训练方法
4.1.4栈式自编码算法
4.1.5微调多层自编码算法
4.2卷积神经网络
4.2.1线性解码器
4.2.2全联通与部分联通网络
4.2.3卷积(Convolution)
4.2.4池化(Pooling)
4.2.5卷积神经网络(CNN)
4.3卷积神经网络实现
4.3.1实现卷积神经网络

第二章 实战篇

第1课 卷积神经网络模型实践
1.1经典CNN模型Lenet
1.1.1Lenet介绍
1.1.2Lenet手写数字识别
1.2CNN的进化AlexNet
1.2.1 从Lenet到AlexaNet
1.2.2 AlexNet解读
1.2.3 AlexNet手写数字识别
1.3基于AlexNet的花朵分类
1.3.1数据抓取与清洗
1.3.2数据预处理
1.3.3训练
1.3.4使用模型
1.4其他CNN模型介绍
1.4.1GoogleNet
1.4.2VGG
1.4.3SqueezeNet

第2课 数据获取与预处理
2.1任务概述
2.1.1物体检测介绍
2.2数据获取
2.2.1抓取方法概述
2.2.2数据抓取(爬虫)
2.2.3基于实时处理系统抓取数据
2.2.4数据清洗
2.3数据预处理方法
2.3.1取均值
2.3.2归一化
2.3.3PCA
2.3.4白化
2.4海量数据与预处理方案
2.4.1分布式实时处理系统
2.4.2Hurricane实时处理系统
2.4.3Hurricane Machine Learning框架
2.5数据预处理实战
2.5.1基于HurricaneML的数据抓取与清洗
2.5.2基于HurricaneML的数据预处理

第3课 基于深度神经网络的物体检测与识别
3.1模式识别与物体识别
3.1.1物体识别领域介绍
3.1.2传统模式识别方法
3.1.3基于深度学习的模式识别方法
3.2物体检测
3.2.1检测与识别
3.2.2R-CNN介绍
3.2.3Fast R-CNN与Faster R-CNN
3.3检测识别实战
3.3.1数据标注(自动+人工,HurricaneML)
3.3.2生成候选区域
3.3.3特征提取
3.3.4类别判断
3.3.5位置精修
3.3.6实际效果
3.4构建训练服务

第4课 物体检测识别移动端APP开发
4.1移动端深度学习系统开发简介
4.1.1移动端深度学习应用
4.1.2移动端深度学习系统开发难点
4.2 C/C++在机器学习领域的重要作用
4.2.1为什么使用C/C++
4.2.2Python与C++在工业界扮演了什么角色
4.2.3如何合理使用工具
4.3框架移植
4.3.1预测的特殊性
4.3.2前向框架移植与裁剪
4.4基于ARM架构的移动端APP开发
4.4.1APP整体结构
4.4.2APP开发实战
4.4.3集成前向框架

第三章 提高篇
第1课 高性能编程技巧
1.1序列化
1.1.1为什么需要序列化
1.1.2序列化与反序列化原理
1.2.3序列化实现
1.1.4Protobuf
1.2并发与线程
1.2.1 C++17线程
1.2.2竞争问题与解决方案
1.2.3多线程优化
1.3拷贝与移动
1.3.1拷贝与赋值
1.3.2移动构造
1.3.3并发冲突
1.3.4何时拷贝?何时移动?
1.4内存管理技巧
1.4.1内存分配与内存碎片
1.4.2 tcmalloc
1.4.3内存池
1.5实战:构建物体检测SDK
1.5.1框架裁剪与集成
1.5.2环境检测与初始化
1.5.3构建接口层
1.5.4资源管理
1.5.5计算线程实现
1.5.6JNI接口层

第2课 深入移动端深度学习应用开发
2.1模型优化
2.1.1实时处理与批处理
2.1.2模型打包和加密
2.1.3自动更新模型
2.1.4建立版本索引
2.2自动更新本地模型
2.2.1使用Nginx建立静态资源服务器
2.2.2使用NodeJS提供版本更新检索
2.2.3下载更新模型
2.3移动端性能优化基础
2.3.1Neon指令集
2.3.2ARM V8a
2.3.3数据预取与缓存
2.4移动端性能优化实践
2.4.1 浮点指令集加速
2.4.2 ARM Neon Intrinsic/ACLE
2.4.3 编译器优化与流水线
2.4.4 实现卷积加速
2.5整形与量化
2.5.1量化思想
2.5.2数据统计与量化测试
2.5.3量化实现
2.5.4实现卷积加速