Что Keras делает с начальным значением состояния ячейки (LSTM) и начальным скрытым состоянием (RNN, LSTM) для вывода?

Предполагая, что обучение завершено: какие значения Keras использует для состояния 0-й ячейки и скрытых состояний при выводе (в слоях LSTM и RNN)? Я мог придумать как минимум три сценария и не смог найти какого-либо окончательного ответа в документации:

(а) Начальные состояния изучаются, а затем используются для всех предсказаний

(б) или начальные состояния всегда установлены на ноль

(c) начальные состояния всегда случайны (будем надеяться, что нет...?)

0 ответов

При использовании LSTM(stateful=True), скрытые состояния инициализируются нулем, изменяются fit или predict, и остаются там, где они есть, пока .reset_states()называется. ЕслиLSTM(stateful=False), состояния сбрасываются после подгонки / прогнозирования / и т.д. каждой партии.

Это можно проверить из .reset_states() исходный код и при непосредственной проверке; как дляstateful=Trueниже. Для получения дополнительной информации о том, как передаются состояния, см. Этот ответ.


Прямой осмотр:

batch_shape = (2, 10, 4)
model = make_model(batch_shape)

X = np.random.randn(*batch_shape)
y = np.random.randint(0, 2, (batch_shape[0], 1))

show_lstm_states("STATES INITIALIZED")
model.train_on_batch(X, y)

show_lstm_states("STATES AFTER TRAIN")
model.reset_states()
show_lstm_states("STATES AFTER RESET")

model.predict(X)
show_lstm_states("STATES AFTER PREDICT")

Выход:

STATES INITIALIZED
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]]

STATES AFTER TRAIN
[[0.12061571 0.03639204 0.20810013 0.05309075]
 [0.01832913 0.00062357 0.10566339 0.60108346]]
[[0.21241754 0.0773523  0.37392718 0.15590034]
 [0.08496398 0.00112716 0.23814857 0.95995367]]

STATES AFTER RESET
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]]

STATES AFTER PREDICT
[[0.12162527 0.03720453 0.20628096 0.05421837]
 [0.01849432 0.00064993 0.1045063  0.6097021 ]]
[[0.21398112 0.07894284 0.3709934  0.15928769]
 [0.08605779 0.00117485 0.23606434 0.97212094]]

Используемые функции / импорт:

import tensorflow as tf
import tensorflow.keras.backend as K
from tensorflow.keras.layers import Input, Dense, LSTM
from tensorflow.keras.models import Model
import numpy as np

def make_model(batch_shape):
    ipt = Input(batch_shape=batch_shape)
    x   = LSTM(4, stateful=True, activation='relu')(ipt)
    out = Dense(1, activation='sigmoid')(x)

    model = Model(ipt, out)
    model.compile('adam', 'binary_crossentropy')

    return model

def show_lstm_states(txt=''):
    print('\n' + txt) 
    states = model.layers[1].states

    for state in states:
        if tf.__version__[0] == '2':
            print(state.numpy())
        else:
            print(K.get_value(state))

Проверьте исходный код:

from inspect import getsource
print(getsource(model.layers[1].reset_states))

Мое понимание от этого является то, что они инициализируются к нулю в большинстве случаев.

Другие вопросы по тегам