5.2 卷积
从名称可以看出,卷积运算是卷积神经网络的重要组成。CNN与各种模式精确匹配的能力可归功于卷积运算的使用。这些运算要求复杂的输入,这一点已在上一节说明过。本节将对卷积运算及其参数进行实验。
卷积运算对两个输入张量(输入和卷积核)进行卷积,并输出一个代表来自每个输入的信息的张量
5.2.1 输入和卷积核
通常,TensorFlow中的卷积运算是通过tf.nn.conv2d完成的。对于一些特定用例,TensorFlow还提供了其他卷积运算。在开始实验卷积运算时,推荐使用tf.nn.conv2d。例如,可试验计算两个张量的卷积,并查看结果。
上述代码将创建两个张量,其中input_batch拥有与上一节中的image_batch相似的形状,它是与kernel进行卷积的第一个张量。卷积核(kernel)是一则重要术语,也称为权值、滤波器、卷积矩阵或模板。由于本任务与计算机视觉相关,使用术语“卷积核”便显得十分有用,因为这意味着将它视为图像卷积核。当用于描述TensorFlow中的相应功能时,使用哪种说法并不存在实际差别。在TensorFlow中,这个参数被命名为filter,相应的权值可从训练中习得。卷积核(filter参数)中不同权值的数量决定了需要学习的卷积核的数量。
上述示例代码中包含了一个卷积核(变量kernel的第1维)。该卷积核的作用是返回一个其第1个通道等于原始输入值,第2个通道等于原始输入值两倍的张量。在本例中,通道用于描述一个秩1张量(向量)的元素。通道这个术语来自计算机视觉领域,用于描述输出向量。例如,一幅RGB图像拥有3个代表了秩1张量[red,green,blue]的通道。就目前而言,请忽略strides参数和padding参数(稍后将对其进行介绍),并重点关注卷积运算(tf.nn.conv2d)的输出。
该输出是另一个与input_batch同秩的张量,但其维数与卷积核相同。若input_batch代表一幅图像,它拥有一个通道。在这种情形下,它将被视为一幅灰度图像。该张量中的每个元素都表示这幅图像中的一个像素。该图像中右下角的像素值将为3.0。
可将卷积运算tf.nn.conv2d视为图像(用input_batch表示)和卷积核张量kernel的组合。这两个张量的卷积会生成一幅特征图(feature map)。特征图是一个比较宽泛的术语,但在计算机视觉中,它与使用图像卷积核的运算的输出相关,而现在,特征图通过为输出添加新层代表了这些张量的卷积。
输入图像与输出的特征图之间的关系可结合代码来分析。访问输入批数据和特征图中的元素时使用的是相同的索引。通过访问输入批数据和特征图中位置相同的像素,可了解当输入与kernel进行卷积运算时,它的值是如何改变的。在下面的例子中,图像中右下方的像素经过卷积后的值变为3.0*1.0和3.0*2.0。这些值对应于像素值和kernel中的相应值。
在这个简化的例子中,每幅图像中的每个像素都与卷积核中的相应值相乘,并累加到特征图的相应层中。在这个语境中,“层”是指输出的新维度。在本例中,要想看到卷积的价值是比较困难的。
5.2.2 跨度
在计算机视觉中,卷积的价值体现在对输入(本例中为图像)降维的能力上。一幅2D图像的维数包括其宽度、高度和通道数。如果图像具有较高的维数,则意味着神经网络扫描所有图像以判断各像素的重要性所需的时间呈指数级增长。利用卷积运算对图像降维是通过修改卷积核的strides(跨度)参数实现的。
参数strides使得卷积核可跳过图像中的一些像素,从而在输出中不包含它们。实际上,说这些像素“被跳过”并不十分准确,因为它们仍然会对输出产生影响。strides参数指定了当图像维数较高,且使用了较为复杂的卷积核时,卷积运算应如何进行。当卷积运算用卷积核遍历输入时,它利用这个跨度参数来修改遍历输入的方式。strides参数使得卷积核无需遍历输入的每个元素,而是可以直接跳过某些元素。
例如,假设需要计算一幅较大的图像和一个较大的卷积核之间的卷积运算。在这个例子中,图像的高度为6个像素,宽度为6个像素,而深度为1个通道(6×6×1),卷积核尺寸为(3×3×1)。
通过将kernel在input_batch上滑动,同时跨过(或跳过)某些元素,input_batch与kernel便结合在一起。kernel每次移动时,都将input_batch的一个元素作为中心。然后,位置重叠的值相乘,再将这些乘积相加得到卷积的结果。卷积就是通过这种逐点相乘的方式将两个输入整合在一起的。利用下图可更容易地将卷积运算可视化。
上图所体现的是与之前的代码完全相同的逻辑。两个张量进行了卷积运算,但卷积核会跳过输入中的一些固定数目的元素。strides显著降低了输出的维数,而卷积核允许卷积使用所有的输入值。在输入数据中,没有任何元素在被跳过时被移除,但它仍然变成了一个形状更小的张量。
设置跨度是一种调整输入张量维数的方法。降维可减少所需的运算量,并可避免创建一些完全重叠的感受域。strides参数的格式与输入向量相同,即(image_batch_size_stride、image_height_stride、image_width_stride、image_channels_stride)。第1个和最后一个跨度参数通常很少修改,因为它们会在tf.nn.conv2d运算中跳过一些数据,从而不将这部分数据予以考虑。如果希望降低输入的维数,可修改image_height_stride和image_width_stride参数。
在对输入使用跨度参数时,所面临的一个挑战是如何应对那些不是恰好在输入的边界到达尽头的跨度值。非均匀的跨越通常在图像尺寸和卷积核尺寸与跨度参数不匹配时出现。如果图像尺寸、卷积核尺寸和strides参数都无法改变,则可采取对图像填充边界的方法来处理那些非均匀区域。
5.2.3 边界填充
当卷积核与图像重叠时,它应当落在图像的边界内。有时,两者尺寸可能不匹配,一种较好的补救策略是对图像缺失的区域进行填充,即边界填充。TensorFlow会用0进行边界填充,或当卷积核与图像尺寸不匹配,但又不允许卷积核跨越图像边界时,会引发一个错误。tf.nn.conv2d的零填充数量或错误状态是由参数padding控制的,它的取值可以是SAME或VALID。
SAME:卷积输出与输入的尺寸相同。这里在计算如何跨越图像时,并不考虑滤波器的尺寸。选用该设置时,缺失的像素将用0填充,卷积核扫过的像素数将超过图像的实际像素数。
VALID:在计算卷积核如何在图像上跨越时,需要考虑滤波器的尺寸。这会使卷积核尽量不越过图像的边界。在某些情形下,可能边界也会被填充。
在计算卷积时,最好能够考虑图像的尺寸,如果边界填充是必要的,则TensorFlow会有一些内置选项。在大多数比较简单的情形下,SAME都是一个不错的选择。当指定跨度参数后,如果输入和卷积核能够很好地工作,则推荐使用VALID。关于这两个参数的更多介绍,请参考https://www.tensorflow.org/versions/master/api_docs/python/nn.html#convolution。
5.2.4 数据格式
tf.nn.conv2d还有另外一个参数data_format未在上述例程中使用。tf.nn.conv2d文档详细解释了如何修改数据格式,以使input、kernel和strides遵循某种与到目前为止所使用的格式不同的格式。如果有某个输入张量未遵循[batch_size,height,width,channel]标准,则修改该格式便非常有用。除了修改输入的格式,使之与标准匹配外,也可修改data_format参数以使用一种不同的布局。
data_format:该参数可取为“NHWC”或“NCHW”,默认值为“NHWC”,用于指定输入和输出数据的格式。当取默认格式“NHWC”时,数据的存储顺序为[batch,in_height,in_width,in_channels]。若该参数取为“NCHW”,数据存储顺序为[batch,in_channels,in_height,in_width]。
5.2.5 深入探讨卷积核
在TensorFlow中,滤波器参数用于指定与输入进行卷积运算的卷积核。滤波器通常用于摄影中以调整图片的属性,如允许到达摄像机透镜的光通量。在摄影中,摄影者可借助滤波器对所拍摄的图片做出大幅度的修改。摄影者之所以能够利用滤波器对图片进行修改,是因为滤波器能够识别到达透镜的光线的特定属性。例如,红色透镜滤波器会吸收(或阻止)不同于红色的每种频率的光,使得只有红色光可通过该滤波器。
对n02088466_3184.jpg运用镜像红色滤波器前后的效果
在计算机视觉中,卷积核(滤波器)常用于识别数字图像中的重要属性。当某些滤波器感兴趣的特征在图像中存在时,滤波器会使用特定模式突出这些特征。若将除红色外的所有颜色值减小,则可得到一个红色滤波器的卷积核。在这种情形下,红色值将保持不变,而其他任何匹配的颜色值将被减小。
本章一开始所展示的例子使用了一个专为边缘检测设计的卷积核。边缘检测卷积核在计算机视觉应用中极为常见,它可用基本的TensorFlow运算和一个tf.nn.conv2d运算实现。
将一幅图像与一个边缘检测卷积核进行卷积所得到的输出将是所有被检测到边缘的区域。这段代码假设已有一个图像批数据(image_batch)可用。在这个例子中,示例图像来自Stanford Dogs数据集,卷积核拥有3个输入和3个输出通道,这些通道对应于[0,255]区间内的RGB值,其中255为最大灰度值。调用tf.minimum和tf.nn.relu的目的是将卷积值保持存在RGB颜色值的合法范[0,255]内。
在这个简单的示例中,也可使用许多其他的常见卷积核。这些卷积核中的每一个都会突出图像中的不同模式,从而得到不同的结果。下列卷积核通过增加颜色的变化幅度可产生锐化效果。
这个卷积核的作用是增加卷积核中心位置像素的灰度,并降低周围像素的灰度。这种灰度的调整能够匹配那些具有较强灰度的像素的模式,并提升它们的灰度,从而使输出在视觉上呈现出锐化的效果。请注意,这里的卷积核四角的元素均为0,并不会对“+”形状的模式产生影响。
这些卷积核在比较初级的层次上能够与图像中的一些模式匹配。卷积神经网络通过使用从训练过程中学习到的复杂卷积核不但可以匹配边缘,还可以匹配更为复杂的模式。在训练过程中,这些卷积核的初值通常随机设定,随着训练迭代的进行,它们的值会由CNN的学习层自动调整。当CNN训练完成一轮迭代后,它接收一幅图像,并将其与某个卷积核进行卷积,然后依据预测结果与该图像真实标签是否一致,对卷积核中的参数进一步调整。例如,若一幅牧羊犬的照片被CNN模型预测为斗牛犬,则卷积核参数将适当调整以试图更好地匹配牧羊犬图片。
用CNN学习复杂的模式并非只用一个单层卷积就可完成,即使上述示例代码中包含了一个tf.nn.relu层用于准备输出以便可视化,也是不够的。在CNN中,卷积层可多次出现,但通常也会包含其他类型的层。这些层联合起来构成了成功的CNN架构所必需的要素。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论