Keras后端Tensorflow

时间:2018-12-03 07:37:32

标签: tensorflow keras

我必须设计一个将RGB作为输入并产生RGB输出的keras模型。如图所示,我必须为R,G和B设计三个平行层。

Keras Model

现在我的问题是如何将RGB图像分为R,G,B并作为输入给CNN的三个平行层。有人可以帮我吗

from __future__ import print_function
import keras
from keras.utils import plot_model
from keras import backend as K
from keras.models import Sequential, Model
from keras.layers import Dense, Activation
from keras.layers import Conv2D, MaxPooling2D, Input, concatenate,  
ZeroPadding2D, merge, add
import tensorflow as tf
from keras.models import load_model
from keras import optimizers
from keras import losses
from keras.optimizers import SGD, Adam
from keras.callbacks import ModelCheckpoint
visible = Input(shape=(64,64,3))

R = visible[:][:][:][0]
G = visible[:][:][:][1]
B = visible[:][:][:][2]

#red, green, blue = tf.split(3, 3, visible)
# first feature extractor

#conv1_1 = Conv2D(32, kernel_size=3, padding='same', 
#kernel_initializer='he_normal')(visible)
conv1_1 = Conv2D(32, kernel_size=3, padding='same', 
kernel_initializer='he_normal')(R)
conv1_1 = Activation('relu')(conv1_1)

conv2_1 = Conv2D(32, kernel_size=3, padding='same', 
kernel_initializer='he_normal')(conv1_1)
conv2_1 = Activation('relu')(conv2_1)

conv3_1= Conv2D(32, kernel_size=3, padding='same', 
kernel_initializer='he_normal')(conv2_1)
conv3_1 = Activation('relu')(conv3_1)

#conv1_2 = Conv2D(32, kernel_size=3, padding='same', 
#kernel_initializer='he_normal')(visible)
conv1_2 = Conv2D(32, kernel_size=3, padding='same', 
kernel_initializer='he_normal')(G)
conv1_2 = Activation('relu')(conv1_2)

conv2_2 = Conv2D(32, kernel_size=3, padding='same', 
kernel_initializer='he_normal')(conv1_2)
conv2_2 = Activation('relu')(conv2_2)

conv3_2= Conv2D(32, kernel_size=3, padding='same', 
kernel_initializer='he_normal')(conv2_2)
conv3_2 = Activation('relu')(conv3_2)

#conv1_3 = Conv2D(32, kernel_size=3, padding='same', 
#kernel_initializer='he_normal')(visible)
conv1_3 = Conv2D(32, kernel_size=3, padding='same', 
kernel_initializer='he_normal')(B)
conv1_3 = Activation('relu')(conv1_3)

conv2_3 = Conv2D(32, kernel_size=3, padding='same', 
kernel_initializer='he_normal')(conv1_3)
conv2_3 = Activation('relu')(conv2_3)

conv3_3= Conv2D(32, kernel_size=3, padding='same', 
kernel_initializer='he_normal')(conv2_3)
conv3_3 = Activation('relu')(conv3_3)


merge = concatenate([conv3_1, conv3_2, conv3_3])

model = Model(inputs=visible, outputs=merge)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='shared_input_layer.png')

我想将“可见”分为R,G,B,并将其作为输入提供给conv1_1,conv1_2和conv1_3。我想添加图层以拆分RGB并自动提供输入

3 个答案:

答案 0 :(得分:1)

如果三个网不同:

visible = Input((64,64,3))

RGB = Lambda(lambda x: tf.split(x, 3, axis=-1))(visible)

net1 = Conv2D(....)(RGB[0])
net1 = Activation(....)(net1)
net1 = Conv2D(....)(net1)
net1 = Activatoin(....)(net1)

net2 = Conv2D(....)(RGB[1])
....

net3 = Conv2D(....)(RGB[2])
.....

joined = Concatenate()([net1,net2,net3])

model = Model(visible, joined)

如果三个网相同:

visible = Input((64,64,3))

out = Lambda(lambda x: K.permute_dimensions(x,(0,3,1,2)))(visible)
out = Reshape((3,64,64,1))(out)

out = TimeDistributed(Conv2D(...))(out)
out = TimeDistributed(Activation(...))(out)
out = TimeDistributed(Conv2D(...))(out)
....

out = Reshape((3,64,64))(out)
out = Lambda(lambda x: K.permute_dimensions(x, (0,2,3,1)))(out)

model = Model(visible,out)

答案 1 :(得分:0)

对于多输入,多输出模型,请使用功能性api:https://keras.io/getting-started/functional-api-guide/

要合并conv层的结果,可以使用keras的连接层。 https://keras.io/layers/merge/#concatenate

imgs, y = read_data()
R = imgs[:][:][:][0]
G = imgs[:][:][:][1]
B = imgs[:][:][:][2]
model.fit([R,G,B], y, ...)

答案 2 :(得分:0)

在模型中输入RGB图像时,实际上是在输入张量为(height ,width ,3)的张量,其中3代表3个通道(红色,绿色,黄色)

enter image description here

您可以通过以下方式分隔频道:

b, g, r    = image_array[:, :, 0], image_array[:, :, 1], image_array[:, :, 2]

请确保您的通道正确对齐(如果存在Alpha通道,请小心删除)

您还可以使用OpenCV,这将使处理图像更加容易

import cv2
b, g, r    = cv2.split(image_array)