在tf.nn.dynamic_rnn(Tensorflow)中手动反馈隐藏状态

时间:2017-12-07 07:31:21

标签: tensorflow lstm

在Web上的许多ptb / mini莎士比亚LSTM生成器教程中,人们制作输入数据(其中每个批次都是后续的。例如,batch_2中的序列在batch_1中的序列之后,batch_1在batch_2之前输入)和feed那些输入数据到dynamic_rnn。教程:https://r2rt.com/recurrent-neural-networks-in-tensorflow-ii.html

在训练期间,这些教程会手动反馈LSTM的隐藏状态,如下面的代码所示。

batch_size = 32
hidden_state_in = cell.zero_state(batch_size, tf.float32) 
output, hidden_state_out = tf.nn.dynamic_rnn(cell, inputs,initial_state=hidden_state_in)
...
#For loop used in training: ...
    output, hidden_state = sess.run([output, hidden_state_out],
                            feed_dict={hidden_state_in:hidden_state})

让我感到困惑的是,在生成或测试ptb / shakespreare时,这些教程提供数据,其中batchsize == 1和seqlength不同(在训练时,批量大小为32或更高)。

def generate_characters(g, checkpoint, num_chars, prompt='A', pick_top_chars=None):
    with tf.Session() as sess:
        sess.run(tf.initialize_all_variables())
        g['saver'].restore(sess, checkpoint)
        state = None
        current_char = vocab_to_idx[prompt] 
        chars = [current_char]

        for i in range(num_chars):
             if state is not None:
                feed_dict={g['x']: [[current_char]], g['init_state']: state}
                #shape [BATCHSIZE, SEQLEN] with BATCHSIZE=1 and SEQLEN=1 
            else:
                feed_dict={g['x']: [[current_char]]}
            preds, state = sess.run([g['preds'],g['final_state']], feed_dict)

将dynamic_rnn与LSTM一起使用时,隐藏状态的形状为[num_layers,2,batch_size,state_size]。我只是想知道如何在训练和测试中使用不同batch_size的数据。 tensorflow内部是否处理这个?

另外,在查看上面r2rt教程的文本部分时,第一代的部分看起来很奇怪。我想这是因为hidden_​​state(在生成开始时被送到dynamic_rnn的initial_state)配置不当,导致它在第一个提示之后。我是对的吗?

0 个答案:

没有答案