Модель с BatchNormalization: застойные потери при тестировании

Я написал нейронную сеть с помощью Keras. Он содержит слои BatchNormalization.

Когда я тренировал его с model.fit, все было хорошо. При обучении с помощью tenorflow как описано здесь, обучение проходит нормально, но этап проверки всегда дает очень низкую производительность и быстро насыщается (точность составляет 5%, 10%, 40%, 40%, 40% ..; убыток тоже застойный).

Мне нужно использовать тензорный поток, потому что он обеспечивает большую гибкость в отношении части мониторинга обучения.

Я сильно подозреваю, что это как-то связано со слоями BN или / и тем, как я вычисляю характеристики теста (см. Ниже)

feed_dict = {x: X_valid,
            batch_size_placeholder: X_valid.shape[0],
            K.learning_phase(): 0,
            beta: self.warm_up_schedule(global_step)
            }
if self.weights is not None:
    feed_dict[weights] = self.weights
acc = accuracy.eval(feed_dict=feed_dict)

Есть ли что-то особенное, что нужно сделать при вычислении точности проверки модели, содержащей слои Keras BatchNormalizatin?

Заранее спасибо !


person sbaur    schedule 27.04.2017    source источник


Ответы (1)


На самом деле я узнал об аргументе training метода __call__ слоя BatchNormalization

Итак, что вы можете сделать при создании экземпляра слоя, это просто:

x = Input((dim1, dim2))
h = Dense(dim3)(x)
h = BatchNormalization()(h, training=K.learning_phase())

И при оценке производительности на проверочном наборе:

feed_dict = {x: X_valid,
             batch_size_placeholder: X_valid.shape[0],
             K.learning_phase(): 0,
             beta: self.warm_up_schedule(global_step)
             }
acc = accuracy.eval(feed_dict=feed_dict)
summary_ = merged.eval(feed_dict=feed_dict)
test_writer.add_summary(summary_, global_step)
person sbaur    schedule 28.04.2017
comment
ну на самом деле я был неправ, это не работает, но я не понимаю почему - person sbaur; 02.05.2017
comment
Я столкнулся с аналогичной проблемой и обнаружил, что установка training=1 в BatchNormalization __call__, похоже, работает. Установка K.learning_phase() на 0 или 1, похоже, не влияет на вывод в том, что касается пакетной нормализации, и пока вы не выполняете свое обучение, параметры пакетной нормы не должны меняться. - person zo7; 18.05.2017
comment
поэтому вы бы порекомендовали использовать другой заполнитель вместо K.learning_phase ()? - person sbaur; 22.05.2017