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

Posted

技术标签:

【中文标题】Keras:批量标准化(axis = 1)的等级为0【英文标题】:Keras: Batch normalization(axis=1) has rank 0 【发布时间】:2019-05-07 04:08:22 【问题描述】:

我正在尝试在 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)

我收到以下异常:

形状必须为 1 级,但为 0 级 带有输入的'batch_normalization_1/cond/Reshape_4'(操作:'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) (None, 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】:

我不知道问题是什么,这似乎是一个 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)

与其他激活(例如 sigmoid 和 tanh)一起执行此操作有一些优势,因为批量标准化可能有助于逃离饱和区。

【讨论】:

谢谢丹尼尔,这非常有用。

以上是关于Keras:批量标准化(axis = 1)的等级为0的主要内容,如果未能解决你的问题,请参考以下文章

禁用 Keras 批量标准化/标准化

在 keras 中使用批量标准化进行微调

Keras:使用批量标准化在同一数据集上的不同训练和验证结果

Keras 中的损失函数和批量大小

如何在 keras 中正确使用 U-net 批量标准化?

keras.argmax中axis=-1是啥意思?