池化层
一旦你理解了卷积层是如何工作的,池化层很容易掌握。 他们的目标是对输入图像进行二次抽样(即收缩)以减少计算负担,内存使用量和参数数量(从而限制过度拟合的风险)。 减少输入图像的大小也使得神经网络容忍一点点的图像变换(位置不变)。
就像在卷积图层中一样,池化层中的每个神经元都连接到前一层中有限数量的神经元的输出,位于一个小的矩形感受野内。 您必须像以前一样定义其大小,跨度和填充类型。 但是,汇集的神经元没有权重; 它所做的只是使用聚合函数(如最大值或平均值)来聚合输入。 图 13-8 显示了最大池层,这是最常见的池化类型。 在这个例子中,我们使用一个2×2的核,步幅为 2,没有填充。 请注意,只有每个核中的最大输入值才会进入下一层。 其他输入被丢弃。
这显然是一个非常具有破坏性的层:即使只有一个2×2
的核和 2 的步幅,输出在两个方向上都会减小两倍(所以它的面积将减少四倍),一下减少了 75% 的输入值
池化层通常独立于每个输入通道工作,因此输出深度与输入深度相同。 接下来可以看到,在这种情况下,图像的空间维度(高度和宽度)保持不变,但是通道数目可以减少。
在 TensorFlow 中实现一个最大池层是非常容易的。 以下代码使用2×2
核创建最大池化层,步幅为2,没有填充,然后将其应用于数据集中的所有图像:
import numpy as np
from sklearn.datasets import load_sample_image
import tensorflow as tf
import matplotlib.pyplot as plt
china = load_sample_image("china.jpg")
flower = load_sample_image("flower.jpg")
dataset = np.array([china, flower], dtype=np.float32)
batch_size, height, width, channels = dataset.shape
# Create 2 filters
filters = np.zeros(shape=(7, 7, channels, 2), dtype=np.float32)
filters[:, 3, :, 0] = 1 # vertical line
filters[3, :, :, 1] = 1 # horizontal line
X = tf.placeholder(tf.float32, shape=(None, height, width, channels))
max_pool = tf.nn.max_pool(X, ksize=[1,2,2,1], strides=[1,2,2,1],padding="VALID")
with tf.Session() as sess:
output = sess.run(max_pool, feed_dict={X: dataset})
plt.imshow(output[0].astype(np.uint8)) # plot the output for the 1st image
plt.show()
ksize
参数包含沿输入张量的所有四维的核形状:[min-batch, height, width, channels]
。 TensorFlow 目前不支持在多个实例上合并,因此ksize
的第一个元素必须等于 1。此外,它不支持在空间维度(高度和宽度)和深度维度上合并,因此ksize[1]
和ksize[2]
都必须等于 1,否则ksize[3]
必须等于 1。
要创建一个平均池化层,只需使用avg_pool()
函数而不是max_pool()
。
现在你知道所有的构建模块来创建一个卷积神经网络。 我们来看看如何组装它们。