Как включить пакетную нормализацию в непоследовательную модель keras

Я новичок в DL и Керасе. В настоящее время я пытаюсь реализовать Unet-подобную CNN, и теперь я хочу включить слои пакетной нормализации в свою непоследовательную модель, но не знаю, как это сделать.

Это моя текущая попытка включить его:

input_1 = Input((X_train.shape[1],X_train.shape[2], X_train.shape[3]))

conv1 = Conv2D(16, (3,3), strides=(2,2), activation='relu', padding='same')(input_1)
batch1 = BatchNormalization(axis=3)(conv1)
conv2 = Conv2D(32, (3,3), strides=(2,2), activation='relu', padding='same')(batch1)
batch2 = BatchNormalization(axis=3)(conv2)
conv3 = Conv2D(64, (3,3), strides=(2,2), activation='relu', padding='same')(batch2)
batch3 = BatchNormalization(axis=3)(conv3)
conv4 = Conv2D(128, (3,3), strides=(2,2), activation='relu', padding='same')(batch3)
batch4 = BatchNormalization(axis=3)(conv4)
conv5 = Conv2D(256, (3,3), strides=(2,2), activation='relu', padding='same')(batch4)
batch5 = BatchNormalization(axis=3)(conv5)
conv6 = Conv2D(512, (3,3), strides=(2,2), activation='relu', padding='same')(batch5)
drop1 = Dropout(0.25)(conv6)

upconv1 = Conv2DTranspose(256, (3,3), strides=(1,1), padding='same')(drop1)
upconv2 = Conv2DTranspose(128, (3,3), strides=(2,2), padding='same')(upconv1)
upconv3 = Conv2DTranspose(64, (3,3), strides=(2,2), padding='same')(upconv2)
upconv4 = Conv2DTranspose(32, (3,3), strides=(2,2), padding='same')(upconv3)
upconv5 = Conv2DTranspose(16, (3,3), strides=(2,2), padding='same')(upconv4)
upconv5_1 = concatenate([upconv5,conv2], axis=3)
upconv6 = Conv2DTranspose(8, (3,3), strides=(2,2), padding='same')(upconv5_1)
upconv6_1 = concatenate([upconv6,conv1], axis=3)
upconv7 = Conv2DTranspose(1, (3,3), strides=(2,2), activation='linear', padding='same')(upconv6_1)

model = Model(outputs=upconv7, inputs=input_1)

Правильно ли используется нормализация партии? В документации keras я прочитал, что вы обычно хотите нормализовать «ось функций»!? Это краткий фрагмент из сводки модели:

====================================================================================================
input_1 (InputLayer)             (None, 512, 512, 9)   0
____________________________________________________________________________________________________
conv2d_1 (Conv2D)                (None, 256, 256, 16)  1312        input_1[0][0]
____________________________________________________________________________________________________
conv2d_2 (Conv2D)                (None, 128, 128, 32)  4640        conv2d_1[0][0]
____________________________________________________________________________________________________
conv2d_3 (Conv2D)                (None, 64, 64, 64)    18496       conv2d_2[0][0]
____________________________________________________________________________________________________

В этом случае моя ось характеристик — это ось 3 (начать отсчет с 0), верно? Я читал о дискуссиях о том, следует ли реализовывать нормализацию пакетов до или после функции активации. В данном случае она используется после функции активации, верно? Есть ли возможность использовать его до активации функции?

Большое спасибо за вашу помощь и отзыв! Действительно ценю это!


person Midas.Inc    schedule 20.09.2017    source источник


Ответы (2)


Часть 1. Правильно ли используется пакетная нормализация?

Вы правильно назвали слой BatchNormalization; axis=3 - это то, что вам нужно, как рекомендовано в документации. Имейте в виду, что в случае с вашей моделью значение axis=3 эквивалентно параметру по умолчанию, axis=-1, поэтому вам не нужно вызывать его явно.

Часть 2. В этом случай, когда он используется после функции активации, верно? Есть ли возможность использовать его перед функцией активации?

Да, пакетная нормализация, как определено в исследование Иоффе и Сегеди 2014 года предназначено для использования после слоя активации в качестве средства уменьшения внутреннего ковариатного сдвига. Ваш код правильно применяет пакетную норму после активации сверточных слоев. Его использование после уровня активации можно рассматривать как «этап предварительной обработки» информации до того, как она попадет на следующий уровень в качестве входных данных.

По этой причине нормализация партии также может служить предварительным -шаг обработки, который вы можете использовать сразу после входного слоя (как описано в this response.) Однако, как упоминается в этом ответе, не следует злоупотреблять пакетной нормой; это требует больших вычислительных ресурсов и может заставить вашу модель вести себя примерно линейно (этот ответ более подробно рассказывает об этой проблеме).

Использование пакетной нормы на каком-то другом этапе модели (не после уровня активации или входного уровня) может иметь плохо изученные последствия для производительности модели; это процесс, специально предназначенный для применения к выходным данным уровня активации.

По моему опыту работы с u-nets, я добился большого успеха, применяя пакетную норму только после сверточных слоев перед максимальным объединением; это эффективно удваивает вычислительную «отдачу» от нормализации, поскольку эти тензоры повторно используются в архитектуре u-net. Кроме того, я не использую пакетную норму (за исключением, может быть, входных данных, если средняя интенсивность пикселей на изображение очень разнородна).

person Michael Klear    schedule 06.03.2018

ось 3 = ось -1, которая является параметром по умолчанию.

person Dacian Yu    schedule 01.08.2019
comment
Добавляет ли это что-то большее, чем другой ответ? - person Ignatius; 01.08.2019