我试图在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)),并且可以正常工作(我已经尝试过了),但是在开始时我需要这种通道配置,以便使用能够测试显示对象的显着性。
有人知道在这里做什么吗?
答案 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)可以做到这一点,因为批量归一化可以帮助逃避饱和区。