TensorFlow+FaceNet+GPU训练模型(超详细过程)(四、模型训练)

在所有的数据都处理完了之后,接下来就可以进行模型的训练了。

在Github上FaceNet项目的介绍中有softmax和论文中提到的三元损失训练triplet两种方式,这边简单的介绍下softmax的训练方法。

FaceNet已经将所有的方法都已经封装好,训练程序在src目录下的train_softmax.py文件中,在训练之前,我们首先要简单的修改下这份文件,让它适用于当前版本。

  1. 找到260行,搜索iteritems也可以
    for key, value in stat.iteritems():

     将iteritems修改为items,在python3中,dict已经没有iteritems方法了

  2. 找到308行,将
    if lr<=0:

    修改为

    if lr is None or lr <= 0:

    亲测在最后一轮训练的时候,学习率本来应该是变成-1,然后结束,但是出现了lr变成None的情况

  3. 这一点仅供GPU玩家修改,使用CPU的话就不用修改了,跳过这一点直接训练就好了,找到191行,将

    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))

    替换成

    config = tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False, allow_soft_placement=True)
        config.gpu_options.allow_growth = True
        sess = tf.Session(config=config)

     

模型训练 

这里在CPU:i7-6700H,显卡:GTX965M,CUDA:9.0,cuDNN:7.0.5的辣鸡笔记本中,采用WebFace数据集进行训练测试

输入运行参数

python src/train_softmax.py --logs_base_dir logs/facenet/ --models_base_dir models/facenet/ --data_dir datasets/CASIA-WebFace_train_182/ --image_size 160 --model_def models.inception_resnet_v1 --lfw_dir datasets/lfw_160/ --optimizer ADAM --learning_rate -1 --max_nrof_epochs 150 --keep_probability 0.8 --random_crop --random_flip --use_fixed_image_standardization --learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt --weight_decay 5e-4 --embedding_size 512 --lfw_distance_metric 1 --lfw_use_flipped_images --lfw_subtract_mean --validation_set_split_ratio 0.05 --validate_every_n_epochs 5 --prelogits_norm_loss_factor 5e-4

简单说下上述的参数,当然还有非常多其它未加入的,需要的可以自己去研究源码

非常的直观,其中

--logs_base_dir:是存放训练过程的目录

--models_base_dir:是存放训练结果模型的目录

--data_dir:是训练数据集的目录,可以根据需要自己更改

--model_def:是训练的神经网络方法,这里采用resnet

--lfw_dir:存放lfw数据集的位置,作用是在训练过程中对模型进行测试,可以不加,但是推荐!!!

--learning_rate:学习率的设置,学习率在训练过程中是非常重要的,设置的太大模型难以收敛,设置的太小模型容易过拟合,所有在训练过程中基本上会选择动态学习率的设置,就是下面要讲到的参数

--learning_rate_schedule_file:学习率时间计划表,我们来打开其中一个文件进行分析

TensorFlow+FaceNet+GPU训练模型(超详细过程)(四、模型训练)

这个是vggface2的训练示例,在epoch0-99轮的时候学习率设置为0.05,100-199轮设置为0.005,200到275轮设置为0.0005,通过这个方法决定模型训练的轮数和相应的学习率变化,可以手动进行修改自定义

在讲完了参数之后,我们开始进行训练,使用GPU进行训练的童鞋有可能遇到一个问题,如下

TensorFlow+FaceNet+GPU训练模型(超详细过程)(四、模型训练)

如果是类似的错误的话,恭喜你,你的显卡和我的一样辣鸡...

FaceNet项目默认一次喂入计算图90张照片,如果显卡的显存不够的话,就会报出OOM的错误,这个时候只需要减少一次的喂入量就行了,添加参数

--batch_size 50

TensorFlow+FaceNet+GPU训练模型(超详细过程)(四、模型训练)

训练一步0.8s,还算可以接受的时间,虽然我觉得喂入数量太少对模型并不是一个很好的选择,但是在CPU下亲测训练一步需要30s+,为了狗命着想,只能忍忍了

接着就是最关键的一点,动态显示训练过程

既然我们放入lfw数据集,那当然需要最大限度利用起来才行,打开一个新的终端,输入命令,定位到logs目录下

tensorboard --logdir=logs/facenet --port 6006

TensorFlow+FaceNet+GPU训练模型(超详细过程)(四、模型训练)

打开网页 

TensorFlow+FaceNet+GPU训练模型(超详细过程)(四、模型训练)

楼主训练了30个小时,最后模型正确率在98.8%左右,很可惜没有达到99%,也许加大batch的数量和增加训练轮数就可以了,不过就结果来说还是很不错的,毕竟训练成功了

同样,如果想要尝试大量数据的训练,完全okk,因为项目会自动保存最新的模型,假使一不小心训练中断了,同样可以加载之前训练的结果继续训练,在源码的参数中有说明

楼主下附训练的结果,大家可以直接运行logs文件拿去骗人,哈哈哈哈哈

链接:https://pan.baidu.com/s/1paZLBHF-hAqxHErXrQlQRw

提取码:e6v9

如果有童鞋发现在楼猪这么详细的教程下依然训练失败的话,可以添加楼猪的Wechat:hzh980807,让楼猪帮你配置环境,当然,不是免费的(^_^)

TensorFlow+FaceNet+GPU训练模型(超详细过程)(四、模型训练)TensorFlow+FaceNet+GPU训练模型(超详细过程)(四、模型训练) 傻傻的小狗子 发布了117 篇原创文章 · 获赞 13 · 访问量 6332 私信 关注
上一篇:文章按给定权重、生成时间综合排序


下一篇:音乐分类