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