Нормализация партии, когда размер партии = 1 - PullRequest
1 голос
/ 08 января 2020

Что произойдет, когда я использую нормализацию партии, но установлю batch_size = 1?

Поскольку я использую медицинские 3D-изображения в качестве учебного набора данных, размер партии может быть установлен только на 1 из-за ограничения GPU. Обычно я знаю, что когда batch_size = 1, дисперсия будет равна 0. И (x-mean)/variance приведет к ошибке из-за деления на 0.

Но почему ошибки не возникли, когда я установил batch_size = 1? Почему моя сеть была обучена так хорошо, как я ожидал? Может ли кто-нибудь объяснить это?

Некоторые люди утверждали, что:

ZeroDivisionError может не встречаться из-за двух случаев. Во-первых, исключение перехвачено в блоке перехвата try. Во-вторых, к рациональному члену добавляется небольшое рациональное число (1e-19), чтобы оно никогда не равнялось нулю.

Но некоторые люди не согласны. Они сказали, что:

Вы должны рассчитать среднее значение и стандартное отклонение для всех пикселей на изображениях пакета. (Так что даже batch_size = 1, в пакете все еще много пикселей. Поэтому причина, по которой batch_size=1 все еще может работать, заключается не в 1e-19)

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

У кого-нибудь другое мнение ???

1 Ответ

1 голос
/ 12 января 2020

дисперсия будет 0

Нет, не будет; BatchNormalization вычисляет статистику только по одной оси (обычно по оси каналов, =-1 (последняя) по умолчанию); каждая другая ось свернута , т.е. суммирована для усреднения; подробности ниже.

Более важно, однако, если вы не можете явно объяснить это, я советую не использовать BatchNormalization с batch_size=1; На это есть веские теоретические причины, и во многих публикациях было показано снижение производительности BN для batch_size до 32 и значительно для <= 8. В двух словах, статистика партии, «усредненная» по одной выборке, сильно отличается от выборки к выборке (высокая дисперсия), и механизмы BN работают не так, как предполагалось. </p>

Малые альтернативы мини-партии : Перенормировка партии - Нормализация слоя - Нормализация веса


Подробности реализации : из исходный код :

reduction_axes = list(range(len(input_shape)))
del reduction_axes[self.axis]

В конце концов, tf.nn.monents вызывается с axes=reduction_axes , который выполняет reduce_sum для вычисления variance. Затем в бэкенде TensorFlow mean и variance передаются в tf.nn.batch_normalization для возврата входных данных, нормализованных по ходу или выводу.

В других словами, если вы введете (batch_size, height, width, depth, channels) или (1, height, width, depth, channels), то BN выполнит вычисления по измерениям 1, height, width и depth.

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


Другие ответы : первый вводит в заблуждение:

добавляется небольшое рациональное число ( 1e-19) к дисперсии

Этого не происходит при вычислении дисперсии, но добавляется к дисперсии при нормализации; тем не менее, это редко необходимо, так как variance далеко от нуля. Кроме того, термин эпсилон на самом деле по умолчанию равен 1e-3 Керасом; он выполняет роль в регуляризации, а не просто избегает деления на ноль.

...