2016-08-29 2 views
2

모델의 첫 번째 레이어는 LSTM입니다. 우리가지도를 볼보다도Kera에서는 model.predict 호출에서 LSTM 상태가 재설정됩니까?

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

:

model.predict를 호출

은 여러 샘플을 전달 말 [[0.5, 0.6, 0.3는]] - 1 개 요소> 0.23589483 등 (순서 길이 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을 통과해야한다, 그것은 기본적으로 False로 설정됩니다. stateful을 사용할 때는 batch_input_shape 인수도 전달해야합니다. 자세한 내용은 here을 참조하십시오. 각 입력을 다음 예측에 적용하려면 배치의 샘플을 평행하게 평가하고 서로 영향을 미치지 않으므로 배치 크기를 1 (예 : batch_input_shape=(1,3,1))로 설정해야합니다.

+2

좋아, 나는 가중치가 변경되지 않습니다 동의합니다. 그러나 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))