Python AssertionError试图连接两个模型并适合Keras

Python AssertionError试图连接两个模型并适合Keras,python,machine-learning,keras,deep-learning,keras-layer,Python,Machine Learning,Keras,Deep Learning,Keras Layer,我正在尝试开发一个图像字幕模型。我指的是这个。我有三种方法,它们执行以下操作: 生成图像模型 生成标题模型 将图像和标题模型连接在一起 由于代码很长,我创建了一个 这是一本书 但当我运行代码时,我得到了以下错误: TraceTraceback (most recent call last): File "trainer.py", line 99, in <module> model.fit([images, encoded_captions], one_hot_capti

我正在尝试开发一个图像字幕模型。我指的是这个。我有三种方法,它们执行以下操作:

  • 生成图像模型
  • 生成标题模型
  • 将图像和标题模型连接在一起
  • 由于代码很长,我创建了一个

    这是一本书

    但当我运行代码时,我得到了以下错误:

    TraceTraceback (most recent call last):
      File "trainer.py", line 99, in <module>
        model.fit([images, encoded_captions], one_hot_captions, batch_size = 1, epochs = 5)
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 950, in fit
        batch_size=batch_size)
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 671, in _standardize_user_data
        self._set_inputs(x)
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 575, in _set_inputs
        assert len(inputs) == 1
    AssertionError
    
    TraceTraceback(最近一次呼叫最后一次):
    文件“trainer.py”,第99行,在
    model.fit([图像,编码字幕],一个热门字幕,批量大小=1,时代=5)
    文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py”,第950行,适合
    批次大小=批次大小)
    文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/keras/engine/training.py”,第671行,在用户数据中
    自设置输入(x)
    文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py”,第575行,输入
    断言len(输入)==1
    断言错误
    
    由于错误来自Keras库,我不知道如何调试它。但当我试图将它们连接在一起时,出现了一些问题


    我想知道这里是否缺少一些内容

    您需要使用
    输出
    属性获取模型的输出,然后使用能够连接它们(通过层或其等效功能接口)并创建最终模型:

    from keras.models import Model
    
    image_model = get_image_model()
    language_model = get_language_model(vocab_size)
    
    merged = concatenate([image_model.output, language_model.output])
    x = LSTM(256, return_sequences = False)(merged)
    x = Dense(vocab_size)(x)
    out = Activation('softmax')(x)
    
    model = Model([image_model.input, language_model.input], out)
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
    model.fit([images, encoded_captions], one_hot_captions, ...)
    
    正如现在代码中所示,您还可以为模型创建逻辑定义一个函数:

    def get_concatenated_model(image_model, language_model, vocab_size):
        merged = concatenate([image_model.output, language_model.output])
        x = LSTM(256, return_sequences = False)(merged)
        x = Dense(vocab_size)(x)
        out = Activation('softmax')(x)
    
        model = Model([image_model.input, language_model.input], out)
        return model
    

    这有助于解决问题。非常感谢。我还有一个问题。我的输出必须是时间分布的,因为我有不止一个单词作为标题。这里,预期的输出形状是
    (None,2327)
    ,但我需要
    (None,412327)
    。41是最大长度。我试图添加一个
    TimeDistributed
    层,但没有按预期工作。你知道怎么解决吗?@YedhuKrishnan你就快到了:不需要
    TimeDistributed
    层,因为。只需在LSTM层中设置
    return\u sequences=True
    。@今天,您可以使用顺序Keras API编写类似的函数吗?@Ghanem您不能这样做,因为顺序API可以用于顺序模型,即一层直接连接到前一层。因此,当有一个连接层时,模型就不再是连续的。@Ghanem在旧版本的Keras中(我认为<2.0),当时有一个用于各种合并操作的
    Merge
    层。在当前版本中,没有这样的层和每个合并操作。你不能在顺序模型中使用它们。这是我在这里找到的最后一个版本吗:“image\u captioning.py”