如何在Tensorflow中实现堆叠式RNN?

时间:2019-03-24 13:30:22

标签: python tensorflow recurrent-neural-network

我想在GPU上使用Tensorflow1.13实现RNN。按照官方的建议,我编写以下代码以获取一堆RNN单元格

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

但是,我收到一条错误消息:

  

ValueError :(“所有单元格都必须具有state_size属性。接收到的单元格:”,[])

我该如何纠正?

2 个答案:

答案 0 :(得分: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)

这将起作用,但是会给出弃用警告,您可以取消显示。

答案 1 :(得分:0)

感谢@ qlzh727。在这里,我引用响应:

StackedRNNCells或StackedRNNCells仅适用于Cell,不适用于图层。 RNN中单元与层之间的区别在于,单元将只处理整个序列中的一个时间步,而该层将处理整个序列。您可以将RNN层视为:

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

如果要在1.x中将2个LSTM层与cudnn堆叠在一起,可以执行以下操作:

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。