未验证 提交 3b84031e 编写于 作者: J Jason 提交者: GitHub

Update README.md

上级 78183dd2
# tensorflow2fluid
[![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE)
## 依赖
## 环境依赖
> python = 2.7
......@@ -9,7 +9,7 @@
> 注:tensorflow2fluid的运行不依赖于paddlepaddle,但测试转换后的模型所需的PaddlePaddle须为1.2.0或更新版本
## 安装
## 安装说明
```
# 如果没有安装paddlepaddle和tensorflow环境
......@@ -21,12 +21,14 @@ cd X2Paddle/tensorflow2fluid
python setup.py install
```
## 使用
## 使用方法
> 1. 目前支持转换的模型格式包括checkpoint保存的模型、将参数序列化到网络结构的pb格式模型
> 2. 模型转换后,在输入同样的数据前提下,检查模型转换前后的diff,一般结果最大diff在1e-5数量级
**例. 将vgg_16模型转换至paddlepaddle模型**
### 转换示例
下面示例中,将vgg_16模型转换至paddlepaddle模型
```
# 下载预训练的vgg_16模型参数
wget http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
......@@ -44,7 +46,7 @@ tf2fluid --meta_file vgg_checkpoint/model.meta \
--save_dir paddle_vgg
```
**参数说明**
### 参数说明
|tf2fluid参数|说明|
|------------------|-----------------------------------------------|
......@@ -56,7 +58,7 @@ tf2fluid --meta_file vgg_checkpoint/model.meta \
|output_nodes|输出tensor名,多个输出时以空格分隔|
|save_dir|转换后的模型保存路径|
**转换模型目录文件说明**
### 转换后模型文件说明
文件|作用
:------------------:|:-----------------------------------------------:
......@@ -65,132 +67,14 @@ ref_name.txt|my_model.py中各tensor与原TensorFlow模型中的tensor对应关
const_\*/params_\*|转换后的模型参数文件
save_var.list|模型载入过程中的变量list
## 下面文档待修改,暂无需关注
## 文档阅读建议
> 1. 使用前,请务必关注文档中『TensorFlow与PaddlePaddle的差异』
> 2. 『使用说明』通过示例展示了转换工具的使用方法
> 3. 『工具介绍』中介绍了工具转换代码实现的部分细节
## TensorFlow与PaddlePaddle的差异
我们计划专门梳理出指南文档,对比TensorFlow与PaddlePaddle的差异,帮助TensorFlow开发者降低学习PaddlePaddle使用的难度,文档会整理在doc目录。
**重要:**用户需要注意,Tensorflow的多数CV模型,默认输入为**NHWC**,而在Paddle中为**NCHW**,因此在转换后的PaddlePaddle模型,提供的输入需是为**NCHW**格式,同时注意输出的格式,比如在经过卷积后,Tensorflow的输出为[**batch, height, width, filter_num**],而在PaddlePaddle中,输出则为[**batch, filter_num, height, width**]
## 使用说明
tensorflow2fluid支持将训练好的TensorFlow模型转至PaddlePaddle fluid模型,转换后的保存目录中,文件list如下表所示
文件|作用
:------------------:|:-----------------------------------------------:
my_model.py|基于PaddlePaddle实现的模型网络结构python代码
ref_name.txt|my_model.py中各tensor与原TensorFlow模型中的tensor对应关系
const_\*/params_\*|转换后的模型参数文件
使用tensorflow2fluid转换模型时,所需的信息如下
|参数|说明|
|------------------|-----------------------------------------------|
|meta_file|TensorFlow模型序列化后保存的meta文件|
|ckpt_file|TensorFlow模型保存checkpoint目录|
|pb_file|Tensorflow保存的pb格式模型|
|input_nodes|输入tensor名,多个输入时以空格分隔|
|input_shape|输入tensor的shape(batch维度以None表示),shape之间以空格分隔,shape内各维度以逗号分隔,须与input_nodes对应|
|output_nodes|输出tensor名,多个输出时以空格分隔|
|save_dir|转换后的模型保存路径|
目前TensorFlow保存的模型主要包括ckpt和pb两种类型。其中加载ckpt模型时,同时也需通过meta文件导入网络结构;而pb模型则已将网络结构和参数均序列化至同一个文件。因此,加载ckpt模型时,需指定meta_file和ckpt_file,而加载pb模型,则只需指定pb_file即可。
### 例:将inception_v3模型转换至PaddlePaddle
```Bash
# 下载并解压inception_v3预训练模型
wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz
tar xzvf inception_v3_2016_08_28.tar.gz
# 将下载的预训练模型转存为check_point
python demo/inception_v3/script/export_to_checkpoint.py inception_v3.ckpt checkpoint
# 将check_point模型转换为PaddlePaddle可加载运行的模型
python convert.py --meta_file checkpoint/model.meta \
--ckpt_dir checkpoint \
--in_nodes inputs \
--input_shape None,299,299,3 \
--output_nodes InceptionV3/Logits/SpatialSqueeze \
--save_dir paddle_inception_v3
```
### 加载转换后的模型
加载转换后的模型主要注意以下三点
## 工具介绍
tensorflow2fluid在模型转换过程中,以tensorflow计算图中的节点为粒度,遍历图中的节点,并将每个节点所对应的OP转换为基于PaddlePaddle实现的python网络结构代码。
> 模型中所使用的代码,一般而言并不能直接能过模型训练时所使用的tensorflow代码中就能完全看出来。比如在python模型代码中所使用到的`tf.contrib.layers.fully_connected`就涉及到如下OP
|TensorFlow OP名|说明|
|:-----------------:|:----------------------------------------:|
|VariableV2|用于创建变量weights和bias|
|MatMul|输入与weights乘法操作|
|BiasAdd|输入值在Matmul后,再与bias相加|
|Relu|输出最后需要通过的激活函数操作|
|Idenitity|计算过程中的变量复制操作|
**目前支持转换OP如文档最末附表所示**,需要注意的是,**在实现转换过程中,代码转换基于各OP常见的使用情况**,此外,并非所有OP都需要转成PaddlePaddle对应的代码实现,如Identity,switch等OP,在实际转换过程中,都直接将输出表示为输入即可。
tensorflow2paddle仍在持续开发阶段中,也非常欢迎用户贡献自己的代码,或者通过issue的方式提出建议和需求。
## 模型转换diff对比
tensflow2fluid在公开的TensorFlow预训练模型上,通过输入1000个随机数据在原模型和转换后的模型上进行预测,得到的平均diff大小如下表所示
Model|Pre-trained Model|Average Diff
:--------------:|:----------------------------------------------:|:-----------------:
[vgg_16](https://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v3.py)|[vgg_16_2016_08_28.tar.gz](http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz)|-
[vgg_19](https://github.com/tensorflow/models/blob/master/research/slim/nets/vgg.py)|[vgg_19_2016_08_28.tar.gz](http://download.tensorflow.org/models/vgg_19_2016_08_28.tar.gz)|-
[resnet_v1_50](https://github.com/tensorflow/models/blob/master/research/slim/nets/resnet_v1.py)|[resnet_v1_50_2016_08_28.tar.gz](http://download.tensorflow.org/models/resnet_v1_50_2016_08_28.tar.gz)|-
[resnet_v1_101](https://github.com/tensorflow/models/blob/master/research/slim/nets/resnet_v1.py)|[resnet_v1_101_2016_08_28.tar.gz](http://download.tensorflow.org/models/resnet_v1_101_2016_08_28.tar.gz)|-
[inception_v3](https://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v3.py)|[inception_v3_2016_08_28.tar.gz](http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz)|-
## Link
[MMdnn-Tensorflow](https://github.com/Microsoft/MMdnn/tree/master/mmdnn/conversion/tensorflow)
> 1. `import`模型结构,模型结构代码定义在my_model.py中
> 2. 注意原模型中输出与转换后模型输出名的映射关系,参考ref_name.txt
> 3. 模型需要加载的参数列表为save_var.list
## 附表:tensorflow2fluid目前支持转换的Tensorflow OP一览表
仍然以上面转换后的vgg_16为例,下面通过示例展示如何加载模型,并进行预测
| TensorFlow OP | Python Api | TensorFlow OP | Python Api |
| ------------------- | ---------- | ---------------------- | ---------- |
| VariableV2 | 1 | placeholderwithdefault | 17 |
| Identity | 2 | switch | 18 |
| Placeholder | 3 | merge | 19 |
| Const | 4 | MaxPool | 20 |
| Conv2D | 5 | Squeeze | 21 |
| BiasAdd | 6 | Add | 22 |
| Relu | 7 | Mean | 23 |
| Conv2dBackpropInput | 8 | DepthwiseConv2dNative | 24 |
| FusedBatchNorm | 9 | Pad | 25 |
| ConcatV2 | 10 | StridedSlice | 26 |
| AvgPool | 11 | ResizeNearestNeighbor | 27 |
| Rsqrt | 12 | Maximum | 28 |
| Mul | 13 | Minimum | 9 |
| Sub | 14 | Sigmoid | 30 |
| Shape | 15 | Pack | 31 |
| Reshape | 16 | | |
> 1. `import'模型结构,模型结构代码定义在my_model.py中
> 1. `import'模型结构,模型结构代码定义在my_model.py中
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册