10.理论:卷积神经网络
在卷积网络的卷积层中,一个“神经元”的输出值如何计算?
首先需要在图像的小区域上做上面的像素的加权和。
然后,加权和通过添加偏置b并通过一个激活函数来得到神经元的输出。
卷积神经网络和之前的网络最大的区别在于:
每个神经元会重复使用相同的权重,而在之前看到的完全连接的网络中,每个神经元都有自己的权重。
在上面的gif图中,您可以看到,通过在图像的两个方向(卷积)上滑动权重块,可以获得与图像中的像素一样多的输出值(不过在边缘需要一些填充,一般填充0)。
这里我们使用卷积核的大小为4x4,彩色图像作为输入,想生成一个输出值的平面。
彩色图像有三个通道,因此在动画中,我们需要4x4x3=48个权重。
但是只有一个卷积核还不够。
为了增加更多的自由度,我们用一组不同的权重(用不同的卷积核)重复同样的事情。
这里用了两个卷积核,所以输出的图片,有两个通道。
通过向张量tensor增加一个维度,可以将两个(或多个)权重集重写为一个,这给出了卷积层的权重张量的一般形状。
由于输入和输出通道的数量是参数,我们可以开始叠加和连接卷积层。
最后的输出层问题仍然存在。我们仍然需要把分类的结果输出。
在最后一层,我们仍然只需要10个神经元用于我们的10类数字。
传统上,这是由“max-pooling”最大值—池化层完成的。
即使现在有更简单的方法,“max-pooling”也有助于直观地理解卷积网络是如何操作的:
如果您假设在训练期间,我们的小块权重演变为识别基本形状(水平和垂直线、曲线…)的滤波器。
如果想让信息经过滤波器之后的有效地传到下一层,那么我们只要让图片形状被滤波器识别的强度最大的地方的值传递下去就好。
在实践时的“max-pooling”最大值—池化层中,神经元输出以2x2的区域进行处理,并且仅保留一个最大值。
不过,还有一种更简单的方法:如果以2像素而不是1像素的步幅在图像上滑动补丁,那么获得的输出值也会更少。
这种方法已被证明同样有效,并且今天的卷积网络仅使用卷积层。
让我们开始构建一个用于手写数字识别的卷积网络吧:
我们将在顶部使用三个卷积层,在底部使用传统的softmax读出层,并将它们与一个完全连接的层连接:
注意,为什么第二和第三卷积层输出值的数量从28x28降到14x14,然后是7x7呢?
因为第二和第三卷积层的步长是两个。
对每一层进行分级,使得神经元的数量大约每层下降两倍:
28x28x4≈3000 → 14x14x8≈1500 → 7x7x12≈500 → 200
下一节讲如何实现。