如何在 Tensorflow Estimator 的每个全局步骤中获取训练损失并评估损失?

Posted

技术标签:

【中文标题】如何在 Tensorflow Estimator 的每个全局步骤中获取训练损失并评估损失?【英文标题】:How to get train loss and evaluate loss every global step in Tensorflow Estimator? 【发布时间】:2018-06-11 22:27:52 【问题描述】:

我可以在每个全局步骤中得到训练损失。但我确实想在张量板的图表“lossxx”中添加评估损失。该怎么做?

MyHook 类(tf.train.SessionRunHook): def after_run(self,run_context,run_value): _session = run_context.session _session.run(_session.graph.get_operation_by_name('acc_op')) def my_model(功能,标签,模式): ... logits = tf.layers.dense(net, 3, activation=None) predict_classes = tf.argmax(logits, 1) 如果模式 == tf.estimator.ModeKeys.PREDICT: 预测 = “类”:预测类, “概率”:tf.nn.softmax(logits) 返回 tf.estimator.EstimatorSpec(模式,预测=预测) # 计算损失。 损失= tf.losses.sparse_softmax_cross_entropy(标签=标签,logits=logits) acc, acc_op = tf.metrics.accuracy(labels=labels, predictions=predicted_classes) tf.identity(acc_op,'acc_op') loss_sum = tf.summary.scalar('lossxx',loss) accuracy_sum = tf.summary.scalar('accuracyxx',acc) 合并 = tf.summary.merge_all() # 创建训练操作。 如果模式 == tf.estimator.ModeKeys.TRAIN: 优化器 = tf.train.AdagradOptimizer(learning_rate=0.1) train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step()) return tf.estimator.EstimatorSpec(模式,损失=损失,train_op=train_op, training_chief_hooks=[ tf.train.SummarySaverHook(save_steps=10, output_dir='./model', summary_op=merg)]) 返回 tf.estimator.EstimatorSpec( 模式,损失=损失,eval_metric_ops='accuracy': (acc, acc_op) ) 分类器.train(input_fn=train_input_fn, steps=1000,hooks=[ MyHook()])

【问题讨论】:

估计器训练函数通常只使用训练数据作为输入。您需要在每批中都有一些验证数据吗?还是交替训练批次和验证批次? 只是为了确保我对您的理解正确:您希望将评估的损失与训练期间的损失叠加?如果是这样,您是否希望对验证集中所有样本的损失进行平均?否则,您希望如何将 lossxx 的 x 轴 (global_step) 与评估中的 x 轴合并? 【参考方案1】:

您实际上不需要自己创建SummarySaverHook,因为它已经包含在tf.estimator.Estimator 中。只需使用tf.summary.xxx 创建您想要的所有摘要,它们都将在每个n 步骤中进行评估。 (请参阅tf.estimator.RunConfig)。

此外,您无需为最终损失loss 创建摘要。这也将自动为您创建。如果你这样做,那么训练和评估摘要将显示在 TensorBoard 上的同一图表中。估算器会在您当前的 model_dir 中创建一个子目录 eval 来实现此目的。

还有一个小提示:直接在摘要中使用acc_op 来更新指标获取它的值。但是,tf.metrics 函数很难处理 ;-)

【讨论】:

【参考方案2】:

您需要使用tf.estimator.train_and_evaluate 将评估数据与训练数据一起传递给模型

【讨论】:

那个train_and_evalulate函数很有意思

以上是关于如何在 Tensorflow Estimator 的每个全局步骤中获取训练损失并评估损失?的主要内容,如果未能解决你的问题,请参考以下文章

如何在SummarySaverHook和Estimator中使用tensorflow.metrics.x?

Tensorflow在Python中导出和重用Estimator对象

如何在Tensorflow中组合feature_columns,model_to_estimator和dataset API

如何使用 tf.estimator 导入保存的 Tensorflow 模型训练并预测输入数据

如何在 Tensorflow Estimator 的 input_fn 中执行数据扩充

如何从提升树 Estimator 迁移到 TensorFlow 决策森林