首页 >> 知识 >> TensorFlow 模型建立与训练

TensorFlow 模型建立与训练

卷积层和池化层的工作原理

卷积层(Convolutional Layer,以 tf.keras.layers.Conv2D 为代表)是 CNN 的核心组件,其结构与大脑的视觉皮层有类似之处。

回忆草莓视频在线观看APP之前建立的 神经细胞的计算模型 以及全连接层,草莓视频在线观看APP默认每个神经元与上一层的所有神经元相连。不过,在视觉皮层的神经元中,情况并不是这样。你或许在生物课上学习过 感受野 (Receptive Field)这一概念,即视觉皮层中的神经元并非与前一层的所有神经元相连,而只是感受一片区域内的视觉信号,并只对局部区域的视觉刺激进行反应。CNN 中的卷积层正体现了这一特性。

例如,下图是一个 7×7 的单通道图片信号输入:

如果使用之前基于全连接层的模型,草莓视频在线观看APP需要让每个输入信号对应一个权值,即建模一个神经元需要 7×7=49 个权值(加上偏置项是50个),并得到一个输出信号。如果一层有 N 个神经元,草莓视频在线观看APP就需要 49N 个权值,并得到 N 个输出信号。

而在 CNN 的卷积层中,草莓视频在线观看APP这样建模一个卷积层的神经元:

图中 3×3 的红框代表该神经元的感受野。由此,草莓视频在线观看APP只需 3×3=9 个权值 ,外加1个偏置项 ,即可得到一个输出信号。例如,对于红框所示的位置,输出信号即为对矩阵 的所有元素求和并加上偏置项 ,记作 。

不过,3×3 的范围显然不足以处理整个图像,因此草莓视频在线观看APP使用滑动窗口的方法。使用相同的参数 ,但将红框在图像中从左到右滑动,进行逐行扫描,每滑动到一个位置就计算一个值。例如,当红框向右移动一个单位时,草莓视频在线观看APP计算矩阵 的所有元素的和加上偏置项 ,记作 。由此,和一般的神经元只能输出 1 个值不同,这里的卷积层神经元可以输出一个 5×5 的矩阵 。

卷积示意图。一个单通道的 7×7 图像在通过一个感受野为 3×3 ,参数为10个的卷积层神经元后,得到 5×5 的矩阵作为卷积结果。¶

下面,草莓视频在线观看APP使用TensorFlow来验证一下上图的计算结果。

将上图中的输入图像、权值矩阵 和偏置项 表示为NumPy数组 image , W , b 如下:

# TensorFlow 的图像表示为 [图像数目,长,宽,色彩通道数] 的四维张量# 这里草莓视频在线观看APP的输入图像 image 的张量形状为 [1, 7, 7, 1]image = np.array([[ [0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 1, 2, 1, 0], [0, 0, 2, 2, 0, 1, 0], [0, 1, 1, 0, 2, 1, 0], [0, 0, 2, 1, 1, 0, 0], [0, 2, 1, 1, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0]]], dtype=np.float32)image = np.expand_dims(image, axis=-1) W = np.array([[ [ 0, 0, -1], [ 0, 1, 0 ], [-2, 0, 2 ]]], dtype=np.float32)b = np.array([1], dtype=np.float32)

然后建立一个仅有一个卷积层的模型,用 W 和 b 初始化 4 :

model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D( filters=1, # 卷积层神经元(卷积核)数目 kernel_size=[3, 3], # 感受野大小 kernel_initializer=tf.constant_initializer(W), bias_initializer=tf.constant_initializer(b) )])

最后将图像数据 image 输入模型,打印输出:

output = model(image)print(tf.squeeze(output))

程序运行结果为:

tf.Tensor([[ 6. 5. -2. 1. 2.] [ 3. 0. 3. 2. -2.] [ 4. 2. -1. 0. 0.] [ 2. 1. 2. -1. -3.] [ 1. 1. 1. 3. 1.]], shape=(5, 5), dtype=float32)

可见与上图中矩阵 的值一致。

还有一个问题,以上假设图片都只有一个通道(例如灰度图片),但如果图像是彩色的(例如有 RGB 三个通道)该怎么办呢?此时,草莓视频在线观看APP可以为每个通道准备一个 3×3 的权值矩阵,即一共有 3×3×3=27 个权值。对于每个通道,均使用自己的权值矩阵进行处理,输出时将多个通道所输出的值进行加和即可。

可能有读者会注意到,按照上述介绍的方法,每次卷积后的结果相比于原始图像而言,四周都会“少一圈”。比如上面 7×7 的图像,卷积后变成了 5×5 ,这有时会为后面的工作带来麻烦。因此,草莓视频在线观看APP可以设定padding策略。在 tf.keras.layers.Conv2D 中,当草莓视频在线观看APP将 padding 参数设为 same 时,会将周围缺少的部分使用0补齐,使得输出的矩阵大小和输入一致。

最后,既然草莓视频在线观看APP可以使用滑动窗口的方法进行卷积,那么每次滑动的步长是不是可以设置呢?答案是肯定的。通过 tf.keras.layers.Conv2D 的 strides 参数即可设置步长(默认为1)。比如,在上面的例子中,如果草莓视频在线观看APP将步长设定为2,输出的卷积结果即会是一个3×3的矩阵。

事实上,卷积的形式多种多样,以上的介绍只是其中最简单和基础的一种。

网站地图