Tensorflow学习9-5:谷歌inception-v3模型之fine-tune slim alexnet

进行 fine-tune 操作需要微调训练所有层,所以迭代训练次数比较多。

1 数据准备

准备好tfrecord格式的图片数据文件,和labels.txt。可以参考上篇。

2 定义新的dataset文件

首先,在dataset/目录下新建一个文件夹 satellite.py,并将flowers.py文件夹中的内容复制到 satellite.py 中,接下来需要修改以下几处内容。

第一处修改,

第二处修改修改为image/format部分

1
'image/format': tf.FixedLenFeature((), tf.string, default_value='jpg'),

修改完 satellite.py后,还需要在同目录的dataset_factory.py文件夹中注册satellite数据库。红色框内为新增加的satellite数据

3 下载训练好的inception-v3模型

http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz 下载并解压后,会得到一个inception_v3.ckpt 文件

4 开始训练

在slim文件夹下运行下面脚本开始训练:
(★注意:如果softmax报错,修改文件D:\Anaconda3\Lib\site-packages\tensorflow\python\framework\ops.py第3385行,在函数 create_op() 内新增一行with tf.device('/cpu:0'):



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
python train_image_classifier.py ^
--train_dir=model2 :训练好的模型存放目录 ^
--dataset_name=satellite :用于读取tfrecord数据集的python文件 ^
--dataset_split_name=train :这里使用切分的训练集 ^
--dataset_dir=images2 :tfrecord文件目录 ^
--batch_size=5 :GPU内存小的建议不要改大,否则报错 ^
--max_number_of_steps=1000 :训练次数 ^
--model_name=inception_v3 :训练模型 ^
--checkpoint_path=D:/Tensorflow/models/inception2016/inception_v3.ckpt :fine-tune专用^
--checkpoint_exclude_scopes=InceptionV3/Logits,InceptionV3/AuxLogits :fine-tune专用^
--trainable_scopes=InceptionV3/Logits,InceptionV3/AuxLogits :fine-tune专用^
--learning_rate=0.001 ^
--learning_rate_decay_type=fixed ^
--save_interval_secs=300 ^
--save_summaries_secs=2 ^
--log_every_n_steps=10 ^
--optimizer=rmsprop ^
--weight_decay=0.00004 ^
--clone_on_cpu=false :可以设置为true指定CPU执行
pause

如图,一般训练10000步左右可以达到准确率要求,ctrl+c 停止脚本程序

5 验证模型准确率

可以用eval_image_classifier.py程序进行验证,在slim文件夹下运行以下脚本

1
2
3
4
5
6
7
8
python test_image_classifier.py ^
--checkpoint_path=model2 ^
--eval_dir=validation_result ^
--dataset_name=satellite ^
--dataset_split_name=validation ^
--dataset_dir=images2 ^
--model_name=inception_v3
pause

得到训练后模型的accuracy结果:

6 导出模型,并对单张图片进行识别

STEP 1:导出网络结构

在slim文件夹下运行以下脚本

1
2
3
4
5
6
python export_inference_graph.py ^
--alsologtostderr ^
--model_name=inception_v3 ^
--output_file=model2/inception_v3_inf_graph.pb ^
--dataset_name=satellite
pause

这个命令会在 model2 文件夹下生成一个inception_v3_inf_graph.pb文件。(注:inception_v3_inf_graph.pb文件夹只保存了inception_v3的网络结构并不包含训练得到的模型。

STEP 2:生成完整的 .pd 模型文件

运行下面脚本,将checkpoint中的模型参数保存进来,转换成完整的模型文件。(需将8100改成model文件夹中保存的实际的模型训练步数)

1
2
3
4
5
6
7
python freeze_graph.py ^
--input_graph=model2/inception_v3_inf_graph.pb ^
--input_checkpoint=model2/model.ckpt-8100 ^
--input_binary=true ^
--output_node_names=InceptionV3/Predictions/Reshape_1 ^
--output_graph=model2/frozen_graph.pb
pause

STEP 3:运行导出模型分类单张图片

运行下面脚本

1
2
3
4
5
python test_image_classifier.py ^
--model_path model2/frozen_graph.pb ^
--label_path images2/labels.txt ^
--image_file test_images/water.jpg
pause

分类结果如下:


总结:
脚本的运行顺序如图编号所示

꧁༺The༒End༻꧂