Neural network Tensorflow初始多个GPU培训损失未加总?

Neural network Tensorflow初始多个GPU培训损失未加总?,neural-network,tensorflow,conv-neural-network,Neural Network,Tensorflow,Conv Neural Network,我正在尝试通过Tensorflow的多个GPU(在一台机器上)的初始代码。我很困惑,因为我们从不同的塔(即GPU)得到了多个损失,据我所知,但评估的损失变量似乎只是最后一个塔的损失,而不是所有塔损失的总和: for step in xrange(FLAGS.max_steps): start_time = time.time() _, loss_value = sess.run([train_op, loss]) duration = time.time() - start_time

我正在尝试通过Tensorflow的多个GPU(在一台机器上)的初始代码。我很困惑,因为我们从不同的塔(即GPU)得到了多个损失,据我所知,但评估的
损失
变量似乎只是最后一个塔的损失,而不是所有塔损失的总和:

for step in xrange(FLAGS.max_steps):
  start_time = time.time()
  _, loss_value = sess.run([train_op, loss])
  duration = time.time() - start_time
其中,
损耗
是上一次专门为每个塔定义的:

for i in xrange(FLAGS.num_gpus):
  with tf.device('/gpu:%d' % i):
    with tf.name_scope('%s_%d' % (inception.TOWER_NAME, i)) as scope:
      # Force all Variables to reside on the CPU.
      with slim.arg_scope([slim.variables.variable], device='/cpu:0'):
        # Calculate the loss for one tower of the ImageNet model. This
        # function constructs the entire ImageNet model but shares the
        # variables across all towers.
        loss = _tower_loss(images_splits[i], labels_splits[i], num_classes,
                           scope)
有人能解释一下将不同塔的损失合并在一起的步骤是什么吗?或者我们仅仅是一座塔的损失,也代表了另一座塔的损失

以下是代码的链接:

出于监测目的,考虑到所有塔架均按预期工作,单个塔架的损失与所有塔架损失的平均值一样具有代表性。这是因为批次和分配给它的塔之间没有关系

但是,
train_op
使用了来自所有塔楼的坡度,因此技术培训应该考虑来自所有塔楼的批次


注意,平均损失的方差比单塔损失的方差小,但它们的期望值相同

是的,根据该代码,损失不会在GPU之间求和或平均。每个gpu的损耗在每个gpu(塔)内部用于梯度计算。只有渐变是同步的。因此,isnan测试只针对最后一个gpu处理的部分数据进行。这并不重要,但可能是一个限制

如果真的需要,我认为您可以按以下方法获得GPU的平均损耗:

per_gpu_loss = []
for i in xrange(FLAGS.num_gpus):
    with tf.device('/gpu:%d' % i):
        with tf.name_scope('%s_%d' % (inception.TOWER_NAME, i)) as scope:
            ...
            per_gpu_loss.append(loss)

mean_loss = tf.reduce_mean(per_gpu_loss, name="mean_loss")
tf.summary.scalar('mean_loss', mean_loss)
然后将sess中的损失替换为平均损失:

_, loss_value = sess.run([train_op, mean_loss])
损失_值现在是所有GPU处理的损失的平均值