私はWord2vecとスキップグラムモデルに関するTowards Data Scienceのチュートリアルに従ってきましたが、何時間もそれを検索し、多くの失敗した解決策を試しても解決できない問題に遭遇しました。
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構造に変換する方法に関するガイダンスです。
これは確かに変わりました。ドット積の場合、dot
レイヤーを使用できるようになりました。
from keras.layers import dot
...
dot_product = dot([target, context], axes=1, normalize=False)
...
もちろん、データに応じてaxis
パラメータを設定する必要があります。 normalize=True
を設定すると、コサイン近接度が得られます。詳細については、 ドキュメント を参照してください。
Kerasへの関数型APIについて学ぶために、ドキュメントに優れた 関数型APIへのガイド があります。すでにシーケンシャルAPIを理解していれば、切り替えは難しくありません。
Mergeは非推奨のようですので、Mergeの代わりに埋め込みで(モデルではなく)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'))