【问题标题】:Why no eval plot for this DNN binary classifier tf.estimator model in tensorboard?为什么在张量板上没有这个 DNN 二元分类器 tf.estimator 模型的评估图?
【发布时间】:2019-11-03 19:41:06
【问题描述】:

我在 Google AI Platform 上使用 tf.estimator API 和 TensorFlow 1.13 来构建 DNN 二进制分类器。出于某种原因,我没有得到eval 图表,但我得到了training 图表。

这里有两种不同的训练方法。第一种是普通的python方法,第二种是在本地模式下使用GCP AI Platform。

请注意,在任何一种方法中,评估都只是最终结果的一个点。我期待一个类似于训练曲线的情节。

最后,我展示了性能指标的相关模型代码。

普通的python笔记本方法:

%%bash
#echo ${PYTHONPATH}:${PWD}/${MODEL_NAME}
export PYTHONPATH=${PYTHONPATH}:${PWD}/${MODEL_NAME}
python -m trainer.task \
   --train_data_paths="${PWD}/samples/train_sounds*" \
   --eval_data_paths=${PWD}/samples/valid_sounds.csv  \
   --output_dir=${PWD}/${TRAINING_DIR} \
   --hidden_units="175" \
   --train_steps=5000 --job-dir=./tmp

本地 gcloud (GCP) 人工智能平台方法:

%%bash

OUTPUT_DIR=${PWD}/${TRAINING_DIR}



echo "OUTPUT_DIR=${OUTPUT_DIR}"
echo "train_data_paths=${PWD}/${TRAINING_DATA_DIR}/train_sounds*"



gcloud ai-platform local train \
   --module-name=trainer.task \
   --package-path=${PWD}/${MODEL_NAME}/trainer \
   -- \
   --train_data_paths="${PWD}/${TRAINING_DATA_DIR}/train_sounds*" \
   --eval_data_paths=${PWD}/${TRAINING_DATA_DIR}/valid_sounds.csv  \
   --hidden_units="175" \
   --train_steps=5000 \
   --output_dir=${OUTPUT_DIR} 

性能指标代码

estimator = tf.contrib.estimator.add_metrics(estimator, my_auc)

还有

# This is from the tensorflow website for adding metrics for a DNNClassifier
# https://www.tensorflow.org/api_docs/python/tf/metrics/auc
def my_auc(features, labels, predictions):
    return {
        #'auc': tf.metrics.auc( labels, predictions['logistic'], weights=features['weight'])
        #'auc': tf.metrics.auc( labels, predictions['logistic'], weights=features[LABEL])
#        'auc': tf.metrics.auc( labels, predictions['logistic'])
        'auc': tf.metrics.auc( labels, predictions['class_ids']),
        'accuracy': tf.metrics.accuracy( labels, predictions['class_ids'])
    }

训练和评估时使用的方法

   eval_spec = tf.estimator.EvalSpec(
        input_fn = read_dataset(
            filename = args['eval_data_paths'],
            mode = tf.estimator.ModeKeys.EVAL,
            batch_size = args['eval_batch_size']),
        steps=100,
        throttle_secs=10,   
        exporters = exporter)


   # addition of throttle_secs=10 above and this
   # below as a result of one of the suggested answers.
   # The result is that these mods do no print the final 
   # evaluation graph much less the intermediate results
   tf.estimator.RunConfig(save_checkpoints_steps=10)

   tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

使用 tf.estimator 的 DNN 二元分类器

estimator = tf.estimator.DNNClassifier(
                        model_dir = model_dir,
                        feature_columns = final_columns,
                        hidden_units=hidden_units,
                        n_classes=2)

model_trained/eval 目录中文件的屏幕截图。

只有这个文件在这个目录中。 它被命名为model_trained/eval/events.out.tfevents.1561296248.myhostname.local,看起来像

【问题讨论】:

  • 你是如何训练估计器的?是tf.estimator.train_and_evaluate吗?
  • 是的,我用我的用法更新了这个问题。
  • 我根据您的 cmets 和建议以及只是使用参数在下面添加了一个答案。结果在我看来并没有过度拟合。评估损失仍呈下降趋势,尚未开始上升。这让我想起了一个问题。在 keras 中有一种基于 eval 上升的提前停止的方法。估计器有这样的方法吗?或者,您是否只是检查图表并根据评估损失的上升修改训练步骤?

标签: python tensorflow google-cloud-platform google-cloud-ml gcp-ai-platform-notebook


【解决方案1】:

通过评论和建议以及调整参数,这是适合我的结果。

启动张量板、训练模型等的代码。使用-------表示笔记本单元


