Где я должен применить выпадение к сверточному слою?

Поскольку слово «слой» часто означает разные вещи применительно к сверточному слою (некоторые рассматривают все путем объединения как один слой, другие рассматривают свертку, нелинейность и объединение как отдельные «слои»;см. рис. 9.7) мне не ясно, где применять выпадение в сверточном слое.

Происходит ли отсев между нелинейностью и объединением?

Например, в 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, ...)
 Panchishin07 июн. 2017 г., 23:10
Обновление с использованием 3х3 на самом деле имеет огромное значение. Использование отсева по даунсэмплингу 3х3 вместо простого усреднения для даунсэмпла 3х3 дает существенную разницу. В MNIST это приводит к правильному 92,5% с использованием отсева при даунсамплинге 3x3, чтобы убедиться, что затем maxpool против правильного 84,2% с использованием среднего по даунсэмплингу 3x3 для подтверждения, а затем максимального пула.
 orome11 июн. 2016 г., 13:54
Другой пример предлагает применить отсев после объединения.
 Panchishin07 июн. 2017 г., 23:01
Я проводил эксперименты с использованием отсева вместо средней понижающей дискретизации в области 2х2 для изображений. Моя теория состояла в том, что вместо понижающей дискретизации каждой области изображения 2х2, если вместо этого использовать отсев для эффективного создания множества более немного отличающихся изображений, тогда у меня будет больше тренировочных образцов, и я смогу тренироваться долго и получать лучшие результаты. После множества различных настроек и длительных тренировочных циклов отсев как средство преобразования понижающей дискретизации в генерацию контента оказался неэффективным.

Ответы на вопрос(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)
 orome02 июн. 2016 г., 01:02
Re: «с точки зрения предотвращения переоснащения, я не уверен, что вы увидите большую проблему перед объединением»: я не думаю, что нужно избегать переобучения на сверточном слое; это квносить шум в более поздние слои (последний абзац перед разделом 6.1.3).

Ваш ответ на вопрос