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

如何将Keras顺序API转换为函数API,keras,embedding,Keras,Embedding,我是nlp新手,正在尝试从网站学习skip gram: 我试图实现skip-gram,但遇到的问题是,下面的代码是keras的顺序API,它不支持合并(后面的代码如下所示) 所以我试图将其转换为函数式api word_model = Embedding(input_dim=vocab_size, output_dim=embed_size, embeddings_initializer="glorot_uniform",

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

我试图实现skip-gram,但遇到的问题是,下面的代码是keras的顺序API,它不支持合并(后面的代码如下所示)

所以我试图将其转换为函数式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)
然而,我得到下面的错误 意外发现类型为
的实例。应为符号张量实例

我尝试了图层和背景的重塑,但仍然不起作用

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

提前谢谢

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'))

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


您的输入实例在哪里?你没有为你的嵌入层提供任何输入,而是从另一个叫做skip gram的函数中获取响应,然后在运行Epochs时调用这个模型你不理解我,我是说keras.layers.Inputi的一个实例,只是根据另一个注释添加了输入,因此,在这种情况下,我必须给出两个输入,一个用于word_模型,另一个用于context_模型,稍后当我实例化模型时,必须说model=model(输入=(inp,inp1),输出=mo)因此,在这种情况下,将有两个输入,一个用于word_模型,一个用于context_word,或者只有一个输入。因此,与从精彩社区获得解决方案相比,构建这个问题花费了更多的时间!!
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)