【问题标题】:How do we know the model converged while training a neural network for object classification/detection?我们如何知道模型在训练用于对象分类/检测的神经网络时收敛?
【发布时间】:2019-03-06 12:23:45
【问题描述】:

我正在使用 Tensorflow 的对象检测 API 来检测汽车。它应该将汽车检测为一类“汽车”。

我关注了senddex的以下系列:

https://pythonprogramming.net/introduction-use-tensorflow-object-detection-api-tutorial/

系统信息:

操作系统 - Ubuntu 18.04 LTS

GPU - Nvidia 940M(显存:2GB)

张量流:1.10

Python - 3.6

CPU - 英特尔 i5

问题: 训练过程运行良好。为了知道模型何时收敛以及何时应该停止训练,我在运行训练的终端中观察了每步训练期间的损失,并且还观察了总损失图Tensorboard 通过在另一个终端中运行以下命令,

$tensorboard --logdit="training"

但即使在训练到 60k 步之后,损失也在 2.1 到 1.2 之间波动。如果我停止训练并从最后一个检查点(保存在 training/ 文件夹中)导出推理图,它在某些情况下会检测到汽车,在某些情况下会给出误报。

我也尝试运行 eval.py,如下所示,

python3 eval.py     --logtostderr     --pipeline_config_path=training/ssd_mobilenet_v1_pets.config     --checkpoint_dir=training/     --eval_dir=eval/

但它给出一个错误,表明 GPU 内存无法运行此脚本以及 train.py。

所以,我停止训练以确保 GPU 空闲,然后运行 ​​eval.py 但它只在 eval/ 文件夹中创建一个 eval 点。为什么?

另外,我如何从 Tensorboard 中的 Precision 图表了解需要停止训练?

如果有人愿意,我也可以发布屏幕截图。 我应该继续训练直到平均损失保持在 1 左右吗?

谢谢。

PS:在下面添加了总损失图,直到 66k 步。

PS2:经过 2 天的训练(并且仍在继续),这是下面的总损失图。

【问题讨论】:

    标签: python-3.x tensorflow tensorboard object-detection-api


    【解决方案1】:

    通常,人们使用一组单独的数据来衡量模型的误差和泛化能力。因此,您将拥有以下数据集来训练和评估模型:

    • 训练集:用于训练模型的数据。
    • 验证集:一组单独的数据,用于测量训练期间的错误。该集合的数据不用于执行任何权重更新。
    • 测试集:该集用于衡量模型训练后的表现。

    在您的情况下,您必须定义一组单独的数据,即验证集,并在固定数量的批次/步骤后重复运行评估并记录错误或准确性。通常发生的情况是,该数据的错误会在开始时减少,并在训练期间的某个时间点增加。因此,跟踪该错误并在该错误减少时生成检查点非常重要。验证数据上具有最低错误的检查点是您要使用的检查点。这种技术称为提前停止

    在训练过程中,在某个点之后误差增加的原因称为过拟合。它告诉您模型失去了泛化到看不见的数据的能力。

    编辑: 下面是一个带有提前停止过程的训练循环示例:

     for step in range(1, _MAX_ITER):
         if step % _TEST_ITER == 0:
             sample_count = 0
             while True:
                    try:
                        test_data = sess.run(test_batch)
                        test_loss, summary = self._model.loss(sess, test_data[0], self._assign_target(test_data), self._merged_summary)
                        sess.run(self._increment_loss_opt, feed_dict={self._current_loss_pl: test_loss})
                        sample_count += 1
                    except tf.errors.OutOfRangeError:
                        score = sess.run(self._avg_batch_loss, feed_dict={self._batch_count_pl: sample_count})
                        best_score =sess.run(self._best_loss)
                        if score < best_score:
                            '''
                            Save your model here...
                            '''
    

    【讨论】:

    • 感谢您的回答。如何重复评估?它不是一直运行并在完成时显示信息的东西吗?就像一旦开始就自行运行的培训?
    • 我已经相应地更新了我的答案。我所做的是使用 tensorboard 可视化训练和验证。一般来说,我的训练运行固定数量的批次或时期,并自动将最佳状态保存到磁盘。所以你可以随时访问状态。
    • 谢谢。我会试试这个。
    • 你不能简单地复制它。您必须自己定义计算图表。
    • 是的,我会调查的。谢谢
    猜你喜欢
    • 2017-10-12
    • 1970-01-01
    • 2012-08-16
    • 2015-08-03
    • 2020-08-24
    • 2011-05-05
    • 1970-01-01
    • 2021-05-02
    • 2017-07-28
    相关资源
    最近更新 更多