深度学习之CNN笔记

原文链接: http://chenhao.space/post/f4e09fe1.html

卷积神经网络

整体结构

在MLP中,相邻层的所有神经元之间都有连接,这称为全连接(fully-connected)。另外,我们用Affine层实现了全连接层。如果使用这个Affine层,一个5层的全连接的神经网络就可以通过图1所示的网络结 构来实现。

如图1所示,全连接的神经网络中, Affine层后面跟着激活函数ReLU 层(或者 Sigmoid 层)。这里堆叠了 4 层“Affine-ReLU”组合,然后第 5 层是 Affine层, 最后由Softmax层输出最终结果(概率)。

基于全连接层(Affine层)的网络的例子

图2是CNN的一个例子。

基于CNN的网络的例子:新增了Convolution层和Pooling层(用灰色的方块表示)

如 图 2 所 示, CNN 中 新 增 了 Convolution 层 和 Pooling 层。 CNN 的 层的连接顺序是“Convolution - ReLU - ( Pooling) ”(Pooling 层有时会被省 略)。这可以理解为之前的“Affi ne - ReLU” 连接被替换成 了“Convolution ReLU - ( Pooling) ”连接。

还需要注意的是,在图 2 的 CNN 中,靠近输出的层中使用了之前 的“Affi ne - ReLU” 组合。此外,最后的输出层中使用了之前的“Affi ne Softmax” 组合。这些都是一般的CNN中比较常见的结构。

 


卷积层

全连接层存在的问题

全连接的神经网络中使用了全连接层(Affine层)。在全连接 层中,相邻层的神经元全部连接在一起,输出的数量可以任意决定。

**全连接层存在什么问题呢?那就是数据的形状被“忽视”了。比如,输入数据是图像时,图像通常是高、长、通道方向上的3维形状。但是,向全连接层输入时,需要将3维数据拉平为1维数据。**实际上,前面提到的使用 了 MNIST 数据集的例子中,输入图像就是 1 通道、高 28 像素、长 28 像素 的(1, 28, 28)形状,但却被排成1列,以784个数据的形式输入到最开始的 Affine层。

图像是3维形状,这个形状中应该含有重要的空间信息。比如,空间上邻近的像素为相似的值、RBG的各个通道之间分别有密切的关联性、相距 较远的像素之间没有什么关联等,3维形状中可能隐藏有值得提取的本质模 式。但是,因为全连接层会忽视形状,将全部的输入数据作为相同的神经元 (同一维度的神经元)处理,所以无法利用与形状相关的信息。

卷积层可以保持形状不变。当输入数据是图像时,卷积层会以 3 维数据的形式接收输入数据,并同样以3 维数据的形式输出至下一层。因此, 在CNN 中,可以(有可能)正确理解图像等具有形状的数据。

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

 

卷积运算

卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波 器运算”。在介绍卷积运算时,我们来看一个具体的例子。

图3.卷积运算的例子

其中那个(一个圈里面一个*号)符号表示卷积运算。

如图3所示,卷积运算对输入数据应用滤波器。在这个例子中,输入数据是有高长方向的形状的数据,滤波器也一样,有高长方向上的维度。假设用(height, width) 表示数据和滤波器的形状,则在本例中,输入大小是 (4, 4),滤波器大小是(3, 3),输出大小是(2, 2)。另外,有的文献中也会用“核” 这个词来表示这里所说的“滤波器”。

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

图4-1.卷积运算的计算顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LwpI7t6A-1571450932481)(https://chenhao-1300052108.cos.ap-beijing.myqcloud.com/ch-Pic/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/CNN%E5%9B%BE/%E5%9B%BE4-2.png)]

在全连接的神经网络中,除了权重参数,还存在偏置。 CNN中, 滤波 器的参数就对应之前的权重。并且, CNN中也存在偏置。 图3的卷积运算 的例子一直展示到了应用滤波器的阶段。包含偏置的卷积运算的处理流如图 5所示。

如图5所示,向应用了滤波器的数据加上了偏置。偏置通常只有1个 (1 × 1)(本例中,相对于应用了滤波器的4个数据,偏置只有1个),这个值 会被加到应用了滤波器的所有元素上。

图5

 

填充

在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比 如0等),这称为填充(padding),是卷积运算中经常会用到的处理。比如, 在图6的例子中,对大小为(4, 4)的输入数据应用了幅度为1的填充。“幅 度为1的填充”是指用幅度为1像素的0填充周围。

