006深度学习入门——卷积神经网络
内容目录

合集请查看:深度学习入门合集
参考书籍:深度学习入门 基于Python的理论与实现 作者:斋藤康毅

卷积神经网络(Convolutional Neural Network,CNN)

整体结构

较神经网络多出了卷积层(Convolution层)池化层(Pooling层)

之前的神经网络中,相邻层的所有神经元之间都有连接,这成为[[全连接(fully-connected)]]

图例

image.png|950

image.png|750

这可以理解为之前的“Affi ne - ReLU”连接被替换成了“Convolution -ReLU -(Pooling)”连接

卷积层

CNN 中,有时将卷积层的输入输出数据称为特征图(featuremap)。其中,卷积层的输入数据称为输入特征图(input feature map),输出数据称为输出特征图(output feature map)

全连接层的问题

全连接层忽略了数据的形状(例如MNIST数据集中的输入图像是1通道、高28像素、长28像素的(1, 28, 28)形状,但却被排成1列,以784个数据的形式输入到最开始的Affine层)
但是卷积层可以保持形状不变

卷积运算

具体例子:

image.png|425

运算原理

对于输入数据,卷积运算以一定间隔滑动滤波器的窗口并应用。这里所说的窗口是指下图中灰色的3 × 3的部分。如图7-4所示,将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和(有时将这个计算称为乘积累加运算)。然后,将这个结果保存到输出的对应位置。将这个过程在所有位置都进行一遍,就可以得到卷积运算的输出。

image.png|325

也可以添加偏置

image.png|350

填充

在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),这称为填充(padding)

image.png|400

上图就是对大小为(4,4)的输入数据应用了幅度为1的填充。(“幅度为1的填充”是指用幅度为1像素的0填充周围)

使用填充主要是为了调整输出的大小。比如,对大小为(4, 4)的输入数据应用(3, 3)的滤波器时,输出大小变为(2, 2),相当于输出大小比输入大小缩小了 2个元素。这在反复进行多次卷积运算的深度网络中会成为问题。为什么呢?因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为 1,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。在刚才的例子中,将填充的幅度设为 1,那么相对于输入大小(4, 4),输出大小也保持为原来的(4, 4)。因此,卷积运算就可以在保持空间大小不变的情况下将数据传给下一层

步幅

应用滤波器的位置间隔称为步幅(stride)。之前的例子中步幅都是1,如果将步幅设为2,则如下图所示,应用滤波器的窗口的间隔变为2个元素。

image.png|350

在上图的例子中,对输入大小为(7, 7)的数据,以步幅2应用了滤波器。通过将步幅设为2,输出大小变为(3, 3)。像这样,步幅可以指定应用滤波器的间隔。
综上,增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。

假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为(OH, OW),填充为P,步幅为S。此时,输出大小可通过下式进行计算。
$$OH=\frac{H+2P-FH}{S}+1$$
$$OW = \frac{W+2P-FW}{S}+1$$

3维数据的卷积运算

通道方向上有多个特征图时,会按通道进行输入数据和滤波器的卷积运算,并将结果相加,从而得到输出。

例子

image.png|500

运算过程

image.png|375

需要注意的是,在3维数据的卷积运算中,输入数据和滤波器的通道数要设为相同的值。在这个例子中,输入数据和滤波器的通道数一致,均为3。滤波器大小可以设定为任意值(不过,每个通道的滤波器大小要全部相同)。这个例子中滤波器大小为(3, 3),但也可以设定为(2, 2)、(1, 1)、(5, 5)等任意值。再强调一下,通道数只能设定为和输入数据的通道数相同的值(本例中为3)。

结合方块思考

image.png

通道数为C的输入数据和通道数为C,数量为FN的滤波器。最终的结果是数量为FN的输出数据

  • 其中,输入数据形状要按(channel,height, width)的顺序书写
  • 作为4维数据,滤波器的权重数据要按(output_channel, input_channel, height, width)的顺序书写
    (详情见《深度学习入门 基于Python的理论与实现》P211-P213)

批处理

我们希望卷积运算也同样对应批处理。为此,需要将在各层间传递的数据保存为4维数据。具体地讲,就是按(batch_num, channel, height, width)的顺序保存数据。

image.png|550

池化层

池化层的作用

池化是缩小高、长方向上的空间的运算

image.png

除了Max池化之外,还有Average池化等。相对于Max池化是从目标区域中取出最大值,Average池化则是计算目标区域的平均值。在图像识别领域,主要使用Max池化

池化层的特称

  • 没有要学习的参数
    池化层和卷积层不同,没有要学习的参数。池化只是从目标区域中取最大值(或者平均值),所以不存在要学习的参数。

  • 通道数不发生变化
    经过池化运算,输入数据和输出数据的通道数不会发生变化。如下图所示,计算是按通道独立进行的。
    image.png|400

卷积层和池化层的python实现

四维数组

CNN中各层间传递的数据是4维数据。所谓4维数据,比如数据的形状是(10, 1, 28, 28),则它对应10个高为28、长为28、通道为1的数据。

>>> x = np.random.rand(10, 1, 28, 28) # 随机生成数据
>>> x.shape
(10, 1, 28, 28)
# 访问第一个数据
>>> x[0].shape # (1, 28, 28)
>>> x[1].shape # (1, 28, 28)
# 访问第一个数据的第一个通道的空间数据
>>> x[0, 0] # 或者x[0][0]

基于im2col的展开

im2col是一个函数,将输入数据展开以适合滤波器(权重)。如下图所示,对3维的输入数据应用im2col后,数据转换为2维矩阵(正确地讲,是把包含批数量的4维数据转换成了2维数据)。

image.png

使用im2col展开输入数据后,之后就只需将卷积层的滤波器(权重)纵向展开为1列,并计算2个矩阵的乘积即可(参照下图)。这和全连接层的Affi ne层进行的处理基本相同。
image.png

有点像之前神经网络,把(1,28,28)的数据拆成726的一维数组进行运算

具体的python代码实现见《深度学习入门 基于Python的理论与实现》P219-P224

CNN的实现

具体的python代码实现见《深度学习入门 基于Python的理论与实现》P225-P228

上一篇
下一篇