如何为TensorFlow预构建Estimator添加指标摘要?
不用自定义Estimator也能实现!
好消息——你完全不用非得定义Custom Estimator和model_fn来实现这个需求,有几个更简便的途径可以快速把TensorFlow metrics和TensorBoard展示结合起来:
方法1:用tf.estimator.add_metrics给预定义Estimator加自定义指标
如果你用的是TensorFlow提供的预定义Estimator(比如DNNClassifier、LinearRegressor这类),tf.estimator.add_metrics就是专门干这个的工具,步骤超简单:
- 定义你的metric函数:接收
labels和predictions作为输入,返回你要计算的TensorFlow metric结果(可以直接用tf.metrics里的现成函数,也可以自己组合逻辑)。 - 把metric绑定到你的Estimator上:调用
tf.estimator.add_metrics,传入你的Estimator和自定义metric函数。 - 正常运行评估:评估时这些指标会自动被计算,并且同步写入TensorBoard的摘要文件里。
举个实际代码例子:
import tensorflow as tf # 先创建一个预定义的DNN分类器 feature_cols = [tf.feature_column.numeric_column('x', shape=[4])] classifier = tf.estimator.DNNClassifier( feature_columns=feature_cols, hidden_units=[10, 10], n_classes=2, model_dir='./my_model_dir' # 指定模型目录,方便TensorBoard读取 ) # 自定义一个准确率指标(也可以换成precision、recall等其他tf.metrics) def custom_accuracy_metric(labels, predictions): # 预定义Estimator的predictions会包含特定键,比如DNNClassifier的'class_ids' predicted_classes = predictions['class_ids'] return tf.metrics.accuracy(labels=labels, predictions=predicted_classes) # 给Estimator绑定这个自定义指标 classifier = tf.estimator.add_metrics(classifier, custom_accuracy_metric) # 运行评估,指标会自动被计算并写入TensorBoard eval_input_fn = tf.estimator.inputs.numpy_input_fn( x={'x': eval_x}, y=eval_y, num_epochs=1, shuffle=False ) eval_results = classifier.evaluate(input_fn=eval_input_fn)
之后你只需要运行tensorboard --logdir=./my_model_dir,就能在TensorBoard的"Scalars"面板看到这个自定义指标的变化了。
方法2:如果已经在用自定义model_fn
要是你已经在写自己的model_fn,那直接在EstimatorSpec的eval_metric_ops参数里指定要计算的指标就行,评估时同样会自动同步到TensorBoard:
def custom_model_fn(features, labels, mode): # 构建你的模型计算逻辑... logits = tf.layers.dense(features['x'], units=2) predictions = { 'class_ids': tf.argmax(logits, axis=1), 'probabilities': tf.nn.softmax(logits) } if mode == tf.estimator.ModeKeys.EVAL: # 定义要计算的评估指标 eval_metric_ops = { 'accuracy': tf.metrics.accuracy(labels=labels, predictions=predictions['class_ids']), 'precision': tf.metrics.precision(labels=labels, predictions=predictions['class_ids']) } return tf.estimator.EstimatorSpec( mode=mode, loss=tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits), eval_metric_ops=eval_metric_ops ) # 处理TRAIN和PREDICT模式的逻辑... # ...
关键提醒
不管用哪种方法,只要你在初始化Estimator时指定了model_dir,TensorBoard就能自动读取到这些指标的摘要数据,完全不用手动写tf.summary相关的代码——Estimator已经帮你封装好了这部分逻辑。
内容的提问来源于stack exchange,提问作者matwilso
相关产品推荐
相关产品推荐

