Нормализация партии Keras «нарушена»: модель не может предсказать. Это действительно сломано? Есть ли исправление? Или конкретная документация по поводу? - PullRequest
1 голос
/ 30 октября 2019

Intro

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

Хотя это дает ожидаемые преимущества в скорости, я также заметил несколько странных симптомов:

  • показатели проверки далеки от хороших. Пахнет переобучением, конечно, прогнозы
  • , рассчитанные в любой точке во время тренировки, совершенно неверны, особенно когда изображения выбираются из набора данных обучения;соответствующие метрики совпадают с (val_loss, val_acc), а не с (loss, acc), напечатанными во время обучения

Это непредсказуемость является доказательством, которое беспокоит меня больше всего. Модель, которая не предсказывает так же, как на тренировках, бесполезна!

Поиски

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

Это довольно убедительно, поскольку объясняет механизм отказа, который соответствует моим наблюдениям. Насколько я понимаю, поскольку BN рассчитывает и продолжает перемещать статистику (средние экспоненты и стандартные отклонения) для выполнения своей работы, для которой требуется много итераций, чтобы стабилизироваться и стать значительным, конечно, он будет вести себя плохо, когда придет делать прогноз с нуля. , когда эти статистические данные не являются достаточно зрелыми (если я неправильно понял это понятие, пожалуйста, сообщите мне).

Актуальные вопросы

Но если подумать более тщательно, это на самом деле не закрывает проблему, а фактически вызывает дополнительные сомнения. Я все еще озадачен тем, что:

  1. Этот сломанный Keras BN , как говорят, влияет на вариант использования трансферного обучения, в то время как мой - классический случай сверточного классификатора, обученногоначальная форма стандарт глорот инициализация. На это должны были жаловаться тысячи пользователей, в то время как вместо этого нет особой дискуссии)
  2. технически: если мое понимание верно, почему эти статистические данные не являются (так как они так важны для предсказания)сохранены в модели, чтобы их последние обновления были доступны для прогнозирования? Кажется вполне возможным сохранить и использовать их во время прогнозирования, как и для любого обучаемого параметра
  3. для управления : если BN Кераса действительно сломан, как мог такой смертельный баг остаться без внимания для болеечем один год? Неужели никто не использует BN и не нуждается в предсказаниях из своих моделей? И даже никто не смог это исправить?
  4. больше практически : наоборот, если это не ошибка, а просто плохое понимание того, как ее использовать, откуда я получунаглядная иллюстрация «как правильно получить прогноз в Keras для модели, которая использует BN?» (демонстрационный код был бы признателен)

Очевидно, мне бы очень понравилось, чтоправильный вопрос - последний, но я должен был включить предыдущие, учитывая свидетельство того, что кто-то утверждает, что Keras BN сломан .

Примечание для SE OP: перед * закрытиемвопрос слишком широкий *, пожалуйста, примите во внимание, что, будучи не совсем понятным, в чем проблема (Keras BN не работает или пользователи не могут правильно его использовать), я должен был предложить больше направлений, среди которых тот, кто желает ответить, можетвыберите.

Подробности

  • Я использую keras 2.2.4 из виртуальной среды python 3.6 (под pyenv / virtualenv).
  • данные передаются по классической схеме ImageDataGenerator() + flow_from_directory() / flow_from_dataframe() (увеличение отключено, хотя: применяется только rescale=1./255), но я также пытался сделать их статическими
  • фактически в конце, для проверки вышеупомянутого поведения, я сгенерировал только один набор данных x,y=next(valid_generator) и использовал уникальную пакетную схему как для обучения, так и для проверки. В то время как на обучающей стороне это сходится (да, цель состояла именно в том, чтобы позволить ему переопределиться!), На стороне валидации обе метрики плохие, а прогнозы абсолютно ошибочны и ошибочны (почти случайны)
  • в этой установке,если BN выключен, val_loss и val_acc точно совпадают с loss и acc и с теми, которые я могу получить из прогнозов, рассчитанных после завершения обучения.

Обновление

В процессе написания минимального примера проблемы, после борьбы за выявление проблемы, я понял, что проблема проявляется / не отображается на разных машинах. В частности, проблема очевидна на хосте, на котором работает Keras 2.3.1, в то время как другой хост с Keras 2.2.4 этого не показывает. Я выложу здесь минимальный пример вместе с конкретными версиями модуля как можно скорее.

...