如何避免在Tensorflow中添加重复集合?

如何避免在Tensorflow中添加重复集合?,tensorflow,neural-network,deep-learning,conv-neural-network,tensorboard,Tensorflow,Neural Network,Deep Learning,Conv Neural Network,Tensorboard,这里是Tensorflow初学者 我有一段代码(一起)对一组图像进行训练和验证。每隔一段时间,在训练循环中,我执行一次验证,并从验证数据集中获得损失。我总结结果并使用tensorboard查看我的可视化效果 我的问题是,我在数我的损失两次,我不应该这样。我的代码将清楚地说明发生了什么 获取一些已拆分为训练集和验证集的图像,并构建神经网络: images, labels = ( self._input_pipeline(filenames, self.mod

这里是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_损失的样子:

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()
发生的问题是交叉熵损失被添加到集合中两次,从而使我得到交叉熵损失的2倍输出

在主例程中使用“交叉熵损失”集合来计算交叉熵总和:

        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)
单个摘要op生成摘要:

        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)                        
有人能帮我避免两次计算交叉熵吗?
例如,如果未执行验证的损失为100,如果我插入上面显示的验证片段,它将变为200。通常,人们通过
feed\u dict
参数将培训和验证数据输入到
sess.run
。这样,“图形”就不依赖于数据集部分


另外,我也不清楚为什么要在这里使用“集合”。你只需输入
cross\u entropy\u sum=tf.reduce\u sum…
minimize

@crashtangle(Crtl-F feed\u dict),我还想最小化cross\u entropy\u total,它是多个gpu之间的交叉熵之和,那么,没有集合我怎么做呢?我回答了你的问题吗?我想知道为什么你应该将验证损失添加到交叉熵损失集合中,然后用它更新权重。如果该步骤用于验证,则不应跳过该损失以添加到仅包含培训损失的集合中。