在上篇文章中,在一个需求预测示例中看到了神经网络是如何工作的,那么如何将类似类型的想法应用于计算机视觉应用程序。
如果你正在开发人脸识别应用程序,让我们深入研究一下。假设一个神经网络将这样的图片作为输入,并输出图片中的人的身份,这个图像是一千乘一千像素,所以它在计算机中的表示实际上是一千乘一千的网格或者也称为像素强度值的千乘千矩阵,在本例中,像素强度值或像素亮度值,从0到255,所以这里的197是像素的亮度,图像的左上角,185是像素的亮度,一个像素以上,以此类推,到214是这孩子那个图像的右下角。如果你把这些像素强度值展开 成一个矢量,你最终得到一个列表或向量,百万像素强度值百万,因为一千乘一千的平方会给你一百万个数字,所以人脸识别的问题是:你能训练一个神经网络,具有百万像素亮度值的特征矢量,并输出图片中的人的身份,所以这就是你如何建立一个神经网络来执行这项任务。
具体流程:输入图像X被馈送到这层神经元,这是第一个隐藏层,然后提取一些特征,第一个隐藏层的输出被馈送到第二个隐藏层,输出到第三层,最后到输出层,估计这个人是某个特定的人。
有趣的是,如果你观察一个被训练过的神经网络很多人脸图像,并试图可视化这些隐藏的层试图计算什么。事实证明,当你在许多人脸照片上训练一个这样的系统时,你观察隐藏层的不同神经元,找出他们可能在计算什么,这就是你可能会发现的第一个隐藏层,你可能会发现一个神经元在寻找一条垂直线或者像那样的垂直边缘,第二个神经元在寻找像这样的定向线或定向边缘,第三个神经元在那个方向寻找一条线,以此类推,所以在神经网络的最早层中,你可能会发现神经元在寻找非常短的线条或者图像中非常短的边缘,如果你看下一个隐藏层,你会发现这些神经元可能会学会将许多小的短线组合在一起,一些短的边缘段,以便寻找面部的部分,例如,每一个小方盒是神经元试图检测到东西的可视化,所以,第一个神经元看起来像是在试图检测,眼睛在图像的某一位置的存在或不存在,第二个神经元似乎在试图检测鼻子底部,当查看本例中的下一个隐藏层时,神经网络将人脸的不同部分聚集在一起,然后试着检测是否有更大更粗糙的脸型,最后检测人脸与不同脸型的对应程度,创建一组丰富的特性,然后帮助输出层尝试确定人物图片的身份。
神经网络的非凡之处在于你可以在不同的隐藏层上自己学习这些特征检测器,从来没有人告诉你它在第一层寻找短的小边缘,眼睛,鼻子和面部部位在第二层,然后第三层更完整的脸型,神经网络能够从数据中自己找出这些东西,在这个可视化中只有一个注意,第一个隐藏层的神经元看着相对较小的窗口去寻找这些边缘,然后第二,三个隐藏层在一个更大的窗口中寻找,所以这些小神经元的可视化实际上对应于图像中不同大小的区域。
如果你在不同的训练集上训练这个神经网络,在很多侧面的汽车照片上来说,相同的算法,如果被要求检测汽车,那么会在第一层学习边缘,所以非常相似,但随后他们将学会在第二层隐藏层中检测汽车部件,然后在第三个隐藏层更完整的汽车形状,所以只要给它输入不同的数据,神经网络自动学习检测非常不同的特征,从而做出汽车检测的预测,人脸识别或者任何被训练的特定任务。