2016-08-29 5 views
2

モデルには、最初のレイヤーとしてLSTMがあります。Keraでは、model.predictの呼び出しでLSTMの状態がリセットされるのはいつですか?

model.predictを呼び出すあなたはいくつかのサンプルを渡し言う:

>sam = np.array([ [[.5, .6, .3]], [[.6, .6, .3]], [[.5, .6, .3]] ]) 
>model.predict(sam) 
array([[ 0.23589483], 
     [ 0.2327884 ], 
     [ 0.23589483]]) 

我々はマッピング見る上:[[0.5、0.6、0.3]] - 1つの要素の> 0.23589483などは(シーケンス

モデルのinput_lengthは1で、input_dimは3です。最初と最後は同じで出力は同じです(0.23589483)。だから私の前提は、Kerasがサンプル(この場合は1-3Dベクトルのシーケンス)を処理した後、モデルのメモリをリセットするということです。つまり、各シーケンスは基本的に独立しています。このビューに間違った情報や誤解を招く情報はありますか?

input_length 3とinput_dim 1で別の例を考えてみましょう。今回は、シーケンス内の値を切り替えて、別の結果を参照します(2番目のリストと最後のリストを比較してください)。したがってKerasはシーケンスを処理するのでメモリは変化しますが、処理が完了するとメモリがリセットされます(最初と2番目のシーケンスは同じ結果を持ちます)。

sam = np.array([ [[.1],[.1],[.9]], [[.1],[.9],[.1]], [[.1],[.1],[.9]] ]) 
model.predict(sam) 
array([[ 0.69906837], 
    [ 0.1454899 ], 
    [ 0.69906837]]) 

我々はマッピングを参照の上、[を[0.1]、[1]、[9]。。] - > 0.69906837など(実数への3つの要素のシーケンス)

答えて

1

あなたはmodel.predict()を呼び出していますこれは、入力を処理するときにネットワークの重みが変化しないことを意味します。したがって、[[.1],[.1],[.9]]を入力すると、間に他の入力があっても常に同じ結果が生成されます。これは、モデルを訓練し、テストデータを予測しているときに推奨される動作です。テストデータをフィードする相手が予測に影響を与えないようにします。

ここで期待される効果はmodel.fit()に表示されます。たとえば、model.train_on_batch()を使用して入力をトレーニングし(モデルウェイトを更新する)、model.predict()を呼び出して出力の変化を確認できます。

EDIT:あなたはLSTMの状態ではなく、ネットワークの重みを探している場合は、それがデフォルトでFalseに設定され、層のinitにstateful=Trueを渡す必要があります。 statefulを使用する場合は、引数もbatch_input_shapeに渡す必要があります。詳細はhereを参照してください。各入力を次の予測に反映させるには、バッチサイズを1に設定する必要があります(例:batch_input_shape=(1,3,1))。これは、バッチ内のサンプルに対して評価が並行して行われ、相互に影響しないためです。

+2

[OK]を、私は重みが変更されません同意するものとします。しかし、LTSMのメモリ/状態はどうですか?それは「体重」とはみなされませんよね?私は実際にLTSM状態をダンプするかどうか疑問に思います。 – yalis

+0

OK私はあなたが意味するものを得て、私の答えを編集しました。私はそれが質問に答えることを望む。 –

+0

@yalis 'stateful = True'を使って、あなたが望む効果を見ることができましたか?私は必要に応じて実際の例を提供することができます。 –

0

これは古い質問ですが、この回答が私のような他のKeras初心者に役立つことを願っています。

私のマシンでこの例題を実行したところ、model.predictを呼び出して、LSTMの隠れ状態とセル状態が実際に変化していることがわかりました。ここで

import numpy as np 
import keras.backend as K 
from keras.models import Model 
from keras.layers import LSTM 

batch_size = 1 
timestep_size = 2 
num_features = 4 

inputs = Input(batch_shape=(batch_size, timestep_size, num_features) 
x = LSTM(num_features, stateful=True)(inputs) 

model = Model(inputs=inputs, outputs=x) 
model.compile(loss="mse", 
       optimizer="rmsprop", 
       metrics=["accuracy"]) 

x = np.random.randint((10,2,4)) 
y = np.ones((10,4)) 
model.fit(x,y, epochs=100, batch_size=1) 

def get_internal_state(model): 
    # get the internal state of the LSTM 
    # see https://github.com/fchollet/keras/issues/218 
    h, c = [K.get_value(s) for s, _ in model.state_updates] 
    return h, c 

print "After fitting:", get_internal_state(model) 

for i in range(3): 
    x = np.random.randint((10,2,4)) 
    model.predict(x) 
    print "After predict:", get_internal_state(model) 

はトレーニング後get_internal_stateへの呼び出しの出力のサンプルです:

After_fitting: (array([[ 1., 1., 1., 1.]], dtype=float32), array([[ 11.33725166, 11.8036108 , 181.75688171, 25.50110626]], dtype=float32)) 
After predict (array([[ 1.  , 0.99999994, 1.  , 1.  ]], dtype=float32), array([[ 9.26870918, 8.83847237, 179.92633057, 28.89341927]], dtype=float32)) 
After predict (array([[ 0.99999571, 0.9992013 , 1.  , 0.9915328 ]], dtype=float32), array([[ 6.5174489 , 8.55165958, 171.42166138, 25.49199104]], dtype=float32)) 
After predict (array([[ 1., 1., 1., 1.]], dtype=float32), array([[ 9.78496075, 9.27927303, 169.95401001, 28.74017715]], dtype=float32)) 
関連する問題