index_cn.rst 12.8 KB
Newer Older
D
Dong Daxiang 已提交
1 2 3
=============
API Reference
=============
Y
Yi Liu 已提交
4

S
swtkiwi 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
飞桨2.0概述
-----------
在保持1.x版本工业级大规模高效训练和多平台快速部署优势的前提,飞桨2.0版本重点提升了框架的易用性,主要在用户交互层进行了优化,降低学习门槛,提升开发效率。不管对于初学者还是资深专家,都能够更容易地使用飞桨进行深度学习任务开发,加速前沿算法研究和工业级任务开发。

此版本为测试版,还在迭代开发中,目前还没有稳定,后续API会根据反馈有可能进行不兼容的升级。对于想要体验飞桨最新特性的开发者,欢迎试用此版本;对稳定性要求高的工业级应用场景推荐使用Paddle
1.8稳定版本。此版本主推命令式(imperative)开发模式,并提供了高层API的封装。命令式开发模式具有很好的灵活性,高层API可以大幅减少重复代码。对于初学者或基础的任务场景,推荐使用高层API的开发方式,简单易用;对于资深开发者想要实现复杂的功能,推荐使用动态图的API,灵活高效。

1.x版本对比,飞桨2.0版本的重要升级如下:

+------------+--------------------------------------+-----------------------------------------+
|            | 飞桨1.x版本                          | 飞桨2.0版本                             |
+============+======================================+=========================================+
| 开发模式   | 推荐声明式(declarative)             | 推荐命令式(imperative)                  |
+------------+--------------------------------------+-----------------------------------------+
| 组网方式   | 推荐函数式组网                       | 推荐面向对象式组网                      |
+------------+--------------------------------------+-----------------------------------------+
| 高层API    |                                    | 封装常见的操作,实现低代码开发          |
+------------+--------------------------------------+-----------------------------------------+
| 基础API    | fluid目录,结构不清晰,存在过时API   | paddle目录,整体结构调整,清理废弃API   |
+------------+--------------------------------------+-----------------------------------------+

开发模式
--------

飞桨同时支持声明式和命令式这两种开发模式,兼具声明式编程的高效和命令式编程的灵活。

声明式编程模式(通常也被称为静态模式或define-and-run模式),程序可以明确分为网络结构定义和执行这两个阶段。定义阶段声明网络结构,此时并未传入具体的训练数据;执行阶段需要用户通过feed的方式传入具体数据,完成计算后,通过fetch的方式返回计算结果。示例如下:

.. code:: python

    import numpy
    import paddle
    # 定义输入数据占位符
    a = paddle.nn.data(name="a", shape=[1], dtype='int64')
    b = paddle.nn.data(name="b", shape=[1], dtype='int64')
    # 组建网络(此处网络仅由一个操作构成,即elementwise_add
    result = paddle.elementwise_add(a, b)
    # 准备运行网络
    cpu = paddle.CPUPlace() # 定义运算设备,这里选择在CPU下训练
    exe = paddle.Executor(cpu) # 创建执行器
    # 创建输入数据
    x = numpy.array([2])
    y = numpy.array([3])
    # 运行网络
    outs = exe.run(
        feed={'a':x, 'b':y}, # 将输入数据x, y分别赋值给变量ab
        fetch_list=[result]  # 通过fetch_list参数指定需要获取的变量结果
        )
    #输出运行结果
    print (outs)
    #[array([5], dtype=int64)]

声明式开发模式的优点为在程序执行之前,可以拿到全局的组网信息,方便对计算图进行全局的优化,提升性能;并且由于全局计算图的存在,方便将计算图导出到文件,方便部署到非python语言的开发环境中,比如:C/C++/JavaScript等。声明式开发模式的缺点为,由于网络定义和执行阶段分离,在定义的时候并不知道所执行的具体的数据,程序的开发和调试会比较困难。

命令式编程模式(通常也被称为动态模式、eager模式或define-by-run模式),程序在网络结构定义的同时立即执行,能够实时的到执行结果。示例如下:

.. code:: python

    import numpy
    import paddle
    from paddle.imperative import to_variable

    # 切换命令式编程模式
    paddle.enable_imperative()

    # 创建数据
    x = to_variable(numpy.array([2]))
    y = to_variable(numpy.array([3]))
    # 定义运算并执行
    z = paddle.elementwise_add(x, y)
    # 输出执行结果
    print (z.numpy())

飞桨2.0推荐开发者使用命令式编程,可以使用原生python控制流API,具有灵活,容易开发调试的优点;同时为了兼具声明式编程在性能和部署方面的优势,飞桨提供了自动转换功能,可以将包含python控制流的代码,转换为Program,通过底层的Executor进行执行。

组网方式
--------

飞桨1.x大量使用函数式的组网方式,这种方法的好处是写法很简洁,但表达能力偏弱,比如:如果我们想要查看fc隐含的参数的值或者想要对某一个参数进行裁剪时,会很困难,我们需要操作隐含的参数名才能访问。比如:

.. code:: python

    import paddle.fluid as fluid

    data = fluid.layers.data(name="data", shape=[32, 32], dtype="float32")
    fc = fluid.layers.fc(input=data, size=1000, act="tanh")

飞桨2.0推荐使用面向对象式的组网方式,需要通过继承\ ``paddle.nn.Layer``\ 类的\ ``__init__``\ \ ``forward``\ 函数实现网络结构自定义,这种方式通过类的成员变量,方便地访问到每个类的成员,比如:

