facenet训练后模型使用tensorflow量化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了facenet训练后模型使用tensorflow量化相关的知识,希望对你有一定的参考价值。
参考技术A 1、使用facenent/src/freeze_graph.py将ckpt模型文件转化为pb模型文件,需要注意的是,需要在这里面添加模型名称及scope,如下图所示,转化ResNeXt模型是需要添加ResNeXt:
2、使用bazel搭建tensorflow的quzntization工具,如下面命令所示;
$ cd ~/tensorflow/ (tensorflow的源码路径)
$ bazel build tensorflow/tools/quantization:quantize_graph
3、量化前需要修改/tensorflow/tensorflow/python/framework/graph_util_impl.py,由于“Identity”的原因有些层无法量化,使量化后的模型无法使用,需做如下图的修改:
3.1、if node.name == "input": \n continue解决了由于“Identity”不将input层量化的错误;
3.2、re.match(r".*/cond.*", input_name)能够结果下面的错误:
ValueError: graph_def is invalid at node 'InceptionResnetV1/Conv2d_1a_3x3/BatchNorm/cond/AssignMovingAvg/decay': More inputs specified ('InceptionResnetV1/Conv2d_1a_3x3/BatchNorm/cond/Switch:1') than the op expects.
4、量化指令:
bazel-bin/tensorflow/tools/quantization/quantize_graph \
--input=/tmp/classify_image_graph_def.pb \
--output_node_names="embeddings" \
--output=/tmp/quantized_graph.pb \
--mode=eightbit
参考文献:https://zhuanlan.zhihu.com/p/25323688
https://www.tensorflow.org/performance/quantization
TensorFlow基础 —— 模型的保存读取与可视化方法总结
TensorFlow提供了一个用于保存模型的工具以及一个可视化方案
这里使用的TensorFlow为1.3.0版本
保存模型数据
- 模型数据以文件的形式保存到本地;
- 使用神经网络模型进行大数据量和复杂模型训练时,训练时间可能会持续增加,此时为避免训练过程出现不可逆的影响,并验证训练效果,可以考虑分段进行,将训练数据模型保存,然后在继续训练时重新读取;
- 此外,模型训练完毕,获取一个性能良好的模型后,可以保存以备重复利用;
模型保存形式如下:
保存模型数据的基本方法:
save_dir = ‘model/graph.ckpt‘
saver = tf.train.Saver()
sess = tf.Session()
#保存模型
saver.save(sess, save_dir)
#读取模型
saver.restore(sess, save_dir)
可以在训练进行之后保存模型saver.save(sess, save_dir) ,
已训练的模型可以在此次训练或预测前读取saver.restore(sess, save_dir),
训练过程可视化方法
TensorFlow提供了一个Tensorboard工具进行可视化,此工具可以将训练过程中输出的数据使用Web浏览器输出显示;
保存的数据文件如下:
保存训练数据的基本方法
TensorFlow可以保存与显示的数据形式:
- 标量Scalars
- 图片Images
- 音频Audio
- 计算图Graph
- 数据分布Distribution
- 直方图Histograms
- 嵌入向量Embeddings
Scalars是常用的可视化数据,如loss值,这里为一个浮点数,在构建TensorFlow数据图时,使用tf.summary.scalar()定义summary节点,数据图执行后,此数据将被输出到文件;
tf.summary.scalar(‘mean‘, tf.reduce_mean(var))
tf.summary.scalar(‘max‘, tf.reduce_max(var))
tf.summary.scalar(‘min‘, tf.reduce_min(var))
loss = tf.reduce_mean(tf.reduce_sum(tf.square((ylabel - yout)),reduction_indices = [1]))
tf.summary.scalar(‘loss‘, loss)
同样输出为直方图
hidel1 = tf.matmul(inputData,Weights) + basis
tf.summary.histogram(‘HiddenLayer1‘, hidel1)
在定义好如上节点后,需要进行合并以便运行这些的summary节点,之后使用方法tf.summary.FileWriter()将数据输出
log_dir = ‘tblog/‘
merged_summary_op = tf.summary.merge_all()
summary_writer = tf.summary.FileWriter(log_dir, sess.graph)
最后在运行过程中获取数据并输出,可以每隔几次迭代输出一次数据
epochs = 10000 #训练次数
for i in range(epochs):
sess.run(train)
if i % 1000 == 0:
print(sess.run(loss))
summary_str = sess.run(merged_summary_op)
summary_writer.add_summary(summary_str, i) #输出一次数据
启动Tensorboard
训练过程中会输出数据文件,此时可以实时的显示可视化结果,也可以训练结束后查看可视化结果;
Tensorboard需要手动启动,在Windows或Linux环境中的启动命令:
tensorboard --logdir=
如:tensorboard --logdir=F:\\tblog
注:Windows下需要在数据文件的根目录执行此命令;
本机为Windows环境:
在浏览器中输入地址http://DESKTOP-6INT0GT:6006,为了保证兼容性,最好使用Chrome进行可视化;
结果:
同样可以查看数据图的可视化结构
以上是关于facenet训练后模型使用tensorflow量化的主要内容,如果未能解决你的问题,请参考以下文章
将 Facenet 模型 .pb 文件转换为 TFLITE 格式时出错
tensorflow 保存好训练的模型,restore 后验证集的正确率很低
TensorFlow人脸识别OpenFaceFace-recognitionInsightface和FaceNet源码运行