图6

卷积运算的填充处理:向输入数据的周围填入0(图中用虚线表示填充,并省略了 填充的内容“0”)

如图6所示,通过填充,大小为(4, 4)的输入数据变成了(6, 6)的形状。 然后,应用大小为(3, 3)的滤波器,生成了大小为(4, 4)的输出数据。这个例 子中将填充设成了1,不过填充的值也可以设置成2、3等任意的整数。在图5 的例子中,如果将填充设为2,则输入数据的大小变为(8, 8);如果将填充设 为3,则大小变为(10, 10)。

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

 

步幅

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

图7.步幅为2的卷积运算的例子

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

综上,增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。 如果将这样的关系写成算式,会如何呢?接下来,我们看一下对于填充和步 幅,如何计算输出大小。

这里,假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为 (OH, OW),填充为P,步幅为S。此时,输出大小可通过以下公式进行计算。
O H = H + 2 P − F H S + 1 O W = H + 2 P − F W S + 1 OH=\frac{H+2P-FH}{S}+1 \\OW=\frac{H+2P-FW}{S}+1 OH=SH+2PFH+1OW=SH+2PFW+1
现在,我们使用这个算式,试着做几个计算。

例1:图6的例子

输入大小:(4, 4);填充:1;步幅:1;滤波器大小:(3, 3)
O H = 4 + 2 ∗ 1 − 3 1 + 1 = 4 O W = 4 + 2 ∗ 1 − 3 1 + 1 = 4 OH=\frac{4+2*1-3}{1}+1=4 \\OW=\frac{4+2*1-3}{1}+1=4 OH=14+213+1=4OW=14+213+1=4

例2:图7的例子

输入大小:(7, 7);填充:0;步幅:2;滤波器大小:(3, 3)
O H = 7 + 2 ∗ 0 − 3 2 + 1 = 3 O W = 7 + 2 ∗ 0 − 3 2 + 1 = 3 OH=\frac{7+2*0-3}{2}+1=3 \\OW=\frac{7+2*0-3}{2}+1=3 OH=27+203+1=3OW=27+203+1=3

例3

输入大小:(28, 31);填充:2;步幅:3;滤波器大小:(5, 5)
O H = 28 + 2 ∗ 2 − 5 3 + 1 = 10 O W = 31 + 2 ∗ 2 − 5 3 + 1 = 11 OH=\frac{28+2*2-5}{3}+1=10 \\OW=\frac{31+2*2-5}{3}+1=11 OH=328+225+1=10OW=331+225+1=11

如这些例子所示,通过在上述公式中代入值,就可以计算输出大小。这 里需要注意的是,虽然只要代入值就可以计算输出大小,但是所设定的值必 须使公式中的 H + 2 P − F H S \frac{H+2P-FH}{S} SH+2PFH H + 2 P − F W S \frac{H+2P-FW}{S} SH+2PFW分别可以除尽。当输出大小无法 除尽时(结果是小数时),需要采取报错等对策。顺便说一下,根据深度学习 的框架的不同,当值无法除尽时,有时会向最接近的整数四舍五入,不进行 报错而继续运行。

 

3维数据的卷积运算

之前的卷积运算的例子都是以有高、长方向的2维形状为对象的。但是, 图像是3维数据,除了高、长方向之外,还需要处理通道方向。这里,我们按 照与之前相同的顺序,看一下对加上了通道方向的3维数据进行卷积运算的例子。

图8是卷积运算的例子,图9是计算顺序。这里以3通道的数据为例, 展示了卷积运算的结果。和2维数据时(图3的例子)相比,可以发现纵深 方向(通道方向)上特征图增加了。通道方向上有多个特征图时,会按通道 进行输入数据和滤波器的卷积运算,并将结果相加,从而得到输出。

图8.对3维数据进行卷积运算的例子

下面是3维数据进行卷积运算的计算顺序。

图9-1

图9-2

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

 

结合方块思考

