【问题标题】:Stacking LSTM layers/cells in tensorflow在张量流中堆叠 LSTM 层/单元
【发布时间】:2017-12-11 23:51:24
【问题描述】:

我正在尝试在 TF 中堆叠 LSTM 单元,这就是我所拥有的:

for layer in xrange(args.num_layers):
    cell_fw = tf.contrib.rnn.LSTMCell(args.hidden_size,
                                  initializer=tf.orthogonal_initializer())

    cell_bw = tf.contrib.rnn.LSTMCell(args.hidden_size,
                                  initializer=tf.orthogonal_initializer())

    cells_fw.append(cell_fw)
    cells_bw.append(cell_bw)

output = initial_input 
for layer in xrange(args.num_layers):
    ((output_fw, output_bw), (last_state_fw, first_state_bw)) = tf.nn.bidirectional_dynamic_rnn(
        cells_fw[layer], cells_bw[layer], output,
        dtype=tf.float32)

    output = tf.concat([output_fw, output_bw], axis=-1)

这给了我一个错误:

ValueError: 变量 bidirectional_rnn/fw/lstm_cell/kernel 已经 存在,不允许。您的意思是在 VarScope 中设置 reuse=True 吗?

当我将它设置为 true 时,我得到了

ValueError: 变量 bidirectional_rnn/fw/lstm_cell/kernel 没有 存在,或者不是用 tf.get_variable() 创建的。你的意思是设置 在 VarScope 中重用=None?

有人可以告诉我我做错了什么或正确的方法是什么。

【问题讨论】:

    标签: machine-learning tensorflow neural-network lstm rnn


    【解决方案1】:

    通常您只需要在不同的范围内创建 RNN,正如 this issue 中所建议的那样:

    with tf.variable_scope('lstm1'):
      output, state = tf.nn.rnn_cell.BasicLSTMCell(3)(input, init_state)
    with tf.variable_scope('lstm2'):
      output2, state2 = tf.nn.rnn_cell.BasicLSTMCell(3)(input2, init_state2)
    

    请注意,范围应涵盖 RNN 创建,而不是 cell 创建。

    如果您确实需要将这些 RNN 置于同一范围内,请使用 reuse=tf.AUTO_REUSE 调用它(在最新版本的 tensorflow 中引入)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 2018-03-25
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多