1.下载Inception V3模型
Download-Link 在tensorflow官网中可以直接下载,下载完压缩包以后解压,注意不要删除这个压缩包,后面可能会用到,然后在同目录下创建一个log文件夹,这些步骤可以手动完成,也可以用下面的python语句执行。
# coding: utf-8
import tensorflow as tf
import os
import tarfile
import requests
#inception模型下载地址
inception_pretrain_model_url = 'http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz'
#模型存放地址
inception_pretrain_model_dir = "inception_model"
if not os.path.exists(inception_pretrain_model_dir):
os.makedirs(inception_pretrain_model_dir)
#获取地址中文件名
filename = inception_pretrain_model_url.split('/')[-1]
#构建模型下载地址
filepath = os.path.join(inception_pretrain_model_dir, filename)
#下开始下载载模型
if not os.path.exists(filepath):
print("download: ", filename)
r = requests.get(inception_pretrain_model_url, stream=True)
with open(filepath, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
print("finish: ", filename)
#解压文件
tarfile.open(filepath, 'r:gz').extractall(inception_pretrain_model_dir)
#创建一个log文件夹 保存日志
log_dir = 'inception_log'
if not os.path.exists(log_dir):
os.makedirs(log_dir)
运行结束以后,应该有两个文件夹分别为model和log,其中model下的
classify_image_graph_def.pb 文件就是下载好的模型。
为了方便理解,这里多说两句,下载的这个模型其实可以看做是google已经花大量时间用大量数据训练好的参数,可以让我们拿来直接用,在这个基础上进行自己的训练,得到自己的图片分类器。这个其实就是一个迁移学习的过程。
我们可以看一下inception V3的图结构:
#获取到这个模型
inception_graph_def_file = os.path.join(inception_pretrain_model_dir, 'classify_image_graph_def.pb')
with tf.Session() as sess:
#创建一个图来存放google训练好的模型
with tf.gfile.FastGFile(inception_graph_def_file, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name='')
#保存图的结构
writer = tf.summary.FileWriter(log_dir, sess.graph)
writer.close()
运行结束以后就可以通过tensorboard查看图结构,在命令行输入
tensorboard --logdir=path to inception_log
这里看不清,大概是这个结构,有个直观印象吧,总之是个较大的网络,我们需要关注的是在顶端部分
进行retrain的时候,需要在第三个池化层后面加入新的节点,不再让它通过原本的softmax进行输出,这里的softmax是为1000个类别的分类器。在训练自己的分类器的过程中,使用自定义的数据集,经过原本inceptionV3的所有节点(除最后一个softmax)得到的结果称之为bottleneck,瓶颈,这些计算得到的结果就是训练自己模型的输出。
那么这些直接使用图片作为输入和使用经过计算结果作为输入的区别在哪呢?
前者的图片可以理解为是生肉,难消化,数据特征不明显,没有经过处理计算,后者可以理解为是熟肉,更好笑话,经过计算以后数据特征更加明显,我们可以使用很少的迭代次数,较短的训练时间就能获得可观的训练结果。
回到上面所说的瓶颈这个概念,如果将整个模型抽象的看做一个花瓶,那么自己训练的这个过程就是插花的过程。我觉得bottleneck的提出真的很微妙,这个词就能更好的理解这个过程。自定义的数据集经过模型的计算,这个过程其实可以理解为前馈神经网络的向前传播,得到的结果只作为自己训练的输入值。如果觉得这部分不好理解,可以先了解一下迁移学习的基本概念。
2.如何使用Inception V3
在说retrain之前,先说说怎么直接使用下载好的模型作为分类器,要知道这个分类器可以识别1000种东西,可用性还是很强的。
# coding: utf-8
# inception 有1000个分类
import tensorflow as tf
import os
import numpy as np