我是Keras的新手,在完成了一些教程之后,我开始构建模型并发现这两种实现方式。但是我在第一个和第二个中出现错误,可以正常工作。有人可以解释两者之间的区别吗?
第一种方法:
visible = Embedding(QsVocabSize, 1024, input_length=max_length_inp, mask_zero=True)
encoder = LSTM(100,activation='relu')(visible)
第二种方法:
model = Sequential()
model.add(Embedding(QsVocabSize, 1024, input_length=max_length_inp, mask_zero=True))
model.add(LSTM(100,activation ='relu'))
这是我得到的错误:
ValueError: Layer lstm_59 was called with an input that isn't a symbolic tensor. Received type: <class 'keras.layers.embeddings.Embedding'>. Full input: [<keras.layers.embeddings.Embedding object at 0x00000207BC7DBCC0>]. All inputs to the layer should be tensors.
答案 0 :(得分:0)
它们是在Keras中创建DL模型的两种方法。第一个代码段遵循功能样式。这种样式用于创建复杂的模型,例如多输入/输出,共享层等。
https://keras.io/getting-started/functional-api-guide/
第二个代码段是顺序样式。可以创建简单的模型,其中只涉及层的堆叠。
https://keras.io/getting-started/sequential-model-guide/
如果您阅读功能API指南,则会注意到以下几点:
'一个层实例是可调用的(在张量上),并且它返回一个张量'
现在,您看到的错误将变得有意义。该行仅创建图层,而不会通过传递张量来调用它。
visible = Embedding(QsVocabSize, 1024, input_length=max_length_inp, mask_zero=True)
随后,将此嵌入对象传递到LSTM层会引发错误,因为它期望张量。
这是功能性API指南中的示例。注意输出张量从一层传递到另一层。
main_input = Input(shape=(100,), dtype='int32', name='main_input')
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
lstm_out = LSTM(32)(x)