【问题标题】:Where should I apply dropout to a convolutional layer?我应该在哪里将 dropout 应用于卷积层?
【发布时间】:2016-06-01 16:03:26
【问题描述】:

因为“层”这个词在应用于卷积层时通常意味着不同的东西(有些通过池化将所有内容视为单个层,其他将卷积、非线性和池化视为单独的“层”;see fig 9.7)我不清楚在卷积层中的何处应用 dropout。

在非线性和池化之间会发生 dropout 吗?


例如,在 TensorFlow 中会是这样的:

kernel_logits = tf.nn.conv2d(input_tensor, ...) + biases
activations = tf.nn.relu(kernel_logits)
kept_activations = tf.nn.dropout(activations, keep_prob)
output = pool_fn(kept_activations, ...)

【问题讨论】:

  • Another example 建议在池化后应用 dropout。
  • 我一直在做实验,使用 dropout 而不是对 2x2 区域的图像进行平均下采样。我的理论是,不是对每个 2x2 图像区域进行下采样,而是使用 dropout 来有效地制作更多略有不同的图像,那么我将有效地拥有更多的训练样本,并且能够长时间训练并获得更好的结果。在尝试了许多不同的设置和长时间的训练后,dropout 作为一种将下采样转化为内容生成的方法被证明是无效的。
  • 更新,使用 3x3 实际上有很大的不同。在 3x3 下采样上使用 dropout 而不是仅对 3x3 下采样进行平均会产生显着差异。在 MNIST 上,这意味着在 3x3 下采样到 conv 然后 maxpool 上使用 dropout 的正确率为 92.5%,而在 3x3 下采样到 conv 然后 maxpool 上使用平均值的正确率为 84.2%。

标签: machine-learning tensorflow


【解决方案1】:

您可能会尝试在不同的地方应用 dropout,但在防止过度拟合方面,您不确定在池化之前会遇到很多问题。我在 CNN 中看到的是 tensorflow.nn.dropout 在非线性和池化之后应用:

    # Create a convolution + maxpool layer for each filter size
    pooled_outputs = []
    for i, filter_size in enumerate(filters):
        with tf.name_scope("conv-maxpool-%s" % filter_size):
            # Convolution Layer
            filter_shape = [filter_size, embedding_size, 1, num_filters]
            W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
            b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")
            conv = tf.nn.conv2d(
                self.embedded_chars_expanded,
                W,
                strides=[1, 1, 1, 1],
                padding="VALID",
                name="conv")
            # Apply nonlinearity
            h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
            # Maxpooling over the outputs
            pooled = tf.nn.max_pool(
                h,
                ksize=[1, sequence_length - filter_size + 1, 1, 1],
                strides=[1, 1, 1, 1],
                padding='VALID',
                name="pool")
            pooled_outputs.append(pooled)



    # Combine all the pooled features
    num_filters_total = num_filters * len(filters)
    self.h_pool = tf.concat(3, pooled_outputs)
    self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])

    # Add dropout
    with tf.name_scope("dropout"):
        self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob)

【讨论】:

  • Re:“在防止过度拟合方面,不确定在池化之前你会看到很多问题”:我认为避免在卷积层过度拟合;发给introduce noise into later layers(第 6.1.3 节之前的最后一段)。
猜你喜欢
  • 2018-04-01
  • 2019-08-09
  • 1970-01-01
  • 2016-12-23
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多