Keras:批量标准化(轴=1)的等级为0

Keras:批量标准化(轴=1)的等级为0,keras,rank,batch-normalization,Keras,Rank,Batch Normalization,我试图在Keras中创建一个具有输入(批次、通道(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

我试图在Keras中创建一个具有输入(批次、通道(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,但对于 带有输入的“批处理规格化”1/cond/reformate 4”(op:“reformate”) 形状:[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) 
正确生成以下摘要:

图层(类型)输出形状参数#
=========================================================================>输入1(InputLayer)(无、3、64、32)0


conv2d_1(conv2d)(无、32、64、32)2432
========================================================================总参数:2432个可训练参数:2432个不可训练参数:0


我知道我可以用

out=批量标准化(轴=-1)(x)

模型输入为(批处理,64,32,通道(3)),它会工作(我已经尝试过了),但我在开始时需要通道的这种配置,以便使用显示对象显著性的包测试模型


有人知道该怎么做吗?

我不知道问题出在哪里,这似乎是一个Keras bug(更新版本或在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)

使用其他激活(如sigmoid和tanh)进行此操作有一些优点,因为批处理规范化可能有助于逃离饱和区

谢谢,丹尼尔,这很有用。