深度学习7,8章

本文最后更新于:2023年8月20日 中午

深度学习入门.pdf

第 7 章 卷积神经网络 226

卷积神经网络(Convolutional Neural Network, #CNN )。
CNN 被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以 CNN 为基础。

7.1 整体结构 226

CNN 中新出现了卷积层(Convolution 层)和池化层(Pooling 层)。

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


解释:这是用 Affine 层实现的全连接层


解释:这是用 CNN 实现的全连接层,CNN 的层的连接顺序是“Convolution - ReLU -(Pooling)”(Pooling 层有时会被省略)。这可以理解为之前的“Affine - ReLU”连接被替换成了“Convolution -ReLU-(Pooling)”连接。

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

7.2 卷积层 227

7.2.1 全连接层存在的问题 228

全连接层中数据的形状会被”忽视“:
例如,输入数据是图像时,图像通常是高、长、通道方向上的 3 维形状。但是,向全连接层输入时,需要将 3 维数据拉平为 1 维数据

图像是 3 维形状,这个形状中应该含有重要的空间信息。但是,因为全连接层会忽视形状,将全部的输入数据作为相同的神经元(同一维度的神经元)处理,所以无法利用与形状相关的信息。
而卷积层可以保持形状不变。当输入数据是图像时,卷积层会以 3 维数据的形式接收输入数据,并同样以 3 维数据的形式输出至下一层。因此,在 CNN 中,可以(有可能)正确理解图像等具有形状的数据。

另外,CNN 中,有时将卷积层的输入输出数据称为特征图(featuremap)。其中,卷积层的输入数据称为输入特征图(input feature map),输出数据称为输出特征图(output feature map)。本书中将“输入输出数据”和“特征图”作为含义相同的词使用。

7.2.2 卷积运算 228

卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。

计算顺序

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

包含偏置的卷积运算的处理流如图 7-5 所示。
|500

7.2.3 填充 231

填充:在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比
如 0 等),是卷积运算中经常会用到的处理。

例如:
对大小为 (4, 4) 的输入数据应用了幅度为 1 的填充。“幅度为 1 的填充”是指用幅度为 1 像素的 0 填充周围。
|450

使用填充主要是为了调整输出的大小。比如,对大小为 (4, 4) 的输入数据应用 (3, 3) 的滤波器时,输出大小变为 (2, 2),相当于输出大小比输入大小缩小了 2 个元素。如果每次进行卷积都会缩小空间,那么在某个时刻输出大小就可能变为 1 ,导致无法再应用卷积。

7.2.4 步幅 232

步幅:应用滤波器的位置间隔

例如:
|450

增大步幅后,输出大小会变小。而增大填充后,输出大小会变大

假设输入大小为 (H, W),滤波器大小为 (FH, FW),输出大小为 (OH, OW),填充为 P,步幅为 S。输出大小可表示为:

当输出大小无法除尽时(结果是小数时),需要采取报错等对策。有时会向最接近的整数四舍五入,不进行报错而继续运行。

7.2.5 3 维数据的卷积运算 234

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

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

注意:
在 3 维数据的卷积运算中,输入数据和滤波器的通道数要设为相同的值。

在这个例子中,输入数据和滤波器的通道数一致,均为 3 。滤波器大小可以设定为任意值(不过,每个通道的滤波器大小要全部相同)。

7.2.6 结合方块思考 236

|500
在这个例子中,数据输出是 1 张特征图。所谓 1 张特征图,换句话说,就是通道数为 1 的特征图。

那么,如果要在通道方向上也拥有多个卷积运算的输出,该怎么做呢?

为此,就需要用到多个滤波器(权重)。用图表示的话,
|500

作为 4 维数据,滤波器的权重数据要按 (output_channel, input_channel, height, width) 的顺序书写。比如,通道数为 3 、大小为 5 × 5 的滤波器有 20 个时,可以写成 (20, 3, 5, 5)。

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

7.2.7 批处理 238

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

例如:
将图 7-12 中的处理改成对 N 个数据进行批处理时,数据的形状如图 7-13 所示。
|525
解释:
图 7-13 的批处理版的数据流中,在各个数据的开头添加了批用的维度。

7.3 池化层 239

池化运算

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

例如:
图 7-14 的例子是按步幅 2 进行 2 × 2 的 Max 池化时的处理顺序
|500

