5.1 卷积神经网络
从技术角度看,卷积神经网络是一种至少包含一个层(tf.nn.conv2d)的神经网络,该层的功能是计算其输入f与一组可配置的卷积核g的卷积,以生成该层的输出。可用一种比较简明的定义描述卷积:卷积的目的是将卷积核(滤波器)应用到某个张量的所有点上,并通过将卷积核在输入张量上滑动而生成经过滤波处理的张量。
图像处理中的边缘检测便是滤波输出的一个典型例子。一个特殊的卷积核被应用到图像中的每个像素,而输出为一个刻画了所有边缘的新图像。在这种情形下,输入张量是一幅图像,而张量中的每个点都对应于一个像素所包含的红色值、绿色值和蓝色值。卷积核会遍历图像中的每个像素,任何位于边缘的像素对应的卷积输出值都会增大。
一个经过简化的卷积层(其输入为一幅图像,而输出为图像中的边缘)[1]
如果暂时对卷积运算如何将输入整合为经过滤波处理的输出或卷积核是什么尚不理解,请不必担心,本章稍后会介绍如何将它们付诸实践。从宏观角度理解何为CNN及其从生物学中获得的灵感是其技术实现的基础。
在1968年,一篇公开发表的学术论文详细介绍了猴子纹状皮层(这部分大脑负责处理视觉输入)的细胞布局。这篇文章讨论了沿垂直方向延伸的细胞组是如何整合而与视觉特性匹配的。对灵长类大脑的研究看似与机器学习任务无关,但实际上对使用CNN的深度学习发展起到了非常重要的作用。
CNN遵循了一个简化的信息匹配过程,这非常类似于在猴子纹状皮层的细胞布局中发现的结构。当信号经过猴子的纹状皮层时,如果得到某种视觉模式的刺激,某些层便会释放信号。例如,一个细胞层会在当水平线经过它时被激活(增加输出信号的幅值)。CNN也会呈现出相似的行为,即某些神经元构成的簇会依据从训练中学习到的模式而激活。例如,经过训练,当水平线经过一个CNN的某一层时,该层会被激活。
匹配水平线的神经网络是一种有用的架构,但CNN更进一步,它通过对多种简单模式分层布局实现复杂模式的匹配。在CNN的语境中,这些模式被称为滤波器或卷积核,而训练的目标是调节这些卷积核的权值,直到它们能够与训练数据精确匹配。要训练这些滤波器,需要将多个不同的层级联,并利用梯度下降法及其变体调节网络权值。
简单的CNN架构通常包含卷积层(tf.nn.conv2d)、非线性变换层(tf.nn.relu)、池化层(tf.nn.max_pool)及全连接层(tf.nn.matmul)。如果没有这些层,模型便很难与复杂的模式匹配,因为网络将被填充过多的信息。一个设计良好的CNN架构会突出那些重要的信息,而将噪声忽略。本章稍后的内容将详细介绍这些层如何协同工作。
这个架构的图像输入遵循一种复杂的格式,以支持图像的批量加载。批量加载图像使得可同时对多幅图像进行处理,但也相应地要求使用更为复杂的数据结构。所使用的数据结构中包含了与一批图像进行卷积运算所需的全部信息。TensorFlow的输入流水线(用于读取和解码文件)拥有一种为使用一个批数据中的多幅图像而设计的专门格式,它包括了任意一幅图像所需的信息([image_batch_size,image_height,image_width,image_channels])。利用下列示例代码,便有可能在TensorFlow中使用图像时检查样例输入的结构。
注意:上述示例代码及本章的后续示例并未包含运行TensorFlow代码所需的通用启动过程,包括导入tensorflow(通常使用缩写tf)、创建TensorFlow会话对象sess、初始化所有的变量和启动线程执行器。如果上述示例代码在运行时未执行上述步骤,将会出现一些变量未定义的错误。
这段示例代码创建了一个包含两幅图像的图像批数据。每幅图像的高为2个像素,宽为3个像素,且颜色空间为RGB。执行后的输出的第1组维度Dimension(1)表明了图像数量,第2组维度Dimension(2)对应图像的高度,第3组维度Dimension(3)表明了图像的宽度,而颜色通道数量对应于最后一组维度Dimension(3)。
有一点值得注意,每个像素的索引都会映射到图像的宽和高这两个维度上。若要获取第1幅图像的第1个像素,需要用下列方式访问每一个维度。
该语句执行后,可得到输出:
变量image_batch并不会从磁盘直接加载图像,而是将自身当成作为输入流水线的一部分而被加载的图像。使用输入流水线从磁盘加载的图像拥有相同的格式和行为。一种常见的做法是创建一些与上述image_batch实例相似的假数据对CNN的输入和输出进行测试。这种简化的输入会使诊断和调试一些简单问题更加容易。简化调试过程非常重要,因为CNN架构极为复杂,训练经常需要耗费数日。
CNN架构的第一个复杂性体现在卷积层的工作机理上。任何图像被加载和处理后,卷积层通常是网络的第一层。这第一个卷积层非常有用,因为它可简化网络的其余部分,并用于调试。下一节将重点介绍卷积层的工作机理,以及如何在TensorFlow中使用它们。
[1] 该图中的g(t)需要修改为[-1-2-1;000;1,2,1],按照图中给出的模板检测到的边缘是不具有方向性的。——译者注
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论