Keras: нормализация партии (ось = 1) имеет ранг 0 - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать нейронную сеть со входом (партия, каналы (3), 64, 32) В Керасе, но у меня есть ошибки, используя нормализацию партии (так как ошибка начинается с упомянутого слоя, я решил изолировать часть, котораявызывает ошибку) Модель запускается следующим образом:

input_imgC = Input(shape=(X.shape[1], X.shape[2], X.shape[3]))
x = Conv2D(32, (5, 5), activation='relu', padding='same', data_format="channels_first")(input_imgC) 
out = BatchNormalization(axis=1)(x)

Я получаю следующее исключение:

Форма должна иметь ранг 1, но имеет ранг 0 для 'batch_normalization_1 / cond /Reshape_4 '(op:' Reshape ') с входными формами: [1,32,1,1], [].

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

input_imgC = Input(shape=(X.shape[1], X.shape[2], X.shape[3]))
out = Conv2D(32, (5, 5), activation='relu', padding='same', data_format="channels_first")(input_imgC) 

Правильно получено следующее резюме:

Слой (тип) Выходной параметр Параметр #
=================================================================> input_1 (InputLayer) (Нет, 3, 64, 32) 0


conv2d_1 (Conv2D) (Нет, 32, 64, 32) 2432
================================================================= Всего параметров: 2432 Обучаемых параметров: 2432 Необучаемых параметров: 0


Я знаю, что могу использовать

out= BatchNormalization (axis = -1) (x)

с входом модели как (batch, 64, 32, channel (3)), и это будет работать (я уже пробовал), но мне нужноэта конфигурация каналов в начале, чтобы протестировать модель с пакетом, который показывает значимость объекта.

Есть ли у кого-нибудь идея, что здесь делать?

1 Ответ

0 голосов
/ 05 декабря 2018

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

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

В конце, если ваши выходные данные являются изображениями, восстановите размеры в нужном вам порядке.

input_imgC = Input(shape=(X.shape[1], X.shape[2], X.shape[3]))
x = Lambda(lambda inputs: K.permute_dimensions(inputs,(0,2,3,1)))(input_imgC)

x = Conv2D(32, (5, 5), activation='relu', padding='same')(x) 
x = BatchNormalization()(x)

out = .......
out = Lambda(lambda inputs: K.permute_dimensions(inputs,(0,3,1,2)))(out)

Подсказка:

В идеале, я бы использовал нормализацию партии перед relu.Это превращает relu в безопасную активацию, которая очень редко замораживается, что неверно, если ее использовать без осторожности.

x = Conv2D(..., activation='linear')(x) #or no activation
x = BatchNormalization()(x)
x = Activation('relu')(x)

Есть некоторые преимущества, связанные с другими активациями, такими как сигмоид и танх, длякак нормализация партии может помочь избежать насыщенных зон.

...