合并Keras上的图层(点积)

时间:2018-09-27 17:30:07

标签: python tensorflow keras word2vec word-embedding

我一直在关注Towards Data Science的有关word2vec和skip-gram模型的教程,但我偶然发现了一个我无法解决的问题,尽管经过了数小时的搜索并尝试了许多失败的解决方案。

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

由于使用了来自keras.layers的Merge层,因此不建议使用该步骤构建跳过语法模型体系结构的步骤。

我似乎对此进行了很多讨论,并且大多数答案是您现在需要使用Keras的Functional API合并图层。但是问题是,我是Keras的一个初学者,不知道如何将我的代码从顺序转换为功能,这是作者使用(和我复制的)代码:

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

运行该块时,显示以下错误:

ImportError                               Traceback (most recent call last)
<ipython-input-79-80d604373468> in <module>()
----> 1 from keras.layers import Merge
      2 from keras.layers.core import Dense, Reshape
      3 from keras.layers.embeddings import Embedding
      4 from keras.models import Sequential
      5 

ImportError: cannot import name 'Merge'

我要问的是一些有关如何将此顺序转换为功能性API结构的指导。

2 个答案:

答案 0 :(得分:2)

这确实改变了。对于点积,您现在可以使用dot层:

from keras.layers import dot
...
dot_product = dot([target, context], axes=1, normalize=False)
...

当然,您必须根据数据设置axis参数。如果您设置normalize=True,则将使余弦接近。有关更多信息,请参见the documentation

要了解Keras的功能API,请在文档中找到一个不错的guide to the functional API。如果您已经了解顺序API,切换就不难了。

答案 1 :(得分:2)

合并似乎已被弃用,因此可以直接在嵌入时使用Dot(而不是在模型中),而不是使用合并。使用以下代码。

from keras.layers import Input
from keras.models import Model
from keras.layers.embeddings import Embedding
from keras.layers.core import Dense, Reshape
from keras.layers import dot

input_target = Input((1,))
input_context = Input((1,))

embedding = Embedding(vocab_size, embed_size, input_length=1, name='embedding')

word_embedding = embedding(input_target)
word_embedding = Reshape((embed_size, 1))(word_embedding)
context_embedding = embedding(input_context)
context_embedding = Reshape((embed_size, 1))(context_embedding)

# now perform the dot product operation  
dot_product = dot([word_embedding, context_embedding], axes=1)
dot_product = Reshape((1,))(dot_product)

# add the sigmoid output layer
output = Dense(1, activation='sigmoid')(dot_product)

model = Model(input=[input_target, input_context], output=output)
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'))