在Web上的许多ptb / mini莎士比亚LSTM生成器教程中,人们制作输入数据(其中每批次都是后续的 . 例如,batch_2中的序列在batch_1中的序列之后,batch_1在batch_2之前输入)并提供这些输入数据到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)配置不当,导致它在第一个提示之后 . 我是对的吗?