一份不可多得的深度学习技巧指南
来源:52AI人工智能
常言道,师傅领进门,修行靠个人,相信很多人或多或少是在别人的建议或带领下步入深度学习这个大坑,然后师傅说深度学习是个玄学,后面就靠个人修行,瞬间就懵了对不对?可能后面经过自己的磨盘滚打,不断实验积累相关经验,会有一些自己的学习心得。本文可谓是深度学习中的一份秘籍,帮助你少走一些弯路。在本文中,列举了一些常用的机器学习的训练技巧,目的是对这些技巧进行简单的介绍并说明它们的工作原理。另外一些建议是斯坦福的CS231n课程及之前总结的网络结构。
本文的目录如下:
数据预处理
初始化
训练
正则化
网络结构
自然语言处理
增强学习
网络压缩
数据预处理
(本部分原作者没有写,以个人的理解及相关补充这部分内容)
What:输入神经网络数据的好坏直接关系着网络训练结果,一般需要对数据进行预处理,常用的数据预处理方式有:
去均值:每个原始数据减去全部数据的均值,即把输入数据各个维度的数据都中心化到0;
归一化:一种方式是使用去均值后的数据除以标准差,另外一种方式是全部数据都除以数据绝对值的最大值;
PCA/白化:这是另外一种形式的数据预处理方式,一种方式是降维处理,另外一种是进行方差处理;
Why:通过对数据进行预处理能够使得它们对模型的影响具有同样的尺度或其他的一些目的。
Ref:CS231n Convolutional Neural Networks for Visual Recognition.
初始化
What:权重若初始化合理能够提升性能并加快训练速度,偏置一般设置为0,对于权重而言,建议统一到一定区间内:
对于线性层[1]:区间为[-v,v],v = 1/sqrt(输入尺寸),sqrt表示开根号;
对于卷积层[2]:区间为[-v,v],v = 1/sqrt(卷积核的宽度x卷积核的高度x输入深度);
批量标准化[3]在某些方面的应用降低了调整权值初始化的需要,一些研究结果页提出了相应的替代公式。
Why:使用默认的初始化,每个神经元会随着输入数量的增多而存在一个方差,通过求根号缩放每个权重能确保神经元有近似的输出分布。
Ref:
1.Stochastic Gradient Descent Tricks, Leon Bottou;
2.在Torch中默认这么操作;
3.Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, S. Ioffe and C. Szegedy;
What:对于长短期记忆网络(LSTM),遗忘偏置一般设置为1,可以加快训练过程。
Why:直觉是训练开始时,想要信息在细胞之间传播,故不希望细胞忘记它的状态。
Ref:An Empirical Exploration of Recurrent Network Architectures, Rafal Jozefowicz et al.
What:对于t-分布领域嵌入算法(t-SNE),原作者建议对于大小为5000~10000之间的数据集,将困惑度设置为5和50之间[1],对于更大的数据集,相应的困惑度也会增。
Why:困惑度决定了每个点的高斯分布的方差大小,更小的困惑度将获得更多的集群,大的困惑度与之相反,太大的困惑度没有任何意义;另外需要考虑的是画出的聚类不能保留原有的规模,聚类之间的距离不一定代表原始的空间几何,不同的困惑度能在数据结构上提供互补的信息,每次运行都会产生不同的结果[2]。
Ref:
1.Visualizing High-Dimensional Data Using t-SNE, L.J.P. van der Maaten.
2.How to Use t-SNE Effectively, Wattenberg, et al., Distill, 2016.
训练
What:除了使用真值硬化目标外,同样可以使用软化目标(softmax输出)训练网络。
Ref:Distilling the Knowledge in a Neural Network / Dark knowledge, G. Hinton et al.
What:学习率可能是需要调参中最重要的一个参数,一种策略是选择一些参数均有随机化学习率,并观察几次迭代后的测试误差。
参数 |
什么情况下增加性能 |
原因 |
注意事项 |
隐藏节点的数量 |
增加 |
增加隐藏节点的数量提升了模型的表示能力 |
隐藏节点的增加会增加模型每次操作的时间和内存代价 |
学习率 |
调整优化 |
一个不合适的学习率会导致模型效率很低 |
|
卷积核的宽度 |
增加 |
增大核宽度提升模型的参数个数 |
更宽的核导致一个更窄的输出维度 |
隐性的零填充 |
增加 |
在卷积前补零保持大尺寸的表示 |
增加了大多数操作的时间和内存代价 |
权值衰减系数 |
降低 |
降低权值衰减系数释放模型的参数 |
|
Dropout的概率 |
降低 |
丢失更少的节点使得单元有更多的机会去拟合训练集 |
Ref:Some advice for tuning the hyperparameters. Ref: Goodfellow et al 2016 Book
正则化
What:在RNN中使用Dropout,它仅仅应用于非循环连接[1],但是一些最近的文章提出了一些技巧使得Dropout能应用于循环连接[2]。
Ref:
1.Recurrent Neural Network Regularization, Wojciech Zaremba et al.
2.Recurrent Dropout without Memory Loss, Stanislau Semeniuta et al.
What:批量标准化(Batch Normalization, BN),增添了一个新的层,作者给出一些额外的技巧加速BN层的工作:
增大学习率;
移除/减少dropout:在不增加过拟合发生的条件下加快训练;
移除/减少L2范数权值归一化;
加快学习率衰减速度:使得网络训练更快;
移除局部响应归一化;
将训练样本打乱地更彻底:防止相同的样本总出现在小批量中(验证集上提高了1%);
减少光度失真;
Why:一些好的解释在此。
Ref:Accelerating Deep Network Training by Reducing Internal Covariate Shift, S. Ioffe and C. Szegedy.
网络结构
What:使用跳跃式连接,直接将中间层连接到输入/输出层。
Why:作者的观点是通过减少神经网络的底端与顶端之间的处理步骤使得训练深层网络更加简单,并减轻梯度消失问题。
When:在一些CNN结构中或RNN中一些重要的层。
Ref:Generating Sequences With Recurrent Neural Networks, Alex Grave et al.
RNN的跳跃式连接例子
What:为LSTM增加窥视孔连接(连接之前输出到门的输入),根据作者的观点,这个操作对长时间依赖关系有用。
Ref:Learning Precise Timing with LSTM Recurrent Networks, Felix A. Gers et al.
What:大多数的深度学习框架提供了一个结合SoftMax和Log的函数或者是在损失函数中计算SoftMax(在Tensorflow中是softmax_cross_entropy_with_logits,在Torch中是nn.LogSoftMax),这些应该被更好地使用。
Why:Log(SoftMax)在数值上不稳定是小概率,从而导致溢出等不良结果。另外一种流行的方法是在Log中加入一些小数避免不稳定。
自然语言处理(NLP)
What:对于RNN和seq2seq模型的一些技巧:
嵌入尺寸:1024或620。更小的维度比如256也能导致很好的表现,但是更高的维度不一定导致更好的表现;
对于译码器而言:LSTM>GRU>Vanilla-RNN;
2-4层似乎普遍足够,但带有残差的更深网络看起来很难收敛,更多去挖掘更多的技巧;
Resd(密集的残差连接)>Res(近连接先前层)>无残差连接;
对于编码器而言:双向>单向(反向输入)>单向;
注意力(加法)>注意力(乘法)>无注意力;
使用光束会导致更好的结果;
Ref:Massive Exploration of Neural Machine Translation Architectures, Denny Britz, Anna Goldie et al.
What:对于seq2seq而言,翻转输入序列的顺序,保持目标序列的完整。
Why:根据作者的观点,这种简单的数据变换极大提升了LSTM的性能。
Ref:Sequence to Sequence Learning with Neural Networks, Ilya Sutskever et al.
What:对于seq2seq而言,为编码器和译码器网络使用不同的权值。
Ref:Sequence to Sequence Learning with Neural Networks, Ilya Sutskever et al.
What:当训练时,强制更正译码器的输入;在测试时,使用先前的步骤,这使得训练在开始时非常高效,Samy等人提出了一种基于模型转变的改进方法[1]。
Ref:1.Scheduled Sampling for Sequence Prediction with Recurrent Neural Networks, Samy Bengio et al.
What:以无监督的方式训练一个网络去预测文本的下一个字符(char-RNN),该网络将学习一种能用来监督任务的表示(比如情感分析)。
Ref:Learning to Generate Reviews and Discovering Sentiment, Ilya Sutskever et al.
增强学习
What:异步:以不同的勘探政策同时训练多个代理,提升了鲁棒性。
Ref:Asynchronous Methods for Deep Reinforcement Learning, V. Mnih.
What:跳帧:每隔4帧计算一次动作,而不是每帧都计算,对于其它帧,重复这个动作。
Why:在Atari游戏中工作得很好,并且使用这个技巧以大约4倍的速度加快了训练过程。
Ref:Playing Atari with Deep Reinforcement Learning, V. Mnih.
What:历史:不是仅仅将当前帧作为输入,而是将最后的帧与输入叠加,结合间隔为4的跳帧,这意味着我们有一个含t、t-4、t-8及t-12的帧栈。
Why:这允许网络有一些动量信息。
Ref:Deep Reinforcement Learning with Double Q-learning, V. Mnih.
What:经验回放:为了避免帧间的相关性,作为一个代理不是更新每一帧,最好是在过渡时期的历史中采样一些样本,该思想类似于有监督学习中训练前打乱数据集。
Ref:Prioritized Experience Replay, Tom Schaul et al.
What:Parallel Advantage Actor Critic(PAAC):通过代理的经验以及使用一个单一的同步更新模型使得简化A3C算法成为可能。
Ref:Efficient Parallel Methods for Deep Reinforcement Learning, Alfredo V. Clemente et al.
网络压缩
What:在推理中,为了减少层数,通过批量归一化(BN)层能够吸收其它的权值。这是因为在测试时批量归一化进行地是一个简单的线性缩放。
作者信息
Conchylicultor,谷歌大脑参与者,专注于机器学习和软件开发。
Linkedin:https://www.linkedin.com/in/potetienne/
Mail:etiennefg.pot@gmail.com
本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。
文章原标题《Deep Learning Tricks》,作者:Conchylicultor,译者:海棠,审阅:
文章为简译,更为详细的内容
请查看://www.52ai.com/AIjiaocheng/3832.html
以往的人脸识别主要是包括人脸图像采集、人脸识别预处理、身份确认、身份查找等技术和系统。现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测、行人跟踪、甚至到了动态物体的跟踪。由此可以看出,人脸识别系统已经由简单的图像处理发展到了视频实时处理。而且算法已经由以前的Adaboots、PCA等传统的统计学方法转变为CNN、RCNN等深度学习及其变形的方法。现在也有相当一部分人开始研究3维人脸识别识别,这种项目目前也受到了学术界、工业界和国家的支持。
首先看看现在的研究现状。如上的发展趋势可以知道,现在的主要研究方向是利用深度学习的方法解决视频人脸识别。
主要的研究人员:
如下:中科院计算所的山世光教授、中科院生物识别研究所的李子青教授、清华大学的苏光大教授、香港中文大学的汤晓鸥教授、Ross B. Girshick等等。
主要开源项目:
SeetaFace人脸识别引擎。该引擎由中科院计算所山世光研究员带领的人脸识别研究组研发。代码基于C++实现,且不依赖于任何第三方的库函数,开源协议为BSD-2,可供学术界和工业界免费使用。github链接:
https://github.com/seetaface/SeetaFaceEngine
主要软件API/SDK:
face++。Face++.com 是一个提供免费人脸检测、人脸识别、人脸属性分析等服务的云端服务平台。Face++是北京旷视科技有限公司旗下的全新人脸技术云平台,在黑马大赛中,Face++获得年度总冠军,已获得联想之星投资。
skybiometry.。主要包含了face detection、face recognition、face grouping。
主要的人脸识别图像库:
目前公开的比较好的人脸图像库有LFW(Labelled Faces in the Wild)和YFW(Youtube Faces in the Wild)。现在的实验数据集基本上是来源于LFW,而且目前的图像人脸识别的精度已经达到99%,基本上现有的图像数据库已经被刷爆。下面是现有人脸图像数据库的总结:
现在在中国做人脸识别的公司已经越来越多,应用也非常的广泛。其中市场占有率最高的是汉王科技。主要公司的研究方向和现状如下:
汉王科技:汉王科技主要是做人脸识别的身份验证,主要用在门禁系统、考勤系统等等。
科大讯飞:科大讯飞在香港中文大学汤晓鸥教授团队支持下,开发出了一个基于高斯过程的人脸识别技术–Gussian face, 该技术在LFW上的识别率为98.52%,目前该公司的DEEPID2在LFW上的识别率已经达到了99.4%。
川大智胜:目前该公司的研究亮点是三维人脸识别,并拓展到3维全脸照相机产业化等等。
商汤科技:主要是一家致力于引领人工智能核心“深度学习”技术突破,构建人工智能、大数据分析行业解决方案的公司,目前在人脸识别、文字识别、人体识别、车辆识别、物体识别、图像处理等方向有很强的竞争力。在人脸识别中有106个人脸关键点的识别。
人脸识别主要分为四大块:人脸定位(face detection)、 人脸校准(face alignment)、 人脸确认(face verification)、人脸鉴别(face identification)。
人脸定位(face detection):
对图像中的人脸进行检测,并将结果用矩形框框出来。在openCV中有直接能拿出来用的Harr分类器。
人脸校准(face alignment):
对检测到的人脸进行姿态的校正,使其人脸尽可能的”正”,通过校正可以提高人脸识别的精度。校正的方法有2D校正、3D校正的方法,3D校正的方法可以使侧脸得到较好的识别。 在进行人脸校正的时候,会有检测特征点的位置这一步,这些特征点位置主要是诸如鼻子左侧,鼻孔下侧,瞳孔位置,上嘴唇下侧等等位置,知道了这些特征点的位置后,做一下位置驱动的变形,脸即可被校”正”了。如下图所示:
这里介绍一种MSRA在14年的技术:Joint Cascade Face Detection and Alignment(ECCV14)。这篇文章直接在30ms的时间里把detection和alignment都给做了。
人脸确认(face verification):
Face verification,人脸校验是基于pair matching的方式,所以它得到的答案是“是”或者“不是”。在具体操作的时候,给定一张测试图片,然后挨个进行pair matching,matching上了则说明测试图像与该张匹配上的人脸为同一个人的人脸。一般在小型办公室人脸刷脸打卡系统中采用的(应该)是这种方法,具体操作方法大致是这样一个流程:离线逐个录入员工的人脸照片(一个员工录入的人脸一般不止一张),员工在刷脸打卡的时候相机捕获到图像后,通过前面所讲的先进行人脸检测,然后进行人脸校正,再进行人脸校验,一旦match结果为“是”,说明该名刷脸的人员是属于本办公室的,人脸校验到这一步就完成了。在离线录入员工人脸的时候,我们可以将人脸与人名对应,这样一旦在人脸校验成功后,就可以知道这个人是谁了。上面所说的这样一种系统优点是开发费用低廉,适合小型办公场所,缺点是在捕获时不能有遮挡,而且还要求人脸姿态比较正(这种系统我们所有,不过没体验过)。下图给出了示意说明:
人脸识别(face identification/recognition):
Face identification或Face recognition,人脸识别正如下图所示的,它要回答的是“我是谁?”,相比于人脸校验采用的pair matching,它在识别阶段更多的是采用分类的手段。它实际上是对进行了前面两步即人脸检测、人脸校正后做的图像(人脸)分类。
根据上面四个概念的介绍,我们可以了解到人脸识别主要包括三个大的、独立性强的模块:
我们将上面的步骤进行详细的拆分,得到下面的过程图:
现在随着人脸识别技术的发展,人脸识别技术主要分为了三类:一是基于图像的识别方法、二是基于视频的识别方法、三是三维人脸识别方法。
基于图像的识别方法:
这个过程是一个静态的图像识别过程,主要利用图像处理。主要的算法有PCA、EP、kernel method、 Bayesian Framwork、SVM 、HMM、Adaboot等等算法。但在2014年,人脸识别利用Deep learning 技术取得了重大突破,为代表的有deepface的97.25%、face++的97.27%,但是deep face的训练集是400w集的,而同时香港中文大学汤晓鸥的Gussian face的训练集为2w。
基于视频的实时识别方法:
这个过程可以看出人脸识别的追踪过程,不仅仅要求在视频中找到人脸的位置和大小,还需要确定帧间不同人脸的对应关系。
参考论文(资料):
1. DeepFace论文。DeepFace:Closing the Gap to Human-level Performance in Face Verificaion
2. 卷积神经网络了解博客。http://blog.csdn.net/zouxy09/article/details/8781543
3. 卷积神经网络的推导博客。http://blog.csdn.net/zouxy09/article/details/9993371/
4. Note on convolution Neural Network.
5. Neural Network for Recognition of Handwritten Digits
6. DeepFace博文:http://blog.csdn.net/Hao_Zhang_Vision/article/details/52831399?locationNum=2&fps=1
DeepFace是FaceBook提出来的,后续有DeepID和FaceNet出现。而且在DeepID和FaceNet中都能体现DeepFace的身影,所以DeepFace可以谓之CNN在人脸识别的奠基之作,目前深度学习在人脸识别中也取得了非常好的效果。所以这里我们先从DeepFace开始学习。
在DeepFace的学习过程中,不仅将DeepFace所用的方法进行介绍,也会介绍当前该步骤的其它主要算法,对现有的图像人脸识别技术做一个简单、全面的叙述。
face detection -> face alignment -> face verification -> face identification
haar分类器:
人脸检测(detection)在opencv中早就有直接能拿来用的haar分类器,基于Viola-Jones算法。
Adaboost算法(级联分类器):
1.参考论文: Robust Real-Time face detection 。
2. 参考中文博客:http://blog.csdn.net/cyh_24/article/details/39755661
3. 博客:http://blog.sina.com.cn/s/blog_7769660f01019ep0.html
本文中采用了基于检测点的人脸检测方法(fiducial Point Detector)。
先选择6个基准点,2只眼睛中心、 1个鼻子点、3个嘴上的点。
通过LBP特征用SVR来学习得到基准点。
效果如下:
2D alignment:
对Detection后的图片进行二维裁剪, scale, rotate and translate the image into six anchor locations。 将人脸部分裁剪出来。
3D alignment:
找到一个3D 模型,用这个3D模型把二维人脸crop成3D人脸。67个基点,然后Delaunay三角化,在轮廓处添加三角形来避免不连续。
将三角化后的人脸转换成3D形状
三角化后的人脸变为有深度的3D三角网
将三角网做偏转,使人脸的正面朝前
最后放正的人脸
效果如下:
上面的2D alignment对应(b)图,3D alignment依次对应(c) ~ (h)。
LBP && joint Beyesian:
通过高维LBP跟Joint Bayesian这两个方法结合。
论文: Bayesian Face Revisited: A Joint Formulation
DeepID系列:
将七个联合贝叶斯模型使用SVM进行融合,精度达到99.15%
论文: Deep Learning Face Representation by Joint Identification-Verification
论文中通过一个多类人脸识别任务来训练深度神经网络(DNN)。网络结构如上图所示。
结构参数:
经过3D对齐以后,形成的图像都是152×152的图像,输入到上述网络结构中,该结构的参数如下:
Conv:32个11×11×3的卷积核
max-pooling: 3×3, stride=2
Conv: 16个9×9的卷积核
Local-Conv: 16个9×9的卷积核,Local的意思是卷积核的参数不共享
Local-Conv: 16个7×7的卷积核,参数不共享
Local-Conv: 16个5×5的卷积核,参数不共享
Fully-connected: 4096维
Softmax: 4030维
提取低水平特征:
过程如下所示:
预处理阶段:输入3通道的人脸,并进行3D校正,再归一化到152*152像素大小——152*152*3.
通过卷积层C1:C1包含32个11*11*3的滤波器(即卷积核),得到32张特征图——32*142*142*3。
通过max-polling层M2:M2的滑窗大小为3*3,滑动步长为2,3个通道上分别独立polling。
通过另一个卷积层C3:C3包含16个9*9*16的3维卷积核。
上述3层网络是为了提取到低水平的特征,如简单的边缘特征和纹理特征。Max-polling层使得卷积网络对局部的变换更加鲁棒。如果输入是校正后的人脸,就能使网络对小的标记误差更加鲁棒。然而这样的polling层会使网络在面部的细节结构和微小纹理的精准位置上丢失一些信息。因此,文中只在第一个卷积层后面接了Max-polling层。这些前面的层称之为前端自适应的预处理层级。然而对于许多计算来讲,这是很必要的,这些层的参数其实很少。它们仅仅是把输入图像扩充成一个简单的局部特征集。
后续层:
L4,L5,L6都是局部连接层,就像卷积层使用滤波器一样,在特征图像的每一个位置都训练学习一组不同的滤波器。由于校正后不同区域的有不同的统计特性,卷积网络在空间上的稳定性的假设不能成立。比如说,相比于鼻子和嘴巴之间的区域,眼睛和眉毛之间的区域展现出非常不同的表观并且有很高的区分度。换句话说,通过利用输入的校正后的图像,定制了DNN的结构。
使用局部连接层并没有影响特征提取时的运算负担,但是影响了训练的参数数量。仅仅是由于有如此大的标记人脸库,我们可以承受三个大型的局部连接层。局部连接层的输出单元受到一个大型的输入图块的影响,可以据此调整局部连接层的使用(参数)(不共享权重)
比如说,L6层的输出受到一个74*74*3的输入图块的影响,在校正后的人脸中,这种大的图块之间很难有任何统计上的参数共享。
顶层:
最后,网络顶端的两层(F7,F8)是全连接的:每一个输出单元都连接到所有的输入。这两层可以捕捉到人脸图像中距离较远的区域的特征之间的关联性。比如,眼睛的位置和形状,与嘴巴的位置和形状之间的关联性(这部分也含有信息)可以由这两层得到。第一个全连接层F7的输出就是我们原始的人脸特征表达向量。
在特征表达方面,这个特征向量与传统的基于LBP的特征描述有很大区别。传统方法通常使用局部的特征描述(计算直方图)并用作分类器的输入。
最后一个全连接层F8的输出进入了一个K-way的softmax(K是类别个数),即可产生类别标号的概率分布。用Ok表示一个输入图像经过网络后的第k个输出,即可用下式表达输出类标号k的概率:
训练的目标是最大化正确输出类别(face 的id)的概率。通过最小化每个训练样本的叉熵损失实现这一点。用k表示给定输入的正确类别的标号,则叉熵损失是:
通过计算叉熵损失L对参数的梯度以及使用随机梯度递减的方法来最小化叉熵损失。
梯度是通过误差的标准反向传播来计算的。非常有趣的是,本网络产生的特征非常稀疏。超过75%的顶层特征元素是0。这主要是由于使用了ReLU激活函数导致的。这种软阈值非线性函数在所有的卷积层,局部连接层和全连接层(除了最后一层F8)都使用了,从而导致整体级联之后产生高度非线性和稀疏的特征。稀疏性也与使用使用dropout正则化有关,即在训练中将随机的特征元素设置为0。我们只在F7全连接层使用了dropout.由于训练集合很大,在训练过程中我们没有发现重大的过拟合。
给出图像I,则其特征表达G(I)通过前馈网络计算出来,每一个L层的前馈网络,可以看作是一系列函数:
归一化:
在最后一级,我们把特征的元素归一化成0到1,以此降低特征对光照变化的敏感度。特征向量中的每一个元素都被训练集中对应的最大值除。然后进行L2归一化。由于我们采用了ReLU激活函数,我们的系统对图像的尺度不变性减弱。
对于输出的4096-d向量:
先每一维进行归一化,即对于结果向量中的每一维,都要除以该维度在整个训练集上的最大值。
每个向量进行L2归一化。
该系统中,归一化后的DeepFace特征向量与传统的基于直方图的特征(如LBP)有一下相同之处:
所有值均为负
非常稀疏
特征元素的值都在区间 [0, 1]之间
卡方距离计算公式如下:
文章中也提到了端到端的度量学习方法,一旦学习(训练)完成,人脸识别网络(截止到F7)在输入的两张图片上重复使用,将得到的2个特征向量直接用来预测判断这两个输入图片是否属于同一个人。这分为以下步骤:
a. 计算两个特征之间的绝对差别;
b,一个全连接层,映射到一个单个的逻辑单元(输出相同/不同)。
Social Face Classification Dataset(SFC): 4.4M张人脸/4030人
LFW: 13323张人脸/5749人
restricted: 只有是/不是的标记
unrestricted:其他的训练对也可以拿到
unsupervised:不在LFW上训练
Youtube Face(YTF): 3425videos/1595人
result on LFW:
result on YTF:
DeepFace与之后的方法的最大的不同点在于,DeepFace在训练神经网络前,使用了对齐方法。论文认为神经网络能够work的原因在于一旦人脸经过对齐后,人脸区域的特征就固定在某些像素上了,此时,可以用卷积神经网络来学习特征。
本文的模型使用了C++工具箱dlib基于深度学习的最新人脸识别方法,基于户外脸部数据测试库Labeled Faces in the Wild 的基准水平来说,达到了99.38%的准确率。
更多算法
http://www.gycc.com/trends/face%20recognition/overview/
dlib:http://dlib.net/
数据测试库Labeled Faces in the Wild:http://vis-www.cs.umass.edu/lfw/
模型提供了一个简单的 face_recognition 命令行工具让用户通过命令就能直接使用图片文件夹进行人脸识别操作。
在图片中捕捉人脸特征
在一张图片中捕捉到所有的人脸
找到并处理图片中人脸的特征
找到每个人眼睛、鼻子、嘴巴和下巴的位置和轮廓。
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)
捕捉脸部特征有很重要的用途,当然也可以用来进行图片的数字美颜digital make-up(例如美图秀秀)
digital make-up:https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py
识别图片中的人脸
识别谁出现在照片里
安装步骤
本方法支持Python3/python2,我们只在macOS和Linux中测试过,还不知是否适用于Windows。
使用pypi的pip3 安装此模块(或是Python 2的pip2)
重要提示:在编译dlib时可能会出问题,你可以通过安装来自源(而不是pip)的dlib来修复错误,请见安装手册How to install dlib from source
https://gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf
通过手动安装dlib,运行pip3 install face_recognition来完成安装。
使用方法命令行界面
当你安装face_recognition,你能得到一个简洁的叫做face_recognition的命令行程序,它能帮你识别一张照片或是一个照片文件夹中的所有人脸。
首先,你需要提供一个包含一张照片的文件夹,并且你已经知道照片中的人是谁,每个人都要有一张照片文件,且文件名需要以该人的姓名命名;
然后你需要准备另外一个文件夹,里面装有你想要识别人脸照片;
接下来你只用运行face_recognition命令,程序能够通过已知人脸的文件夹识别出未知人脸照片中的人是谁;
针对每个人脸都要一行输出,数据是文件名加上识别到的人名,以逗号分隔。
如果你只是想要知道每个照片中的人名而不要文件名,可以进行如下操作:
Python模块
你可以通过引入face_recognition就能完成人脸识别操作:
API 文档: https://face-recognition.readthedocs.io.
在图片中自动识别所有人脸
请参照此案例this example: https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py
识别图片中的人脸并告知姓名
请参照此案例this example: https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py
Python代码案例
所有例子在此 here.
https://github.com/ageitgey/face_recognition/tree/master/examples
·找到照片中的人脸Find faces in a photograph
https://github.com/ageitgey/face_recognition/blob/master/examples/find_faces_in_picture.py
· 识别照片中的面部特征Identify specific facial features in a photograph
https://github.com/ageitgey/face_recognition/blob/master/examples/find_facial_features_in_picture.py
· 使用数字美颜Apply (horribly ugly) digital make-up
https://github.com/ageitgey/face_recognition/blob/master/examples/digital_makeup.py
·基于已知人名找到并识别出照片中的未知人脸Find and recognize unknown faces in a photograph based on photographs of known people
https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py
人脸识别方法的原理
如果你想学习此方法的人脸定位和识别原理,请参见read my article。
https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78
注意事项
· 本人脸识别模型仅限用于成人,对于儿童来说效果不佳,模型可能会由于使用默认的对比阈值(0.6)而无法清楚识别出儿童的脸。
github源码:https://github.com/ageitgey/face_recognition#face-recognition
EET电子工程专辑
在自动驾驶汽车技术中,卷积神经网络(CNN)已证明是一种非常强大的道路特征识别工具。卷积神经网络经过工程师们的训练可以检测道路类型和路边的特征。在用于这种训练的各种数据集的帮助下,这种模型会以类似小孩学步那样教汽车学习驾驶技巧。
本文描述了在现有驾驶员评估系统中如何训练和整合CNN模型,同时介绍了这种模型及其改进版本VGGNet的本质,以便更好地理解这一相对未知的课题。VGGNet的使用可以极大地提升预测的精度,特别是考虑到车内驾驶员面前的摄像机时。作为嵌入式系统,驾驶员评估系统的运算能力是非常有限的。工程师团队受命在该模型和现有驾驶员评估系统基础上使用实际世界数据开发CNN,结果发布在本文的总结部分。本文还讨论了CNN的模型集成和训练处理优化,同时强调了神经网络的可重用性。
定期的驾驶员评估是车辆行驶管理和服务行业的一个重要步骤。具有正确反馈措施的定期评估可以提升驾驶员的表现。借助近来机器学习领域中的进步及仪器使用的价值,我们可以很容易地将机密的和精确的数据连接到登录上的中央计算系统。这样的计算机和其它模块一起可以用作一套组合工具来评估驾驶员的表现。
图1:传统的驾驶员评估系统(来源:Einfochips)。
数据块(时间、视频、传感器数据);收集数据块的离线处理;管理员评估
图1对传统驾驶员评估系统进行了简单的描述。类似这样的系统可以用来接受来自不同传感器的数据,然后提供给板载计算机(低等级)进行存储,并完整地传送给离线数据处理单元。当驾驶员过来进行评估时,离线数据处理单元再将数据发布给管理者。
在传统环境中,视频提供的数据,以及来自传感器的数据必须进行人工管理。但众所周知,人工管理容易出错。
鉴于这种情况,能够智能抽象、分类并提取信息的机制将特别管用,特别是在OBD-II的帮助下。下面我们将讨论如何融合/组合这两组信息向驾驶员和管理者产生合理的输出。
在服务器端只有传感器数据是不足以完成驾驶员评估的。比如,让我们看个实时场景:
下坡:一般意味着连续的加速,比方说8到10秒,远远超出发布的极限。这肯定会影响驾驶员驾驶汽车的性能数据。事实上这是一种真阴性(假阳性)情形。我们建议的系统有助于判断上坡和下坡,而检测到真阴性后可以提升驾驶员的评估性能。
图2:基于训练过的神经网络的驾驶员评估系统(来源:Einfochips)。
数据块的智能离线处理;自动生成的成绩单;训练过的神经网络
如上图所示,数据块的离线处理被数据块的智能处理所替代。这种数据处理是在训练过的神经网络帮助下完成的。卷积神经网络可以将连续视频观察任务从人卸载给智能机器。这里的想法是分类特征(在这个例子中的上坡和下坡)并使用这些信息和时间轴上的OBD-II数据判断驾驶员的性能。
NeuralTalk2用于分类图像。它使用卷积神经网络机制分类图像。针对每种检测到的特征,它提供置信值。
图3:一般的深度学习流程图(来源:Einfochips)。
卷积+非线性;合并;完全连接;鸟;日出;海洋;上坡路
神经卷积网络的工作方式:
步骤1:滤波器、参数和权重被分配一定的随机值。权重是指完整连接的网络值,滤波器是卷积滤波器的数量。
步骤2:网络接收输入的图像,开始正向传播(卷积,非线性激活,空间合并,最后进入完全连接(FC)的层),它还寻找每种特征的可能性——参考卷积和非线性部分以及图3中的合并部分。
卷积:f(x)=fD(…f2(f1(x;w1);w2)…),wD)
这里的fd作用是输入一个值xd和一个参数值wd,产生输出结果xd+1。虽然函数的类型和结果是人工的,但参数w=(w1,…,wD)是从训练中学到的。
非线性激活ReLU(调整过的线性单元):
f(x)=max(0, x)
空间合并:
f(x) = max(Stride)
步骤3:计算总误差
总误差 = ∑ ½(目标误差–输出误差)²
步骤4:使用后向传播最大限度地减小误差。为了做到这点,先获得相对权重的梯度误差,然后使用梯度下降更新滤波器的值和参数,以尽量减小输出误差。这里发生改变的是滤波器值,连接权重也得到了更新。这是在完全连接层完成的。
w=wi–ƞ×dL/dw
w=权重
wi=初始权重
ƞ=学习速率
由于这个应用与驾驶员评估有关,因此他/她驾驶时所处的场景或场景是最重要的,而不是单单仪器读数。为了理解这种场景(让我们想象一条路),我们需要一个非常好的分类器。为了克服这个问题,我们可以使用内部使用VGGNet的NeuralTalk2。VGGNet是一种卷积网络,最擅于识别物体的位置。它还擅长于分类物体本身。输入是一个图像,输出是概率(图4)。
图4:一般的VGGNet模块(来源:Einfochips)。
VGGNet有这种能力依赖于一种因素。它相信这个因素可以识别/分类图像,这对理解图像的深度是很有用的。深度分析做的越多,图像可以被分类的越精确。换句话说,卷积的越多,物体分类的越好。在VGGNet中有16个卷积层,用于提升预测的精度。CONV层执行3×3卷积,步幅为1,填充为1。POOL层执行2×2最大化合并,步幅为2,填充为0。
在训练阶段一套训练用输入会提供给NeuralTalk2。我们限制训练集为直路、上坡、下坡、弯路、左转和右转。这在以更加有效的方式训练模型中特别有用,因为输入数量是有限的。我们这样做的目的是我们想在进行评估时取得更高的精度。
产生的经过训练的网络/模型专门关注训练集中提到的特征,如上坡、左转和右转。这个模型可以被移植到大多数X86 Linux计算机。
输入传感器:OBD-II是汽车内的一种标准接口。该硬件用于从终端传感器收集OBD-II的发动机转速、热量、速度数据,并将这些数据提供给运算模块作为其输入。
评估仪表板:仪表板将对这些数据进行第一层的分析,它会显示理想的和原始的数据图。当点击原始数据图上的任何点时,它会显示数据集中可用的该点的完整细节。
前置摄像机记录汽车前方的视频。当驾驶员驾驶汽车上坡时,很明显他会踩下更大的油门以维持汽车的推力。随后这些数据连同前置摄像头的视频一起被记录到与硬件相连的存储设备中。
当驾驶员的旅程结束并且在停车场停下来后,这些记录的数据将得到分析。视频和图像通过计算机进行分析,这个计算机中已经内置有训练过的分类模型。除了视频外,转速、速度、热量等其它汽车参数也会被分析。由于计算机已经学会了检测上坡,因此它会自动丢弃不断增加的汽车转速数据,这在传统装置中是不可能的。这种机制在避免错误地驾驶员评估中是很有用的。
现场图像的检测
图5:直线道路的检测(来源:Einfochips)。
图6:下坡路的检测(来源:Einfochips)。
图7:上坡路的检测(来源:Einfochips)。
这种训练过的模型能够以很高的精度识别直路和坡路。
训练算法的伪码
以下是完整的训练算法伪码:
测试算法的伪码
注意:伪码中提到的概率值是假设的。
在有效地针对各种道路类型和特征进行训练后,神经卷积网络本身可以成为未来自动驾驶技术的强有力武器。这种模型也可以集成进软件平台,用于增强现有驾驶员评估系统的精度。还可以用各种数据集对这种神经网络进行再次训练,比如物体识别、物体分类、快照识别等。因此模型很有效率,并且可重复使用。
我们还可以进一步推论,卷积神经网络模型和其它软件整合后将提供更大的灵活性。未来工作可以通过优化模型的总体训练过程得以开展。优化底层库函数和频繁使用的函数可以极大地改善总体训练过程。
量子位
原作:Radu Raice
安妮 编译自 Medium
量子位 出品 | 公众号 QbitAI
这篇文章颇!具!人!气!
软件工程专业的学生Radu Raice近日发表了文章《Want to know how Deep Learning works? Here’s a quick guide for everyone》,不到两天时间就在外网《Medium》上收获了6.9k个赞。
零基础没关系,Raice通过用深度学习搭建预测机票价格模型,教你直观理解深度学习的工作原理。
莫急莫急,想学习深度学习的工作原理,你得先通过一个入学测试才行。
Q1:你了解监督学习吗?
监督学习应用了包含输入和期望输出的标记数据集。
用监督学习训练AI时,我们需要给它输入并告诉它期望输出值。当AI输出有误时,它将重新调整计算。这个过程在数据集中反复进行,直到AI不再犯错。
Q2:你了解无监督学习吗?
用无监督学习训练数据时,你让AI对数据进行分类。
比如用AI预测网店的销量,没有标记了输入和输出的数据集供它使用,它将创造自己的输入数据分类,告诉你哪种类型的用户更可能购买哪些不同的产品。
比如用AI预测网店的销量,没有标记了输入和输出的数据集供它使用,它将创造自己的输入数据分类,告诉你哪种类型的用户更可能购买哪些不同的产品。
深度学习的工作原理
恭喜通过入学测试!
其实,深度学习是机器学习里的一个分支,让我们在给定输入上训练AI预测输出。训练AI需要会用到监督学习和无监督学习。
在这篇文章中,我们通过构建一个机票价格预测工具了解机器学习的原理,之后用监督学习的方法训练它。
为了对新手友好,我们排除了往返机票等复杂情况,仅用以下四种输入:
出发机场
到达机场
出发日期
航线名
神经网络好比AI的大脑。
与动物类似,这个AI机票价格预测工具的大脑也有神经元。下图中的圆圈就代表神经元,它们是互相连接的。
这些神经元被分为三种不同类型的层:
输入层(input layer)
隐藏层(hidden layer)
输出层(output layer)
输入层负责接收输入数据。在这个预测工具中,输入层主要包含四个神经元,分别为起始机场、到达机场、出发日期和航线名。接收到这些信息后,它将输入数据传递到第一个隐藏层。
隐藏层负责对输入数据进行数学运算。如何决定隐藏层的数量、以及每层神经元的数量仍是构建神经网络的挑战。
输出层返回输出数据。在本例中,它会给出预测的机票价格。
所以,这个工具到底是怎样计算机票价格的呢?答案是深度学习。
每个神经元间靠权重(weight)连接,它决定了输入值的重要性。初始权重是随机设置的。
在预测机票价格时,出发日期是对价格影响较大的因素。所以,出发日期神经元连接的权重会比较大。
每个神经元都有一个激活函数。不过,因为这篇文章是新手友好向,我们不讲解相关的数学推理。
简单来说,激活函数的目的是将神经元的输出“标准化”。
一旦一组输入数据传递到了神经元的所有层,它将会通过输出层再将输出数据返回。
走到训练这一步,你又要开始新挑战了,训练难就难在你不仅没有大数据集,而且还很难满足所需的强大计算能力。
想做机票价格预测工具,我们必须找到票价信息的历史数据。由于机场和出发日期的组合有很多种可能,因此这个票价列表信息也非常庞大。
为了训练AI,我们需要给它提供来自数据集的输入,并将AI的输出和数据集中的真实输出做对比。因为还没有经过训练,所以AI的输出还是错误的。
一旦将整个数据集中所有数据输入完成,我们就可以创建一个代价函数,它能显示AI的输出与实际输出的差异。
理想情况下,我们希望代价函数是0,此时AI的输出就等于真实输出。
还记得上面章节中提到的权重吗,在减少代价函数的操作中,权重起着至关重要的作用。
改变神经元间的权重可以调整代价函数,我们可以随机改变它们直到代价函数接近0,但这种方法很低效。
在这种情况下,梯度下降(Gradient Descent)闪亮登场。
梯度下降是一种寻找函数最小值的方法,寻找机票价格模型中的代价函数最小值也得用它。
梯度下降的工作原理是在数据集的每次迭代后,以很小的增量改变权重。通过计算确定权重代价函数的导数(或梯度),我们可以看到最小值的方向。
为了使代价函数最小,我们需要用强大的计算力多次循环访问数据集。
深度学习的魔力就在于,使用梯度下降法更新权重是自动完成的。就这样,我们的机票价格预测小工具就完成了。
这篇文章只是入门深度学习的第一步,入坑深度学习任重而道远,还有许多其他类型的神经网络需要你了解,比如计算机视觉的卷积神经网络和自然语言处理的递归神经网络等。
如果你想了解深度学习的应用技术,建议你选择一门在线课程。我觉得Andrew Ng的Deeplearning.ai课程不错。
深度学习需要神经网络模仿动物的智力。
一个神经网络中有三种神经元层,即输入层、隐藏层和输出层。
神经元之间的连接与权重有关,它决定了输入值的重要性。
将激活函数应用到数据中,可以使神经元的输出标准化。
为了训练神经网络,你需要一个大数据集。
迭代数据集和对比输出将产生一个代价函数,显示AI的输出与真实输出之间的差异。
数据集的每一次迭代后,神经元之间的权重会通过梯度下降的方式,降低代价函数的值。
想进一步讨论,可以在文章下方留言。
附原文地址:
https://medium.freecodecamp.org/want-to-know-how-deep-learning-works-heres-a-quick-guide-for-everyone-1aedeca88076
深度学习的工作原理你了解了吗?
人工智能赛博物理操作系统
AI-CPS OS
“人工智能赛博物理操作系统”(新一代技术+商业操作系统“AI-CPS OS”:云计算+大数据+物联网+区块链+人工智能)分支用来的今天,企业领导者必须了解如何将“技术”全面渗入整个公司、产品等“商业”场景中,利用AI-CPS OS形成数字化+智能化力量,实现行业的重新布局、企业的重新构建和自我的焕然新生。
AI-CPS OS的真正价值并不来自构成技术或功能,而是要以一种传递独特竞争优势的方式将自动化+信息化、智造+产品+服务和数据+分析一体化,这种整合方式能够释放新的业务和运营模式。如果不能实现跨功能的更大规模融合,没有颠覆现状的意愿,这些将不可能实现。
领导者无法依靠某种单一战略方法来应对多维度的数字化变革。面对新一代技术+商业操作系统AI-CPS OS颠覆性的数字化+智能化力量,领导者必须在行业、企业与个人这三个层面都保持领先地位:
重新行业布局:你的世界观要怎样改变才算足够?你必须对行业典范进行怎样的反思?
重新构建企业:你的企业需要做出什么样的变化?你准备如何重新定义你的公司?
重新打造自己:你需要成为怎样的人?要重塑自己并在数字化+智能化时代保有领先地位,你必须如何去做?
AI-CPS OS是数字化智能化创新平台,设计思路是将大数据、物联网、区块链和人工智能等无缝整合在云端,可以帮助企业将创新成果融入自身业务体系,实现各个前沿技术在云端的优势协同。AI-CPS OS形成的数字化+智能化力量与行业、企业及个人三个层面的交叉,形成了领导力模式,使数字化融入到领导者所在企业与领导方式的核心位置:
精细:这种力量能够使人在更加真实、细致的层面观察与感知现实世界和数字化世界正在发生的一切,进而理解和更加精细地进行产品个性化控制、微观业务场景事件和结果控制。
智能:模型随着时间(数据)的变化而变化,整个系统就具备了智能(自学习)的能力。
高效:企业需要建立实时或者准实时的数据采集传输、模型预测和响应决策能力,这样智能就从批量性、阶段性的行为变成一个可以实时触达的行为。
不确定性:数字化变更颠覆和改变了领导者曾经仰仗的思维方式、结构和实践经验,其结果就是形成了复合不确定性这种颠覆性力量。主要的不确定性蕴含于三个领域:技术、文化、制度。
边界模糊:数字世界与现实世界的不断融合成CPS不仅让人们所知行业的核心产品、经济学定理和可能性都产生了变化,还模糊了不同行业间的界限。这种效应正在向生态系统、企业、客户、产品快速蔓延。
AI-CPS OS形成的数字化+智能化力量通过三个方式激发经济增长:
创造虚拟劳动力,承担需要适应性和敏捷性的复杂任务,即“智能自动化”,以区别于传统的自动化解决方案;
对现有劳动力和实物资产进行有利的补充和提升,提高资本效率;
人工智能的普及,将推动多行业的相关创新,开辟崭新的经济增长空间。
给决策制定者和商业领袖的建议:
超越自动化,开启新创新模式:利用具有自主学习和自我控制能力的动态机器智能,为企业创造新商机;
迎接新一代信息技术,迎接人工智能:无缝整合人类智慧与机器智能,重新
评估未来的知识和技能类型;
制定道德规范:切实为人工智能生态系统制定道德准则,并在智能机器的开
发过程中确定更加明晰的标准和最佳实践;
重视再分配效应:对人工智能可能带来的冲击做好准备,制定战略帮助面临
较高失业风险的人群;
开发数字化+智能化企业所需新能力:员工团队需要积极掌握判断、沟通及想象力和创造力等人类所特有的重要能力。对于中国企业来说,创造兼具包容性和多样性的文化也非常重要。
子曰:“君子和而不同,小人同而不和。” 《论语·子路》云计算、大数据、物联网、区块链和 人工智能,像君子一般融合,一起体现科技就是生产力。
如果说上一次哥伦布地理大发现,拓展的是人类的物理空间。那么这一次地理大发现,拓展的就是人们的数字空间。在数学空间,建立新的商业文明,从而发现新的创富模式,为人类社会带来新的财富空间。云计算,大数据、物联网和区块链,是进入这个数字空间的船,而人工智能就是那船上的帆,哥伦布之帆!
新一代技术+商业的人工智能赛博物理操作系统AI-CPS OS作为新一轮产业变革的核心驱动力,将进一步释放历次科技革命和产业变革积蓄的巨大能量,并创造新的强大引擎。重构生产、分配、交换、消费等经济活动各环节,形成从宏观到微观各领域的智能化新需求,催生新技术、新产品、新产业、新业态、新模式。引发经济结构重大变革,深刻改变人类生产生活方式和思维模式,实现社会生产力的整体跃升。
产业智能官 AI-CPS
用“人工智能赛博物理操作系统”(新一代技术+商业操作系统“AI-CPS OS”:云计算+大数据+物联网+区块链+人工智能),在场景中构建状态感知-实时分析-自主决策-精准执行-学习提升的认知计算和机器智能;实现产业转型升级、DT驱动业务、价值创新创造的产业互联生态链。
长按上方二维码关注微信公众号: AI-CPS,更多信息回复:
新技术:“云计算”、“大数据”、“物联网”、“区块链”、“人工智能”;新产业:“智能制造”、“智能农业”、“智能金融”、“智能零售”、“智能城市”、“智能驾驶”;新模式:“财富空间”、“特色小镇”、“赛博物理”、“供应链金融”。
点击“阅读原文”,访问AI-CPS OS官网
本文系“产业智能官”(公众号ID:AI-CPS)收集整理,转载请注明出处!
版权声明:由产业智能官(公众号ID:AI-CPS)推荐的文章,除非确实无法确认,我们都会注明作者和来源。部分文章推送时未能与原作者取得联系。若涉及版权问题,烦请原作者联系我们,与您共同协商解决。联系、投稿邮箱:erp_vip@hotmail.com