【问题标题】:Effect of max_pool in Convolutional Neural Network [tensorflow]max_pool 在卷积神经网络中的作用 [tensorflow]
【发布时间】:2017-06-25 21:20:45
【问题描述】:

我正在关注 Vincent Vanhoucke 的 Udacity 深度学习视频,并试图了解最大池化的(实际的或直观的或明显的)效果。

假设我当前的模型(没有池化)使用步长为 2 的卷积来降低维度。

  def model(data):
    conv = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME')
    hidden = tf.nn.relu(conv + layer1_biases)
    conv = tf.nn.conv2d(hidden, layer2_weights, [1, 2, 2, 1], padding='SAME')
    hidden = tf.nn.relu(conv + layer2_biases)
    shape = hidden.get_shape().as_list()
    reshape = tf.reshape(hidden, [shape[0], shape[1] * shape[2] * shape[3]])
    hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases)
    return tf.matmul(hidden, layer4_weights) + layer4_biases

现在我介绍了池化:用步幅为 2 且内核大小为 2 的最大池化操作 (nn.max_pool()) 替换步幅。

  def model(data):
    conv1 = tf.nn.conv2d(data, layer1_weights, [1, 1, 1, 1], padding='SAME')
    bias1 = tf.nn.relu(conv1 + layer1_biases)
    pool1 = tf.nn.max_pool(bias1, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
    conv2 = tf.nn.conv2d(pool1, layer2_weights, [1, 1, 1, 1], padding='SAME')
    bias2 = tf.nn.relu(conv2 + layer2_biases)
    pool2 = tf.nn.max_pool(bias2, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
    shape = pool2.get_shape().as_list()
    reshape = tf.reshape(pool2, [shape[0], shape[1] * shape[2] * shape[3]])
    hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases)
    return tf.matmul(hidden, layer4_weights) + layer4_biases

除了提高准确性之外,我们使用后一种模型而不是无池模型的令人信服的原因是什么?很想听听已经多次使用 cnn 的人的一些见解!

【问题讨论】:

  • 在您的示例中,您不想返回tf.matmul(poo2, ... 否则网络不包含最后一个池化层,对吧?

标签: tensorflow deep-learning conv-neural-network


【解决方案1】:

这两种方法(strides 和 pooling)都降低了输入的维度(对于 strides/pooling 大小 > 1)。这本身就是一件好事,因为它减少了计算时间、参数数量并允许防止过度拟合。

他们以不同的方式实现它:

您还提到“除了提高的准确性”。但几乎人们在机器学习中所做的一切都是为了提高准确性(一些其他损失函数)。因此,如果明天有人会证明 sum-square-root pooling 在许多基准测试上都取得了最好的结果,那么很多人会开始使用它。

【讨论】:

  • 谢谢萨尔瓦多!我们很幸运有你!
  • “这两种方法(步幅和池化)都降低了维度” - 错误。只有 strides > 1 会降低维度。您可以使用 stride = 1 进行池化。(否则一个很好的答案)
  • @MartinThoma 这有点吹毛求疵。就像你可以说池化不会降低维度一样。因为从技术上讲,您可以使用 1 个元素的池化(什么都不做),它也不会减少暗淡。无论如何,添加了关于 > 1 的评论。
  • “你可以说池化不会降低维度。” ——这正是我要说的。我不认为这是吹毛求疵。这是一个重要的信息,对于刚接触神经网络的人来说可能不清楚,而且很容易写/说。 +1
【解决方案2】:

在分类任务中,提高准确率是目标。

但是,池化允许您:

  1. 降低输入维度
  2. 强制网络学习特定功能,具体取决于您应用的池化类型。

降低输入维度是您想要的,因为它会迫使网络将其学习的表示投射到不同且具有较低维度的空间中。从计算上讲,这很好,因为您必须分配更少的内存,因此您可以拥有更大的批次。但这也是可取的,因为通常高维空间有很多冗余,并且在这些空间中所有对象看起来都是稀疏和不同的(参见The curse of dimensionality

此外,您决定用于池化操作的功能可能会迫使网络更加重视某些功能。

例如,Max-pooling 被广泛使用,因为它允许网络对输入图像的微小变化具有鲁棒性。

在实践中会发生什么,只有激活最高的特征才能通过最大池化门。 如果输入图像移动了少量,那么最大池操作会产生相同的输出,尽管输入发生了移动(因此最大移动等于内核大小)。

没有池化的 CNN 也能够学习这种特征,但在参数和计算时间方面的成本更高(参见Striving for Simplicity: The All Convolutional Net

【讨论】:

  • 论文“争取简单性”是否意味着暗示没有池化的 CNN 实际上在成本和计算时间方面“更小”,而准确性却没有太大损失?论文中将 conv+pooling 替换为 conv with stride。
  • 是的,他们用有 kernel_width² x kernel_depth x number_of_kernels 参数来学习的操作替换了一个需要学习的参数为 0 的操作。
  • 他们不会用 conv 替换池化层。他们用 conv_with_stride 替换了 conv+pooling(一起)。
  • 你确定吗?阅读第 2 页上的编号列表(表示他们可以选择是按照您告诉我的方式删除图层,还是替换为卷积(第 1 点和第 2 点)。然后他们说第一点有一些缺点。向下滚动,然后,到第 5 页并查看表 3。模型 A、B 和 C 增加了参数的数量,同时变得“全卷积”
  • 是的,你是对的,看起来他们已经尝试了这两个选项。他们得到的最好结果是用 cnn_with_stride 代替池化。
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2019-08-18
  • 2017-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
相关资源
最近更新 更多