#tensorflow #keras
#tensorflow #keras
Вопрос:
Я работаю над примером Keras в https://www.tensorflow.org/tutorials/text/text_generation
Модель построена здесь:
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.GRU(rnn_units,
return_sequences=True,
stateful=True,
recurrent_initializer='glorot_uniform'),
tf.keras.layers.Dense(vocab_size)
])
return model
Во время обучения они всегда передаются в массив целых чисел длиной 100.
Но во время прогнозирования они могут передавать ввод любой длины, а выходные данные имеют ту же длину, что и входные данные. У меня всегда было впечатление, что длины временных шагов должны быть одинаковыми. Разве это не так, и количество временных шагов RNN каким-то образом может измениться?
Ответ №1:
RNN — это модели последовательности, т.Е.. они принимают последовательность входных данных и выдают последовательность выходных данных. Длина последовательности также называется временными шагами — это количество раз, когда ячейка RNN разворачивается, и для каждого разворачивания передается ввод, а ячейка RNN, использующая свои вентили, выдает выходные данные (для каждого разворачивания). Таким образом, теоретически вы можете иметь сколь угодно длинную последовательность. Теперь давайте предположим, что у вас разные входные данные разного размера, поскольку у вас не может быть входных данных переменного размера в отдельных пакетах, вам нужно собрать входные данные одинакового размера и создать пакет, если вы хотите тренироваться с использованием пакетов. Вы также можете использовать размер пакета 1 и не беспокоиться обо всем этом, но обучение становится мучительно медленным.
В практических ситуациях во время обучения мы делим входные данные на одинаковые размеры, чтобы обучение стало быстрым. Существуют ситуации, такие как модели языкового перевода, где это невозможно.
Таким образом, теоретически RNNs не имеет никаких ограничений на длину последовательности, однако большая последовательность начнет терять контекст при запуске по мере увеличения длины последовательности.
При прогнозировании вы можете использовать любую длину последовательности, какую захотите.
В вашем случае размер вашего вывода совпадает с размером ввода из-за return_sequences=True
. Вы также можете иметь один вывод, используя return_sequences=False
where в keras возвращается только вывод последнего разворачивания.
Ответ №2:
Длина обучающих последовательностей не должна быть равна прогнозируемой длине.
RNN имеет дело с двумя векторами: новым словом и скрытым состоянием (накопленным из предыдущих слов). Он не сохраняет длину последовательности.
Но чтобы получить хорошее предсказание длинных последовательностей, вам нужно обучить RNN длинным последовательностям, потому что RNN должен изучать длинный контекст.