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”