如果我有一个来自Google的训练好的Imagnet模型(inception-resnet-v2),这个模型实际上会给我两个输出:logits
,以及一个名为end_points的列表,我可以从中提取出已经通过softmax激活的最终预测层,即一个名为predictions
的变量。然而,这并不能明确给我提供预测所需的类别标签。为此,我必须在定义了train_op之后,在图中使用label = tf.argmax(predictions, 1)
,以免影响原始计算。
或者,我可以使用np.argmax(sess.run(predictions), 1)
,这是在图外计算的。
我的问题是,如果我选择第一种方法,会不会消耗更多的内存,并影响我的计算(就我可以使用的batch_size而言)?仅仅在图外计算必要的标签是否更安全、更好?
回答:
当你发出多个.run
调用时,图定义会被缓存。如果你修改了图,它将需要重新编码并再次发送。因此,第一次运行修改后的图时,可能会使用graph_def.SerializeToString
额外占用一些内存,但这不应该影响之后的.run
步骤。
相关逻辑在session.py中,请注意检查self._graph.version > self._current_version
的行
def _extend_graph(self): # 确保对图的任何更改都反映在运行时中。 with self._extend_lock: if self._graph.version > self._current_version: # pylint: disable=protected-access graph_def, self._current_version = self._graph._as_graph_def( from_version=self._current_version, add_shapes=self._add_shapes) # pylint: enable=protected-access with errors.raise_exception_on_not_ok_status() as status: tf_session.TF_ExtendGraph( self._session, graph_def.SerializeToString(), status) self._opened = True