Neural network Tensorflow初始多个GPU培训损失未加总?
我正在尝试通过Tensorflow的多个GPU(在一台机器上)的初始代码。我很困惑,因为我们从不同的塔(即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
损失
变量似乎只是最后一个塔的损失,而不是所有塔损失的总和:
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处理的损失的平均值