Tensorflow初学者。
我有一段代码可以对一组图像进行培训和验证(一起)。经常在训练循环中,我执行验证并从验证数据集中获取损失。我总结了结果并使用tensorboard来查看我的可视化。
我的问题是,我在计算我的损失两次,我不应该。我的代码将清楚地说明发生了什么
获取一些已经分成训练和验证集的图像,同时构建神经网络:
images, labels = (
self._input_pipeline(filenames, self.model_config.BATCH_SIZE))
v_images, v_labels = (
self._input_pipeline(v_filenames, self.model_config.BATCH_SIZE))
logits = self.build_nets(images)
tf.get_variable_scope().reuse_variables()
v_logits = self.build_nets(v_images)
设置损失功能:
_ = self.set_loss(logits, labels)
validation_step = self.set_loss(v_logits, v_labels)
这就是set_loss的样子:
def set_loss(self, y, y_):
cross_entropy_sum = (
tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=y, labels=y_)))
tf.add_to_collection('cross_entropy_loss', cross_entropy_sum)
return tf.losses.get_losses()
正在发生的问题是cross_entropy_loss被添加两次到集合,从而给我2倍的交叉熵损失输出
在主例程中使用集合'cross_entropy_loss'来计算cross_entropy_total:
get_cross_entropy = tf.get_collection('cross_entropy_loss')
cross_entropy_total = tf.add_n(get_cross_entropy, name='cross_entropy_loss_across_all_gpus')
tf.summary.scalar("cross entropy loss", cross_entropy_total)
单个摘要操作会生成摘要:
summary_op = tf.summary.merge_all()
训练步骤如下:
train_step = (
tf.train.GradientDescentOptimizer(model_config.INITIAL_LEARNING_RATE).minimize(cross_entropy_total))
这是最后一篇,运行训练片和验证片并写出摘要
_, cross_entropy = sess.run([train_step, cross_entropy_total])
if step % self.model_config.SUMMARY_EVERY == 0:
summary_str = sess.run(summary_op)
summary_writer.add_summary(summary_str, step)
#validation
_, cross_entropy = sess.run([validation_step, cross_entropy_total])
v_summary_str = sess.run(summary_op)
v_summary_writer.add_summary(v_summary_str, step)
那么有人可以帮助我避免两次计算cross_entropy_total吗? 例如,如果没有执行验证的损失是100,如果我插入上面显示的验证件,则它变为200
答案 0 :(得分:1)
通常,人们通过feed_dict
参数向sess.run
提供培训和验证数据。这样,“图表”不依赖于数据集部分。
另外,我不清楚为什么你甚至需要在这里使用“收藏品”。您可以将cross_entropy_sum = tf.reduce_sum ...
提供给minimize
。