%%bash
# clean model output dirs
# This is so that the trained model is deleted
output_dir=${PWD}/${TRAINING_DIR} 
echo ${output_dir}
rm -rf ${output_dir}

# start tensorboard
def tb(logdir="logs", port=6006, open_tab=True, sleep=2):
    import subprocess
    proc = subprocess.Popen(
        "exec " + "tensorboard --logdir={0} --port={1}".format(logdir, port), shell=True)
    if open_tab:
        import time
        time.sleep(sleep)
        import webbrowser
        webbrowser.open("http://127.0.0.1:{}/".format(port))
    return proc


cwd = os.getcwd()
output_dir=cwd + '/' + TRAINING_DIR 
print(output_dir)


server1 = tb(logdir=output_dir)

%%bash
# The model run config is hard coded to checkpoint every 500 steps
#
#echo ${PYTHONPATH}:${PWD}/${MODEL_NAME}
export PYTHONPATH=${PYTHONPATH}:${PWD}/${MODEL_NAME}
python -m trainer.task \
   --train_data_paths="${PWD}/samples/train_sounds*" \
   --eval_data_paths=${PWD}/samples/valid_sounds.csv  \
   --output_dir=${PWD}/${TRAINING_DIR} \
   --hidden_units="175" \
   --train_batch_size=10 \
   --eval_batch_size=100 \
   --eval_steps=1000 \
   --min_eval_frequency=15 \
   --train_steps=20000 --job-dir=./tmp

相关型号代码

# This hard codes the checkpoints to be
# every 500 training steps?
estimator = tf.estimator.DNNClassifier(
                    model_dir = model_dir,
                    feature_columns = final_columns,
                    hidden_units=hidden_units,
                    config=tf.estimator.RunConfig(save_checkpoints_steps=500),
                    n_classes=2)




# trainspec to tell the estimator how to get training data
train_spec = tf.estimator.TrainSpec(
    input_fn = read_dataset(
        filename = args['train_data_paths'],
        mode = tf.estimator.ModeKeys.TRAIN, # make sure you use the dataset api
        batch_size = args['train_batch_size']),
    max_steps = args['train_steps'])  # max_steps allows a resume

exporter = tf.estimator.LatestExporter(name = 'exporter',
                                       serving_input_receiver_fn = serving_input_fn)



eval_spec = tf.estimator.EvalSpec(
    input_fn = read_dataset(
        filename = args['eval_data_paths'],
        mode = tf.estimator.ModeKeys.EVAL,
        batch_size = args['eval_batch_size']),
    steps=args['eval_steps'],
    throttle_secs = args['min_eval_frequency'],
    exporters = exporter)




tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

结果图

【讨论】:

    【解决方案2】:

    estimator.train_and_evaluate() 中指定train_speceval_speceval_spec 通常有不同的输入函数(例如开发评估数据集,非洗牌)

    每隔 N 步,就会保存来自 train 进程的一个检查点,并且 eval 进程会加载相同的权重并根据 eval_spec 运行。这些评估摘要记录在检查点的步骤编号下,因此您可以比较训练与测试的性能。

    在您的情况下,每次调用评估时,评估只会在图表上产生一个点。该点包含整个评估调用的平均值。 看看this类似的问题:

    我会将tf.estimator.EvalSpec 修改为具有较小值的throttle_secs(默认为600),并将tf.estimator.RunConfig 中的save_checkpoints_steps 也修改为较小的值:

    tf.estimator.RunConfig(save_checkpoints_steps=SOME_SMALL_VALUE_TO_VERIFY)

    【讨论】:

    • 我更新了代码以显示您的建议。可悲的是,它使情况变得更糟。现在它不会显示损失的最终评估结果。
    • 当您仅在 save_checkpoints_steps 中添加值时,现在在您的训练和评估日志中会发生什么?你看到的不止一点,请澄清一下。
    • 另外,您使用的是什么类型的 Estimator?谢谢!
    • 好的,第一个问题,你的意思是删除throttle_secs并保留save_checkpoints_steps,然后在日志中看到多个点?对于估算器类型,它是一个 dnn - 二元分类器。
    • 使用上面我原始问题中显示的代码以及您对 save_checkpoints 和 throttle_secs addtions 的建议,我在 model_trained/eval/ 目录中获得了一个文件。它是一个带有一堆垃圾字符的 ascii 文件。 Linux 文件命令说它是一个数据文件,而不是它识别的东西。它看起来像 ascii 和二进制的组合。我会添加一个截图,因为我不知道如何解释它。顺便说一句,是否有描述此文件的文档?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多