如何将 Keras 顺序 API 转换为函数式 API

how to convert the Keras sequential API to functional API

我是 nlp 的新手,正在尝试从网站学习 skip gram:

https://towardsdatascience.com/understanding-feature-engineering-part-4-deep-learning-methods-for-text-data-96c44370bbfa

我正在尝试实现 skip gram,我 运行 遇到的问题是下面的代码是 keras 的顺序 API 并且它不支持合并(稍后在代码如下)

word_model.add(Embedding(vocab_size, embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1))
word_model.add(Reshape((embed_size, )))

所以我正在尝试将其转换为函数式 api

word_model = Embedding(input_dim=vocab_size, output_dim=embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1)

word_model = Reshape(target_shape= (embed_size,))(word_model)

但是我收到以下错误 意外找到 <class 'keras.layers.embeddings.Embedding'> 类型的实例。需要符号张量实例。

我试过重塑图层和背景,但还是不行。

请建议如何转换或使其工作。

提前致谢。

from keras.layers import Merge
from keras.layers.core import Dense, Reshape
from keras.layers.embeddings import Embedding
from keras.models import Sequential

# build skip-gram architecture
word_model = Sequential()
word_model.add(Embedding(vocab_size, embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1))
word_model.add(Reshape((embed_size, )))

context_model = Sequential()
context_model.add(Embedding(vocab_size, embed_size,
                  embeddings_initializer="glorot_uniform",
                  input_length=1))
context_model.add(Reshape((embed_size,)))

model = Sequential()
model.add(Merge([word_model, context_model], mode="dot"))
model.add(Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid"))
model.compile(loss="mean_squared_error", optimizer="rmsprop")

# view model summary
print(model.summary())

# visualize model structure
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot

SVG(model_to_dot(model, show_shapes=True, show_layer_names=False, 
                 rankdir='TB').create(prog='dot', format='svg'))

您首先需要一个输入层,然后将其传递到嵌入层。以下是使用两个输入(一个用于目标词,一个用于上下文词)的示例:

target_input = keras.layers.Input(input_shape)
context_input = keras.layers.Input(input_shape)

target_emb = Embedding(input_dim=vocab_size, output_dim=embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1)(target_input)
target_emb = Reshape((embed_size,))(target_emb)

context_emb = Embedding(input_dim=vocab_size, output_dim=embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1)(context_input)
context_emb = Reshape((embed_size,))(target_emb)

# Add the remaining layers here...

model = keras.models.Model(inputs=[target_input, context_input], outputs=output)