#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, если таковой имеется.