Давайте посмотрим на различия при игре с аргументами:
tf.keras.backend.clear_session()
tf.set_random_seed(42)
X = np.array([[[1,2,3],[4,5,6],[7,8,9]],[[1,2,3],[4,5,6],[0,0,0]]], dtype=np.float32)
model = tf.keras.Sequential([tf.keras.layers.LSTM(4, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform')])
print(tf.keras.backend.get_value(model(X)).shape)
# (2, 3, 4)
print(tf.keras.backend.get_value(model(X)))
# [[[-0.16141939 0.05600287 0.15932009 0.15656665]
# [-0.10788933 0. 0.23865232 0.13983202]
[-0. 0. 0.23865232 0.0057992 ]]
# [[-0.16141939 0.05600287 0.15932009 0.15656665]
# [-0.10788933 0. 0.23865232 0.13983202]
# [-0.07900514 0.07872108 0.06463861 0.29855606]]]
Итак, если return_sequences
установлено на True
, модель вернула полную последовательность, которую она предсказывает.
tf.keras.backend.clear_session()
tf.set_random_seed(42)
model = tf.keras.Sequential([
tf.keras.layers.LSTM(4, return_sequences=False, stateful=True, recurrent_initializer='glorot_uniform')])
print(tf.keras.backend.get_value(model(X)).shape)
# (2, 4)
print(tf.keras.backend.get_value(model(X)))
# [[-0. 0. 0.23865232 0.0057992 ]
# [-0.07900514 0.07872108 0.06463861 0.29855606]]
Таким образом, как указано в документации, если return_sequences
установлено на False
, модель возвращает только последний вывод.
Что касается stateful
, в него немного сложнее погрузиться.Но, по сути, то, что происходит при наличии нескольких пакетов входов, последнее состояние ячейки в пакете i
будет исходным состоянием в пакете i+1
.Тем не менее, я думаю, вы будете более чем довольны настройками по умолчанию.