解释:
“Max 池化”是获取最大值的运算,“2 × 2”表示目标区域的大小。如图所示,从 2 × 2 的区域中取出最大的元素。
此外,这个例子中将步幅设为了 2,所以 2 × 2 的窗口的移动间隔为 2 个元素。另外,一般来说,池化的窗口大小会和步幅设定成相同的值。

除了 Max 池化之外,还有 Average 池化等。Average 池化计算目标区域的平均值。
在图像识别领域,主要使用 Max 池化

池化层的特征

  • 没有要学习的参数

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

  • 通道数不发生变化

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

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

输入数据发生微小偏差时,池化仍会返回相同的结果。因此,池化对输入数据的微小偏差具有鲁棒性

7.4 卷积层和池化层的实现 241

7.4.1 4 维数组 241

如前所述,CNN 中各层间传递的数据是 4 维数据。所谓 4 维数据,比如数据的形状是 (10, 1, 28, 28),则它对应 10 个高为 28 、长为 28 、通道为 1 的数据。用 Python 来实现的话,如下所示。

1
2
3
>>> x = np.random.rand(10, 1, 28, 28) # 随机生成数据
>>> x.shape
(10, 1, 28, 28)

访问第 1 个、第 2 个数据,写 x[0]、x[1]

1
2
>>> x[0].shape # (1, 28, 28)
>>> x[1].shape # (1, 28, 28)

若要访问第 1 个数据的第 1 个通道的空间数据

1
>>> x[0, 0] # 或者x[0][0]

7.4.2 基于 im2col 的展开 242

麻烦地实现卷积:重复若干层 for

NumPy 中存在使用 for 语句后处理变慢的缺点(NumPy 中,访问元素时最好不要用 for 语句)。

简单地实现卷积:用 im2col 这个便利的函数

im2col 这个名称是“image to column”的缩写,翻译过来就是“从图像到矩阵”的意思

im2col 函数:将输入数据展开以适合滤波器(权重)

具体地说,如图 7-18 所示,对于输入数据,将应用滤波器的区域(3 维方块)横向展开为 1 列。im2col 会在所有应用滤波器的地方进行这个展开处理。
|500

解释:
为了便于观察,设置的步幅较大,以使滤波器的应用区域不重叠。而在实际的卷积运算中,滤波器的应用区域几乎都是重叠的,在这种情况下,使用 im2col 展开后,展开后的元素个数会多于原方块的元素个数。因此,使用 im2col 的实现存在比普通的实现消耗更多内存的缺点。但是,汇总成一个大的矩阵进行计算,对计算机的计算颇有益处。

使用 im2col 将输入数据转化为矩阵后,与将卷积层的滤波器(权重)1 列列纵向展开构成的矩阵相乘,得到输出数据的矩阵,最后再把矩阵 reshape 为四维数组保存在 #CNN 中
|500

7.4.3 卷积层的实现 244

7.4.4 池化层的实现 247

7.5 CNN 的实现 249

7.6 CNN 的可视化 253

7.6.1 第 1 层权重的可视化 253

7.6.2 基于分层结构的信息提取 255

7.7 具有代表性的 CNN 256

7.7.1 LeNet 256

7.7.2 AlexNet 257

7.8 小结 258

第 8 章 深度学习 260

8.1 加深网络 260

8.1.1 向更深的网络出发 260

8.1.2 进一步提高识别精度 263

8.1.3 加深层的动机 265

8.2 深度学习的小历史 267

8.2.1 ImageNet 268

8.2.2 VGG 269

8.2.3 GoogLeNet 270

8.2.4 ResNet 271

8.3 深度学习的高速化 273

8.3.1 需要努力解决的问题 273

8.3.2 基于 GPU 的高速化 274

8.3.3 分布式学习 275

8.3.4 运算精度的位数缩减 277

8.4 深度学习的应用案例 278

8.4.1 物体检测 278

8.4.2 图像分割 280

8.4.3 图像标题的生成 281

8.5 深度学习的未来 283

8.5.1 图像风格变换 283

8.5.2 图像的生成 285

8.5.3 自动驾驶 286

8.5.4 Deep Q-Network(强化学习) 287

8.6 小结 289


深度学习7,8章
http://example.com/posts/37925.html
作者
司马吴空
发布于
2023年8月6日
许可协议