README.md 9.1 KB
Newer Older
J
jiangjiajun 已提交
1
# tensorflow2fluid
J
Jason 已提交
2
[![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE)
J
Jason 已提交
3

J
Jason 已提交
4
## 依赖
J
Jason 已提交
5

J
Jason 已提交
6
> python = 2.7
J
Jason 已提交
7

J
Jason 已提交
8
> tensorflow >= 1.12.0
J
Jason 已提交
9

J
Jason 已提交
10
> 注:tensorflow2fluid的运行不依赖于paddlepaddle,但测试转换后的模型所需的PaddlePaddle须为1.2.0或更新版本
J
Jason 已提交
11

J
Jason 已提交
12 13 14
## 安装

```
J
Jason 已提交
15 16 17 18
# 如果没有安装paddlepaddle和tensorflow环境
pip install paddlepaddle
pip install tensorflow

J
Jason 已提交
19 20 21 22 23 24
git clone https://github.com/PaddlePaddle/X2Paddle.git
cd X2Paddle/tensorflow2fluid
python setup.py install
```

## 使用
J
Jason 已提交
25 26 27

> 1. 目前支持转换的模型格式包括checkpoint保存的模型、将参数序列化到网络结构的pb格式模型

J
Jason 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
**例. 将vgg_16模型转换至paddlepaddle模型**
```
# 下载预训练的vgg_16模型参数
wget http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
tar xzvf vgg_16_2016_08_28.tar.gz

# 将模型转存为checkpoint格式模型
python demo/export_to_checkpoint.py --model vgg_16 --ckpt_file vgg_16.ckpt --save_dir vgg_checkpoint

# 转换模型
tf2fluid --meta_file vgg_checkpoint/model.meta \
         --ckpt_dir vgg_checkpoint/ \
         --in_nodes inputs \
         --input_shape None,224,224,3 \
         --output_nodes vgg_16/fc8/squeezed \
         --save_dir paddle_vgg
```

J
Jason 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
**参数说明**

|参数|说明|
|------------------|-----------------------------------------------|
|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_shape|输出tensor名,多个输出时以空格分隔|
|save_dir|转换后的模型保存路径|

**转换模型目录文件说明**


文件|作用
:------------------:|:-----------------------------------------------:
my_model.py|基于PaddlePaddle实现的模型网络结构python代码
ref_name.txt|my_model.py中各tensor与原TensorFlow模型中的tensor对应关系
const_\*/params_\*|转换后的模型参数文件
J
Jason 已提交
66 67 68

## 下面文档待修改,暂无需关注

J
Jason 已提交
69 70 71
## 文档阅读建议

> 1. 使用前,请务必关注文档中『TensorFlow与PaddlePaddle的差异』
J
Jason 已提交
72 73
> 2. 『使用说明』通过示例展示了转换工具的使用方法
> 3. 『工具介绍』中介绍了工具转换代码实现的部分细节
J
Jason 已提交
74

J
Jason 已提交
75 76
## TensorFlow与PaddlePaddle的差异
我们计划专门梳理出指南文档,对比TensorFlow与PaddlePaddle的差异,帮助TensorFlow开发者降低学习PaddlePaddle使用的难度,文档会整理在doc目录。
J
Jason 已提交
77

J
Jason 已提交
78
**重要:**用户需要注意,Tensorflow的多数CV模型,默认输入为**NHWC**,而在Paddle中为**NCHW**,因此在转换后的PaddlePaddle模型,提供的输入需是为**NCHW**格式,同时注意输出的格式,比如在经过卷积后,Tensorflow的输出为[**batch, height, width, filter_num**],而在PaddlePaddle中,输出则为[**batch, filter_num, height, width**]
J
Jason 已提交
79

J
Jason 已提交
80
## 使用说明
J
Jason 已提交
81

J
Jason 已提交
82
tensorflow2fluid支持将训练好的TensorFlow模型转至PaddlePaddle fluid模型,转换后的保存目录中,文件list如下表所示
J
Jason 已提交
83

J
Jason 已提交
84 85 86 87
文件|作用
:------------------:|:-----------------------------------------------:
my_model.py|基于PaddlePaddle实现的模型网络结构python代码
ref_name.txt|my_model.py中各tensor与原TensorFlow模型中的tensor对应关系
J
Jason 已提交
88
const_\*/params_\*|转换后的模型参数文件
J
Jason 已提交
89

J
Jason 已提交
90 91 92 93
使用tensorflow2fluid转换模型时,所需的信息如下

|参数|说明|
|------------------|-----------------------------------------------|
J
Jason 已提交
94
|meta_file|TensorFlow模型序列化后保存的meta文件|
J
Jason 已提交
95
|ckpt_file|TensorFlow模型保存checkpoint目录|
J
Jason 已提交
96
|pb_file|Tensorflow保存的pb格式模型|
J
Jason 已提交
97 98 99 100
|input_nodes|输入tensor名,多个输入时以空格分隔|
|input_shape|输入tensor的shape(batch维度以None表示),shape之间以空格分隔,shape内各维度以逗号分隔,须与input_nodes对应|
|output_shape|输出tensor名,多个输出时以空格分隔|
|save_dir|转换后的模型保存路径|
J
Jason 已提交
101 102

目前TensorFlow保存的模型主要包括ckpt和pb两种类型。其中加载ckpt模型时,同时也需通过meta文件导入网络结构;而pb模型则已将网络结构和参数均序列化至同一个文件。因此,加载ckpt模型时,需指定meta_file和ckpt_file,而加载pb模型,则只需指定pb_file即可。
J
Jason 已提交
103

J
Jason 已提交
104 105
### 例:将inception_v3模型转换至PaddlePaddle

J
Jason 已提交
106
```Bash
J
Jason 已提交
107
# 下载并解压inception_v3预训练模型
J
Jason 已提交
108
wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz
J
Jason 已提交
109
tar xzvf inception_v3_2016_08_28.tar.gz
J
Jason 已提交
110

J
Jason 已提交
111
# 将下载的预训练模型转存为check_point
J
Jason 已提交
112
python demo/inception_v3/script/export_to_checkpoint.py inception_v3.ckpt checkpoint
J
Jason 已提交
113

J
Jason 已提交
114
# 将check_point模型转换为PaddlePaddle可加载运行的模型
J
Jason 已提交
115 116 117 118 119 120 121
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
```
J
Jason 已提交
122 123

### 加载转换后的模型
J
Jason 已提交
124

J
Jason 已提交
125
## 工具介绍
J
Jason 已提交
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147

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对比

J
Jason 已提交
148
tensflow2fluid在公开的TensorFlow预训练模型上,通过输入1000个随机数据在原模型和转换后的模型上进行预测,得到的平均diff大小如下表所示
J
Jason 已提交
149

J
Jason 已提交
150
Model|Pre-trained Model|Average Diff
J
Jason 已提交
151
:--------------:|:----------------------------------------------:|:-----------------:
J
Jason 已提交
152
[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)|-
J
Jason 已提交
153 154 155 156
[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)|-
J
Jason 已提交
157 158 159



J
Jason 已提交
160 161
## Link
[MMdnn-Tensorflow](https://github.com/Microsoft/MMdnn/tree/master/mmdnn/conversion/tensorflow)
J
Jason 已提交
162

J
Jason 已提交
163
## 附表:tensorflow2fluid目前支持转换的Tensorflow OP一览表
J
Jason 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182

| 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         |                        |            |