Уважаемый читатель!
Эта статья была переиздана на Эдукаора и также была с открытым исходным кодом. К сожалению, 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]
. Но теперь мы рассматриваем все временные шаги как элементы в нашем пакете, поэтому все будет работать так, как мы хотим.
Вся программа
Это целый автономный сценарий, просто скопируйте и запустите.
Следующий шаг
В следующей части мы упорядочим сеть для использования исключения, что сделает ее менее склонной к переобучению.