Уважаемый читатель!

Эта статья была переиздана на Эдукаора и также была с открытым исходным кодом. К сожалению, TensorFlow 2.0 изменил API, поэтому он не работает для более поздних версий. Мы приветствуем любую помощь в обновлении учебников. Я также рекомендую вам изучить PyTorch.

В предыдущем руководстве мы построили многослойную LSTM RNN. В этом посте мы ускорим его, не разбивая входные данные и метки в список, как это сделано в строках 41–42 нашего кода. Вы можете удалить эти строки, в которых объявлены inputs_series и labels_series. Затем измените вызов tf.nn.rnn в строке 47 на следующее:

Функция dynamic_rnn принимает пакетные входные данные формы [batch_size, truncated_backprop_length, input_size], таким образом добавляя одно измерение в конце. Результатом будет последнее состояние каждого слоя в сети в виде LSTMStateTuple, хранящегося вcurrent_state, а также тензора states_series с формой [batch_size, truncated_backprop_length, state_size], содержащего скрытое состояние последнего слоя на всех временных шагах.

Тензор states_series изменяется во второй строке в приведенном выше примере кода до формы [batch_size*truncated_backprop_length, state_size], мы вскоре увидим причину этого. Подробнее про dynamic_rnn вы можете прочитать в документации.

Теперь введите эти две строки под изменением формы states_series.

Обратите внимание, что сейчас мы работаем только с тензорами, списки Python остались в прошлом. Вычисление logits и labels визуализировано ниже, обратите внимание на переменную state_series, форма которой была изменена ранее. В TensorFlow изменение формы выполняется в C-подобном порядке индекса. Это означает, что мы читаем из исходного тензора и записываем в целевой тензор, причем индекс последней оси изменяется быстрее всего, а индекс первой оси изменяется медленнее всего. Результат изменения формы будет таким, как показано на рисунке ниже, где похожие цвета обозначают один и тот же временной шаг, а сгруппированные по вертикали интервалы элементов обозначают разные партии.

Давайте рассмотрим все тензоры на рисунке выше, сначала давайте начнем с размеров. У нас есть batch_size=3, state_size=3, num_classes=2 и truncated_backprop_length=3. Тензор states_series имеет форму [batch_size*truncated_backprop_length, state_size], labels имеет форму [batch_size*truncated_backprop_length], logits имеет форму [batch_size*truncated_backprop_length, num_classes], W2 имеет форму [state_size, num_classes] и b2 имеет форму [1, num_classes]. Может быть немного сложно отслеживать все тензоры, но рисование и визуализация с помощью цветов определенно помогают.

Затем рассчитайте прогнозы для визуализации:

Здесь мы снова фактически разбиваем тензоры на списки. Возможно, это не лучший способ сделать это, но он быстрый и грязный, и функция построения графика уже ожидает список.

sparse_softmax_cross_entropy_with_logits может принимать форму наших тензоров! Измените вычисление losses на это.

Как мы можем прочитать в API, logits должен иметь форму [batch_size, num_classes], а labels должен иметь форму [batch_size]. Но теперь мы рассматриваем все временные шаги как элементы в нашем пакете, поэтому все будет работать так, как мы хотим.

Вся программа

Это целый автономный сценарий, просто скопируйте и запустите.

Следующий шаг

В следующей части мы упорядочим сеть для использования исключения, что сделает ее менее склонной к переобучению.