2016-09-23 51 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填充功能的一個輸入/輸出序列測試此模型。爲什麼我不能使用具有完全相同維度的輸入/輸出序列? model.evaluate(X_padded, Y_padded)給我一個維度錯誤。

然後,當我跑model.predict(X_padded)我得到下面的輸出(帶有numpy.random.seed(0)生成模型之前):

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

我得到的輸出是

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

這使得指標(MSE)不變,但它仍是MSE超過所有值,包括一個我想掩蓋。爲什麼?當我評估我的模型時,這不是我想要的。它的確會引起損失值的變化,這似乎是MSE在最後兩個數值上的歸一化,不會給更長的序列以更多的權重。

我的樣品重量有問題嗎?另外,我真的不知道這個損失值是如何產生的。我應該做些什麼來排除訓練和評估中的填充值(我假設sample_weight參數在fit函數中的工作原理相同)。

回答

0

這確實是庫中的一個bug,在Keras 2中這個問題已經解決了。