2016-09-23 4 views
1

Keras로 가변 길이 시퀀스의 시퀀스 모델에 시퀀스를 트레이닝하고 있지만 예기치 않은 문제가 발생합니다. 내가 관측하고있는 행동이 도서관의 바람직한 행동인지 그리고 왜 그렇게되는지는 분명하지 않습니다.가변 길이 시퀀스에 대한 시퀀스 학습의 이상 동작 시퀀스

내가 묻어 층과 문제를 설명하는 GRU 재발 층 재발 모델을했습니다

모델 만들기. I 대신 마스크 층의 묻어 층에 mask_zero=0.0를 사용하지만,이 변화하는 변화를 보이지 않는다 (도 출력 전에 마스크 층 가산 않는다)

import numpy 
from keras.layers import Embedding, GRU, TimeDistributed, Dense, Input 
from keras.models import Model 
import keras.preprocessing.sequence 

numpy.random.seed(0) 
input_layer = Input(shape=(3,), dtype='int32', name='input') 
embeddings = Embedding(input_dim=20, output_dim=2, input_length=3, mask_zero=True, name='embeddings')(input_layer) 
recurrent = GRU(5, return_sequences=True, name='GRU')(embeddings) 
output_layer = TimeDistributed(Dense(1), name='output')(recurrent) 
model = Model(input=input_layer, output=output_layer) 
output_weights = model.layers[-1].get_weights() 
output_weights[1] = numpy.array([0.2]) 
model.layers[-1].set_weights(output_weights) 
model.compile(loss='mse', metrics=['mse'], optimizer='adam', sample_weight_mode='temporal') 

I 마스킹 사용하고 sample_weight 파라미터 패딩 값을 트레이닝/평가에서 제외합니다. 출력이 예상되는 이유는

이 방식으로 서식 할

X = [[1, 2]] 
X_padded = keras.preprocessing.sequence.pad_sequences(X, dtype='float32', maxlen=3) 
Y = [[[1], [2]]] 
Y_padded = keras.preprocessing.sequence.pad_sequences(Y, maxlen=3, dtype='float32') 

출력 모양 : 나는 Keras 패딩 기능을 사용하여 I 패드 하나의 입력/출력 시퀀스에이 모델을 테스트합니다. 정확하게 동일한 차원을 가진 입출력 시퀀스를 사용할 수없는 이유는 무엇입니까? model.evaluate(X_padded, Y_padded)은 나에게 차원 오류를줍니다.

그럼, 내가 (모델 생성하기 전에 numpy.random.seed(0)와) 다음과 같은 출력을 얻을 model.predict(X_padded) 실행하면

[[[ 0.2  ] 
    [ 0.19946882] 
    [ 0.19175649]]] 

왜 출력 레이어 마스크 첫 번째 입력이되지 않습니다? 바이어스에 어쨌든 계산 output_value (평등 숨겨진 층 값이 0이기 때문에?이 바람직하지 않는 것.이 문제를 해결하지 못한다 출력층 전에 마스크 층을 추가하는 것이다.

MSE 산출

그런 다음 모델 (model.evaluate(X_padded, Y_padded))을 평가할 때 전체 시퀀스 (1.3168) 의 평균 제곱 오류 (MSE)를 반환합니다.이 첫 번째 값은 마스크가 적용되지 않았을 때 예상되는 것으로 가정합니다. 내가 원하는 것

Keras 문서에서 나는 sample_weight 매개 변수를 사용하여 해결해야한다고 생각합니다. 나는 노력이 문제 :

sample_weight = numpy.array([[0, 1, 1]]) 
model_evaluation = model.evaluate(X_padded, Y_padded, sample_weight=sample_weight) 
print model.metrics_names, model_evaluation 

내가 얻을 출력이 메트릭 (MSE) 변경되지 않은 잎

['loss', 'mean_squared_error'] [2.9329459667205811, 1.3168648481369019] 

입니다, 그것은 여전히 ​​하나를 포함 이상 모든 값의 MSE입니다 나는 가면 싶었다. 왜? 내 모델을 평가할 때 원하는 것은 아닙니다. 그것은 손실 값의 변화를 일으키는데, 이것은 더 긴 시퀀스에 더 많은 가중치를주지 않기 위해 정규화 된 마지막 두 값에 대한 MSE 인 것처럼 보입니다.

샘플 무게가 잘못 되었습니까? 또한, 나는이 손실 값이 어떻게 발생했는지 정말로 알 수 없습니다. 패딩 된 값을 교육 및 평가에서 제외하려면 어떻게해야합니까? (저는 sample_weight 매개 변수가 fit 함수에서 동일하게 작동한다고 가정합니다).

답변

0

실제로 Keras 2의 라이브러리 버그입니다.이 문제는 해결되었습니다.