README.md 7.0 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 15
## TensorFlow与PaddlePaddle的差异
我们计划专门梳理出指南文档,对比TensorFlow与PaddlePaddle的差异,帮助TensorFlow开发者降低学习PaddlePaddle使用的难度,文档会整理在doc目录。
**重要:**用户需要注意,Tensorflow的多数模型,默认输入为**NHWC**,而在Paddle中为**NCHW**,因此在转换后的PaddlePaddle模型,提供的输入需是为**NCHW**格式,同时注意输出的格式,比如在经过卷积后,Tensorflow的输出为[**batch, height, width, filter_num**],而在PaddlePaddle中,输出则为[**batch, filter_num, height, width**]

J
Jason 已提交
16
## 介绍
J
Jason 已提交
17

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

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

J
Jason 已提交
26
tensorflow2fluid在模型转换过程中,以tensorflow计算图中的节点为粒度,遍历图中的节点,并将每个节点所对应的OP转换为基于PaddlePaddle实现的python网络结构代码。
J
Jason 已提交
27

J
Jason 已提交
28
> 模型中所使用的代码,一般而言并不能直接能过模型训练时所使用的tensorflow代码中就能完全看出来。比如在python模型代码中所使用到的`tf.contrib.layers.fully_connected`就涉及到如下OP
J
Jason 已提交
29 30 31 32 33 34 35 36 37

|TensorFlow OP名|说明|
|:-----------------:|:----------------------------------------:|
|VariableV2|用于创建变量weights和bias|
|MatMul|输入与weights乘法操作|
|BiasAdd|输入值在Matmul后,再与bias相加|
|Relu|输出最后需要通过的激活函数操作|
|Idenitity|计算过程中的变量复制操作|

J
Jason 已提交
38
**目前支持转换OP如文档最末附表所示**,需要注意的是,**在实现转换过程中,代码转换基于各OP常见的使用情况**,此外,并非所有OP都需要转成PaddlePaddle对应的代码实现,如Identity,switch等OP,在实际转换过程中,都直接将输出表示为输入即可。
J
Jason 已提交
39

J
Jason 已提交
40

J
Jason 已提交
41
tensorflow2paddle仍在持续开发阶段中,也非常欢迎用户贡献自己的代码,或者通过issue的方式提出建议和需求。
J
Jason 已提交
42 43 44



J
Jason 已提交
45 46
## 模型转换diff对比

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

Model|Pre-trained Model|Diff
:--------------:|:----------------------------------------------:|:-----------------:
[vgg_16](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)|1e-05
J
Jason 已提交
52 53 54 55
[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)|1e-05
[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)|1e-05
[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)|1e-05
[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)|1e-05
J
Jason 已提交
56

J
Jason 已提交
57
## 用法
J
Jason 已提交
58 59 60 61
使用tensorflow2fluid转换模型时,所需的信息如下

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

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

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

J
Jason 已提交
74
```Bash
J
Jason 已提交
75
# 下载并解压inception_v3预训练模型
J
Jason 已提交
76
wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz
J
Jason 已提交
77
tar xzvf inception_v3_2016_08_28.tar.gz
J
Jason 已提交
78

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

J
Jason 已提交
82
# 将check_point模型转换为PaddlePaddle可加载运行的模型
J
Jason 已提交
83 84 85 86 87 88 89
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 已提交
90 91

### 加载转换后的模型
J
Jason 已提交
92 93 94

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

J
Jason 已提交
96
## 附表:tensorflow2fluid目前支持转换的Tensorflow OP一览表
J
Jason 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115

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