TensorFlow(v1.1.0)Multi-RNN BasicLSTMCell错误('reuse'参数)Python 3.5

时间:2017-05-13 21:03:07

标签: python tensorflow lstm

扩展:What is the use of a "reuse" parameter of tf.contrib.layers functions?

问题:虽然这个问题已经在github上提出并且可能会在TensorFlow的另一个版本中得到解决,但我暂时没有找到现有的解决方案;是否存在可能在此期间起作用的权宜之计?

代码:

state_size = 4
def lstm_cell():
    if 'reuse' in inspect.getargspec(tf.contrib.rnn.BasicLSTMCell.__init__).args:
        return tf.contrib.rnn.BasicLSTMCell(state_size, forget_bias=0.0, state_is_tuple=True, reuse=tf.get_variable_scope().reuse)
    else:
        return tf.contrib.rnn.BasicLSTMCell(state_size, forget_bias=0.0, state_is_tuple=True)

cell = lstm_cell()
cell = rnn.DropoutWrapper(cell, output_keep_prob=0.5)
cell = rnn.MultiRNNCell([cell] * num_layers, state_is_tuple=True)
states_series, current_state = tf.nn.dynamic_rnn(cell, tf.expand_dims(batchX_placeholder, -1), initial_state=rnn_tuple_state)
states_series = tf.reshape(states_series, [-1, state_size])

函数lstm_cell()是来自https://github.com/tensorflow/models/blob/master/tutorials/rnn/ptb/ptb_word_lm.py的建议。它解释了最新版本的tensorflow包含了BasicLSTMCell()的'reuse'参数。

在此代码中,如果我将重用设置为False,则tf.nn.dynamic_rnn行会产生错误:

  • “ValueError:变量 rnn / multi_rnn_cell / cell_0 / basic_lstm_cell / weights已存在, 不允许。你的意思是在VarScope中设置reuse = True吗?本来 定义于:......“

如果我将重用设置为True,则错误为:

  • “ValueError:尝试重用RNNCell  具有与其第一个不同的变量范围 使用。细胞的首次使用是在范围内 'rnn / multi_rnn_cell / cell_0 / basic_lstm_cell',这个尝试是与 范围'rnn / multi_rnn_cell / cell_1 / basic_lstm_cell'。请创建一个 如果您希望它使用不同的集合,则单元格的新实例 重量。如果在使用之前: MultiRNNCell([BasicLSTMCell(...)] * num_layers),更改为: MultiRNNCell([BasicLSTMCell(...)for _ in range(num_layers)])。如果 在你使用相同的单元格实例之前,前进和 双向RNN的反向小区,只需创建两个实例(一个 前进,后退一个)。 2017年5月,我们将开始 转换此单元格的行为以使用现有存储的权重,如果 any,当使用scope = None调用它时(可能导致静默 模型退化,所以这个错误将一直存在。)“

最后,将'scope = None'添加到dynamic_rnn也没有任何区别。

1 个答案:

答案 0 :(得分:0)

您是否考虑过尝试'重用为真'错误?

  

如果您在使用之前:MultiRNNCell([BasicLSTMCell(...)] *   num_layers),更改为:MultiRNNCell([BasicLSTMCell(...)for _ in   范围(num_layers)])。

以下代码剪辑适用于我(已经回答here

def lstm_cell():
    cell = tf.contrib.rnn.NASCell(state_size, reuse=tf.get_variable_scope().reuse)
    return tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob=0.8)

rnn_cells = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(num_layers)], state_is_tuple = True)
outputs, current_state = tf.nn.dynamic_rnn(rnn_cells, x, initial_state=rnn_tuple_state)