【问题标题】:how to convert the Keras sequential API to functional API如何将 Keras 顺序 API 转换为函数式 API
【发布时间】:2019-01-24 19:41:54
【问题描述】:

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

【问题讨论】:

  • 您的 Input 实例在哪里?您没有向嵌入层提供任何输入
  • 感谢您的响应,它来自另一个名为 skip gram 的函数,然后在运行 epochs 时调用此模型
  • 你不明白我的意思,我是说 keras.layers.Input 的一个实例
  • 我只是根据另一条评论添加了输入,所以在这种情况下,我必须为 word_model 提供两个输入,为 context_model 提供另一个输入,稍后当我实例化模型时必须说 model = Model(inputs = (inp, inp1), 输出 =mo)

标签: keras embedding


【解决方案1】:

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

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)

【讨论】:

  • 所以在这种情况下将有两个输入,一个用于 word_model,一个用于 context_word,或者只有一个输入
  • 与从优秀社区获得解决方案相比,提出这个问题需要更多时间!!
猜你喜欢
  • 2020-09-02
  • 1970-01-01
  • 2017-10-06
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2020-07-22
  • 1970-01-01
相关资源
最近更新 更多