我正在按照Dat Trans示例使用 TensorFlow 的对象检测器 API 训练我自己的对象检测器。
我成功开始训练自定义对象。我正在使用 CPU 来训练模型,但完成 100 个训练步骤大约需要 3 小时。我想我必须更改一些参数.config
。
我尝试转换.ckpt
为.pb
,我参考了这篇文章,但我仍然无法转换
1)如何减少训练步数?
2)有没有办法转换.ckpt
为.pb
.
我不认为你可以减少训练步骤的数量,但你可以在任何检查点(ckpt
)停止,然后将其转换为.pb
文件
从你可以使用的 TensorFlow 模型 git 存储库,export_inference_graph.py
和以下代码
python tensorflow_models/object_detection/export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path architecture_used_while_training.config \
--trained path_to_saved_ckpt/model.ckpt-NUMBER \
--output_directory model/
其中NUMBER
是指您最近保存的检查点文件编号,但是如果您在 tensorboard 中发现它更好,则可以使用较旧的检查点文件
1)恐怕没有有效的方法来“减少”训练步骤。使用更大的批量大小可能会导致“更快”的训练(例如,以更少的步数达到高精度),但每一步都需要更长的计算时间,因为你是在 CPU 上运行的。使用输入图像分辨率可能会加快速度,但会降低精度。你真的应该考虑转移到一台有 GPU 的机器上。
2)默认情况下.pb
,文件(及其相应的文本版本.pbtxt
)仅包含图形的定义。如果你冻结你的图表,你需要一个检查点,获取图表中定义的所有变量,将它们转换为常量,并为它们分配存储在检查点中的值。您通常这样做是为了将经过训练的模型发送给将要使用它的任何人,但这在训练阶段是没有用的。
是的,.config 文件中有一个参数,您可以根据需要减少步骤数。num_steps:在 .config 文件中,实际上是训练中的时期数。
但请记住,不建议减少太多。因为如果减少太多,您的损失函数不会减少太多,这会给您带来不好的输出。
因此,请继续查看损失函数,一旦它低于 1 ,您就可以开始单独测试您的模型,并且您的训练将会进行。
我强烈建议找到一种方法来加快每个训练步骤的运行时间,而不是减少训练步骤的数量。最好的方法是使用 GPU。如果你不能这样做,你可以考虑降低图像分辨率或使用更轻的网络。
要转换为冻结推理图(.pb 文件),请参阅此处的文档: https ://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/exporting_models.md
1. 是的,有一种方法可以改变训练步骤的数量:
尝试这个,
python model_main_tf2.py --pipeline_config_path="config_path_here" --num_train_steps=5000 --model_dir="model_dir_here" --alsologtostderr
这里我将训练步数设置为 5000
2. 是的,有一种方法可以将检查点转换为 .pb:
尝试这个,
python exporter_main_v2.py --trained_checkpoint_dir="checkpoint_dir_here" --pipeline_config_path="config_path_here" --output_directory "output_dir_here"
这将创建一个目录,其中将保存检查点和 .pb 文件。