首页 文章

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

提问于
浏览
2

我正在使用Tensorflow的Object Detection API来检测汽车 . 它应该将汽车检测为一类“汽车” .

我跟着senddex的以下系列:

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

系统信息:

操作系统 - Ubuntu 18.04 LTS

GPU - Nvidia 940M(VRAM:2GB)

Tensorflow:1.10

Python - 3.6

CPU - Intel i5

问题:培训过程非常精细 . 为了知道模型何时收敛以及何时应该停止训练,我在运行训练的终端中观察 loss during the training per step 并通过在另一个终端中运行以下命令来观察 also observe the Total Loss graph in 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内存无法运行此脚本 along with train.py .

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

另外,我如何理解Tensorboard中的Precision图表需要停止培训?

我也可以发布截图,如果有人想要的话 . 我应该继续训练,直到损失平均在1左右?

谢谢 .

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

enter image description here

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

enter image description here

1 回答

  • 1

    通常,使用一组单独的数据来测量模型的误差和泛化能力 . 因此,可以使用以下数据集来训练和评估模型:

    • Training set: 用于训练模型的数据 .

    • Validation set: 一组单独的数据,用于衡量培训期间的错误 . 该组的数据不用于执行任何重量更新 .

    • Test set: 此组用于在训练后测量模型的性能 .

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

    在训练期间某个点之后错误增加的原因称为 Overfitting . 它告诉你,模型失去了它能够推广到看不见的数据的能力 .

    Edit: 以下是早期停止程序的训练循环示例:

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

相关问题