首页 文章

两个并行的conv2d层(keras)

提问于
浏览
0

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

我想构建网络,以便有两个单独的卷积层作为输入 . 每一个都采用一个矩阵(或图像) . 然后将这些组合在下一层中 . 所以我希望它看起来像这样:

enter image description here

我的第一个问题是我可以在keras中执行此操作(或者如果不是在tensorflow中)吗?第二个问题是?是否有意义?因为我也可以很容易地将两个矩阵合成在一起,并且只使用一个conv2d层 . 所以像这样:

enter image description here

我想要做的事情会走得太远 . 但你能想象出第一个版本更有意义的情况吗?

1 回答

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

相关问题