Как справиться с пакетной нормализацией для нескольких наборов данных?

#python #pytorch #dataset #conv-neural-network #batch-normalization

Вопрос:

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

Мне сказали, что слои пакетной нормализации могут пытаться найти веса, которые подходят для всех во время обучения, что является проблемой, поскольку распределение моих синтетических данных не совсем равно распределению реальных данных. Таким образом, идея состояла бы в том, чтобы иметь разные » копии’ весов слоев пакетной нормализации. Таким образом, нейронная сеть оценивает различные веса для синтетических и реальных данных и использует только веса реальных данных для оценки.

Может ли кто-нибудь предложить мне хорошие способы действительно реализовать это в pytorch? Моя идея заключалась в следующем: после каждой эпохи обучения в наборе данных я просматривал все слои batchnorm и сохранял их веса. Затем в начале следующей эпохи я бы снова повторил загрузку правильных весов. Является ли это хорошим подходом? Тем не менее, я не уверен, как мне следует обращаться с весами пакетной нормы во время тестирования, поскольку пакетная норма трактует это по-другому.

Комментарии:

1. Что вы пробовали до сих пор с точки зрения реализации?

2. Я просто попробовал кое-что другое. При построении модели я создаю копии слоев batchnorm для каждого обучающего набора данных. Затем я передаю имя набора данных в функцию переадресации, и там я выбираю правильные слои при каждом запуске. Однако я не уверен, что это хорошая процедура и будет работать

Ответ №1:

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

Вместо того, чтобы пытаться отслеживать несколько норм пакетной обработки, вы, вероятно, просто хотите установить track_running_stats значение True для своего уровня нормы пакетной обработки, а затем перевести его в режим оценки при тестировании. Это приведет к тому, что он вычислит среднее значение и дисперсию для нескольких партий во время обучения, а затем будет использовать это среднее значение и дисперсию позже во время тестирования, вместо того, чтобы просматривать статистику партий для тестовых партий.

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

Если вы действительно хотите вычислять новые средства и отклонения во время тестирования, я бы сделал следующее: вместо того, чтобы передавать в вашу сеть одну партию как реальных, так и синтетических данных, я бы передал одну партию реальных данных, затем одну партию синтетических данных и усреднил бы две потери вместе перед обратной обработкой. (Обратите внимание , что если вы сделаете это, вам не следует полагаться на среднее значение и дисперсию позже-вам придется либо установить track_running_stats False его, либо сбросить, когда вы закончите, и выполнить несколько фиктивных пакетов только с реальными данными для вычисления разумных значений. Это связано с тем, что статистика среднего значения и дисперсии полезна только в том случае, если ожидается, что они будут примерно одинаковыми для каждой партии, и вместо этого вы поляризуете значения, вводя разные типы данных в разных партиях.)