两个平行的conv2d层(keras)

时间:2018-07-26 19:15:48

标签: tensorflow keras conv-neural-network

我要两个人建立一个神经网络,以两个具有相同尺寸(例如灰度图像)的单独矩阵作为输入,并输出一个介于-1和1之间(可能为tanh)的值。

我想构建网络,以便有两个单独的卷积层作为输入。每一个取一个矩阵(或图像)。然后将这些内容合并到下一层。所以我希望它看起来像这样:

enter image description here

我的第一个问题是我可以在keras中这样做吗? 第二个问题是?是否有意义? 因为我也可以很容易地将两个矩阵合成在一起,并且只使用一个conv2d层。像这样:

enter image description here

我想确切地做的事情太过分了。但是您能想象第一个版本更有意义的情况吗?

1 个答案:

答案 0 :(得分:2)

如果输入不同,则可以在Keras中这样做,这很有意义。要在keras中这样做,首先需要一个多输入模型,并且必须将卷积层的输出连接在一起。

input_1= Input(shape=(x,y), name='input_1')
input_2= Input(shape=(x,y), name='input_1')
c1 = Conv2D(filter_size, kernel_size))(input_1)
p1 = MaxPooling2D(pool_size=(2, 2)(input_1)
f1 = Flatten()(p1)
c2 = Conv2D(filter_size, kernel_size))(input_2)
p2 = MaxPooling2D(pool_size=(2, 2)(c2)
f2 = Flatten()(p2)

x = concatenate([f1, f2])
x = Dense(num_classes, activation='sigmoid')(x)

model = Model(inputs=[input_1, input_2], outputs=[x])
model.compile('adam', 'binary_crossentropy', metrics=['accuracy'])    

根据您的数据,也可能共享卷积层,因此您只需定义一次dem即可重用它们。在这种情况下,权重是共享的。

conv = Conv2D(filter_size, kernel_size))
pooling = MaxPooling2D(pool_size=(2, 2)
flatten = Flatten()

f1 = flatten(pooling(conv(input_1)))
f2 = flatten(pooling(conv(input_2)))