2016-01-29 13 views
9

ニューラルネットワークとKerasライブラリの新機能です。hereの埋め込みレイヤーを使用して入力データをマスクする方法が不思議ですRNNの場合、2Dテンソルから3Dテンソルに変換されます。Kerasのリカレントニューラルネットワーク(RNN)のエンベディングレイヤーの使用方法

(増加時に)次のようにデータを見て、私の時系列セイ:今すぐ

X_train = [ 
    [1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    ... 
] # with a length of 1000 

、私はRNNの時間tの特徴ベクトルを予測するための最後の2つの特徴ベクトルを与えたいと思うだろうと言います+1。

現在、埋め込みレイヤーなしで、形状(nb_samples、timesteps、input_dim)を持つ必要な3Dテンソルを作成しています(この例ではhere)。次のように私の例に関連

、最終3Dテンソルはその後になります。

X_train_2 = [ 
    [[1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0]], 
    [[2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0]], 
    [[3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0]], 
    etc... 
] 

とY_train:

Y_train = [ 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    etc... 
] 

次のように私のモデルが見えますが(上記の単純な例に適応):

num_of_vectors = 2 
vect_dimension = 4 

model = Sequential() 
model.add(SimpleRNN(hidden_neurons, return_sequences=False, input_shape=(num_of_vectors, vect_dimension))) 
model.add(Dense(vect_dimension)) 
model.add(Activation("linear")) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 
model.fit(X_train, Y_train, batch_size=50, nb_epoch=10, validation_split=0.15) 

最後に、私の質問は、どのようにこれらの2Dテンソルから3Dテンソルは自分自身を再形成し、代わりに埋め込みレイヤーを使用しますか?おそらく答えは私は単純に埋め込み層のドキュメンテーションによって混乱している、かなり単純です

model.add(Embedding(?????)) 

:私は、モデルの後に=シーケンシャル()私のような何かを追加する必要がありますね。

答えて

7

あなたはそれできるが、以下のように:

注:

  1. を私はちょうどあなたの入力構造のいくつかのアイデアを与えることを0として、いくつかのXとYを生成しました。

  2. マルチクラスのy_trainを使用している場合は、バイナリ化する必要があります。

  3. さまざまな長さのデータがある場合は、埋め込みを追加する必要があります。

  4. 時刻t + 1で予測することについて正しく理解していれば、シーケンスからシーケンスへの学習を見てみるとよいでしょう。

ような何か試してみてください:私がこれまで知っているから

hidden_neurons = 4 
nb_classes =3 
embedding_size =10 

X = np.zeros((128, hidden_neurons), dtype=np.float32) 
y = np.zeros((128, nb_classes), dtype=np.int8) 


model = Sequential() 
model.add(Embedding(hidden_neurons, embedding_size)) 
model.add(SimpleRNN(hidden_neurons, return_sequences=False)) 
model.add(Dense(nb_classes)) 
model.add(Activation("softmax")) 
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', class_mode="categorical") 
model.fit(X, y, batch_size=1, nb_epoch=1) 
+0

多分私はすべての私の数字の後ろに ".0"を加えていたはずです。私は実際には、カテゴリ分析を実行しようとしていません。 – Kito

0

を、埋め込み層は、多かれ少なかれword embeddingなどの次元削減のためであると思われます。したがって、この意味では、一般的な形状変更ツールとしては当てはまりません。

基本的に、{car:1、mouse:2 ... zebra:9999}のように整数に単語をマッピングすると、入力テキストは[1,2のような整数IDで表される単語のベクトルになります、9999 ...]、これは[車、マウス、ゼブラ...]を意味します。しかし、ボキャブラリの長さの実数のベクトルに単語をマップするのは効率的なようです。したがって、テキストに1000個のユニークワードがある場合、1000個の実数ベクトルに各ワードをマップします。それは主に単語の意味が他のすべての単語とどれほど似ているかの重さを表していると思いますが、私はそれが正しいと確信できず、単語を埋め込む他の方法があります。

関連する問題