我正在使用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步 .
PS2:经过2天的训练(现在仍在),这是下面的总损失图 .
1 回答
通常,使用一组单独的数据来测量模型的误差和泛化能力 . 因此,可以使用以下数据集来训练和评估模型:
Training set: 用于训练模型的数据 .
Validation set: 一组单独的数据,用于衡量培训期间的错误 . 该组的数据不用于执行任何重量更新 .
Test set: 此组用于在训练后测量模型的性能 .
在您的情况下,您必须定义一组单独的数据 validation set 并在固定数量的批次/步骤之后重复运行评估并记录错误或准确性 . 通常发生的是,该数据的错误在开始时会减少,在训练期间会在某个时刻增加 . 因此,跟踪该错误并在此错误减少时生成检查点非常重要 . 验证数据上具有最低错误的检查点是您要使用的检查点 . 这种技术称为 Early Stopping .
在训练期间某个点之后错误增加的原因称为 Overfitting . 它告诉你,模型失去了它能够推广到看不见的数据的能力 .
Edit: 以下是早期停止程序的训练循环示例: