2016-09-23 49 views
1

Kerasを使用して可変長シーケンスのシーケンスモデルを訓練していますが、予期しない問題が発生しています。私が観察している振る舞いが、図書館が望む振る舞いであるのか、それがどうなるのかは、私には不明です。可変長シーケンスのシーケンス学習に対する奇妙な動作シーケンス

モデル作成

私は埋め込み層との問題を示してGRU再発層と再発モデルを作りました。私の代わりにマスキング層の埋め込み層に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') 

私はマスキングと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パッド1の入力/出力シーケンスにこのモデルをテストします。正確に同じ次元を持つ入出力シーケンスを使用できないのはなぜですか? 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)の平均二乗誤差(Mean Squered Error)(MSB)を返します。この最初の値は、マスクされていないときに期待されます

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 

を私が手に出力が

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

これは、メトリック(MSE)変更せずに残している、それはまだその1を含むすべての値、オーバーMSEです:私が試したこの問題は、私はマスクされたかった。どうして?これは私のモデルを評価するときに私が望むものではありません。これは、ロス値の変化を引き起こし、これは、より長いシーケンスに対してより多くの重みを与えないように正規化された最後の2つの値に対するMSEであるように見える。

サンプルウェイトに問題がありますか?また、私は本当にこの損失の値がどのようになったのか把握することはできません。パッディングされた値をトレーニングと評価の両方から除外するにはどうすればよいですか(私はsample_weightパラメータがフィット関数で同じように動作すると仮定します)。

答えて

0

実際にはライブラリのバグで、Keras 2ではこの問題は解決されました。