【问题标题】:How to get a total training set loss for an epoch using Tensorflow Estimator api如何使用 Tensorflow Estimator api 获得一个时期的总训练集损失
【发布时间】:2018-08-24 19:44:03
【问题描述】:

我正在寻找一种实现学习率搜索的方法,如下所述:https://arxiv.org/pdf/1506.01186.pdf

要实现这一点,我需要有一种方法可以在单个 epoch 获得多个学习率的损失。我正在考虑创建一个 SessionRunHook 并简单地从每个步骤的损失中取平均值,这并不准确,因为最后一步很可能没有元素的 batch_size 但它应该足够好。

您是否实施过此类 SessionRunHook 或知道如何在训练期间访问损失或/和批量大小。

【问题讨论】:

    标签: tensorflow tensorflow-estimator


    【解决方案1】:

    我想出的是这个,它不考虑最后一个可以更小的小批量,但由于我没有运行整个训练集,所以应该没问题:

    class RecordLossHook(tf.train.SessionRunHook):
      def __init__(self, loss_name):
        self.loss_name = loss_name
    
      def begin(self):
        self._loss_tensor = tf.get_default_graph().as_graph_element(self.loss_name+":0")
        self.loss_summed = 0
        self.batch_count = 0
    
      def before_run(self, run_context):
        return tf.train.SessionRunArgs(self._loss_tensor)
    
      def after_run(self, run_context,  run_values):
        self.loss_summed += run_values.results
        self.batch_count += 1 
        self.loss = self.loss_summed/self.batch_count 
    

    但是,如果有人有更好的钩子来解释最后一个小批量,我很乐意接受这样的答案。

    【讨论】:

      【解决方案2】:

      也许这样的事情也可以:

      epoch_loss = tf.Variable(0, trainable=False, dtype=tf.float32)
      update_epoch_loss = tf.assign_add(epoch_loss, loss_op)
      reset_epoch_loss = tf.variables_initializer([epoch_loss])
      
      
      for epoch in num_epochs:
      
          sess.run(reset_epoch_loss)
      
          for step in steps_per_epoch:
              sess.run([train_op, update_epoch_loss])
      
          this_epoch_loss = sess.run(epoch_loss)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-11
        • 2020-11-24
        • 2016-02-23
        • 2018-09-12
        • 2019-08-12
        • 2020-09-11
        • 2021-12-27
        • 2019-04-08
        相关资源
        最近更新 更多