SSD-Tensorflow 学习三:在自己的数据集上微调(优化)

踩了很多坑,花费了好久好久,内心的崩溃程度,还是自己太菜。

在所有的准备工作都down了之后,接下来就需要使用模型在自己的数据集上进行训练。SSD-Tensorflow 官网上给出的建议是:可以先在imageNet预训练的模型的基础上利用自己的数据集对网络模型进行微调,即固定骨干网络参数,对附加网络结构进行训练,当模型收敛达到0.5mAP的时候,再对所有参数进行微调。

预训练模型:models

https://github.com/tensorflow/models/tree/master/research/slim

1。从vgg开始训练其中某些层的参数

通过加载预训练好的vgg16模型进行参数初始化

通过checkpoint_exclude_scopes指定哪些层的参数不需要从vgg16模型中加载

通过trainable_scopes指定哪些层的参数需要训练,则未指定的参数保持不变。如果注释掉的话,则是对所有参数进行训练。

DATASET_DIR=./tfrecords
TRAIN_DIR=./log/
CHECKPOINT_PATH=./checkpoints/vgg_16.ckpt
python train_ssd_network.py \
    --train_dir=${TRAIN_DIR} \             #训练生成模型的存放路径
    --dataset_dir=${DATASET_DIR} \         #数据存放路径
    --dataset_name=pascalvoc_2007 \        #数据名的前缀
    --dataset_split_name=train \
    --model_name=ssd_300_vgg \             #加载的模型的名字
    --checkpoint_path=${CHECKPOINT_PATH} \ #所加载模型的路径
    --checkpoint_model_scope=vgg_16 \      #所加载模型的作用域名
    --checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
    --trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
    --save_summaries_secs=60 \       #每60s保存一次日志
    --save_interval_secs=600 \       #每600s保存一次模型
    --weight_decay=0.0005 \          #正则化权值衰减系数
    --optimizer=adam \               #选取的最优化函数
    --learning_rate=0.001 \          #学习率
    --learning_rate_decay_factor=0.94 \   #学习率衰减因子
    --batch_size=32 \
    --gpu_memory_fraction=0.9        #指定占用gpu内存的百分比

https://blog.csdn.net/liuyan20062010/article/details/78905517

2。可视化log

可使用tensorboard,可视化训练时的loss或其他指标。

tensorboard --logdir=${TRAIN_DIR}

tensorboard --logdir=/home/whut/yyCode/SSD-Tensorflow/log_finetune

在浏览器输入:http://localhost:6006

SSD-Tensorflow 学习三:在自己的数据集上微调(优化)_第1张图片

SSD-Tensorflow 学习三:在自己的数据集上微调(优化)_第2张图片

特别注意:

1)训练完之后,在TRAIN_DIR路径下会产生四种文件,在做模型测试的时候需要将训练得到的整个文件夹作为自己训练得到的模型作为CHECKPOINT_PATH输入。

2)自行创建文件保存训练过程中的中间结果:

#创建保存文件nohup,并启动训练
nohup sh finetune.sh &
#查看训练日志
tailf nohup.out

3)GPU训练 or CPU 训练

 在训练模型之前,打开SSD-Tensorflow/train_ssd_network.py找到里面的DATA_FORMAT参数项(27行),如果是使用cpu训练则值为NHWC,如果是使用gpu训练则值为NCHW,如下:

DATA_FORMAT = 'NCHW'  #gpu训练
DATA_FORMAT = 'NHWC'  #cpu训练

4)参数设置技巧

根据电脑性能情况,设置batch_size,值越大表示批量处理的数量越大,对机器性能的要求越高。如果电脑性能普通的,则可以设置为8,甚至4,土豪请忽略。
学习率learning_rate也可以根据实际情况调整,学习率越小则越精确,训练的时间也越长,学习率越大则可缩短训练时间,但会降低精准度。

 

参考文献:

https://blog.csdn.net/yexiaogu1104/article/details/77416020/

ssd-tensorflow:跑视频

https://blog.csdn.net/w5688414/article/details/78395177

ssd-tensorflow:训练及测试、模型固化、模型导出、模型量化和模型裁剪

https://blog.csdn.net/yexiaogu1104/article/details/77416020/

 

https://blog.csdn.net/Echo_Harrington/article/details/81131441

代码详解:

https://blog.csdn.net/k87974/article/details/80606407

你可能感兴趣的:(SSD-Tensorflow 学习三:在自己的数据集上微调(优化))