池化层

​一旦你理解了卷积层是如何工作的,池化层很容易掌握。 他们的目标是对输入图像进行二次抽样(即收缩)以减少计算负担,内存使用量和参数数量(从而限制过度拟合的风险)。 减少输入图像的大小也使得神经网络容忍一点点的图像变换(位置不变)。

​就像在卷积图层中一样,池化层中的每个神经元都连接到前一层中有限数量的神经元的输出,位于一个小的矩形感受野内。 您必须像以前一样定义其大小,跨度和填充类型。 但是,汇集的神经元没有权重; 它所做的只是使用聚合函数(如最大值或平均值)来聚合输入。 图 13-8 显示了最大池层,这是最常见的池化类型。 在这个例子中,我们使用一个2×2的核,步幅为 2,没有填充。 请注意,只有每个核中的最大输入值才会进入下一层。 其他输入被丢弃。

池化层 - 图1

​这显然是一个非常具有破坏性的层:即使只有一个2×2的核和 2 的步幅,输出在两个方向上都会减小两倍(所以它的面积将减少四倍),一下减少了 75% 的输入值

​池化层通常独立于每个输入通道工作,因此输出深度与输入深度相同。 接下来可以看到,在这种情况下,图像的空间维度(高度和宽度)保持不变,但是通道数目可以减少。

​在 TensorFlow 中实现一个最大池层是非常容易的。 以下代码使用2×2核创建最大池化层,步幅为2,没有填充,然后将其应用于数据集中的所有图像:

  1. import numpy as np
  2. from sklearn.datasets import load_sample_image
  3. import tensorflow as tf
  4. import matplotlib.pyplot as plt
  5. china = load_sample_image("china.jpg")
  6. flower = load_sample_image("flower.jpg")
  7. dataset = np.array([china, flower], dtype=np.float32)
  8. batch_size, height, width, channels = dataset.shape
  9. # Create 2 filters
  10. filters = np.zeros(shape=(7, 7, channels, 2), dtype=np.float32)
  11. filters[:, 3, :, 0] = 1 # vertical line
  12. filters[3, :, :, 1] = 1 # horizontal line
  13. X = tf.placeholder(tf.float32, shape=(None, height, width, channels))
  14. max_pool = tf.nn.max_pool(X, ksize=[1,2,2,1], strides=[1,2,2,1],padding="VALID")
  15. with tf.Session() as sess:
  16. output = sess.run(max_pool, feed_dict={X: dataset})
  17. plt.imshow(output[0].astype(np.uint8)) # plot the output for the 1st image
  18. plt.show()

ksize参数包含沿输入张量的所有四维的核形状:[min-batch, height, width, channels]。 TensorFlow 目前不支持在多个实例上合并,因此ksize的第一个元素必须等于 1。此外,它不支持在空间维度(高度和宽度)和深度维度上合并,因此ksize[1]ksize[2]都必须等于 1,否则ksize[3]必须等于 1。

​要创建一个平均池化层,只需使用avg_pool()函数而不是max_pool()

​现在你知道所有的构建模块来创建一个卷积神经网络。 我们来看看如何组装它们。