tensorflow是否提供像caffe average_loss操作这样的操作?

问题描述 投票:-3回答:2

由于限制了gpu,我想在每两步训练后更新我的体重。具体而言,网络将首先计算fisrt批输入并节省损失。然后网络计算下一批输入并平均这两个损失,并将更新权重一次。它喜欢caffe中的average_loss op,例如()fcn-berkeley。以及如何计算batchnorm update-ops。

python tensorflow deep-learning caffe semantic-segmentation
2个回答
0
投票

容易,juste使用tf.reduce_mean(input_tensor)

Tf documentation reduce_mean

在你的情况下,它将是:

loss = tf.concat([loss1,loss2], axis=0)

final_loss = tf.reduce_mean(loss, axis=0)

0
投票

请检查this线程以获取Caffe's average_loss的正确信息。

您应该能够通过以类似的方式对LoggingTensorHook进行子类化来计算平均损失

class MyLoggingTensorHook(tf.train.LoggingTensorHook):

    # set every_n_iter to if you want to average last 2 losses
    def __init__(self, tensors, every_n_iter):
        super().__init__(tensors=tensors, every_n_iter=every_n_iter)

        # keep track of previous losses
        self.losses=[]

    def after_run(self, run_context, run_values):
        _ = run_context

        # assuming you have a tag like 'average_loss'
        # as the name of your loss tensor
        for tag in self._tag_order:
            if 'average_loss' in tag:
                self.losses.append(run_values.results[tag])

        if self._should_trigger:
            self._log_tensors(run_values.results)

        self._iter_count += 1

    def _log_tensors(self, tensor_values):

        original = np.get_printoptions()
        np.set_printoptions(suppress=True)
        logging.info("%s = %s" % ('average_loss', np.mean(self.losses)))
        np.set_printoptions(**original)
        self.losses=[]

并将其附加到估算器的train方法或使用TrainSpec

您应该能够在每个步骤中正常计算变量的渐变,但是通过调整定义当前迭代或步骤的global_state变量,在每N个步骤中应用它们(您应该在图形中通过类似global_step = tf.train.get_or_create_global_step()初始化此变量) 。请参阅compute_gradientsapply_gradients的用法。

© www.soinside.com 2019 - 2024. All rights reserved.