зачем устанавливать return_sequence = True и stateful = True для tf.keras.layers.LSTM? - PullRequest
1 голос
/ 22 марта 2019

Я изучаю tenorflow2.0 и следую учебнику .В примере rnn я нашел код:

def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
  model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim, 
                              batch_input_shape=[batch_size, None]),
    tf.keras.layers.LSTM(rnn_units, 
                        return_sequences=True, 
                        stateful=True, 
                        recurrent_initializer='glorot_uniform'),
    tf.keras.layers.Dense(vocab_size)
  ])
  return model

Мой вопрос: почему код задает аргумент return_sequences=True и stateful=True?Как насчет использования аргумента по умолчанию?

Ответы [ 3 ]

2 голосов
/ 22 марта 2019

Пример в учебнике о генерации текста.Это вход, который подается в сеть в пакете:

(64, 100, 65) # (batch_size, sequence_length, vocab_size)

  1. return_sequences=True

Поскольку цель состоит в том, чтобы предсказать символ для каждого временного шага, то есть для каждого символа в последовательности, необходимо предсказать следующий символ.

Таким образом, аргумент return_sequences=True установлен вtrue, чтобы получить выходную форму (64, 100, 65).Если для этого аргумента установлено значение False, то будет возвращен только последний вывод, поэтому для пакета из 64 вывод будет (64, 65), т. Е. Для каждой последовательности из 100 символов будет возвращен только последний предсказанный символ.

stateful=True

Из документации, "Если True, последнее состояние для каждого образца с индексом i в пакете будет использоваться в качестве исходного состояния для образца индекса iв следующем пакете. "

На приведенной ниже диаграмме из учебника вы можете видеть, что установка с учетом состояния помогает LSTM делать лучшие прогнозы, предоставляя контекст предыдущего прогноза.

enter image description here

2 голосов
/ 22 марта 2019

Последовательности возврата

Давайте рассмотрим типичные модели архитектуры, построенные с использованием LSTM.

Последовательность для моделей последовательности:

enter image description here

Мы вводим последовательность входов (х), по одной партии за раз, и каждаяЯчейка LSTM возвращает вывод (y_i).Таким образом, если ваш вход имеет размер batch_size x time_steps X input_size, тогда вывод LSTM будет batch_size X time_steps X output_size.Это называется последовательностью к модели последовательности, потому что входная последовательность преобразуется в выходную последовательность.Типичное использование этой модели в теггере (POS tagger, NER Tagger).В keras это достигается установкой return_sequences=True.

Классификация последовательностей - Архитектура «многие к одному»

enter image description here

Во архитектуре «многие к одному»мы используем выходные значения только последней ячейки LSTM.Этот тип архитектуры обычно используется для задач классификации, таких как прогнозирование, если рецензия на фильм (представленная в виде последовательности слов) имеет + ve of -ve.В keras, если мы установим return_sequences=False, модель возвращает состояние вывода только последней ячейки LSTM.

Statefull

Ячейка LSTM состоит из множества вентилей, как показано на рисунке ниже из .Состояния / ворота предыдущей ячейки используются для вычисления состояния текущей ячейки.Если в керасе statefull=False, то состояния сбрасываются после каждой партии.Если statefull=True, то состояния из предыдущего пакета для индекса i будут использоваться в качестве исходного состояния для индекса i в следующем пакете.Таким образом, информация о состоянии передается между пакетами с statefull=True.Проверьте это ссылка для объяснения полезности Statefullness с примером.

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

1 голос
/ 22 марта 2019

Давайте посмотрим на различия при игре с аргументами:

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.Тем не менее, я думаю, вы будете более чем довольны настройками по умолчанию.

...