在我的Keras CNN中,我添加了如下输入图层:
model.add(Conv2D(32, (3, 3), input_shape=(img_width, img_height, nb_channel)))
nb_channel = 3表示RGB输入,= 1表示灰度输入,flow_from_directory
和ImageDataGenerator
但是,我想指定一组颜色来输入我的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步骤,我们可以选择我们想要的切片。
答案 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)