由于 gpu 的限制,我想在每两步训练后更新我的体重。具体来说,网络将首先计算第一个批输入并保存损失。然后网络计算下一批输入并平均这两个损失,并更新一次权重。它喜欢 caffe 中的 average_loss op,例如()fcn-berkeley。以及如何计算 batchnorm 更新操作。
问问题
99 次
2 回答
0
简单,公正使用tf.reduce_mean(input_tensor)
在您的情况下,它将是:
loss = tf.concat([loss1,loss2], axis=0)
final_loss = tf.reduce_mean(loss, axis=0)
于 2018-08-30T14:37:50.163 回答
0
请检查此线程以获取有关 Caffe 的正确信息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
定义当前迭代或步骤的变量(您应该在图中通过类似的东西初始化此变量global_step = tf.train.get_or_create_global_step()
)在每 N 步中应用它们。请参阅compute_gradients和apply_gradients的用法。
于 2018-08-28T15:28:39.310 回答