【问题标题】:How can I connect the outputs of 2 keras models into one seperate layer?如何将 2 个 keras 模型的输出连接到一个单独的层?
【发布时间】:2023-08-02 00:37:01
【问题描述】:

我正在尝试解决一个问题,我最初需要获取 2 个输入,将它们中的每一个传递通过自动编码器层,然后将所有内容连接到将连接到两个自动编码器输出的层。

This is how the model should look at the end

我已经创建了自动编码器层并保存了它们。我无法找出如何将编码数据的两个输出连接到一层。非常感谢您的建议。

编辑:

我一直在研究连接层,它似乎应该可以完成这项工作。但是,我仍然不知道如何将自动编码器的最后一层连接到连接层。

自动编码器层的形状如下:

input_1 (InputLayer)         [(None, 85)]                       
_________________________________________________________________
dense (Dense)                (None, 54)                     
_________________________________________________________________
dense_2 (Dense)              (None, 36)                      

以及连接层的形成:

connector = keras.layers.Concatenate()([autoencoder1.layers[2], autoencoder2.layers[2]])

autoencoder1、autoencoder2 都是加载的 autoencoder 模型层。

它会抛出以下错误:

TypeError: 'NoneType' object is not subscriptable

【问题讨论】:

    标签: python tensorflow machine-learning keras autoencoder


    【解决方案1】:

    尝试使用连接层。它需要多个张量并将它们连接到一个张量。

    https://keras.io/api/layers/merging_layers/concatenate/

    根据您编辑的问题,我了解您希望共享编码器的层,这意味着您希望对两个输入使用相同的权重。如果我理解正确,网络应该是这样的:

    from keras import Sequential, Model
    from keras.layers import Input, Dense, Concatenate
    
    encoder = Sequential([
            Dense(54),
            Dense(36)])
    input_1 = Input(85)
    input_2 = Input(85)
    encoded_1 = encoder(input_1)
    encoded_2 = encoder(input_2)
    concat = Concatenate()([encoded_1, encoded_2])
    ...
    model = Model(inputs=[input_1, input_2], outputs=[...])
    

    【讨论】:

    • 是的,事实上我确实想把模型做成这样。我有一个已经准备好的编码器,我在一个单独的文件中训练了这些层:输入 85 Dense 54 Dense 36。我只需要加载它两次并将 2 个编码器与一个连接层连接起来。这不起作用并抛出我在编辑中显示的错误。我会按照你的建议做,但我更喜欢使用已经训练过的编码器,只连接它的两个实例。关于我的代码有什么问题的任何线索?
    • 为什么需要两个 encodrr 实例?似乎加载编码器模型并像使用功能 API 的层一样使用它应该可以解决您的问题。
    • 您所说的将模型用作具有功能性 API 的层是什么意思?我很确定我的代码与您的代码完全相同,但它不起作用。我需要两个编码器层实例,因为我正在使用 2 个单独的输入,并且我希望它们都通过编码器层。
    【解决方案2】:

    【讨论】:

      最近更新 更多