如何在 Tensorflow 中实现堆叠式 RNN?
How to implement a stacked RNNs in Tensorflow?
我想在 GPU 上使用 Tensorflow1.13 实现一个 RNN。按照官方的推荐,我写了下面的代码得到一堆RNN cells
lstm = [tk.layers.CuDNNLSTM(128) for _ in range(2)]
cells = tk.layers.StackedRNNCells(lstm)
但是,我收到一条错误消息:
ValueError: ('All cells must have a state_size
attribute. received cells:', [< tensorflow.python.keras.layers.cudnn_recurrent.CuDNNLSTM object at 0x13aa1c940>])
我该如何更正它?
这可能是一个 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)
这会起作用,但它会给出一个弃用警告,您可以取消该警告。
感谢@qlzh727。在这里,我引用回复:
StackedRNNCells 或 StackedRNNCells 仅适用于 Cell,不适用于图层。 RNN 中 cell 和 layer 的区别在于 cell 只会处理整个序列中的一个时间步长,而 layer 会处理整个序列。您可以将 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和normal的实现,你可以把上面的例子改成tf.layers.LSTM(128, return_sequence=True),这样会用到cudnn impl(如果可用)。
我想在 GPU 上使用 Tensorflow1.13 实现一个 RNN。按照官方的推荐,我写了下面的代码得到一堆RNN cells
lstm = [tk.layers.CuDNNLSTM(128) for _ in range(2)]
cells = tk.layers.StackedRNNCells(lstm)
但是,我收到一条错误消息:
ValueError: ('All cells must have a
state_size
attribute. received cells:', [< tensorflow.python.keras.layers.cudnn_recurrent.CuDNNLSTM object at 0x13aa1c940>])
我该如何更正它?
这可能是一个 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)
这会起作用,但它会给出一个弃用警告,您可以取消该警告。
感谢@qlzh727。在这里,我引用回复:
StackedRNNCells 或 StackedRNNCells 仅适用于 Cell,不适用于图层。 RNN 中 cell 和 layer 的区别在于 cell 只会处理整个序列中的一个时间步长,而 layer 会处理整个序列。您可以将 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和normal的实现,你可以把上面的例子改成tf.layers.LSTM(128, return_sequence=True),这样会用到cudnn impl(如果可用)。