我想在GPU上使用Tensorflow1.13实现RNN。按照官方的建议,我编写以下代码以获取一堆RNN单元格
lstm = [tk.layers.CuDNNLSTM(128) for _ in range(2)]
cells = tk.layers.StackedRNNCells(lstm)
但是,我收到一条错误消息:
ValueError :(“所有单元格都必须具有
state_size
属性。接收到的单元格:”,[])
我该如何纠正?
答案 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。>