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

时间:2018-12-05 14:45:06

标签: keras rank batch-normalization

我试图在Keras中创建带有输入(批处理,channels(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
  ================================================== ================总参数:2,432可训练参数:2,432非可训练参数:0

     

我知道我可以使用

  

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

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

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

1 个答案:

答案 0 :(得分:1)

我不知道问题出在哪里,这似乎是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)

使用其他激活方法(例如S型和tanh)可以做到这一点,因为批量归一化可以帮助逃避饱和区。