【问题标题】:Training Keras CNN model on Green channel from RGB images从 RGB 图像在绿色通道上训练 Keras CNN 模型
【发布时间】:2017-09-14 12:18:39
【问题描述】:

到目前为止,我已经尝试解决这个问题大约 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: Input 0 is in compatible with layer batch_normalization_181: expected ndim=4, found ndim=3

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

我们将不胜感激。

【问题讨论】:

  • 请详细说明“拒绝工作”的含义。包括可能的错误消息。
  • 您必须发布错误消息,以便人们了解发生了什么。
  • 谢谢,我已经添加了错误信息。

标签: deep-learning keras keras-layer


【解决方案1】:

首先您必须检查您使用的数据格式是channels_first 还是channels_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)

当然,你的输出shape不能和输入shape一样,必须是(1,224,224)

以下层:

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


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

【讨论】:

  • 谢谢。我正在使用channel_first。我已经编辑了我的原始帖子并添加了错误消息。还是不行
【解决方案2】:

我不敢相信,但我找到了解决方案:

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)),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2019-04-14
    • 2017-08-27
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多