如何在Keras的一个模型中两次使用同一层/模型?

时间:2020-02-06 11:50:44

标签: python tensorflow keras deep-learning

我正在尝试创建一个组合模型,该模型一次将两个不同的图像通过一个子模型(一个编码器)传递,然后污染两个结果并将它们提供给最终的子模型,从而根据在这两个潜在表示上。我想对两个图像使用相同的编码器以减少训练时间,因为如果我确实需要对图像进行编码,我肯定只需要一个编码器吗? (我应该注意这些图像是相似的。)

但是,在制作了编码器和最终子模型之后,我尝试使用以下代码制作最终的组合模型:

combinedModel = keras.Model(inputs=[encoder.input, encoder.input], outputs=finalSubModel)

尽管如此,Keras还是不喜欢我两次使用相同的模型,这给了我以下错误:

ValueError: The list of inputs passed to the model is redundant. All inputs should only appear once. Found: [<tf.Tensor 'input_2:0' shape=(None, 32, 32, 1) dtype=float32>, <tf.Tensor 'input_2:0' shape=(None, 32, 32, 1) dtype=float32>]

在keras中是否可以在一个模型中一次使用相同的子模型,还是我必须对使用的2种不同类别的图像使用单独的编码器?

1 个答案:

答案 0 :(得分:2)

假设您使用以下功能构建了模型:

def make_encoder(h, w, c):
    inp = Input((h, w, c))
    x = SomeLayer()(inp)
    x = SomeLayer()(x)
    ....
    out = OutLayer()(x)
    return Model(inputs=[inp], outputs=[out])

现在,要创建组合模型,您需要为每个调用使用具有不同Input层的相同编码器。要了解最后一行,请看以下内容:

def make_combined(h, w, c):
    inp1 = Input((h, w, c))
    inp2 = Input((h, w, c))
    encoder = make_encoder(h, w, c)

    encoded_1 = encoder(inp1)
    encoded_2 = encoder(inp2)

    # Concatenate the result
    encoded_out = Concatenate()([encoded_1, encoded_2])

    return Model(inputs=[inp1, inp2], outputs=[encoded_out])

注意,我正在使用两个不同的虚拟Input层为同一编码器提供单独的输入。