【发布时间】:2020-04-05 20:18:03
【问题描述】:
我正在尝试将一些 TensorFlow 1 代码移植到 TensorFlow 2。旧代码使用现已弃用的 MultiRNNCell 创建具有多个隐藏层的 GRU 层。在 TensorFlow 2 中,我想使用内置的 GRU Layer,但似乎没有允许该类具有多个隐藏层的选项。 PyTorch equivalent 有一个作为初始化参数公开的选项,num_layers。
我的解决方法是使用 TensorFlow RNN 层并为我想要的每个隐藏层传递一个 GRU 单元 - 这是文档中推荐的方式:
dim = 1024
num_layers = 4
cells = [tf.keras.layers.GRUCell(dim) for _ in range(num_layers)]
gru_layer = tf.keras.layers.RNN(
cells,
return_sequences=True,
stateful=True
)
但是内置的 GRU 层支持 CuDNN,这是普通 RNN 似乎缺乏的,引用 the docs:
在数学上,RNN(LSTMCell(10)) 产生的结果与 LSTM(10)。事实上,在 TF v1.x 中这一层的实现是 只需创建相应的 RNN 单元并将其包装在 RNN 中 层。然而,使用内置的 GRU 和 LSTM 层可以使用 的 CuDNN,您可能会看到更好的性能。
那么我该如何实现呢?如何获得同时支持多个隐藏层并支持 CuDNN 的 GRU 层?鉴于 TensorFlow 中内置的 GRU 层缺少这样的选项,是否真的有必要?或者,获得深度 GRU 网络的唯一方法是按顺序堆叠多个 GRU 层?
编辑: 似乎,根据this answer 的类似问题,确实没有内置方法来创建具有多个隐藏层的 GRU 层,它们必须是手动堆叠。
【问题讨论】:
-
从概念上讲,这些隐藏层是什么?它们是平行的吗?它们是连续的吗?他们是做什么的?
-
谢谢。我认为这可以使用顺序模型来完成,包装多个 GRU 层实例。所以它是串行/顺序的,我猜。就像我编辑中链接的答案一样。我正在尝试使用带有单元列表的 RNN 类来实现已经可以实现的目标 - 层堆栈,更深的网络。但是通过 CuDNN 优化。文档指出后者仅适用于内置的 GRU Layer 类。
标签: tensorflow keras deep-learning neural-network recurrent-neural-network