我正在訓練一個序列模型序列與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函數中的工作原理相同)。