.. code:: python

    import paddle

    class SimpleNet(paddle.nn.Layer):
        def __init__(self, in_size, out_size):
            super(SimpleNet, self).__init__()
            self._linear = paddle.nn.Linear(in_size, out_size)

        def forward(self, x):
            y = self._linear(x)
            return y

高层API
-------

使用飞桨进行深度学习任务的开发,整体过程包括数据处理、组网、训练、评估、模型导出、预测部署这些基本的操作。这些基本操作在不同的任务中会反复出现,使用基础API进行开发时,需要开发者重复地写这些基础操作的代码,增加了模型开发的工作量。高层API针对这些基础操作进行了封装,提供更高层的开发接口,开发者只需要关心数据处理和自定义组网,其他工作可以通过调用高层API来完成。在MNIST手写数字识别任务中,对比动态图基础API的实现方式,通过使用高层API可以减少80%的非组网类代码。

使用高层API的另外一个好处是,可以通过一行代码\ ``paddle.enable_imperative``\ ,切换命令式编程模式和声明式编程模式。在开发阶段,可以使用的命令式编程模式,方便调试;开发完成后,可以切换到声明式编程模式,加速训练和方便部署。兼具了命令式编程实时执行,容易调试的优点,以及声明式编程全局优化和容易部署的优点。

以下为高层API的一个基础示例

.. code:: python

    import numpy as np
    import paddle
    import paddle.nn.functional as F
    from paddle.incubate.hapi.model import Model, Input, Loss
    from paddle.incubate.hapi.loss import CrossEntropy

    #高层API的组网方式需要继承ModelModel类实现了模型执行所需的逻辑
    class SimpleNet(Model):
        def __init__(self, in_size, out_size):
            super(SimpleNet, self).__init__()
            self._linear = paddle.nn.Linear(in_size, out_size)
        def forward(self, x):
            y = self._linear(x)
            z = self._linear(y)
            pred = F.softmax(z)
            return pred

    #兼容声明式开发模式,定义数据形状类型,如果不使用声明式编程模式,可以不定义数据占位符
    inputs = [Input([None, 8], 'float32', name='image')]
    labels = [Input([None, 1], 'int64', name='labels')]

    #定义模型网络结构,包括指定损失函数和优化算法
    model = SimpleNet(8, 8)
    optimizer = paddle.optimizer.AdamOptimizer(learning_rate=0.1, parameter_list=model.parameters())
    model.prepare(optimizer, CrossEntropy(), None, inputs, labels, device='cpu')

    #切换执行模式
    paddle.enable_imperative(paddle.CPUPlace())

    #基于batch的训练
    batch_num = 10
    x = np.random.random((4, 8)).astype('float32')
    y = np.random.randint(0, 8, (4, 1)).astype('int64')
    for i in range(batch_num):
        model.train_batch(inputs=x, labels=y)

更多高层API开发的模型和示例请参考github Repo:
`hapi <https://github.com/paddlepaddle/hapi>`__

基础API
-------

飞桨2.0提供了新的API,可以同时支持声明式和命令式两种开发模式,比如paddle.nn.Linear,避免在两种模式下使用不同的API造成困惑。原飞桨1.xAPI位于paddle.fluid目录下,其中部分组网类的API,只能用于声明式开发,比如:fluid.layers.fc,无法用于命令式开发。

飞桨2.0API的目录结构进行了调整,从原来的paddle.fluid目录调整到paddle目录下,使得开发接口更加清晰,调整后的目录结构如下:

+---------------------+-----------------------------------------------------------------------------------------------------------+
| 目录                | 功能和包含API                                                                                             |
+=====================+===========================================================================================================+
| paddle.\*           | paddle根目录下保留了常用API的别名,当前包括:paddle.tensor, paddle.framework目录下的所有API               |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.tensor       | tensor操作相关的API,比如:创建zeros, 矩阵运算matmul, 变换concat, 计算elementwise\_add, 查找argmax    |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.nn           | 跟组网相关的API,比如:输入占位符data/Input,控制流while\_loop/cond,损失函数,卷积,LSTM等,激活函数等   |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.framework    | 基础框架相关的API,比如:Variable, Program, Executor                                                    |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.imperative   | imprerative模式专用的API,比如:to\_variable, prepare\_context                                          |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.optimizer    | 优化算法相关API,比如:SGDAdagrad, Adam                                                               |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.metric       | 评估指标计算相关的API,比如:accuracy, cos\_sim                                                         |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.io           | 数据输入输出相关API,比如:save, load, Dataset, DataLoader                                              |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.device       | 设备管理相关API,比如:CPUPlace CUDAPlace                                                             |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.fleet        | 分布式相关API                                                                                             |
+---------------------+-----------------------------------------------------------------------------------------------------------+

同时飞桨2.0对部分Paddle
1.x版本的API进行了清理,删除了部分不再推荐使用的API,具体信息请参考Release
Note



Y
Yi Liu 已提交
194 195 196
..  toctree::
    :maxdepth: 1

D
Dong Daxiang 已提交
197
    ../api_guides/index_cn.rst
S
swtkiwi 已提交
198
    paddle_cn.rst
D
Dong Daxiang 已提交
199
    dataset_cn.rst
S
swtkiwi 已提交
200 201 202 203
    tensor_cn.rst
    nn_cn.rst
    imperative_cn.rst
    declarative_cn.rst
D
Dong Daxiang 已提交
204
    optimizer_cn.rst
S
swtkiwi 已提交
205 206 207 208 209
    metric_cn.rst
    framework_cn.rst
    io_cn.rst
    utils_cn.rst
    incubate_cn.rst