在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)配置不当,导致它在第一个提示之后。我是对的吗?