TensorFlow:如果我在图表中处理二次计算,会消耗更多内存吗?

时间:2017-02-02 12:50:30

标签: python machine-learning tensorflow computer-vision deep-learning

如果我有来自Google的训练过的Imagnet模型(inception-resnet-v2),该模型实际上给了我两个输出:logits,以及一个名为end_points的列表,我可以在其中提取最终的预测层已经使用softmax激活执行,即称为predictions的变量。但是,这并没有明确地给我一个我需要预测的类标签。为此,我要么必须在之后执行{/ 1}} 我在图表中定义了train_op,这样我就不会影响原始计算。

或者,我可以使用从图表中计算的label = tf.argmax(predictions, 1)

我的问题是,如果我选择第一种方法,是否会消耗更多内存并影响我的计算(就我可以使用的batch_size而言)?从图表中计算出必要的标签是否更安全,更好?

1 个答案:

答案 0 :(得分:1)

发出多个.run调用时,会缓存图表定义。如果您修改图形,它将需要重新编码并再次发送。因此,第一次运行修改后的图表时,graph_def.SerializeToString可能会使用一些额外的内存,但在此之后不应影响.run步骤。

相关逻辑位于session.py,请注意检查self._graph.version > self._current_version

的行
 def _extend_graph(self):
    # Ensure any changes to the graph are reflected in the runtime.
    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