使用lstm中的stateful和return_sequence導致InvalidArgumentError

問題描述

訓練一個模型,使用LSTM組爲第一層,具體模型如下圖。當使用LSTM的默認參數爲 stateful = False,return_sequences = False時,能夠正常訓練。
lstm_1
然而當要返回每步的狀態時,即LSTM的默認參數爲 stateful = True,return_sequences = True時,模型和報錯如下:
lstm_2


InvalidArgumentError Traceback (most recent call last)
in ()
21 history = model.fit(tfrecords_train_set,
22 validation_data = tfrecords_valid_set,
—> 23 epochs = epochs, verbose=2, callbacks = callbacks)
24
25 scores = model.evaluate(tfrecords_test_set, verbose=2)



InvalidArgumentError: [Derived] Incompatible shapes: [3,128] vs. [64,128]
[[{{node while_19/body/_1/add}}]]
[[model_14/lstm1/StatefulPartitionedCall]] [Op:__inference_distributed_function_118033]

Function call stack:
distributed_function -> distributed_function -> distributed_function


問題原因

看到 Incompatible shapes: [3,128] vs. [64,128],64是我設的batch_size,128是輸入數據的時間步time_step,爲什麼有個3?折騰了半天,我才發現是劃分batch導致的,我使用的是batch()劃分數據集,當只傳入batch_size不設置其他參數時,不足一個batch_size大小的最後一個batch也會劃爲一個batch。代碼如下:
batch—1
這裏就是最後3個數據被劃爲一個batch。在LSTM中,當要返回每個時間步的輸出時,要指定batch大小,input初始化的input shape要修改,我這裏使用的時 Keras functional API,input shape要使用batch_shape指定,如下:

inputs = tf.keras.Input(batch_shape=(batch_size, timesteps, input_dims), name='inputs')

當訓練到最後一個batch時,輸入shape指定是batch_size與真正的輸入batch_size不一致導致出錯。

解決辦法

這裏的解決辦法是丟棄最後一個batch。
batch-2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章