在训练神经网络进行对象分类/检测时,我们如何知道模型收敛?

时间:2018-10-01 11:41:10

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

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

我关注了senddex的以下系列文章:

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

系统信息:

OS-Ubuntu 18.04 LTS

GPU-Nvidia 940M(VRAM:2GB)

Tensorflow:1.10

Python-3.6

CPU-英特尔i5

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

$tensorboard --logdit="training"

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

我还尝试如下运行 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 /文件夹中仅创建一个评估点。为什么?

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

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

谢谢。

PS:添加了总损耗图,直到66k步。

enter image description here

PS2:经过2天的训练(仍在进行),这是下面的总损失图。

enter image description here

1 个答案:

答案 0 :(得分:2)

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

  • 训练集::用于训练模型的数据。
  • 验证集::一组单独的数据,将用于测量训练期间的错误。此集合的数据不用于执行任何重量更新。
  • 测试集::该集用于评估训练后模型的性能。

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

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

编辑: 这是一个包含早期停止过程的训练循环的示例:

 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...
                        '''