ValueError:尝试使用与第一次使用不同的变量范围重用RNNCell

时间:2017-03-08 11:04:22

标签: python tensorflow

以下代码片段

import tensorflow as tf
from tensorflow.contrib import rnn

hidden_size = 100
batch_size  = 100
num_steps   = 100
num_layers  = 100
is_training = True
keep_prob   = 0.4

input_data = tf.placeholder(tf.float32, [batch_size, num_steps])
lstm_cell = rnn.BasicLSTMCell(hidden_size, forget_bias=0.0, state_is_tuple=True)

if is_training and keep_prob < 1:
    lstm_cell = rnn.DropoutWrapper(lstm_cell)
cell = rnn.MultiRNNCell([lstm_cell for _ in range(num_layers)], state_is_tuple=True)

_initial_state = cell.zero_state(batch_size, tf.float32)

iw = tf.get_variable("input_w", [1, hidden_size])
ib = tf.get_variable("input_b", [hidden_size])
inputs = [tf.nn.xw_plus_b(i_, iw, ib) for i_ in tf.split(input_data, num_steps, 1)]

if is_training and keep_prob < 1:
    inputs = [tf.nn.dropout(input_, keep_prob) for input_ in inputs]

outputs, states = rnn.static_rnn(cell, inputs, initial_state=_initial_state)

产生以下错误:

  

ValueError:尝试重用RNNCell   &lt; tensorflow.contrib.rnn.python.ops.core_rnn_cell_impl.BasicLSTMCell对象位于0x10210d5c0&gt;具有与其首次使用不同的可变范围。第一次使用单元格的范围是'rnn/multi_rnn_cell/cell_0/basic_lstm_cell',这种尝试的范围是“&n; rnn / multi_rnn_cell / cell_1 / basic_lstm_cell&#39;``。

     

如果您希望使用不同的权重集,请创建单元格的新实例。

     

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

     

如果在使用与双向RNN的正向和反向单元相同的单元实例之前,只需创建两个实例(一个用于转发,一个用于反向)。

     

2017年5月,我们将开始转换此单元格的行为,以便在使用scope=None调用时使用现有存储的权重(如果有)(这会导致静默模型降级,因此此错误将直到那时为止。)

如何解决这个问题?

我的Tensorflow版本是1.0。

1 个答案:

答案 0 :(得分:10)

正如评论中所建议的,我的解决方案是:
改变这个

cell = tf.contrib.rnn.LSTMCell(state_size, state_is_tuple=True)
cell = tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob=0.8)
rnn_cells = tf.contrib.rnn.MultiRNNCell([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, scope = "layer")

成:

def lstm_cell():
    cell = tf.contrib.rnn.LSTMCell(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)

似乎解决了可重用性问题。我没有从根本上理解潜在的问题,但这解决了我在TF 1.1rc2上的问题 干杯!