【问题标题】:MulticellRNN Error with TensorflowTensorFlow 的 MulticellRNN 错误
【发布时间】:2017-05-29 21:56:46
【问题描述】:

我有 TensorFlow 1.1.0

我正在学习来自 https://github.com/ageron/handson-ml/blob/master/14_recurrent_neural_networks.ipynb 的关于多单元(堆叠)RNN 的基本教程

以下代码产生一个奇怪的错误,我无法通过搜索找出原因。

import tensorflow as tf
n_inputs = 2
n_neurons = 100
n_layers = 3
n_steps = 5

X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
multi_layer_cell = tf.contrib.rnn.MultiRNNCell([basic_cell for _ in range(n_layers)])
outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()

这似乎是正确的代码,但它得到了错误:

ValueError:尝试以不同于第一次使用的变量范围重用 RNNCell。首次使用单元格时使用范围“rnn/multi_rnn_cell/cell_0/basic_rnn_cell”,这次尝试使用范围“rnn/multi_rnn_cell/cell_1/basic_rnn_cell”。如果您希望它使用一组不同的权重,请创建一个新的单元实例。 如果之前使用:MultiRNNCell([BasicRNNCell(...)] * num_layers),则改为:MultiRNNCell([BasicRNNCell(...) for _ in range(num_layers)])。 如果在您使用相同的单元实例作为双向 RNN 的正向和反向单元之前,只需创建两个实例(一个用于正向,一个用于反向)。在 2017 年 5 月,我们将开始将此单元格的行为转换为使用现有存储的权重(如果有),当它以 scope=None 调用时(这可能导致静默模型退化,因此该错误将一直存在到那时。)

我将我从 Github 中的代码切换到的部分加粗。 关于为什么这仍然会引发错误的任何想法? 非常感谢您的帮助!

【问题讨论】:

    标签: tensorflow recurrent-neural-network


    【解决方案1】:

    在这行代码中:

    multi_layer_cell = tf.contrib.rnn.MultiRNNCell([basic_cell for _ in range(n_layers)])
    

    basic_cell 变量需要替换为函数。当您使用变量时,n_layers 网络的每一层都将使用相同的权重集。相反,尝试使用函数:

    def create_rnn_layer(n_neurons):
        return tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
    

    然后将 basic_cell 替换为 create_rnn_layer(n_neurons)。这样,在创建网络时。该函数将被调用 n_layers 次,因此将使用不同的权重。

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 2016-02-16
      • 2017-08-16
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多