Выпадающий слой идет до или после плотного слоя в TensorFlow?
Согласно Руководству по слоям TF выпадающий слой идет после последнего плотного слоя:
dense = tf.layers.dense(input, units=1024, activation=tf.nn.relu)
dropout = tf.layers.dropout(dense, rate=params['dropout_rate'],
training=mode == tf.estimator.ModeKeys.TRAIN)
logits = tf.layers.dense(dropout, units=params['output_classes'])
Разве не имеет смысла иметь его до того плотного слоя, чтобы он изучал отображение от входа к выходу с эффектом выпадения?
dropout = tf.layers.dropout(prev_layer, rate=params['dropout_rate'],
training=mode ==
dense = tf.layers.dense(dropout, units=1024, activation=tf.nn.relu)
logits = tf.layers.dense(dense, units=params['output_classes'])
1 ответ
Это не та или иная ситуация. Неформально говоря, общепринятая мудрость гласит: применять отсев после плотных слоев, а не столько после сверточных или складывающихся, так что на первый взгляд это будет зависеть от того, что именно prev_layer
в вашем втором фрагменте кода.
Тем не менее, в настоящее время этот "принцип дизайна" регулярно нарушается (см. Некоторые интересные соответствующие обсуждения в Reddit & CrossValidated); даже в примере MNIST CNN, включенном в Keras, мы видим, что выпадение применяется как после максимального пула, так и после плотного:
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25)) # <-- dropout here
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5)) # <-- and here
model.add(Dense(num_classes, activation='softmax'))
Итак, оба ваших фрагмента кода верны, и мы можем легко представить третий допустимый вариант:
dropout = tf.layers.dropout(prev_layer, [...])
dense = tf.layers.dense(dropout, units=1024, activation=tf.nn.relu)
dropout2 = tf.layers.dropout(dense, [...])
logits = tf.layers.dense(dropout2, units=params['output_classes'])
В качестве общего совета: учебники, на которые вы ссылаетесь, только пытаются познакомить вас с инструментами и (очень) общими принципами, поэтому не рекомендуется "переоценивать" показанные решения...