背景
目前我主要负责深度学习这块的研究应用。这里介绍深度学习技术是因为目前在快测上的图片识别有具体的应用,希望可以做到抛砖引玉之用。
什么是深度学习
深度学习是 机器学习这门学科里的一种实现技术,那么什么又是机器学习?机器学习简单的讲可以理解为使用数据,训练模型,使用模型解决问题的一种编程思维。
传统的程序设计思想存在的问题
- 传统的程序设计无法有效解决非线性问题
例如: 语音识别, 图像识别等非线性的问题
什么是非线性问题,举个简单的栗子:
如下两幅图,如果要你把图中的两类数据画一条直线分割出来,无法使用线性思想来解决。
xxx.jpg xor.jpg
快测平台的需求
-
自动分类识别UI异常的图片
比如以下几类图片
image.png
image.png
image.png
image.png
image.png
image.png
image.png
如何做
科普一点知识
- 关于神经元
image.png
如上图的人脑神经网络。学过生物的都知道,我们的大脑是由无数的神经细胞组成,神经细胞又有突触,轴突,树突等组成。而人工神经网络其实就是对人脑神经网络的一种粗略的模拟。人工神经细胞是对神经细胞的一种模拟,一般也叫做人工神经元,就是如图中第二行最右侧的数学模型的抽象,它将树突抽象为该数学模型中的输入,将轴突抽象为该数学模型中的输出,轴突连接到其他人工神经细胞中,在人工神经网络中就是其他神经细胞的输出,下一层的输入。
- 多层感知机
传统的神经网络即-多层感知机遇到主要可以分为三层.第一层是输入层, 第二层是隐含层, 第三层是输出层.多层感知机中的神经元是全连接的, 这会导致参数特别巨大, 模型难以训练等问题.
image.png
-
人的视觉神经系统
image.png - 局部感受野
人的视觉对外部的感知是从局部到全局的.所谓的局部感受野是指对于一个视觉皮层的神经细胞而言, 其看到的并不是外界的所有.而只是一小部分.而更高层的神经细胞是通过接受部分其上一层的神经细胞来组合获取得到更加丰富的感知.
而卷积神经网络中的设计中就有借鉴这一点.这样做的好处就是可以大大的降低神经网络中参数的个数, 节省了大量的存储和计算资源.
如下图, 对于传统的神经网络, 使用的是全连接的方式, 那么假设有一副单通道的图像, 其大小为1000 * 1000,则每个隐含层的神经元,需要1000 * 1000个参数.假设隐含层存在1M 个神经元, 则需要10 ^ 12个参数.
image.png
- 误差反向传播算法
该算法主要是用来更新网络中参数的数值, 使得模型越来越能够越来越精确.
基本原理 - 利用输出后的误差来估计输出前一层的误差, 再用这个 误差估计更前一层的误差, 如此一层一层反传下去.从而获得它个层的误差估计.
- 属于监督学习的方式.
-
该算法核心是: 梯度下降.
loss.png
-
- 数学部分(略)
准备工作
- 安装Anaconda框架, 安装keras
- 安装tensorflow-gpu
准备工作主要安装这三个框架, 前者是基于Python的数据科学的集成环境, 集成了各大常使用的数据科学的框架和工具。Keras是基于tensorflow等深度学习框架二次封装的框架,提供了更加简练的API,方便快速迭代和开发。
搭建人工神经网络
1.搭建网络
如下图,我使用Keras搭建的网络模型
输入层:
结构是这样的,第一层是输入层或者说是数据层,其大小是150 * 150 * 3.子所以有个第三纬度3是因为,图片是三通道的RGB。
特征提取层:
以第一个特征提取器举例,是由32个卷积核接着池化层组成。32个卷积核可以提取32个feature maps,就如上图所示。当然特征提取一般不会只有一个这种卷积结构组成,而是符合了多个卷积结构,越往后的卷积结构越能提取出更高层次的语意信息。
输出层:
输出层接的是一个多层感知机,就是传统的神经网络形式,其主要用来分类。并使用统计学的softmax函数将输出强度转换成对应的概率估计,方便使用。所以每个神经元最终的输出代表一种种类的类别概率估计。
卷积层部分代码
使用Docker部署
为什么基于docker进行部署
- 跨平台
主要处于考虑可能未来服务要部署在Windows平台,也要部署在linux平台。既要部署在客户端也要部署于服务端的可能性考虑。
- 易部署集群服务
使用Docker比较容易部署集群服务。只需要导入对应的镜像,就可以开启一个容器作为服务,可以提高并发服务。
导出模型
基于Keras训练好的模型,最后还需要部署,由于Keras使用了tensorflow作为后端,所以最后还需要将模型导出为tensorflow能识别的模型格式。如图所示为导出的训练好的模型数据文件。
03083399-9080-4935-8600-2568E68E93F2.png
构建基于ubuntu14.04的服务端环境
Dockerfile
FROM ubuntu:14.04
RUN echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list \
&& sudo apt-get update \
&& sudo apt-get install -y --force-yes tensorflow-model-server
&& sudo apt-get install -y --force-yes vim
COPY ./qt_picture_type_model ./start_qt_picture_classify_serving.sh /root/
相关的依赖,如服务端和训练好的模型数据依赖我都编写进dockerfile
使用docker build命令执行这个Dockerfile即可生成对应需要的服务端环境,并自动拷贝模型到容器中。
开启服务
在终端中执行如下命令
docker run -itd --restart=always -p 9000:6000 sweetcs/tf_serving:v1_0_4 /bin/bash -c '/root/start_qt_picture_classify_serving.sh'
基于GRPC的通信协议的客户端依赖库编写
(略)
训练中遇到的几个痛点
- 提供的数据分类粗糙
提供的分类数据过于粗糙,有很多数据是分类分错。主要由于前期没有积累更多更细致的数据。
- 数据过拟合
数据拟合这个问题,后面排查主要由于做数据增强的时候数据出现问题,有的数据再增强后可能会变成更像是另外一种类别的数据。如图下图,是一个弹框图片,经过数据增强后已经不具备弹框的特点, 可能会被归类于正常图片。
_0_5031.jpg
- 分类还不够细
后续可能要优化的是做更精细的分类,例如现在可以比较准确的区分出弹框,但是还不能够区分出异常的弹框和正常的弹框。
深度学习的研究方向
- 图像分割。
- 图像解析。
- 语言识别。
- 行为识别。
- 自然语言处理等。
- 聊天机器人、自动新闻采集撰写等。
网友评论