首页 文章

在张量流中堆叠LSTM层/单元

提问于
浏览
2

我试图在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吗?

当我把它设置为真时,我得到了

ValueError:变量bidirectional_rnn / fw / lstm_cell / kernel不存在,或者未使用tf.get_variable()创建 . 你是不是要在VarScope中设置reuse = None?

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

1 回答

  • 2

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

    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创建,而不是单元格创建 .

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

相关问题