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的主要内容,如果未能解决你的问题,请参考以下文章