Neural network 如何实际执行已保存的TensorFlow模型?

Neural network 如何实际执行已保存的TensorFlow模型?,neural-network,tensorflow,deep-learning,lstm,recurrent-neural-network,Neural Network,Tensorflow,Deep Learning,Lstm,Recurrent Neural Network,这里是Tensorflow新手。我正在尝试建立一个RNN。我的输入数据是一组大小为instance_size的向量实例,表示一组粒子在每个时间步的(x,y)位置。(因为实例已经有语义内容,它们不需要嵌入。)目标是在下一步学习预测粒子的位置 根据所包含的RNN代码,我创建了一个大致如下的模型(省略了一些细节): inputs,self.\u input\u data=tf.placeholder(tf.float32,[batch\u size,num\u steps,instance\u siz

这里是Tensorflow新手。我正在尝试建立一个RNN。我的输入数据是一组大小为
instance_size
的向量实例,表示一组粒子在每个时间步的(x,y)位置。(因为实例已经有语义内容,它们不需要嵌入。)目标是在下一步学习预测粒子的位置

根据所包含的RNN代码,我创建了一个大致如下的模型(省略了一些细节):

inputs,self.\u input\u data=tf.placeholder(tf.float32,[batch\u size,num\u steps,instance\u size])
self.\u targets=tf.placeholder(tf.float32,[batch\u size,num\u steps,instance\u size])
使用tf.variable_scope(“lstm_cell”,reuse=True):
lstm_cell=tf.nn.rnn_cell.BasicLSTMCell(隐藏_大小,忽略_偏差=0.0)
如果是培训和配置保持问题<1:
lstm_单元=tf.nn.rnn_单元.下拉式振打器(
lstm_单元格,输出_keep_prob=config.keep_prob)
cell=tf.nn.rnn\u cell.MultiRNNCell([lstm\u cell]*config.num\u层)
self.\u初始\u状态=cell.zero\u状态(批处理大小,tf.float32)
从tensorflow.models.rnn导入rnn
输入=[tf.挤压(输入[1])
对于tf.split中的输入(1,num_步骤,输入)]
输出,状态=rnn.rnn(单元,输入,初始状态=self.\u初始状态)
输出=tf.reformate(tf.concat(1,输出),[-1,隐藏大小])
softmax\u w=tf.get\u变量(“softmax\u w,[隐藏大小,实例大小])
softmax_b=tf.get_变量(“softmax_b”,[instance_size])
logits=tf.matmul(输出,softmax_w)+softmax_b
损失=位置误差平方损失(
tf.重塑(logits,[-1]),
tf.重塑(自我目标,[-1]),
)
自身成本=成本=tf.减少总量(损失)/批量
self.\u final\u state=状态
然后我创建一个
saver=tf.train.saver()
,使用给定的
run\u epoch()
方法对数据进行迭代训练,并使用
saver.save()
写出参数。到目前为止,一切顺利


但是我如何实际使用经过训练的模型呢?本教程到此为止。从中,为了读回变量,我需要设置与保存变量时运行的图形完全相同的图形,或者有选择地恢复特定变量。无论哪种方式,这意味着我的新模型都需要输入大小
批量大小x数量步骤x实例大小
。但是,我现在只想在输入的size
num\u steps x instance\u size
上对模型进行一次向前传递,并读取单个
instance\u size
大小的结果(下一时间步的预测);换句话说,我想创建一个模型,该模型接受的张量与我训练的张量不同。我可以通过将现有模型传递给我的预期数据
batch\u size
次来混淆视听,但这似乎不是最佳做法。最好的方法是什么

您必须创建一个具有相同结构但批处理大小为1的新图形,并使用
tf.train.Saver.restore()导入保存的变量。您可以在ptb_word_lm.py中查看它们如何定义具有可变批量大小的多个模型:


例如,您可以有一个单独的文件,在该文件中,您使用所需的批处理大小实例化图形,然后恢复保存的变量。然后可以执行图形。

是否将图形中的输入保存为变量?这将是可变批量的问题。通常您只保存参数变量,结果图可以在批变量批维度上工作,无需修改。此问题总计+1!!!这就是我现在的观点:
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