基于Tensorflow的迁移学习应用 kaggle dog breed identification构建新图片分类器
本文所用数据来源于https://www.kaggle.com/c/dog-breed-identification, 将基于google tensorflow中的预训练的mobilenet模型和inception v3模型,对新dataset中10200张不同狗品种照片训练新的图片分类。
Why transfer learning here?
- 一个好的图片分类器,从scratch开始搭建,不仅构建cnn archtiecture会花费大量的时间精力,而且为了分类器的精准度,也需要大量的图片作为training data。
- 而实际应用中,针对不用需要而构建的分类器,通常只有小量的数据集,从scratch开始训练一个巨大的拥有百万甚至更多的parameters的cnn分类器很容导致过拟合,而使训练出的分类器在general set上表现不佳。
- 我们将使用的经过预训练的mobilenet模型和inception v3模型,是google基于 ImageNet , 一个计算机视觉系统识别项目,目前世界上图像识别最大的数据库,其包含了分成了数千个类型、数百万张有标注的图像, 训练出的两个分类器模型,其Top-1 accuracy 分别达到78.0%和70.7%,inception v3会有更好的accuray,而mobilenet因为其轻量,训练速度更快。
- 针对与原数据库相似但size较小的数据集,使用transfer learning,将已根据
基于MobileNet的新分类器搭建
准备阶段,get code
|
|
准备阶段,get dataset
https://www.kaggle.com/c/dog-breed-identification, 下载training dataset, labels.csv和test dataset,
预处理数据集
我们直接下载得到的训练数据集中,只有所有的图片在同一个数据集,我们需要整理成模型需要的格式,即在同一个directory下,将每个label建一个subdirectory,将所有对应的图片放入当前subdirectory下,参考code可见:
配置MobileNet
|
|
注意这里:
IMAGE_SIZE, 即image resolution配置的参数:128,160,192, or 224px。当然越高的resolution可以带来更高的accuray,同时也需要更多的训练时间。
相对模型size占最大largest MobileNet的比例: 1.0, 0.75, 0.50, or 0.25. 同样,所占比例越大,accuracy越高,也需要更多的训练时间。
在这个任务中,我们希望获得更可能高的accuray,所以采取以上配置。
用tensorboard监控训练过程
|
|
在后台启用tensorboard,tensorboard可以用来监控训练过程,帮助我们更好判断是否过拟合等。
训练完成后,可以在浏览器输入
or http://0.0.0.0:6006即可看到tensorboard为我们绘画的各种训练过程图像。
训练模型
|
|
注意:
在这里,把我们之前预处理过的数据集,让在tf_files directory下。
optionally,我们可以添加更多的训练参数,详情可以参考
1234python -m scripts.retrain -h我加入了以下的参数--training_rate=0.001 \--train_batch_size=64 \
调参
调节training steps, training rate, train batch size等等。
预测
对于单个图片,可以用source code中的label_image.py
|
|
而针对这个狗品种分类器的任务,我们把从kaggle上下载的test dataset也放入tf_files directory下,修改了一下source中的label_image.py,增加新的文件generate_result.py, 对每个文件依次调用label_image.py,code可见
https://github.com/LauraBowenHe/dog-breed-identification/tree/master/MobileNet
|
|
这一步预测时间会比较长,大概7-8小时,生成的文件会存在/tensorflow-poets-2/output/下,我们在训练前可先手动创建这个文件夹。
基于inception v3的新分类器搭建
inception v3的搭建和mobilenet很相似,只有在get code时有所不同。
准备阶段,get code
|
|
准备阶段, get dataset和预处理数据集
参考以上
训练模型
retrain的代码在/examples/image_retraining,我们可以直接用刚刚mobilenet模型中,/tensorflow-for-poet-2/tf_files,因为我们之前已经有把数据集都放在那里了,当然即使没有也没关系,新建一个tf_files就行
|
|
python -m retrain.py -h 可以查阅可以添加的参数
附一张训练结束的图,可见当前分类器的validation accuracy是90.3%。
调参
调节training steps, training rate, train batch size等等。
预测
因为我们已将生成的模型放入tf_files。我们把从kaggle上下载的test dataset也放入tf_files directory下,创建了一份label_image_inceptionV3.py,增加新的文件generate_result_inceptionV3.py, 对每个文件依次调用label_image_inceptionV3.py,code可见
|
|
这一步预测时间会比较长,比MobileNet所用的时间更长,大概在十四个小时,生成的文件会存在/tensorflow-poets-2/output/下,我们在训练前可先手动创建这个文件夹。
Reference
http://cs231n.github.io/transfer-learning/
https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0
https://www.ouyangsong.com/2017/05/20/image-classification-retrained-based-on-inceptionv3/