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可以保存与显示的数据形式:

  1. 标量Scalars
  2. 图片Images
  3. 音频Audio
  4. 计算图Graph
  5. 数据分布Distribution
  6. 直方图Histograms
  7. 嵌入向量Embeddings

Scalars是常用的可视化数据,如loss值,这里为一个浮点数,在构建TensorFlow数据图时,使用tf.summary.scalar()定义summary节点,数据图执行后,此数据将被输出到文件;

  with tf.name_scope(‘var‘):
  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量化的主要内容,如果未能解决你的问题,请参考以下文章

训练后使用量化权重进行 keras 模型评估

将 Facenet 模型 .pb 文件转换为 TFLITE 格式时出错

转载:tensorflow保存训练后的模型

openface 训练数据集

tensorflow 保存好训练的模型,restore 后验证集的正确率很低

TensorFlow人脸识别OpenFaceFace-recognitionInsightface和FaceNet源码运行