内容简介:深度学习的应用主要包括两个部分,一是通过深度学习框架训练出模型,二是利用训练出来的模型进行预测。开发者基于不同的深度学习框架能够得到不同的训练模型,如果想要基于一种框架进行预测,就必须要解决不同框架的模型之间的匹配问题。基于这种考虑,也为了帮助用户快速从其他框架迁移,PaddlePaddle开源了模型转换工具X2Paddle。它可以将TensorFlow、Caffe 的模型转换为PaddlePaddle的核心框架Paddle Fluid可加载的格式。同时X2Paddle还支持ONNX格式的模型转换,这样也相
本文转载自百度PaddlePaddle
深度学习的应用主要包括两个部分,一是通过深度学习框架训练出模型,二是利用训练出来的模型进行预测。
开发者基于不同的深度学习框架能够得到不同的训练模型,如果想要基于一种框架进行预测,就必须要解决不同框架的模型之间的匹配问题。基于这种考虑,也为了帮助用户快速从其他框架迁移,PaddlePaddle开源了模型转换工具X2Paddle。
它可以将TensorFlow、Caffe 的模型转换为PaddlePaddle的核心框架Paddle Fluid可加载的格式。同时X2Paddle还支持ONNX格式的模型转换,这样也相当于支持了众多可以转换为ONNX格式的框架,比如PyTorch、MXNet、CNTK等。
项目地址:
https://github.com/PaddlePaddle/X2Paddle
项目概览
X2Paddle最新发布的V0.3版本,包括tensorflow2fluid,caffe2fluid和onnx2fluid。对于TesorFlow和Caffe,我们还提供了它们与Paddle Fluid的常用API对比文档。通过这些文档可以清楚查看这几个框架在API设计上的异同,方便用户快速熟悉PaddlePaddle的接口使用。
caff2fluid
1、支持VGG, ResNet, AlexNet等图像分类模型的转换
2、提供Caffe-PaddlePaddle常用API的对比文档,地址:https://github.com/PaddlePaddle/X2Paddle/tree/master/caffe2fluid/doc
tensorflow2fluid
1、支持VGG, ResNet, NASNet, YOLO-V3, UNet等图像分类,检测和分割模型的转换
2、提供TensorFlow-PaddlePaddle常用API的对比文档,地址:
https://github.com/PaddlePaddle/X2Paddle/tree/master/tensorflow2fluid/doc
onnx2fluid
1、支持VGG,ResNet,Inception, YOLO-V2, UNet等图像分类,检测和分割模型的转换;
2、部分框架,如PyTorch支持导出为ONNX模型,因此也可通过onnx2fluid支持相应框架下模型转换至PaddlePaddle
接下来我们将以 tensorflow2fluid 转换 VGG_16 模型为例,介绍其使用方法。
VGG_16是CV领域的一个经典模型,本文档以tensorflow/models下的VGG_16为例,展示如何将TensorFlow训练好的模型转换为PaddlePaddle模型。
模型转换实战
1.环境准备
模型转换和测试的环境依赖TensorFlow和PaddlePaddle,通过如下方式安装相应依赖(CPU或GPU版本)
CPU版本
pip install tensorflow==1.13.1 pip install paddlepaddle==1.4.0
GPU版本
pip install tensorflow-gpu==1.13.1 pip install paddlepaddle-gpu==1.4.1.post97
git clone https://github.com/PaddlePaddle/X2Paddle.git cd X2Paddle/tensorflow2fluid
2.下载预训练模型
wget http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz tar xzvf vgg_16_2016_08_28.tar.gz
3.保存模型为checkpoint格式
下载的模型vgg_16.ckpt仅保存了模型参数,需加载模型,并通过tf.train.Saver重新将模型保存成tensorflow2fluid支持的格式
import tensorflow.contrib.slim as slim
from tensorflow.contrib.slim.nets import vgg
import tensorflow as tf
import numpy
with tf.Session() as sess:
inputs = tf.placeholder(dtype=tf.float32,
shape=[None, 224, 224, 3],
name='inputs')
with slim.arg_scope(vgg.vgg_arg_scope()):
logits, endpoint = vgg.vgg_16(inputs,
num_classes=1000,
is_training=False)
# 加载模型
load_model = slim.assign_from_checkpoint_fn(
"vgg_16.ckpt",
slim.get_model_variables("vgg_16"))
load_model(sess)
# 测试样例数据
numpy.random.seed(13)
data = numpy.random.rand(5, 224, 224, 3)
output_tensor = sess.graph.get_tensor_by_name(
"vgg_16/fc8/squeezed:0")
result = sess.run([output_tensor], {inputs:data})
numpy.save("tf_result.npy", numpy.array(result))
# 保存为tensorflow2fluid支持的模型格式
saver = tf.train.Saver()
saver.save(sess, "./checkpoint/model")
4.将模型转换为PaddlePaddle模型
模型转换时,需要指定输入tensor的name和shape, batch维以None表示, 同时还要指定输出tensor的name。转换过程中,会根据输入和输出的tensor对计算图进行裁剪,仅转换输入与输出之间的子图。
python tf2fluid/convert.py --meta_file checkpoint/model.meta \
--ckpt_dir checkpoint \
--in_nodes inputs \
--input_shape None,224,224,3 \
--output_nodes vgg_16/fc8/squeezed \
--use_cuda False \
--input_format NHWC \
--save_dir paddle_model
注意:由于在转换过程中,涉及到部分TensorFlow模型中的参数实时infer,因此通过use_cuda参数可设置infer时是否使用GPU
转换后的模型目录中的各文件含义如下表所示,
| 文件 | 作用 |
| mymodel.py | 基于PaddlePaddle实现的模型网络结构 python 代码 |
| ref_name.info | my_model.py中各tensor与原TensorFlow模型中的tensor对应关系 |
| const_*/params_* | 转换后的模型参数文件 |
| save_var.list | 模型载入过程中的变量list |
5.加载转换后的PaddlePaddle模型,并进行预测
tensorflow2fluid在tf2fluid/model_loader.py中封装了模型加载方法,可通过如下示例代码加载模型,并进行预测。
import tf2fluid.model_loader as ml
import numpy
model = ml.ModelLoader("paddle_model", use_cuda=False)
numpy.random.seed(13)
data = numpy.random.rand(5, 224, 224, 3).astype("float32")
# NHWC -> NCHW
data = numpy.transpose(data, (0, 3, 1, 2))
results = model.inference(feed_dict={model.inputs[0]:data})
numpy.save("pd_result.npy", numpy.array(results))
可通过调用save_inference_model,将模型结构和模型参数均序列化保存,如下代码所示
model.save_inference_model("new_model_dir")
序列化后的模型加载方式可参考PaddlePaddle官网文档说明:
http://www.paddlepaddle.org/documentation/docs/zh/1.4/api_guides/low_level/inference.html#id4
6.对比转换前后模型之前的预测结果差异
在上文的代码中,我们均通过固定随机数据方式,在TensorFlow和PaddlePaddle模型中输入了相同的样例数据,并将结果保存至tf_result.npy和pd_result.npy中,通过对比两个结果的差异,判断模型的转换是否符合需求。
如下代码对比的仅为输入一个样例数据后的差异对比,实际应用场景中,建议用户根据需求定义自己的测试数据进行更严谨的对比测试。
import numpy
paddle_result = numpy.load("pd_result.npy")
tensorflow_result = numpy.load("tf_result.npy")
diff = numpy.fabs(paddle_result - tensorflow_result)
print(numpy.max(diff))
输出: 1.1920929e-06
X2Paddle以用户的需求为导向,对于用户而言不仅可以方便模型的迁移,同时提供的相应API对比文档也可帮助用户通过现有框架的使用经验快速上手PaddlePaddle的使用。目前X2Paddle已经支持了众多的CV领域的经典模型,有需求的小伙伴们赶紧试用起来吧!
— 完 —
小程序|get更多AI学习干货
加入社群
量子位AI社群开始招募啦,量子位社群分:AI讨论群、AI+行业群、AI技术群;
欢迎对AI感兴趣的同学,在量子位公众号(QbitAI)对话界面回复关键字“微信群”,获取入群方式。(技术群与AI+行业群需经过审核,审核较严,敬请谅解)
量子位 QbitAI · 头条号签约作者
վ'ᴗ' ի 追踪AI技术和产品新动态
喜欢就点「在看」吧 !
以上所述就是小编给大家介绍的《一文看懂如何使用模型转换工具X2Paddle》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- YOLO Caffe模型转换BN的坑
- 文本挖掘从小白到精通(三)---主题模型和文本数据转换
- 小米开源语音模型 Kaldi-ONNX 转换工具,助力移动端部署!
- 飞桨上线万能转换小工具,教你玩转TensorFlow、Caffe等模型迁移
- 飞桨万能转换小工具X2Paddle,教你玩转模型迁移
- 更自由的GAN图像联想:无监督跨类的图像转换模型FUNIT,英伟达&&康奈尔大学
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Coding the Matrix
Philip N. Klein / Newtonian Press / 2013-7-26 / $35.00
An engaging introduction to vectors and matrices and the algorithms that operate on them, intended for the student who knows how to program. Mathematical concepts and computational problems are motiva......一起来看看 《Coding the Matrix》 这本书的介绍吧!