将数据和滤波器结合长方体的方块来考虑,3维数据的卷积运算会很 容易理解。方块是如图10所示的3维长方体。把3维数据表示为多维数组时,书写顺序为(channel, height, width) 。比如,通道数为 C、高度为 H、 长度为W的数据的形状可以写成(C, H, W) 。滤波器也一样,要按(channel, height, width) 的顺序书写。比如,通道数为 C、滤波器高度为 FH (Filter Height) 、长度为FW(Filter Width) 时,可以写成(C, FH, FW) 。

图10.结合方块思考卷积运算。请注意方块的形状

在这个例子中,数据输出是1张特征图。所谓1张特征图,换句话说, 就是通道数为1的特征图。那么,如果要在通道方向上也拥有多个卷积运算的输出,该怎么做呢?为此,就需要用到多个滤波器(权重)。用图表示的话, 如图11所示。

图11.基于多个滤波器的卷积运算的例子

图11中,通过应用FN个滤波器,输出特征图也生成了FN个。如果 将这FN个特征图汇集在一起,就得到了形状为(FN, OH, OW)的方块。将 这个方块传给下一层,就是CNN的处理流。

如图 11 所示,关于卷积运算的滤波器,也必须考虑滤波器的数量。因此,作为4维数据,滤波器的权重数据要按(output_channel, input_ channel, height, width) 的顺序书写。比如,通道数为 3、大小为 5 × 5 的滤波器有20个时,可以写成(20, 3, 5, 5)。

卷积运算中(和全连接层一样)存在偏置。在图11的例子中,如果进 一步追加偏置的加法运算处理,则结果如下面的图12所示。

图 12 中,每个通道只有一个偏置。这里,偏置的形状是 (FN, 1, 1), 滤波器的输出结果的形状是(FN, OH, OW)。这两个方块相加时,要对滤波 器的输出结果(FN, OH, OW)按通道加上相同的偏置值。另外,不同形状的 方块相加时,可以基于NumPy的广播功能轻松实现。

图12.卷积运算的处理流(追加了偏置项)

 

批处理

神经网络的处理中进行了将输入数据打包的批处理。之前的全连接神经 网络的实现也对应了批处理,通过批处理,能够实现处理的高效化和学习时 对mini-batch的对应。

我们希望卷积运算也同样对应批处理。为此,需要将在各层间传递的数 据保存为4维数据。具体地讲,就是按(batch_num, channel, height, width) 的顺序保存数据。比如,将图12中的处理改成对N个数据进行批处理时, 数据的形状如图13所示。

图13的批处理版的数据流中,在各个数据的开头添加了批用的维度。 像这样,数据作为4维的形状在各层间传递。这里需要注意的是,网络间传 递的是4维数据,对这N个数据进行了卷积运算。也就是说,批处理将N次 的处理汇总成了1次进行。

图13.卷积运算的处理流(批处理)

 


池化层

池化是缩小高、长方向上的空间的运算。比如,如图14所示,进行将 2 × 2的区域集约成1个元素的处理,缩小空间大小。

图14.Max池化的处理顺序

图14的例子是按步幅2进行2 × 2的Max池化时的处理顺序。“Max 池化”是获取最大值的运算,“2 × 2”表示目标区域的大小。如图所示,从 2 × 2的区域中取出最大的元素。此外,这个例子中将步幅设为了2,所以 2 × 2的窗口的移动间隔为2个元素。另外,一般来说,池化的窗口大小会 和步幅设定成相同的值。比如,3 × 3的窗口的步幅会设为3,4 × 4的窗口 的步幅会设为4等。

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

池化层的特征

  • 没有要学习的参数

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

  • 通道数不发生变化

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AnjLO1sC-1571450932485)(https://chenhao-1300052108.cos.ap-beijing.myqcloud.com/ch-Pic/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/CNN%E5%9B%BE/%E5%9B%BE15.png)]

  • 对微小的位置变化具有鲁棒性(健壮)

    输入数据发生微小偏差时,池化仍会返回相同的结果。因此,池化对 输入数据的微小偏差具有鲁棒性。比如,3 × 3的池化的情况下,如图 16 所示,池化会吸收输入数据的偏差(根据数据的不同,结果有可 能不一致)。

图16

参考资料

  1. 深度学习入门
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值