人类获取外界信息最重要的途径就是视觉。要想实现AI,计算机也必须能够理解视觉内容。深度学习,特别是加入了卷积后,在计算机视觉方面取得了突破性进展。由此带来的应用也爆发式的增长。它也是目前热门的自动驾驶技术的基石。

传统神经网络的局限

用我们之前讲过的深度神经网络是否可以完全解决计算机视觉问题呢?我们之前的例子也显示了它在识别人手写数字方面的能力。实际情况是我们之前使用的图片分辨率都很小,计算机还可以处理。目前我们的图片如果按照1000*1000个像素计算,每个像素有R,G,B 3个channel。那么我们的输入层就有300万个输入。如果第一层我们有100个神经元,那么对应第一层的weight值就要有3亿个weight值要算。 这样的计算量对于计算机来说太大,而且因为w太多,训练集就显得不够,容易过拟合。模型精度也不会好。

除此之外,我们之前识别的手写数字他们在整个图片里的位置都在相同地方。每个连接输入层到第一层的weight值功能相对明确固定。比如对于0,在图形中心和四个角的权重就小,其余权重就大。但是对于一个识别一张照片里是否有一个猫的网络,猫可以出现在图片任意位置。这使得传统的神经网络权重调节就会混乱。

什么是卷积神经网络


在计算机视觉里,边缘检测是非常重要的,它是最底层的feature,后边网络层基于形状,以及形状的组合都是基于边缘检测的结果。现在问题来了我们如何检测图片里的边缘呢?


比如上边这个图片,假设它是一个6*6的一个矩阵,只有灰度值。

Filter

我们定义一个Filter,它是一个3*3的矩阵:

你可以把Filter理解成一个扫雷器,用它在原始图片上扫,这个filter对竖直的边界感兴趣。这个扫雷器怎么探测呢?就是用卷积计算。

卷积

一个Filter是一个探雷器,它能探测的面积是3乘3个元素。我们要探测的图片是6乘6个元素。我们现在来探测第一个区域,也就是原图的左上角的3乘3个元素。然后我们把原图所取的3乘3矩阵里对应的元素与相同坐标的Filter里的元素相乘。最后把所有乘积后的元素相加,得到一个输出。你可以把原图的矩阵理解为输入,filter里的值理解为weight值。这就是一个Z函数,目前还没有B值,后边我们会加上。

接下来我们要探测第二个区域,注意,它只是向右滑动1个元素,并不是3个元素:

同理,当第一行元素扫描完了,我们需要纵向移动时,我们也是只移动一个元素:

最终我们得到一个新的矩阵:它的中间两列是30,其余列都为零。这就是它检测到的竖向边缘。因为我们原始图片的像素太少,只有6乘6,可能开起来不太明显,如果我们的元素是60乘60,那么新生成的矩阵就有58乘58个元素。只有最中间的两列不为零,其余元素全为零。可以更明显的看到检测出来的竖直边缘。

最后我们通过一个动画来看:
输入:

filter:

卷积:

关于卷积的定义

在深度学习里,我们定义的卷积和数学或者信号处理课程里谈的卷积有一些区别,那就是不用做翻转。因为在数学里是为了达到结合律。但是在深度学习里,我们就是按上边我们演示的方法把对应坐标的元素相乘,最终累加所得。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: