在Keras训练模型图像输入中选择特定的一组RGB通道

时间:2018-05-20 11:07:18

标签: python image tensorflow keras

在我的Keras CNN中,我添加了如下输入图层:

model.add(Conv2D(32, (3, 3), input_shape=(img_width, img_height, nb_channel)))

nb_channel = 3表示RGB输入,= 1表示灰度输入,flow_from_directoryImageDataGenerator

但是,我想指定一组颜色来输入我的CNN,例如,只允许绿色和红色通道,我该怎么办?

我使用带有张量流后端的Keras

除了@ Minh-Tuan Nguyen的整洁解决方案,我们也可以按照以下方式进行切片

#custom filter
def filter_layer(x):
    red_x = x[:,:,:,0]
    blue_x = x[:,:,:,2]
    green_x = x[:,:,:,1]
    red_x = tf.expand_dims(red_x, axis=3)
    blue_x = tf.expand_dims(blue_x, axis=3)
    green_x = tf.expand_dims(green_x, axis=3)
    output = tf.concat([red_x, blue_x], axis=3)
    return output
#model
input = Input(shape=(img_height, img_width, img_channels))

在concat步骤,我们可以选择我们想要的切片。

2 个答案:

答案 0 :(得分:3)

您可以在自定义Lambda图层中对输入张量进行切片。假设您只想要红色和绿色:

model.add(Lambda(lambda x: x[:,:,:,:2], input_shape=(w, h, channels)))

TensorFlow允许类似切片到NumPy,对于Keras,您需要将其包裹在Lambda图层中以合并到您的模型中。

答案 1 :(得分:2)

我认为在这里更“天真”地处理切片会更容易,因为据我所知,Keras不支持使用python和numpy等索引列表对张量进行切片。以下是我针对此问题的代码示例。尝试查看它是否符合您的要求。

indices = [0,2]

def filter_layer(input, indices=indices):
    for i in range(len(indices)):
        index = indices[i]
        x_temp = Lambda(lambda x: x[:,:,:,index][...,None])(input)

        if i==0:
            x = x_temp
        else:
            x = Concatenate(-1)([x, x_temp])
        return x

input = Input(shape=(img_height, img_width, img_channels))
x = Lambda(filter_layer)(input)