Keras:批量归一化(轴=1)的等级为 0

Keras: Batch normalization(axis=1) has rank 0

我正在尝试在 Keras 中创建一个带有输入 (batch, channels(3), 64, 32) 的神经网络,但是我在使用 Batch normalization 时遇到了错误(因为错误从提到的层开始,所以我选择隔离导致错误的部分)模型是这样开始的:

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)

我收到以下异常:

Shape must be rank 1 but is rank 0 for 'batch_normalization_1/cond/Reshape_4' (op: 'Reshape') with input shapes: [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) 

正确生成了以下摘要:

Layer (type) Output Shape Param #
================================================================= > input_1 (InputLayer) (None, 3, 64, 32) 0


conv2d_1 (Conv2D) (None, 32, 64, 32) 2432
================================================================= Total params: 2,432 Trainable params: 2,432 Non-trainable params: 0


我知道我可以使用

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

将模型输入为 (batch, 64, 32, channels(3)) 并且它会工作(我已经尝试过)但是我需要在开始时使用这种通道配置以便使用显示对象显着性的包。

有人知道在这里做什么吗?

我不知道问题出在哪里,似乎是 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 之前使用 batch normalization。这将 relu 变成了一个安全的激活,很少会被冻结,如果不小心使用就不会发生这种情况。

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

使用其他激活函数(例如 sigmoid 和 tanh)执行此操作有一些优势,因为批量归一化可能有助于逃离饱和区域。