Как реализовать сложенные RNNs в Tensorflow?

#python #tensorflow #recurrent-neural-network

#python #tensorflow #рекуррентная нейронная сеть

Вопрос:

Я хочу реализовать RNN, используя Tensorflow1.13 на GPU. Следуя официальной рекомендации, я пишу следующий код, чтобы получить стек ячеек RNN

 lstm = [tk.layers.CuDNNLSTM(128) for _ in range(2)]
cells = tk.layers.StackedRNNCells(lstm)
  

Однако я получаю сообщение об ошибке:

Ошибка значения: (‘Все ячейки должны иметь state_size атрибут. полученные ячейки:’, [< tensorflow.python.keras.layers.cudnn_recurrent.Объект CuDNNLSTM в 0x13aa1c940>])

Как я могу это исправить?

Ответ №1:

Это может быть ошибка Tensorflow, и я бы предложил создать проблему на Github. Однако, если вы хотите обойти ошибку, вы можете использовать:

 import tensorflow as tf
import tensorflow.keras as tk

lstm = [tk.layers.CuDNNLSTM(128) for _ in range(2)]
stacked_cells = tf.nn.rnn_cell.MultiRNNCell(lstm)
  

Это сработает, но выдаст предупреждение об устаревании, которое вы можете подавить.

Ответ №2:

Спасибо @qlzh727. Здесь я цитирую ответ:

Либо StackedRNNCells, либо StackedRNNCells работает только с ячейкой, а не со слоем. Разница между ячейкой и слоем в RNN заключается в том, что ячейка будет обрабатывать только один временной шаг во всей последовательности, тогда как слой будет обрабатывать всю последовательность. Вы можете рассматривать слой RNN как:

 for t in whole_time_steps:
  output_t, state_t = cell(input_t, state_t-1)
  

Если вы хотите сложить 2 слоя LSTM вместе с cudnn в 1.x, вы можете сделать:

 l1 = tf.layers.CuDNNLSTM(128, return_sequence=True)
l2 = tf.layers.CuDNNLSTM(128)
l1_output = l1(input)
l2_oupput = l2(l1_output) 
  

В tf 2.x мы объединяем cudnn и обычную реализацию вместе, вы можете просто изменить приведенный выше пример с помощью tf.layers.LSTM(128, return_sequence=True), который будет использовать cudnn impl, если таковой имеется.