从RGB图像训练绿色通道上的Keras CNN模型

时间:2017-09-14 12:18:39

标签: deep-learning keras keras-layer

到目前为止,我一直试图解决这个问题大约24小时,但遗憾的是无法提出一些问题。

问题很简单:我在2个子目录中有2个类别,子目录中的图像是RGB格式,但我只对绿色通道感兴趣。我使用flow_from_directory函数读取批量图像(图像@ size(3,224,224))然后我尝试使用Lambda图层提取绿色通道,如下所示:

def get_model_bw(input_shape=(3,224,224), classes = 2, lr=1e-4):
    model = Sequential([
        Lambda(lambda x: x[:,1,:,:], input_shape=input_shape, output_shape=(1,224,224)),
        BatchNormalization(axis=1),
        Conv2D(32,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        Conv2D(32,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        Conv2D(32,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        MaxPooling2D(),
        Conv2D(64,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        Conv2D(64,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        Conv2D(64,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        MaxPooling2D(),
        Conv2D(128,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        Conv2D(128,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        MaxPooling2D(),
        Conv2D(256,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        Conv2D(256,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        MaxPooling2D(),
        Conv2D(512,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        Conv2D(512,(3,3), activation='relu',padding='same'),
        BatchNormalization(axis=1),
        MaxPooling2D(),
        Flatten(),
        Dense(1000, activation='relu'),
        BatchNormalization(),
        Dense(1000, activation='relu'),
        BatchNormalization(),
        Dense(classes, activation='softmax')
        ])
    model.compile(Adam(lr=lr), loss='categorical_crossentropy', metrics=['accuracy'])
    return model

model_bw = get_model_bw(input_shape=(3,224,224), classes=2)

但它只是拒绝工作...... 它抛出的错误是:

ValueError Traceback(最近一次调用最后一次) ValueError:输入0与图层batch_normalization_181不兼容:预期ndim = 4,找到ndim = 3

有什么建议吗? 附:我正在使用Theano后端和最新的keras版本。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

首先,您必须检查是否使用了数据格式channels_firstchannels_last。 (看来你首先使用频道,输入形状)

Keras的默认值为channels_last。您可以在用户文件夹的keras.json文件中看到:<user>\.keras\keras.json。这也可以为每一层单独设置。

lambda图层

使用图层外的形状(例如input_shape=(3,224,224))时,不指定批量大小(图像数)。

但在lambda图层内(无论何时直接在张量上工作),批量大小都会显示为第一个维度,因此,您的频道不在第一维,而在第二维:

Lambda(lambda x: x[:,1,:,:], input_shape=input_shape, output_shape=outputshape)

当然,您的输出形状不能与输入形状相同,它必须是(1,224,224)

以下图层:

不要将input_shape添加到其他图层,只添加到第一层(即lambda图层)

如果出现任何问题,请显示错误消息。

答案 1 :(得分:0)

我无法相信,但我找到了解决方案:

lambda图层:

from keras import backend as K
Lambda(lambda x: K.expand_dims(x[:,1,:,:],1), input_shape=input_shape, output_shape=(1,224,224)),
相关问题