【发布时间】:2016-07-30 06:19:54
【问题描述】:
Tensorflow 新手在这里。我正在尝试构建一个 RNN。我的输入数据是一组大小为instance_size 的向量实例,表示一组粒子在每个时间步的 (x,y) 位置。 (由于实例已经具有语义内容,它们不需要嵌入。)目标是在下一步学习预测粒子的位置。
按照RNN tutorial 并稍微修改包含的RNN代码,我创建了一个或多或少这样的模型(省略了一些细节):
inputs, self._input_data = tf.placeholder(tf.float32, [batch_size, num_steps, instance_size])
self._targets = tf.placeholder(tf.float32, [batch_size, num_steps, instance_size])
with tf.variable_scope("lstm_cell", reuse=True):
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_size, forget_bias=0.0)
if is_training and config.keep_prob < 1:
lstm_cell = tf.nn.rnn_cell.DropoutWrapper(
lstm_cell, output_keep_prob=config.keep_prob)
cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * config.num_layers)
self._initial_state = cell.zero_state(batch_size, tf.float32)
from tensorflow.models.rnn import rnn
inputs = [tf.squeeze(input_, [1])
for input_ in tf.split(1, num_steps, inputs)]
outputs, state = rnn.rnn(cell, inputs, initial_state=self._initial_state)
output = tf.reshape(tf.concat(1, outputs), [-1, hidden_size])
softmax_w = tf.get_variable("softmax_w", [hidden_size, instance_size])
softmax_b = tf.get_variable("softmax_b", [instance_size])
logits = tf.matmul(output, softmax_w) + softmax_b
loss = position_squared_error_loss(
tf.reshape(logits, [-1]),
tf.reshape(self._targets, [-1]),
)
self._cost = cost = tf.reduce_sum(loss) / batch_size
self._final_state = state
然后我创建一个saver = tf.train.Saver(),迭代数据以使用给定的run_epoch() 方法对其进行训练,并使用saver.save() 写出参数。到目前为止,一切顺利。
但我如何真正使用训练好的模型?教程到此停止。从the docs on tf.train.Saver.restore() 开始,为了读回变量,我需要设置与保存变量时运行的完全相同的图表,或者有选择地恢复特定变量。无论哪种方式,这意味着我的新模型将需要大小为batch_size x num_steps x instance_size 的输入。但是,我现在想要的只是在大小为num_steps x instance_size 的输入上对模型进行一次前向传递,并读出一个instance_size 大小的结果(下一个时间步的预测);换句话说,我想创建一个模型,它接受与我训练过的张量不同的张量。我可以通过将现有模型传递给我的预期数据batch_size 次来解决它,但这似乎不是最佳实践。最好的方法是什么?
【问题讨论】:
-
您是否将图表中的输入保存为变量?这将是可变批量大小的问题。通常你只保存参数变量,结果图可以在批量变量批量维度上工作而无需修改。
-
这个问题的总+1!!!这就是我现在所处的位置:stackoverflow.com/questions/38966346/…
标签: neural-network tensorflow deep-learning lstm recurrent-neural-network