Я использую модель логов enet для одного из моих проектов и испытываю некоторые трудности с использованием регуляризации.
Без какой-либо регуляризации уменьшается как проверка, так и потеря обучения (MSE). Потеря тренировки уменьшается быстрее, что приводит к некоторому переоснащению финальной модели.
Поэтому я решил использовать dropout, чтобы избежать перегрузки. При использовании Dropout потери как при проверке, так и при обучении уменьшаются примерно до 0,13 в течение первой эпохи и остаются постоянными в течение примерно 10 эпох.
После этого обе функции потерь уменьшаются так же, как и без выпадения, что приводит к повторному набору. Конечное значение потерь находится примерно в том же диапазоне, что и без отсева.
Так что для меня кажется, что выпадение действительно не работает.
Если я переключусь на регуляризацию L2, я смогу избежать переобучения, но я бы предпочел использовать Dropout в качестве регуляризатора.
Теперь мне интересно, испытывал ли кто-нибудь подобное поведение?
Я использую выпадение как в плотном блоке (слой узких мест), так и в переходном блоке (коэффициент отсева = 0,5):
def bottleneck_layer(self, x, scope):
with tf.name_scope(scope):
x = Batch_Normalization(x, training=self.training, scope=scope+'_batch1')
x = Relu(x)
x = conv_layer(x, filter=4 * self.filters, kernel=[1,1], layer_name=scope+'_conv1')
x = Drop_out(x, rate=dropout_rate, training=self.training)
x = Batch_Normalization(x, training=self.training, scope=scope+'_batch2')
x = Relu(x)
x = conv_layer(x, filter=self.filters, kernel=[3,3], layer_name=scope+'_conv2')
x = Drop_out(x, rate=dropout_rate, training=self.training)
return x
def transition_layer(self, x, scope):
with tf.name_scope(scope):
x = Batch_Normalization(x, training=self.training, scope=scope+'_batch1')
x = Relu(x)
x = conv_layer(x, filter=self.filters, kernel=[1,1], layer_name=scope+'_conv1')
x = Drop_out(x, rate=dropout_rate, training=self.training)
x = Average_pooling(x, pool_size=[2,2], stride=2)
return x