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

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

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

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

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


person Jonn Dove    schedule 04.03.2019    source источник


Ответы (2)


При использовании 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))
person OverLordGoldDragon    schedule 02.11.2019

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

person Carson Cummins    schedule 02.11.2019
comment
Если это всего лишь большинство случаев, то он не определен. - person RalfFriedl; 03.11.2019