2016-08-29 99 views
2

該模型具有LSTM作爲其第一層。Keras何時在調用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]]) 

上面我們看到的映射:[3.5,0.6 .3] - > 0.23589483等(1元的序列,它是長度爲3的矢量,被映射爲實數)

該模型的input_length爲1,input_dim爲3.注意,第一個和最後一個是相同的並且具有相同的輸出(0.23589483)。所以我的假設是在Keras處理一個樣本(在這種情況下是一個1-3D矢量的序列)之後,它會重置模型的內存。那是每個序列基本上是獨立的。這種觀點有什麼不正確或誤導?

以input_length 3和input_dim 1爲例。這次切換序列中的值並查看不同的結果(將第二個列表與最後一個列表進行比較)。因此,隨着Keras處理一個序列,內存正在改變,但是當完成處理時,內存復位(第一個和第二個序列具有相同的結果)。

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()查看輸出更改。

編輯:如果您尋找LSTM而不是網絡的權重狀態,你應該通過stateful=True到層的init,它是默認設置爲False。當使用stateful時,您也必須通過batch_input_shape參數。有關更多信息,請參閱here。請注意,如果您希望每個輸入都會影響下一個預測,則必須將批處理大小設置爲1(例如batch_input_shape=(1,3,1)),因爲批處理中的樣本的評估是並行完成的,並且彼此不會相互影響。

+2

好吧,我同意的權重將不會改變。但是LTSM的內存/狀態呢?這不被認爲是「重量」,對吧?我想知道是否有實際轉儲LTSM狀態。 – yalis

+0

好的,我明白了你的意思並編輯了我的答案。我希望它能回答這個問題。 –

+0

@yalis能否使用'stateful = True'來看你想要的效果?如果需要,我可以提供一個工作示例。 –

0

我很欣賞這是一個老問題,但希望這個答案可以幫助像我這樣的Keras初學者。

我在我的機器上運行了這個例子,並觀察到LSTM的隱藏狀態和單元狀態確實隨着對model.predict的調用而改變。

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