我正在通过斯坦福大学课程学习使用Tensorflow的神经网络。我在实施RNN时发现了这一点,并且不太明白为什么会累积损失:
# This adds a loss operation to the Graph for batch training
def add_loss_op(self, output):
all_ones = [tf.ones([self.config.batch_size * self.config.num_steps])]
cross_entropy = sequence_loss(
[output], [tf.reshape(self.labels_placeholder, [-1])], all_ones, len(self.vocab))
tf.add_to_collection('total_loss', cross_entropy)
# Doesn't this increase in size every batch of training?
loss = tf.add_n(tf.get_collection('total_loss'))
return loss
get_collection()
here的文档未提及有关清除变量的任何内容。由于这是针对每个培训步骤进行的,因此每个培训时期/小批量的损失是否会增加并继续进行?
我还是NN的新手,所以要纠正我对此的任何误解!
答案 0 :(得分:1)
我认为这里的add_n实际上只是为了确保'total_loss'集合中任何预先存在的损失都被添加到最终结果中。它不会改变任何变量,只是总结其输入并返回总数。
答案 1 :(得分:0)
如果我没猜错,在此add_loss_to_collection操作之前,还有其他操作可以将l2_loss的可训练变量添加到此集合中。如果确实如此,这个add_n op意味着在这个"损失"中总结所有损失(包括l2_loss和预测损失)。采集。你会感到困惑"运行add_to_loss操作有很多迭代,是损失增量吗?",不,如果调试运行过程,你会看到整个图形时已经确定了这个集合大小正在构建,当tensorflow在实际中运行时,该集合的大小或框架没有改变。