2017-08-12 6 views
4

Kerasの埋め込みレイヤーがわかりません。それを説明する記事がたくさんありますが、私はまだ混乱しています。誰かがいくつかの例でそれを説明できる場合たとえば、このコードでIMDB評判分析例を使って説明する:ケラスのレイヤを埋め込む方法

top_words = 5000 
max_review_length = 500 
embedding_vecor_length = 32  

model = Sequential() 
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) 
model.add(LSTM(100)) 
model.add(Dense(1, activation='sigmoid')) 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
print(model.summary()) 
model.fit(X_train, y_train, nb_epoch=3, batch_size=64) 

から以下のコードは、埋め込み層は、層を埋め込むの出力であるもの、それは素敵な正確に何でしょうないかもしれませんさあ!!

+1

[Kerasの埋め込みとは何ですか?](https://stackoverflow.com/questions/38189713/what-is-an-embedding-in-keras) – DJK

+0

これはtheanoで説明しましたが、それは簡単ですケラスの例で理解する – user1670773

+0

層の数学は同じ原理に従います。 – DJK

答えて

2

埋め込みレイヤーは、word2vecやあらかじめ計算された手袋のように、入力単語から埋め込みベクトルを作成します(私自身はまだ数学を理解できません)。

コードを取得する前に、簡単な例を示しましょう。

texts = ['This is a text','This is not a text'] 

まず、各単語がベクトルの辞書と順に単語に割り当てられた番号は、単語のシーケンスを作成し、ある整数のベクトルにこれらの文章を回します。

from keras.preprocessing.text import Tokenizer 
from keras.preprocessing.sequence import pad_sequences 
from keras.utils import to_categorical 

max_review_length = 6 #maximum length of the sentence 
embedding_vecor_length = 3 
top_words = 10 

#num_words is tne number of unique words in the sequence, if there's more top count words are taken 
tokenizer = Tokenizer(top_words) 
tokenizer.fit_on_texts(texts) 
sequences = tokenizer.texts_to_sequences(texts) 
word_index = tokenizer.word_index 
input_dim = len(word_index) + 1 
print('Found %s unique tokens.' % len(word_index)) 

#max_review_length is the maximum length of the input text so that we can create vector [... 0,0,1,3,50] where 1,3,50 are individual words 
data = pad_sequences(sequences, max_review_length) 

print('Shape of data tensor:', data.shape) 
print(data) 

[Out:] 
'This is a text' --> [0 0 1 2 3 4] 
'This is not a text' --> [0 1 2 5 3 4] 

今、あなたはこれらの埋め込み層へ

from keras.models import Sequential 
from keras.layers import Embedding 

model = Sequential() 
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length,mask_zero=True)) 
model.compile(optimizer='adam', loss='categorical_crossentropy') 
output_array = model.predict(data) 

output_arrayはサイズの配列(2、6、3)入力が含まれていることができます。私の場合は2件の入力レビューや文章、6が最大数です各レビューの単語数(max_review_length)と3はembedding_vecor_lengthです。 など。

array([[[-0.01494285, -0.007915 , 0.01764857], 
    [-0.01494285, -0.007915 , 0.01764857], 
    [-0.03019481, -0.02910612, 0.03518577], 
    [-0.0046863 , 0.04763055, -0.02629668], 
    [ 0.02297204, 0.02146662, 0.03114786], 
    [ 0.01634104, 0.02296363, -0.02348827]], 

    [[-0.01494285, -0.007915 , 0.01764857], 
    [-0.03019481, -0.02910612, 0.03518577], 
    [-0.0046863 , 0.04763055, -0.02629668], 
    [-0.01736645, -0.03719328, 0.02757809], 
    [ 0.02297204, 0.02146662, 0.03114786], 
    [ 0.01634104, 0.02296363, -0.02348827]]], dtype=float32) 
サイズの最大500語(以上は削除されます)のレビューを作成して、ベクターにこれらの500個の単語のそれぞれを回すことができますが、5000個の単語のリストを持って、あなたの場合は

、32

ます実行することにより、単語インデックスと埋め込みベクトルの間のマッピングを取得することができます:

model.layers[0].get_weights() 

をtop_words以下の場合は10だったので、私たちは10ワードのマッピングを持っているし、あなたがそのマッピングを見ることができます0、1、2、3、 4と5は上記のoutput_arrayに等しい。

[array([[-0.01494285, -0.007915 , 0.01764857], 
    [-0.03019481, -0.02910612, 0.03518577], 
    [-0.0046863 , 0.04763055, -0.02629668], 
    [ 0.02297204, 0.02146662, 0.03114786], 
    [ 0.01634104, 0.02296363, -0.02348827], 
    [-0.01736645, -0.03719328, 0.02757809], 
    [ 0.0100757 , -0.03956784, 0.03794377], 
    [-0.02672029, -0.00879055, -0.039394 ], 
    [-0.00949502, -0.02805768, -0.04179233], 
    [ 0.0180716 , 0.03622523, 0.02232374]], dtype=float32)] 

これらのベクターはhttps://stats.stackexchange.com/questions/270546/how-does-keras-embedding-layer-workで述べたようにはランダムとして開始し、ちょうどネットワークの他のパラメータのようなnetwordオプティマイザによって最適化されています。

関連する問題