【问题标题】:AssertionError while trying to concatenate two models and fit in Keras尝试连接两个模型并适合 Keras 时出现 AssertionError
【发布时间】:2019-03-05 03:32:05
【问题描述】:

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

  1. 生成图像模型
  2. 生成字幕模型
  3. 将图像和标题模型连接在一起

由于代码很长,我创建了一个Gist to show the methods

这是summary of my image model and caption model

然后我运行代码,我收到了这个错误:

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

由于错误来自 Keras 库,我不知道如何调试它。但是当我尝试将它们连接在一起时出现了问题。

我想知道我是否在这里遗漏了什么

【问题讨论】:

  • 这是我在这里找到的最后一个版本:“image_captioning.py”

标签: python machine-learning keras deep-learning keras-layer


【解决方案1】:

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

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, 41, 2327)。 41 是最大长度。我试图添加一个TimeDistributed 层,但这并没有按预期工作。知道如何解决吗?
  • @YedhuKrishnan 你快到了:不需要TimeDistributed 层,因为Dense layer is applied on the last axis。只需在 LSTM 层设置return_sequences=True
  • @today ,你能写出类似的函数,但使用顺序 Keras API 吗?
  • @Ghanem 您不能这样做,因为 Sequential API 可用于顺序模型,即一层直接连接到前一层。因此,当有连接层时,模型就不再是连续的了。
  • @Ghanem 那是在旧版本的 Keras(我认为 Merge 层。在当前版本中没有这样的层和每个合并操作has its own separate layer。而且你不能在顺序模型中使用它们。
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2020-04-22
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2020-09-12
相关资源
最近更新 更多