提交 933ebbb9 编写于 作者: Z zy0531 提交者: Hao Wang

api modification (#769)

* api modification

half modification of fluid/io/layers

* Apply suggestions from code review
Co-Authored-By: Nzy0531 <48094155+zy0531@users.noreply.github.com>

* Update fluid_cn.rst
上级 a2dd4993
################# #################
fluid fluid
################# #################
.. _cn_api_fluid_AsyncExecutor: .. _cn_api_fluid_AsyncExecutor:
AsyncExecutor AsyncExecutor
------------------------------- -------------------------------
.. py:class:: paddle.fluid.AsyncExecutor(place=None, run_mode='') .. py:class:: paddle.fluid.AsyncExecutor(place=None, run_mode='')
**AsyncExecutor正在积极开发,API可能在短期内进行调整。** **AsyncExecutor正在积极开发,API可能在短期内进行调整。**
Python中的异步执行器。AsyncExecutor利用多核处理器和数据排队的强大功能,使数据读取和融合解耦,每个线程并行运行。 Python中的异步执行器。AsyncExecutor利用多核处理器和数据排队的强大功能,使数据读取和融合解耦,每个线程并行运行。
AsyncExecutor不是在python端读取数据,而是接受一个训练文件列表,该列表将在c++中检索,然后训练输入将被读取、解析并在c++代码中提供给训练网络。 AsyncExecutor不是在python端读取数据,而是接受一个训练文件列表,该列表将在c++中检索,然后训练输入将被读取、解析并在c++代码中提供给训练网络。
参数: 参数:
- **place** (fluid.CPUPlace|None) - 指示 executor 将在哪个设备上运行。目前仅支持CPU - **place** (fluid.CPUPlace|None) - 指示 executor 将在哪个设备上运行。目前仅支持CPU
**代码示例:** **代码示例:**
.. code-block:: python .. code-block:: python
data_feed = fluid.DataFeedDesc('data.proto') data_feed = fluid.DataFeedDesc('data.proto')
startup_program = fluid.default_startup_program() startup_program = fluid.default_startup_program()
main_program = fluid.default_main_program() main_program = fluid.default_main_program()
filelist = ["train_data/part-%d" % i for i in range(100)] filelist = ["train_data/part-%d" % i for i in range(100)]
thread_num = len(filelist) / 4 thread_num = len(filelist) / 4
place = fluid.CPUPlace() place = fluid.CPUPlace()
async_executor = fluid.AsyncExecutor(place) async_executor = fluid.AsyncExecutor(place)
async_executor.run_startup_program(startup_program) async_executor.run_startup_program(startup_program)
epoch = 10 epoch = 10
for i in range(epoch): for i in range(epoch):
async_executor.run(main_program, async_executor.run(main_program,
data_feed, data_feed,
filelist, filelist,
thread_num, thread_num,
[acc], [acc],
debug=False) debug=False)
.. note:: .. note::
对于并行gpu调试复杂网络,您可以在executor上测试。他们有完全相同的参数,并可以得到相同的结果。 对于并行gpu调试复杂网络,您可以在executor上测试。他们有完全相同的参数,并可以得到相同的结果。
目前仅支持CPU 目前仅支持CPU
.. py:method:: run(program, data_feed, filelist, thread_num, fetch, mode='', debug=False) .. py:method:: run(program, data_feed, filelist, thread_num, fetch, mode='', debug=False)
使用此 ``AsyncExecutor`` 来运行 ``program`` 。 使用此 ``AsyncExecutor`` 来运行 ``program`` 。
``filelist`` 中包含训练数据集。用户也可以通过在参数 ``fetch`` 中提出变量来检查特定的变量, 正如 ``fluid.Executor`` 。 ``filelist`` 中包含训练数据集。用户也可以通过在参数 ``fetch`` 中提出变量来检查特定的变量, 正如 ``fluid.Executor`` 。
但不像 ``fluid.Executor`` , ``AsyncExecutor`` 不返回获取到的变量,而是将每个获取到的变量作为标准输出展示给用户。 但不像 ``fluid.Executor`` , ``AsyncExecutor`` 不返回获取到的变量,而是将每个获取到的变量作为标准输出展示给用户。
数据集上的运算在多个线程上执行,每个线程中都会独立出一个线程本地作用域,并在此域中建立运算。 数据集上的运算在多个线程上执行,每个线程中都会独立出一个线程本地作用域,并在此域中建立运算。
所有运算同时更新参数值。 所有运算同时更新参数值。
参数: 参数:
- **program** (Program) – 需要执行的program。如果没有提供该参数,默认使用 ``default_main_program`` - **program** (Program) – 需要执行的program。如果没有提供该参数,默认使用 ``default_main_program``
- **data_feed** (DataFeedDesc) – ``DataFeedDesc`` 对象 - **data_feed** (DataFeedDesc) – ``DataFeedDesc`` 对象
- **filelist** (str) – 一个包含训练数据集文件的文件列表 - **filelist** (str) – 一个包含训练数据集文件的文件列表
- **thread_num** (int) – 并发训练线程数。参照 *注解* 部分获取合适的设置方法 - **thread_num** (int) – 并发训练线程数。参照 *注解* 部分获取合适的设置方法
- **fetch** (str|list) – 变量名,或者变量名列表。指明最后要进行观察的变量命名 - **fetch** (str|list) – 变量名,或者变量名列表。指明最后要进行观察的变量命名
- **mode** (str) – 该接口的运行模式 - **mode** (str) – 该接口的运行模式
- **debug** (bool) – 如果为True, 在每一个minibatch处理后,fetch 中指明的变量将会通过标准输出打印出来 - **debug** (bool) – 如果为True, 在每一个minibatch处理后,fetch 中指明的变量将会通过标准输出打印出来
.. note:: .. note::
1.该执行器会运行program中的所有运算,不只是那些依赖于fetchlist的运算 1.该执行器会运行program中的所有运算,不只是那些依赖于fetchlist的运算
2.该类执行器在多线程上运行,每个线程占用一个CPU核。为了实现效率最大化,建议将 ``thread_num`` 等于或稍微小于CPU核心数 2.该类执行器在多线程上运行,每个线程占用一个CPU核。为了实现效率最大化,建议将 ``thread_num`` 等于或稍微小于CPU核心数
.. py:method:: download_data(afs_path, local_path, fs_default_name, ugi, file_cnt, hadoop_home='$HADOOP_HOME', process_num=12) .. py:method:: download_data(afs_path, local_path, fs_default_name, ugi, file_cnt, hadoop_home='$HADOOP_HOME', process_num=12)
download_data是用于分布式训练的默认下载方法,用户可不使用该方法下载数据。 download_data是用于分布式训练的默认下载方法,用户可不使用该方法下载数据。
**示例** **示例**
.. code-block:: python .. code-block:: python
exe = fluid.AsyncExecutor() exe = fluid.AsyncExecutor()
exe.download_data("/xxx/xxx/xx/", exe.download_data("/xxx/xxx/xx/",
"./data", "afs:// "./data", "afs://
xxx.xxx.xxx.xxx:9901", "xxx,yyy") xxx.xxx.xxx.xxx:9901", "xxx,yyy")
参数: 参数:
- **afs_path** (str) - 用户定义的afs_path - **afs_path** (str) - 用户定义的afs_path
- **local_path** (str) - 下载数据路径 - **local_path** (str) - 下载数据路径
- **fs_default_name** (str) - 文件系统服务器地址 - **fs_default_name** (str) - 文件系统服务器地址
- **ugi** (str) - hadoop ugi - **ugi** (str) - hadoop ugi
- **file_cn** (int) - 用户可以指定用于调试的文件号 - **file_cnt** (int) - 用户可以指定用于调试的文件号
- **hadoop_home** (str) - hadoop home path - **hadoop_home** (str) - hadoop home path
- **process_num** (int) - 下载进程号 - **process_num** (int) - 下载进程号
.. py:method:: get_instance() .. py:method:: get_instance()
获取当前节点的实例,以便用户可以在分布式背景下中执行操作。 获取当前节点的实例,以便用户可以在分布式背景下中执行操作。
.. py:method:: config_distributed_nodes() .. py:method:: config_distributed_nodes()
如果用户需要运行分布式AsyncExecutor,则需要进行全局配置,以便获取当前进程的信息。 如果用户需要运行分布式AsyncExecutor,则需要进行全局配置,以便获取当前进程的信息。
.. py:method:: stop() .. py:method:: stop()
在流程结束时,用户应该停止服务器并阻止所有workers。 在流程结束时,用户应该停止服务器并阻止所有workers。
.. py:method:: init_server(dist_desc) .. py:method:: init_server(dist_desc)
如果当前进程是server,则初始化当前节点的服务器。 如果当前进程是server,则初始化当前节点的服务器。
参数: 参数:
- **dist_desc** (str)- 描述如何初始化worker和server的protobuf字符串 - **dist_desc** (str)- 描述如何初始化worker和server的protobuf字符串
.. py:method:: init_worker(dist_desc, startup_program) .. py:method:: init_worker(dist_desc, startup_program)
如果当前进程是worker,则初始化当前节点的worker 如果当前进程是worker,则初始化当前节点的worker
参数: 参数:
- **dist_desc** (str)- 描述如何初始化worker和server的protobuf字符串 - **dist_desc** (str)- 描述如何初始化worker和server的protobuf字符串
- **startup_program** (fluid.Program)- 当前进程的startup program - **startup_program** (fluid.Program)- 当前进程的startup program
.. py:method:: init_model() .. py:method:: init_model()
可以从其中一个worker中调用的init_model命令。随之,在server中初始化模型参数。 可以从其中一个worker中调用的init_model命令。随之,在server中初始化模型参数。
.. py:method:: save_model(save_path) .. py:method:: save_model(save_path)
可以从其中一个worker调用的save_model命令。随之,模型参数会保存在server中并上传到文件系统的save_path指定的位置。 可以从其中一个worker调用的save_model命令。随之,模型参数会保存在server中并上传到文件系统的save_path指定的位置。
参数: 参数:
- **save_path** (str)- 文件系统的保存路径 - **save_path** (str)- 文件系统的保存路径
.. _cn_api_fluid_BuildStrategy: .. _cn_api_fluid_BuildStrategy:
BuildStrategy BuildStrategy
------------------------------- -------------------------------
.. py:class:: paddle.fluid.BuildStrategy .. py:class:: paddle.fluid.BuildStrategy
``BuildStrategy`` 使用户更精准地控制 ``ParallelExecutor`` 中SSA图的建造方法。可通过设置 ``ParallelExecutor`` 中的 ``BuildStrategy`` 成员来实现此功能。 ``BuildStrategy`` 使用户更精准地控制 ``ParallelExecutor`` 中SSA图的建造方法。可通过设置 ``ParallelExecutor`` 中的 ``BuildStrategy`` 成员来实现此功能。
**代码示例** **代码示例**
.. code-block:: python .. code-block:: python
build_strategy = fluid.BuildStrategy() build_strategy = fluid.BuildStrategy()
build_strategy.reduce_strategy = fluid.BuildStrategy.ReduceStrategy.Reduce build_strategy.reduce_strategy = fluid.BuildStrategy.ReduceStrategy.Reduce
train_exe = fluid.ParallelExecutor(use_cuda=True, train_exe = fluid.ParallelExecutor(use_cuda=True,
loss_name=loss.name, loss_name=loss.name,
build_strategy=build_strategy) build_strategy=build_strategy)
train_loss, = train_exe.run([loss.name], feed=feed_dict) train_loss, = train_exe.run([loss.name], feed=feed_dict)
.. py:attribute:: debug_graphviz_path .. py:attribute:: debug_graphviz_path
str类型。它表明了以graphviz格式向文件中写入SSA图的路径,有利于调试。 默认值为""。 str类型。它表明了以graphviz格式向文件中写入SSA图的路径,有利于调试。 默认值为""。
.. py:attribute:: enable_sequential_execution .. py:attribute:: enable_sequential_execution
类型是BOOL。 如果设置为True,则ops的执行顺序将与program中的执行顺序相同。 默认为False。 类型是BOOL。 如果设置为True,则ops的执行顺序将与program中的执行顺序相同。 默认为False。
.. py:attribute:: fuse_elewise_add_act_ops .. py:attribute:: fuse_elewise_add_act_ops
bool类型。它表明了是否融合(fuse)elementwise_add_op和activation_op。这会使整体执行过程更快一些。默认为False。 bool类型。它表明了是否融合(fuse)elementwise_add_op和activation_op。这会使整体执行过程更快一些。默认为False。
.. py:attribute:: fuse_relu_depthwise_conv .. py:attribute:: fuse_relu_depthwise_conv
BOOL类型,fuse_relu_depthwise_conv指示是否融合relu和depthwise_conv2d,它会节省GPU内存并可能加速执行过程。 此选项仅适用于GPU设备。 默认为False。 BOOL类型,fuse_relu_depthwise_conv指示是否融合relu和depthwise_conv2d,它会节省GPU内存并可能加速执行过程。 此选项仅适用于GPU设备。 默认为False。
.. py:attribute:: gradient_scale_strategy .. py:attribute:: gradient_scale_strategy
str类型。在 ``ParallelExecutor`` 中,存在三种定义 *loss@grad* 的方式,分别为 ``CoeffNumDevice``, ``One`` 与 ``Customized``。默认情况下, ``ParallelExecutor`` 根据设备数目来设置 *loss@grad* 。如果你想自定义 *loss@grad* ,你可以选择 ``Customized`` 方法。默认为 ``CoeffNumDevice`` 。 str类型。在 ``ParallelExecutor`` 中,存在三种定义 *loss@grad* 的方式,分别为 ``CoeffNumDevice``, ``One`` 与 ``Customized``。默认情况下, ``ParallelExecutor`` 根据设备数目来设置 *loss@grad* 。如果你想自定义 *loss@grad* ,你可以选择 ``Customized`` 方法。默认为 ``CoeffNumDevice`` 。
.. py:attribute:: reduce_strategy .. py:attribute:: reduce_strategy
str类型。在 ``ParallelExecutor`` 中,存在两种减少策略(reduce strategy),即 ``AllReduce`` 和 ``Reduce`` 。如果你需要在所有执行场所上独立地进行参数优化,可以使用 ``AllReduce`` 。反之,如果使用 ``Reduce`` 策略,所有参数的优化将均匀地分配给不同的执行场所,随之将优化后的参数广播给其他执行场所。在一些模型中, ``Reduce`` 策略执行速度更快一些。默认值为 ``AllReduce`` 。 str类型。在 ``ParallelExecutor`` 中,存在两种减少策略(reduce strategy),即 ``AllReduce`` 和 ``Reduce`` 。如果你需要在所有执行场所上独立地进行参数优化,可以使用 ``AllReduce`` 。反之,如果使用 ``Reduce`` 策略,所有参数的优化将均匀地分配给不同的执行场所,随之将优化后的参数广播给其他执行场所。在一些模型中, ``Reduce`` 策略执行速度更快一些。默认值为 ``AllReduce`` 。
.. py:attribute:: remove_unnecessary_lock .. py:attribute:: remove_unnecessary_lock
BOOL类型。如果设置为True, GPU操作中的一些锁将被释放,ParallelExecutor将运行得更快,默认为 False。 BOOL类型。如果设置为True, GPU操作中的一些锁将被释放,ParallelExecutor将运行得更快,默认为 True。
.. py:attribute:: sync_batch_norm
.. _cn_api_fluid_CompiledProgram: 类型为bool,sync_batch_norm表示是否使用同步的批正则化,即在训练阶段通过多个设备同步均值和方差。
CompiledProgram 当前的实现不支持FP16培训和CPU。仅在一台机器上进行同步式批正则,不适用于多台机器。
-------------------------------
默认为 False。
.. py:class:: paddle.fluid.CompiledProgram(program)
编译一个接着用来执行的Program。 .. _cn_api_fluid_CompiledProgram:
1. 首先使用layers(网络层)创建程序。 CompiledProgram
2. (可选)可使用CompiledProgram来在运行之前优化程序。 -------------------------------
3. 定义的程序或CompiledProgram由Executor运行。
.. py:class:: paddle.fluid.CompiledProgram(program_or_graph)
CompiledProgram用于转换程序以进行各种优化。例如,
编译成一个用来执行的Graph。
- 预先计算一些逻辑,以便每次运行更快。
- 转换Program,使其可以在多个设备中运行。 1. 首先使用layers(网络层)创建程序。
- 转换Program以进行优化预测或分布式训练。 2. (可选)可使用CompiledProgram来在运行之前优化程序。
3. 定义的程序或CompiledProgram由Executor运行。
**代码示例**
CompiledProgram用于转换程序以进行各种优化。例如,
.. code-block:: python
- 预先计算一些逻辑,以便每次运行更快。
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() - 转换Program,使其可以在多个设备中运行。
exe = fluid.Executor(place) - 转换Program以进行优化预测或分布式训练。
exe.run(startup)
compiled_prog = compiler.CompiledProgram(main).with_data_parallel( **代码示例**
loss_name=loss.name)
for i in range(5): .. code-block:: python
test_loss, = exe.run(compiled_prog,
feed=feed_dict, place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
fetch_list=[loss.name]) exe = fluid.Executor(place)
exe.run(startup)
参数: compiled_prog = compiler.CompiledProgram(main).with_data_parallel(
- **program** : 一个Program对象,承载着用户定义的模型计算逻辑 loss_name=loss.name)
for i in range(5):
.. py:method:: with_data_parallel(loss_name=None, build_strategy=None, exec_strategy=None, share_vars_from=None) test_loss, = exe.run(compiled_prog,
feed=feed_dict,
配置Program使其以数据并行方式运行。 fetch_list=[loss.name])
参数: 参数:
- **loss_name** (str) - 损失函数名称必须在训练过程中设置。 默认None。 - **program_or_graph** (Graph|Program): 如果它是Program,那么它将首先被降成一个graph,以便进一步优化。如果它是一个graph(以前可能优化过),它将直接用于进一步的优化。注意:只有使用 with_data_parallel 选项编译时才支持graph。
- **build_strategy** (BuildStrategy) - build_strategy用于构建图,因此它可以在具有优化拓扑的多个设备/核上运行。 有关更多信息,请参阅 ``fluid.BuildStrategy`` 。 默认None。
- **exec_strategy** (ExecutionStrategy) - exec_strategy用于选择执行图的方式,例如使用多少线程,每次清理临时变量之前进行的迭代次数。 有关更多信息,请参阅 ``fluid.ExecutionStrategy`` 。 默认None。 .. py:method:: with_data_parallel(loss_name=None, build_strategy=None, exec_strategy=None, share_vars_from=None, places=None)
- **share_vars_from** (CompiledProgram) - 如果有,此CompiledProgram将共享来自share_vars_from的变量。 share_vars_from指定的Program必须由此CompiledProgram之前的Executor运行,以便vars准备就绪。
配置Program使其以数据并行方式运行。
返回: self
参数:
.. py:method:: with_inference_optimize(config) - **loss_name** (str) - 损失函数名称必须在训练过程中设置。 默认None。
- **build_strategy** (BuildStrategy) - build_strategy用于构建图,因此它可以在具有优化拓扑的多个设备/核上运行。 有关更多信息,请参阅 ``fluid.BuildStrategy`` 。 默认None。
添加预测优化。 - **exec_strategy** (ExecutionStrategy) - exec_strategy用于选择执行图的方式,例如使用多少线程,每次清理临时变量之前进行的迭代次数。 有关更多信息,请参阅 ``fluid.ExecutionStrategy`` 。 默认None。
- **share_vars_from** (CompiledProgram) - 如果有,此CompiledProgram将共享来自share_vars_from的变量。 share_vars_from指定的Program必须由此CompiledProgram之前的Executor运行,以便vars准备就绪。
参数: - **places** (list(CUDAPlace)|list(CPUPlace)|None) - 如果提供,则仅在给定位置编译程序。否则,编译时使用的位置由Executor确定,使用的位置由环境变量控制:如果使用GPU,则标记FLAGS_selected_gpus或CUDA_VISIBLE_DEVICES设备;如果使用CPU,则标记CPU_NUM。例如,如果要在GPU 0和GPU 1上运行,请设置places=[fluid.CUDAPlace(0), fluid.CUDAPlace(1)]。如果要在2个CPU核心上运行,请设置places=[fluid.CPUPlace()]*2。
- **config** - 用于创建预测器的NativeConfig或AnalysisConfig的实例
返回: self
返回: self
.. py:method:: with_inference_optimize(config)
.. _cn_api_fluid_cpu_places: 添加预测优化。
cpu_places 参数:
------------------------------- - **config** - 用于创建预测器的NativeConfig或AnalysisConfig的实例
.. py:function:: paddle.fluid.cpu_places(device_count=None) 返回: self
创建 ``fluid.CPUPlace`` 对象列表。
.. _cn_api_fluid_cpu_places:
如果 ``device_count`` 为None,则设备数目将由环境变量 ``CPU_NUM`` 确定。如果未设置 ``CPU_NUM`` ,则设备数目将由 ``multiprocessing.cpu_count()`` 确定。
cpu_places
参数: -------------------------------
- **device_count** (None|int) - 设备数目
.. py:function:: paddle.fluid.cpu_places(device_count=None)
返回: CPUPlace列表
创建 ``fluid.CPUPlace`` 对象列表。
返回类型:out (list(fluid.CPUPlace))
如果 ``device_count`` 为None,则设备数目将由环境变量 ``CPU_NUM`` 确定。如果未设置 ``CPU_NUM`` ,则设备数目将由 ``multiprocessing.cpu_count()`` 确定。
参数:
.. _cn_api_fluid_CPUPlace: - **device_count** (None|int) - 设备数目
CPUPlace 返回: CPUPlace列表
-------------------------------
返回类型:out (list(fluid.CPUPlace))
.. py:class:: paddle.fluid.CPUPlace
CPUPlace是设备的描述符。它代表一个CPU,可以访问CPUPlace对应的内存。 .. _cn_api_fluid_CPUPlace:
CPUPlace
-------------------------------
.. py:class:: paddle.fluid.CPUPlace
.. _cn_api_fluid_create_lod_tensor:
CPUPlace是设备的描述符。它代表一个CPU,可以访问CPUPlace对应的内存。
create_lod_tensor
-------------------------------
.. py:function:: paddle.fluid.create_lod_tensor(data, recursive_seq_lens, place)
.. _cn_api_fluid_create_lod_tensor:
该函数从一个numpy数组,列表或者已经存在的lod tensor中创建一个lod tensor。
通过一下几步实现: create_lod_tensor
-------------------------------
1. 检查length-based level of detail (LoD,长度为基准的细节层次),或称recursive_sequence_lengths(递归序列长度)的正确性
.. py:function:: paddle.fluid.create_lod_tensor(data, recursive_seq_lens, place)
2. 将recursive_sequence_lengths转化为offset-based LoD(偏移量为基准的LoD)
3. 把提供的numpy数组,列表或者已经存在的lod tensor复制到CPU或GPU中(依据执行场所确定) 该函数从一个numpy数组,列表或者已经存在的lod tensor中创建一个lod tensor。
4. 利用offset-based LoD来设置LoD 通过一下几步实现:
例如: 1. 检查length-based level of detail (LoD,长度为基准的细节层次),或称recursive_sequence_lengths(递归序列长度)的正确性
假如我们想用LoD Tensor来承载一词序列的数据,其中每个词由一个整数来表示。现在,我们意图创建一个LoD Tensor来代表两个句子,其中一个句子有两个词,另外一个句子有三个。
那么数 ``data`` 可以是一个numpy数组,形状为(5,1)。同时, ``recursive_seq_lens`` 为 [[2, 3]],表明各个句子的长度。这个长度为基准的 ``recursive_seq_lens`` 将在函数中会被转化为以偏移量为基准的 LoD [[0, 2, 5]]。 2. 将recursive_sequence_lengths转化为offset-based LoD(偏移量为基准的LoD)
参数: 3. 把提供的numpy数组,列表或者已经存在的lod tensor复制到CPU或GPU中(依据执行场所确定)
- **data** (numpy.ndarray|list|LoDTensor) – 容纳着待复制数据的一个numpy数组、列表或LoD Tensor
- **recursive_seq_lens** (list) – 一组列表的列表, 表明了由用户指明的length-based level of detail信息 4. 利用offset-based LoD来设置LoD
- **place** (Place) – CPU或GPU。 指明返回的新LoD Tensor存储地点
例如:
返回: 一个fluid LoDTensor对象,包含数据和 ``recursive_seq_lens`` 信息 假如我们想用LoD Tensor来承载一词序列的数据,其中每个词由一个整数来表示。现在,我们意图创建一个LoD Tensor来代表两个句子,其中一个句子有两个词,另外一个句子有三个。
那么数 ``data`` 可以是一个numpy数组,形状为(5,1)。同时, ``recursive_seq_lens`` 为 [[2, 3]],表明各个句子的长度。这个长度为基准的 ``recursive_seq_lens`` 将在函数中会被转化为以偏移量为基准的 LoD [[0, 2, 5]]。
参数:
- **data** (numpy.ndarray|list|LoDTensor) – 容纳着待复制数据的一个numpy数组、列表或LoD Tensor
- **recursive_seq_lens** (list) – 一组列表的列表, 表明了由用户指明的length-based level of detail信息
- **place** (Place) – CPU或GPU。 指明返回的新LoD Tensor存储地点
返回: 一个fluid LoDTensor对象,包含数据和 ``recursive_seq_lens`` 信息
.. _cn_api_fluid_create_random_int_lodtensor:
create_random_int_lodtensor
-------------------------------
.. py:function:: paddle.fluid.create_random_int_lodtensor(recursive_seq_lens, base_shape, place, low, high)
.. _cn_api_fluid_create_random_int_lodtensor:
该函数创建一个存储多个随机整数的LoD Tensor。
create_random_int_lodtensor
该函数是经常在书中出现的案例,所以我们根据新的API: ``create_lod_tensor`` 更改它然后放在LoD Tensor板块里来简化代码。 -------------------------------
该函数实现以下功能: .. py:function:: paddle.fluid.create_random_int_lodtensor(recursive_seq_lens, base_shape, place, low, high)
1. 根据用户输入的length-based ``recursive_seq_lens`` (基于长度的递归序列长)和在 ``basic_shape`` 中的基本元素形状计算LoDTensor的整体形状
2. 由此形状,建立numpy数组
3. 使用API: ``create_lod_tensor`` 建立LoDTensor 该函数创建一个存储多个随机整数的LoD Tensor。
该函数是经常在书中出现的案例,所以我们根据新的API: ``create_lod_tensor`` 更改它然后放在LoD Tensor板块里来简化代码。
假如我们想用LoD Tensor来承载一词序列,其中每个词由一个整数来表示。现在,我们意图创建一个LoD Tensor来代表两个句子,其中一个句子有两个词,另外一个句子有三个。那么 ``base_shape`` 为[1], 输入的length-based ``recursive_seq_lens`` 是 [[2, 3]]。那么LoDTensor的整体形状应为[5, 1],并且为两个句子存储5个词。
该函数实现以下功能:
参数:
- **recursive_seq_lens** (list) – 一组列表的列表, 表明了由用户指明的length-based level of detail信息 1. 根据用户输入的length-based ``recursive_seq_lens`` (基于长度的递归序列长)和在 ``basic_shape`` 中的基本元素形状计算LoDTensor的整体形状
- **base_shape** (list) – LoDTensor所容纳的基本元素的形状 2. 由此形状,建立numpy数组
- **place** (Place) – CPU或GPU。 指明返回的新LoD Tensor存储地点 3. 使用API: ``create_lod_tensor`` 建立LoDTensor
- **low** (int) – 随机数下限
- **high** (int) – 随机数上限
假如我们想用LoD Tensor来承载一词序列,其中每个词由一个整数来表示。现在,我们意图创建一个LoD Tensor来代表两个句子,其中一个句子有两个词,另外一个句子有三个。那么 ``base_shape`` 为[1], 输入的length-based ``recursive_seq_lens`` 是 [[2, 3]]。那么LoDTensor的整体形状应为[5, 1],并且为两个句子存储5个词。
返回: 一个fluid LoDTensor对象,包含数据和 ``recursive_seq_lens`` 信息
参数:
- **recursive_seq_lens** (list) – 一组列表的列表, 表明了由用户指明的length-based level of detail信息
- **base_shape** (list) – LoDTensor所容纳的基本元素的形状
.. _cn_api_fluid_cuda_pinned_places: - **place** (Place) – CPU或GPU。 指明返回的新LoD Tensor存储地点
- **low** (int) – 随机数下限
cuda_pinned_places - **high** (int) – 随机数上限
-------------------------------
返回: 一个fluid LoDTensor对象,包含数据和 ``recursive_seq_lens`` 信息
.. py:function:: paddle.fluid.cuda_pinned_places(device_count=None)
.. _cn_api_fluid_cuda_pinned_places:
创建 ``fluid.CUDAPinnedPlace`` 对象列表。 cuda_pinned_places
-------------------------------
如果 ``device_count`` 为None,则设备数目将由环境变量 ``CPU_NUM`` 确定。如果未设置 ``CPU_NUM`` ,则设备数目将由 ``multiprocessing.cpu_count()`` 确定。
参数: .. py:function:: paddle.fluid.cuda_pinned_places(device_count=None)
- **device_count** (None|int) - 设备数目
返回: CUDAPinnedPlace对象列表
创建 ``fluid.CUDAPinnedPlace`` 对象列表。
返回类型:out(list(fluid.CUDAPinnedPlace))
如果 ``device_count`` 为None,则设备数目将由环境变量 ``CPU_NUM`` 确定。如果未设置 ``CPU_NUM`` ,则设备数目将由 ``multiprocessing.cpu_count()`` 确定。
参数:
.. _cn_api_fluid_cuda_places: - **device_count** (None|int) - 设备数目
cuda_places 返回: CUDAPinnedPlace对象列表
-------------------------------
返回类型:out(list(fluid.CUDAPinnedPlace))
.. py:function:: paddle.fluid.cuda_places(device_ids=None)
创建 ``fluid.CUDAPlace`` 对象列表。
.. _cn_api_fluid_cuda_places:
如果 ``device_ids`` 为None,则首先检查 ``FLAGS_selected_gpus`` 的环境变量。如果 ``FLAGS_selected_gpus=0,1,2`` ,则返回的列表将为[fluid.CUDAPlace(0), fluid.CUDAPlace(1), fluid.CUDAPlace(2)]。如果未设置标志 ``FLAGS_selected_gpus`` ,则将返回所有可见的GPU places。 cuda_places
-------------------------------
如果 ``device_ids`` 不是None,它应该是GPU的设备ID。例如,如果 ``device_id=[0,1,2]`` ,返回的列表将是[fluid.CUDAPlace(0), fluid.CUDAPlace(1), fluid.CUDAPlace(2)]。 .. py:function:: paddle.fluid.cuda_places(device_ids=None)
参数: 创建 ``fluid.CUDAPlace`` 对象列表。
- **device_ids** (None|list(int)|tuple(int)) - GPU的设备ID列表
返回: CUDAPlace列表
如果 ``device_ids`` 为None,则首先检查 ``FLAGS_selected_gpus`` 的环境变量。如果 ``FLAGS_selected_gpus=0,1,2`` ,则返回的列表将为[fluid.CUDAPlace(0), fluid.CUDAPlace(1), fluid.CUDAPlace(2)]。如果未设置标志 ``FLAGS_selected_gpus`` ,则将返回所有可见的GPU places。
返回类型:out (list(fluid.CUDAPlace))
如果 ``device_ids`` 不是None,它应该是GPU的设备ID。例如,如果 ``device_id=[0,1,2]`` ,返回的列表将是[fluid.CUDAPlace(0), fluid.CUDAPlace(1), fluid.CUDAPlace(2)]。
参数:
- **device_ids** (None|list(int)|tuple(int)) - GPU的设备ID列表
.. _cn_api_fluid_CUDAPinnedPlace:
返回: CUDAPlace列表
CUDAPinnedPlace
------------------------------- 返回类型:out (list(fluid.CUDAPlace))
.. py:class:: paddle.fluid.CUDAPinnedPlace
CUDAPinnedPlace是一个设备描述符,它所指代的存储空间可以被GPU和CPU访问。
.. _cn_api_fluid_CUDAPinnedPlace:
CUDAPinnedPlace
.. _cn_api_fluid_CUDAPlace: -------------------------------
CUDAPlace .. py:class:: paddle.fluid.CUDAPinnedPlace
-------------------------------
CUDAPinnedPlace是一个设备描述符,它所指代的存储空间可以被GPU和CPU访问。
.. py:class:: paddle.fluid.CUDAPlace
CUDAPlace是一个设备描述符,它代表一个GPU,并且每个CUDAPlace有一个dev_id(设备id)来表明当前CUDAPlace代表的卡数。dev_id不同的CUDAPlace所对应的内存不可相互访问。
.. _cn_api_fluid_CUDAPlace:
CUDAPlace
-------------------------------
.. py:class:: paddle.fluid.CUDAPlace
.. _cn_api_fluid_DataFeedDesc:
CUDAPlace是一个设备描述符,它代表一个GPU,并且每个CUDAPlace有一个dev_id(设备id)来表明当前CUDAPlace代表的卡数。dev_id不同的CUDAPlace所对应的内存不可相互访问。
DataFeedDesc
-------------------------------
.. py:class:: paddle.fluid.DataFeedDesc(proto_file)
数据描述符,描述输入训练数据格式。
这个类目前只用于AsyncExecutor(有关类AsyncExecutor的简要介绍,请参阅注释)
.. _cn_api_fluid_DataFeedDesc:
DataFeedDesc应由来自磁盘的有效protobuf消息初始化:
DataFeedDesc
.. code-block:: python -------------------------------
data_feed = fluid.DataFeedDesc('data.proto') .. py:class:: paddle.fluid.DataFeedDesc(proto_file)
可以参考 :code:`paddle/fluid/framework/data_feed.proto` 查看我们如何定义message 数据描述符,描述输入训练数据格式。
一段典型的message可能是这样的: 这个类目前只用于AsyncExecutor(有关类AsyncExecutor的简要介绍,请参阅注释)
.. code-block:: text DataFeedDesc应由来自磁盘的有效protobuf消息初始化:
name: "MultiSlotDataFeed" .. code-block:: python
batch_size: 2
multi_slot_desc { data_feed = fluid.DataFeedDesc('data.proto')
slots {
name: "words" 可以参考 :code:`paddle/fluid/framework/data_feed.proto` 查看我们如何定义message
type: "uint64"
is_dense: false 一段典型的message可能是这样的:
is_used: true
} .. code-block:: text
slots {
name: "label" name: "MultiSlotDataFeed"
type: "uint64" batch_size: 2
is_dense: false multi_slot_desc {
is_used: true slots {
} name: "words"
} type: "uint64"
is_dense: false
但是,用户通常不应该关心消息格式;相反,我们鼓励他们在将原始日志文件转换为AsyncExecutor可以接受的训练文件的过程中,使用 :code:`Data Generator` 生成有效数据描述。 is_used: true
}
DataFeedDesc也可以在运行时更改。一旦你熟悉了每个字段的含义,您可以修改它以更好地满足您的需要。例如: slots {
name: "label"
.. code-block:: python type: "uint64"
is_dense: false
data_feed.set_batch_size(128) is_used: true
data_feed.set_dense_slots('wd') # The slot named 'wd' will be dense }
data_feed.set_use_slots('wd') # The slot named 'wd' will be used }
#Finally, the content can be dumped out for debugging purpose: 但是,用户通常不应该关心消息格式;相反,我们鼓励他们在将原始日志文件转换为AsyncExecutor可以接受的训练文件的过程中,使用 :code:`Data Generator` 生成有效数据描述。
print(data_feed.desc()) DataFeedDesc也可以在运行时更改。一旦你熟悉了每个字段的含义,您可以修改它以更好地满足您的需要。例如:
.. code-block:: python
参数:
- **proto_file** (string) - 包含数据feed中描述的磁盘文件 data_feed.set_batch_size(128)
data_feed.set_dense_slots('wd') # The slot named 'wd' will be dense
data_feed.set_use_slots('wd') # The slot named 'wd' will be used
.. py:method:: set_batch_size(batch_size)
#Finally, the content can be dumped out for debugging purpose:
设置batch size,训练期间有效
print(data_feed.desc())
参数:
- batch_size:batch size 参数:
- **proto_file** (string) - 包含数据feed中描述的磁盘文件
**代码示例:**
.. code-block:: python .. py:method:: set_batch_size(batch_size)
data_feed = fluid.DataFeedDesc('data.proto') 设置batch size,训练期间有效
data_feed.set_batch_size(128)
.. py:method:: set_dense_slots(dense_slots_name) 参数:
- batch_size:batch size
指定slot经过设置后将变成密集的slot,仅在训练期间有效。
**代码示例:**
密集slot的特征将被输入一个Tensor,而稀疏slot的特征将被输入一个lodTensor
.. code-block:: python
参数: data_feed = fluid.DataFeedDesc('data.proto')
- **dense_slots_name** : slot名称的列表,这些slot将被设置为密集的 data_feed.set_batch_size(128)
**代码示例:** .. py:method:: set_dense_slots(dense_slots_name)
.. code-block:: python 指定slot经过设置后将变成密集的slot,仅在训练期间有效。
data_feed = fluid.DataFeedDesc('data.proto') 密集slot的特征将被输入一个Tensor,而稀疏slot的特征将被输入一个lodTensor
data_feed.set_dense_slots(['words'])
.. note:: 参数:
- **dense_slots_name** : slot名称的列表,这些slot将被设置为密集的
默认情况下,所有slot都是稀疏的
**代码示例:**
.. py:method:: set_use_slots(use_slots_name)
.. code-block:: python
设置一个特定的slot是否用于训练。一个数据集包含了很多特征,通过这个函数可以选择哪些特征将用于指定的模型。 data_feed = fluid.DataFeedDesc('data.proto')
data_feed.set_dense_slots(['words'])
参数:
- **use_slots_name** :将在训练中使用的slot名列表 .. note::
**代码示例:** 默认情况下,所有slot都是稀疏的
.. code-block:: python .. py:method:: set_use_slots(use_slots_name)
data_feed = fluid.DataFeedDesc('data.proto')
data_feed.set_use_slots(['words']) 设置一个特定的slot是否用于训练。一个数据集包含了很多特征,通过这个函数可以选择哪些特征将用于指定的模型。
.. note:: 参数:
- **use_slots_name** :将在训练中使用的slot名列表
默认值不用于所有slot
**代码示例:**
.. py:method:: desc() .. code-block:: python
返回此DataFeedDesc的protobuf信息 data_feed = fluid.DataFeedDesc('data.proto')
data_feed.set_use_slots(['words'])
返回:一个message字符串
.. note::
**代码示例:**
默认值不用于所有slot
.. code-block:: python
data_feed = fluid.DataFeedDesc('data.proto') .. py:method:: desc()
print(data_feed.desc())
返回此DataFeedDesc的protobuf信息
返回:一个message字符串
**代码示例:**
.. _cn_api_fluid_DataFeeder: .. code-block:: python
DataFeeder data_feed = fluid.DataFeedDesc('data.proto')
------------------------------- print(data_feed.desc())
.. py:class:: paddle.fluid.DataFeeder(feed_list, place, program=None)
``DataFeeder`` 负责将reader(读取器)返回的数据转成一种特殊的数据结构,使它们可以输入到 ``Executor`` 和 ``ParallelExecutor`` 中。
reader通常返回一个minibatch条目列表。在列表中每一条目都是一个样本(sample),它是由具有一至多个特征的列表或元组组成的。 .. _cn_api_fluid_DataFeeder:
DataFeeder
以下是简单用法: -------------------------------
.. code-block:: python .. py:class:: paddle.fluid.DataFeeder(feed_list, place, program=None)
place = fluid.CPUPlace()
img = fluid.layers.data(name='image', shape=[1, 28, 28])
label = fluid.layers.data(name='label', shape=[1], dtype='int64') ``DataFeeder`` 负责将reader(读取器)返回的数据转成一种特殊的数据结构,使它们可以输入到 ``Executor`` 和 ``ParallelExecutor`` 中。
feeder = fluid.DataFeeder([img, label], fluid.CPUPlace()) reader通常返回一个minibatch条目列表。在列表中每一条目都是一个样本(sample),它是由具有一至多个特征的列表或元组组成的。
result = feeder.feed([([0] * 784, [9]), ([1] * 784, [1])])
在多GPU模型训练时,如果需要提前分别向各GPU输入数据,可以使用 ``decorate_reader`` 函数。 以下是简单用法:
.. code-block:: python .. code-block:: python
place=fluid.CUDAPlace(0) place = fluid.CPUPlace()
feeder = fluid.DataFeeder(place=place, feed_list=[data, label]) img = fluid.layers.data(name='image', shape=[1, 28, 28])
reader = feeder.decorate_reader( label = fluid.layers.data(name='label', shape=[1], dtype='int64')
paddle.batch(flowers.train(), batch_size=16)) feeder = fluid.DataFeeder([img, label], fluid.CPUPlace())
result = feeder.feed([([0] * 784, [9]), ([1] * 784, [1])])
在多GPU模型训练时,如果需要提前分别向各GPU输入数据,可以使用 ``decorate_reader`` 函数。
参数:
- **feed_list** (list) – 向模型输入的变量表或者变量表名 .. code-block:: python
- **place** (Place) – place表明是向GPU还是CPU中输入数据。如果想向GPU中输入数据, 请使用 ``fluid.CUDAPlace(i)`` (i 代表 the GPU id);如果向CPU中输入数据, 请使用 ``fluid.CPUPlace()``
- **program** (Program) – 需要向其中输入数据的Program。如果为None, 会默认使用 ``default_main_program()``。 缺省值为None place=fluid.CUDAPlace(0)
feeder = fluid.DataFeeder(place=place, feed_list=[data, label])
reader = feeder.decorate_reader(
抛出异常: paddle.batch(flowers.train(), batch_size=16))
- ``ValueError`` – 如果一些变量不在此 Program 中
**代码示例** 参数:
- **feed_list** (list) – 向模型输入的变量表或者变量表名
.. code-block:: python - **place** (Place) – place表明是向GPU还是CPU中输入数据。如果想向GPU中输入数据, 请使用 ``fluid.CUDAPlace(i)`` (i 代表 the GPU id);如果向CPU中输入数据, 请使用 ``fluid.CPUPlace()``
- **program** (Program) – 需要向其中输入数据的Program。如果为None, 会默认使用 ``default_main_program()``。 缺省值为None
# ...
place = fluid.CPUPlace()
feed_list = [ 抛出异常:
main_program.global_block().var(var_name) for var_name in feed_vars_name - ``ValueError`` – 如果一些变量不在此 Program 中
] # feed_vars_name 是一个由变量名组成的列表
feeder = fluid.DataFeeder(feed_list, place)
for data in reader(): **代码示例**
outs = exe.run(program=main_program,
feed=feeder.feed(data)) .. code-block:: python
# ...
.. py:method:: feed(iterable) place = fluid.CPUPlace()
feed_list = [
main_program.global_block().var(var_name) for var_name in feed_vars_name
根据feed_list(数据输入表)和iterable(可遍历的数据)提供的信息,将输入数据转成一种特殊的数据结构,使它们可以输入到 ``Executor`` 和 ``ParallelExecutor`` 中。 ] # feed_vars_name 是一个由变量名组成的列表
feeder = fluid.DataFeeder(feed_list, place)
参数: for data in reader():
- **iterable** (list|tuple) – 要输入的数据 outs = exe.run(program=main_program,
feed=feeder.feed(data))
返回: 转换结果
返回类型: dict .. py:method:: feed(iterable)
.. py:method:: feed_parallel(iterable, num_places=None) 根据feed_list(数据输入表)和iterable(可遍历的数据)提供的信息,将输入数据转成一种特殊的数据结构,使它们可以输入到 ``Executor`` 和 ``ParallelExecutor`` 中。
参数:
该方法获取的多个minibatch,并把每个minibatch提前输入进各个设备中。 - **iterable** (list|tuple) – 要输入的数据
参数: 返回: 转换结果
- **iterable** (list|tuple) – 要输入的数据
- **num_places** (int) – 设备数目。默认为None。 返回类型: dict
返回: 转换结果
.. py:method:: feed_parallel(iterable, num_places=None)
返回类型: dict
.. note:: 该方法获取的多个minibatch,并把每个minibatch提前输入进各个设备中。
设备(CPU或GPU)的数目必须等于minibatch的数目
参数:
- **iterable** (list|tuple) – 要输入的数据
- **num_places** (int) – 设备数目。默认为None。
.. py:method:: decorate_reader(reader, multi_devices, num_places=None, drop_last=True)
返回: 转换结果
返回类型: dict
将reader返回的输入数据batch转换为多个mini-batch,之后每个mini-batch都会被输入进各个设备(CPU或GPU)中。
.. note::
参数: 设备(CPU或GPU)的数目必须等于minibatch的数目
- **reader** (fun) – 该参数是一个可以生成数据的函数
- **multi_devices** (bool) – bool型,指明是否使用多个设备
- **num_places** (int) – 如果 ``multi_devices`` 为 ``True`` , 可以使用此参数来设置GPU数目。如果 ``num_places`` 为 ``None`` ,该函数默认使用当前训练机所有GPU设备。默认为None。
- **drop_last** (bool) – 如果最后一个batch的大小比 ``batch_size`` 要小,则可使用该参数来指明是否选择丢弃最后一个batch数据。 默认为 ``True`` .. py:method:: decorate_reader(reader, multi_devices, num_places=None, drop_last=True)
返回:转换结果
返回类型: dict 将reader返回的输入数据batch转换为多个mini-batch,之后每个mini-batch都会被输入进各个设备(CPU或GPU)中。
抛出异常: ``ValueError`` – 如果 ``drop_last`` 值为False并且data batch与设备不匹配时,产生此异常 参数:
- **reader** (fun) – 该参数是一个可以生成数据的函数
- **multi_devices** (bool) – bool型,指明是否使用多个设备
- **num_places** (int) – 如果 ``multi_devices`` 为 ``True`` , 可以使用此参数来设置GPU数目。如果 ``multi_devices`` 为 ``None`` ,该函数默认使用当前训练机所有GPU设备。默认为None。
- **drop_last** (bool) – 如果最后一个batch的大小比 ``batch_size`` 要小,则可使用该参数来指明是否选择丢弃最后一个batch数据。 默认为 ``True``
返回:转换结果
返回类型: dict
抛出异常: ``ValueError`` – 如果 ``drop_last`` 值为False并且data batch与设备不匹配时,产生此异常
.. _cn_api_fluid_default_main_program:
default_main_program
-------------------------------
.. py:function:: paddle.fluid.default_main_program()
.. _cn_api_fluid_default_main_program:
此函数用于获取默认或全局main program(主程序)。该主程序用于训练和测试模型。
default_main_program
``fluid.layers`` 中的所有layer函数可以向 ``default_main_program`` 中添加operators(算子)和variables(变量)。 -------------------------------
``default_main_program`` 是fluid的许多编程接口(API)的Program参数的缺省值。例如,当用户program没有传入的时候, .. py:function:: paddle.fluid.default_main_program()
``Executor.run()`` 会默认执行 ``default_main_program`` 。
返回: main program
返回类型: Program 此函数用于获取默认或全局main program(主程序)。该主程序用于训练和测试模型。
``fluid.layers`` 中的所有layer函数可以向 ``default_main_program`` 中添加operators(算子)和variables(变量)。
``default_main_program`` 是fluid的许多编程接口(API)的Program参数的缺省值。例如,当用户program没有传入的时候,
``Executor.run()`` 会默认执行 ``default_main_program`` 。
返回: main program
返回类型: Program
.. _cn_api_fluid_default_startup_program:
default_startup_program
-------------------------------
.. py:function:: paddle.fluid.default_startup_program()
.. _cn_api_fluid_default_startup_program:
该函数可以获取默认/全局 startup program (启动程序)。
``fluid.layers`` 中的layer函数会新建参数、readers(读取器)、NCCL句柄作为全局变量。
default_startup_program
startup_program会使用内在的operators(算子)去初始化他们,并由layer函数将这些operators追加到startup program中。 -------------------------------
该函数将返回默认的或当前的startup_program。用户可以使用 ``fluid.program_guard`` 去切换program。 .. py:function:: paddle.fluid.default_startup_program()
返回: startup program
返回类型: Program 该函数可以获取默认/全局 startup program (启动程序)。
``fluid.layers`` 中的layer函数会新建参数、readers(读取器)、NCCL句柄作为全局变量。
startup_program会使用内在的operators(算子)去初始化他们,并由layer函数将这些operators追加到startup program中。
该函数将返回默认的或当前的startup_program。用户可以使用 ``fluid.program_guard`` 去切换program。
返回: startup program
返回类型: Program
.. _cn_api_fluid_DistributeTranspiler:
DistributeTranspiler
-------------------------------
.. py:class:: paddle.fluid.DistributeTranspiler (config=None)
该类可以把fluid program转变为分布式数据并行计算程序(distributed data-parallelism programs),可以有Pserver和NCCL2两种模式。
当program在Pserver(全称:parameter server)模式下, ``main_program`` (主程序)转为使用一架远程parameter server(即pserver,参数服务器)来进行参数优化,并且优化图会被输入到一个pserver program中。
在NCCL2模式下,transpiler会在 ``startup_program`` 中附加一个 ``NCCL_ID`` 广播算子(broadcasting operators)来实现在该集群中所有工作结点共享 ``NCCL_ID`` 。 .. _cn_api_fluid_DistributeTranspiler:
调用 ``transpile_nccl2`` 后, 你 **必须** 将 ``trainer_id`` , ``num_trainers`` 参数提供给 ``ParallelExecutor`` 来启动NCCL2分布式模式。
DistributeTranspiler
-------------------------------
.. py:class:: paddle.fluid.DistributeTranspiler (config=None)
**代码示例**
.. code-block:: python 该类可以把fluid program转变为分布式数据并行计算程序(distributed data-parallelism programs),可以有Pserver和NCCL2两种模式。
当program在Pserver(全称:parameter server)模式下, ``main_program`` (主程序)转为使用一架远程parameter server(即pserver,参数服务器)来进行参数优化,并且优化图会被输入到一个pserver program中。
#pserver模式下 在NCCL2模式下,transpiler会在 ``startup_program`` 中附加一个 ``NCCL_ID`` 广播算子(broadcasting operators)来实现在该集群中所有工作结点共享 ``NCCL_ID`` 。
pserver_endpoints = "192.168.0.1:6174,192.168.0.2:6174" 调用 ``transpile_nccl2`` 后, 你 **必须** 将 ``trainer_id`` , ``num_trainers`` 参数提供给 ``ParallelExecutor`` 来启动NCCL2分布式模式。
trainer_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
current_endpoint = "192.168.0.1:6174"
trainer_id = 0
trainers = 4
role = os.getenv("PADDLE_TRAINING_ROLE") **代码示例**
t = fluid.DistributeTranspiler() .. code-block:: python
t.transpile(
trainer_id, pservers=pserver_endpoints, trainers=trainers) #pserver模式下
if role == "PSERVER": pserver_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
pserver_program = t.get_pserver_program(current_endpoint) trainer_endpoints = "192.168.0.1:6174,192.168.0.2:6174"
pserver_startup_program = t.get_startup_program(current_endpoint, current_endpoint = "192.168.0.1:6174"
pserver_program) trainer_id = 0
elif role == "TRAINER": trainers = 4
trainer_program = t.get_trainer_program() role = os.getenv("PADDLE_TRAINING_ROLE")
# nccl2模式下 t = fluid.DistributeTranspiler()
config = fluid.DistributeTranspilerConfig() t.transpile(
config.mode = "nccl2" trainer_id, pservers=pserver_endpoints, trainers=trainers)
t = fluid.DistributeTranspiler(config=config) if role == "PSERVER":
t.transpile(trainer_id, workers=workers, current_endpoint=curr_ep) pserver_program = t.get_pserver_program(current_endpoint)
exe = fluid.ParallelExecutor( pserver_startup_program = t.get_startup_program(current_endpoint,
use_cuda, pserver_program)
loss_name=loss_var.name, elif role == "TRAINER":
num_trainers=len(trainers.split(",)), trainer_program = t.get_trainer_program()
trainer_id=trainer_id
) # nccl2模式下
config = fluid.DistributeTranspilerConfig()
config.mode = "nccl2"
t = fluid.DistributeTranspiler(config=config)
.. py:method:: transpile(trainer_id, program=None, pservers='127.0.0.1:6174', trainers=1, sync_mode=True, startup_program=None, current_endpoint='127.0.0.1:6174') t.transpile(trainer_id, workers=workers, current_endpoint=curr_ep)
exe = fluid.ParallelExecutor(
该方法可以运行该transpiler(转译器)。 use_cuda,
loss_name=loss_var.name,
参数: num_trainers=len(trainers.split(",)),
- **trainer_id** (int) – 当前Trainer worker的id, 如果有n个Trainer worker, id 取值范围为0 ~ n-1 trainer_id=trainer_id
- **program** (Program|None) – 待transpile(转译)的program, 缺省为 ``fluid.default_main_program()`` )
- **startup_program** (Program|None) - 要转译的 ``startup_program`` ,默认为 ``fluid.default_startup_program()``
- **pservers** (str) – 内容为Pserver列表的字符串,格式为:按逗号区分不同的Pserver,每个Pserver的格式为 *ip地址:端口号*
- **trainers** (int|str) – 在Pserver模式下,该参数指Trainer机的个数;在nccl2模式下,它是一个内容为Trainer终端列表的字符串
- **sync_mode** (bool) – 是否做同步训练(synchronous training), 默认为True .. py:method:: transpile(trainer_id, program=None, pservers='127.0.0.1:6174', trainers=1, sync_mode=True, startup_program=None, current_endpoint='127.0.0.1:6174')
- **startup_program** (Program|None) – 待transpile(转译)的startup_program,默认为 ``fluid.default_main_program()``
- **current_endpoint** (str) – 当需要把program转译(transpile)至NCCL2模式下时,需要将当前endpoint(终端)传入该参数。Pserver模式不使用该参数 该方法可以运行该transpiler(转译器)。
.. py:method:: get_trainer_program(wait_port=True) 参数:
- **trainer_id** (int) – 当前Trainer worker的id, 如果有n个Trainer worker, id 取值范围为0 ~ n-1
- **program** (Program|None) – 待transpile(转译)的program, 缺省为 ``fluid.default_main_program()``
该方法可以得到Trainer侧的program。 - **startup_program** (Program|None) - 要转译的 ``startup_program`` ,默认为 ``fluid.default_startup_program()``
- **pservers** (str) – 内容为Pserver列表的字符串,格式为:按逗号区分不同的Pserver,每个Pserver的格式为 *ip地址:端口号*
返回: Trainer侧的program - **trainers** (int|str) – 在Pserver模式下,该参数指Trainer机的个数;在nccl2模式下,它是一个内容为Trainer终端列表的字符串
- **sync_mode** (bool) – 是否做同步训练(synchronous training), 默认为True
返回类型: Program - **startup_program** (Program|None) – 待transpile(转译)的startup_program,默认为 ``fluid.default_main_program()``
- **current_endpoint** (str) – 当需要把program转译(transpile)至NCCL2模式下时,需要将当前endpoint(终端)传入该参数。Pserver模式不使用该参数
.. py:method:: get_trainer_program(wait_port=True)
.. py:method:: get_pserver_program(endpoint)
该方法可以得到Trainer侧的program。
该方法可以得到Pserver(参数服务器)侧的程序
返回: Trainer侧的program
参数:
- **endpoint** (str) – 当前Pserver终端 返回类型: Program
返回: 当前Pserver需要执行的program
返回类型: Program .. py:method:: get_pserver_program(endpoint)
.. py:method:: get_pserver_programs(endpoint) 该方法可以得到Pserver(参数服务器)侧的程序
参数:
该方法可以得到Pserver侧用于分布式训练的 ``main_program`` 和 ``startup_program`` 。 - **endpoint** (str) – 当前Pserver终端
参数: 返回: 当前Pserver需要执行的program
- **endpoint** (str) – 当前Pserver终端
返回类型: Program
返回: (main_program, startup_program), “Program”类型的元组
返回类型: tuple .. py:method:: get_pserver_programs(endpoint)
.. py:method:: get_startup_program(endpoint, pserver_program=None, startup_program=None) 该方法可以得到Pserver侧用于分布式训练的 ``main_program`` 和 ``startup_program`` 。
参数:
**该函数已停止使用** - **endpoint** (str) – 当前Pserver终端
获取当前Pserver的startup_program,如果有多个被分散到不同blocks的变量,则修改operator的输入变量。
返回: (main_program, startup_program), “Program”类型的元组
参数:
- **endpoint** (str) – 当前Pserver终端 返回类型: tuple
- **pserver_program** (Program) – 已停止使用。 先调用get_pserver_program
- **startup_program** (Program) – 已停止使用。应在初始化时传入startup_program
.. py:method:: get_startup_program(endpoint, pserver_program=None, startup_program=None)
返回: Pserver侧的startup_program
返回类型: Program **该函数已停止使用**
获取当前Pserver的startup_program,如果有多个被分散到不同blocks的变量,则修改operator的输入变量。
参数:
- **endpoint** (str) – 当前Pserver终端
- **pserver_program** (Program) – 已停止使用。 先调用get_pserver_program
- **startup_program** (Program) – 已停止使用。应在初始化时传入startup_program
返回: Pserver侧的startup_program
.. _cn_api_fluid_DistributeTranspilerConfig: 返回类型: Program
DistributeTranspilerConfig
-------------------------------
.. py:class:: paddle.fluid.DistributeTranspilerConfig
.. py:attribute:: slice_var_up (bool)
为多个Pserver(parameter server)将tensor切片, 默认为True。 .. _cn_api_fluid_DistributeTranspilerConfig:
.. py:attribute:: split_method (PSDispatcher) DistributeTranspilerConfig
-------------------------------
可使用 RoundRobin 或者 HashName。
.. py:class:: paddle.fluid.DistributeTranspilerConfig
注意: 尝试选择最佳方法来达到Pserver间负载均衡。
.. py:attribute:: min_block_size (int) .. py:attribute:: slice_var_up (bool)
block中分割(split)出的元素个数的最小值。 为多个Pserver(parameter server)将tensor切片, 默认为True。
注意: 根据:`issuecomment-369912156 <https://github.com/PaddlePaddle/Paddle/issues/8638#issuecomment-369912156>`_ , 当数据块大小超过2MB时,我们可以有效地使用带宽。如果你想更改它,请详细查看 ``slice_variable`` 函数。 .. py:attribute:: split_method (PSDispatcher)
可使用 RoundRobin 或者 HashName。
注意: 尝试选择最佳方法来达到Pserver间负载均衡。
.. py:attribute:: min_block_size (int)
.. _cn_api_fluid_ExecutionStrategy: block中分割(split)出的元素个数的最小值。
ExecutionStrategy 注意: 根据:`issuecomment-369912156 <https://github.com/PaddlePaddle/Paddle/issues/8638#issuecomment-369912156>`_ , 当数据块大小超过2MB时,我们可以有效地使用带宽。如果你想更改它,请详细查看 ``slice_variable`` 函数。
-------------------------------
.. py:class:: paddle.fluid.ExecutionStrategy
``ExecutionStrategy`` 允许用户更加精准地控制program在 ``ParallelExecutor`` 中的运行方式。可以通过在 ``ParallelExecutor`` 中设置本成员来实现。
**代码示例**
.. _cn_api_fluid_ExecutionStrategy:
.. code-block:: python
ExecutionStrategy
exec_strategy = fluid.ExecutionStrategy() -------------------------------
exec_strategy.num_threads = 4
.. py:class:: paddle.fluid.ExecutionStrategy
train_exe = fluid.ParallelExecutor(use_cuda=True,
loss_name=loss.name, ``ExecutionStrategy`` 允许用户更加精准地控制program在 ``ParallelExecutor`` 中的运行方式。可以通过在 ``ParallelExecutor`` 中设置本成员来实现。
exec_strategy=exec_strategy)
**代码示例**
train_loss, = train_exe.run([loss.name], feed=feed_dict)
.. code-block:: python
exec_strategy = fluid.ExecutionStrategy()
.. py:attribute:: allow_op_delay exec_strategy.num_threads = 4
这是一个bool类型成员,表示是否推迟communication operators(交流运算)的执行,这样做会使整体执行过程更快一些。但是在一些模型中,allow_op_delay会导致程序中断。默认为False。 train_exe = fluid.ParallelExecutor(use_cuda=True,
loss_name=loss.name,
exec_strategy=exec_strategy)
.. py:attribute:: num_iteration_per_drop_scope train_loss, = train_exe.run([loss.name], feed=feed_dict)
int型成员。它表明了清空执行时产生的临时变量需要的程序执行重复次数。因为临时变量的形状可能在两次重复过程中保持一致,所以它会使整体执行过程更快。默认值为100。
.. note:: .. py:attribute:: allow_op_delay
1. 如果在调用 ``run`` 方法时获取结果数据,``ParallelExecutor`` 会在当前程序重复执行尾部清空临时变量
这是一个bool类型成员,表示是否推迟communication operators(交流运算)的执行,这样做会使整体执行过程更快一些。但是在一些模型中,allow_op_delay会导致程序中断。默认为False。
2. 在一些NLP模型里,该成员会致使GPU内存不足。此时,你应减少 ``num_iteration_per_drop_scope`` 的值
.. py:attribute:: num_iteration_per_drop_scope
.. py:attribute:: num_threads
int型成员。它表明了清空执行时产生的临时变量需要的程序执行重复次数。因为临时变量的形状可能在两次重复过程中保持一致,所以它会使整体执行过程更快。默认值为100。
int型成员。它代表了线程池(thread pool)的大小。这些线程会被用来执行当前 ``ParallelExecutor`` 的program中的operator(算子,运算)。如果 :math:`num\_threads=1` ,则所有的operator将一个接一个地执行,但在不同的程序重复周期(iterations)中执行顺序可能不同。如果该成员没有被设置,则在 ``ParallelExecutor`` 中,它会依据设备类型(device type)、设备数目(device count)而设置为相应值。对GPU,:math:`num\_threads=device\_count∗4` ;对CPU, :math:`num\_threads=CPU\_NUM∗4` 。在 ``ParallelExecutor`` 中有关于 :math:`CPU\_NUM` 的详细解释。如果没有设置 :math:`CPU\_NUM` , ``ParallelExecutor`` 可以通过调用 ``multiprocessing.cpu_count()`` 获取CPU数目(cpu count)。默认值为0。
.. note::
1. 如果在调用 ``run`` 方法时获取结果数据,``ParallelExecutor`` 会在当前程序重复执行尾部清空临时变量
2. 在一些NLP模型里,该成员会致使GPU内存不足。此时,你应减少 ``num_iteration_per_drop_scope`` 的值
.. py:attribute:: num_threads
int型成员。它代表了线程池(thread pool)的大小。这些线程会被用来执行当前 ``ParallelExecutor`` 的program中的operator(算子,运算)。如果 :math:`num\_threads=1` ,则所有的operator将一个接一个地执行,但在不同的程序重复周期(iterations)中执行顺序可能不同。如果该成员没有被设置,则在 ``ParallelExecutor`` 中,它会依据设备类型(device type)、设备数目(device count)而设置为相应值。对GPU,:math:`num\_threads=device\_count∗4` ;对CPU, :math:`num\_threads=CPU\_NUM∗4` 。在 ``ParallelExecutor`` 中有关于 :math:`CPU\_NUM` 的详细解释。如果没有设置 :math:`CPU\_NUM` , ``ParallelExecutor`` 可以通过调用 ``multiprocessing.cpu_count()`` 获取CPU数目(cpu count)。默认值为0。
.. _cn_api_fluid_executor:
Executor
-------------------------------
.. py:class:: paddle.fluid.Executor (place)
.. _cn_api_fluid_executor:
执行引擎(Executor)使用python脚本驱动,仅支持在单GPU环境下运行。多卡环境下请参考 ``ParallelExecutor`` 。
Python Executor可以接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表) Executor
向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。 -------------------------------
feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量(或识别类场景中的命名)。
应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。 .. py:class:: paddle.fluid.Executor (place)
Executor将全局变量存储到全局作用域中,并为临时变量创建局部作用域。
当每一mini-batch上的前向/反向运算完成后,局部作用域的内容将被废弃,
但全局作用域中的变量将在Executor的不同执行过程中一直存在。
执行引擎(Executor)使用python脚本驱动,支持在单/多GPU、单/多CPU环境下运行。
program中所有的算子会按顺序执行。 Python Executor可以接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表)
向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。
**示例代码** feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量(或识别类场景中的命名)。
.. code-block:: python 应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。
# 新建一个执行引擎Executor名为exe。 Executor将全局变量存储到全局作用域中,并为临时变量创建局部作用域。
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() 当每一mini-batch上的前向/反向运算完成后,局部作用域的内容将被废弃,
exe = fluid.Executor(place) 但全局作用域中的变量将在Executor的不同执行过程中一直存在。
# 仅运行一次startup program.
# 不需要优化/编译这个startup program. **示例代码**
exe.run(fluid.default_startup_program())
.. code-block:: python
# 无需编译,直接运行main program
loss, = exe.run(fluid.default_main_program(), # 新建一个执行引擎Executor名为exe。
feed=feed_dict, place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
fetch_list=[loss.name]) exe = fluid.Executor(place)
# 另一种方法是,编译这个main program然后运行. 参考CompiledProgram # 仅运行一次startup program.
compiled_prog = compiler.CompiledProgram( # 不需要优化/编译这个startup program.
fluid.default_main_program()).with_data_parallel( exe.run(fluid.default_startup_program())
loss_name=loss.name)
loss, = exe.run(compiled_prog, # 无需编译,直接运行main program
feed=feed_dict, loss, = exe.run(fluid.default_main_program(),
fetch_list=[loss.name]) feed=feed_dict,
fetch_list=[loss.name])
参数: # 另一种方法是,编译这个main program然后运行. 参考CompiledProgram
- **place** (core.CPUPlace|core.CUDAPlace(n)) – 指明了 ``Executor`` 的执行场所 compiled_prog = compiler.CompiledProgram(
fluid.default_main_program()).with_data_parallel(
loss_name=loss.name)
loss, = exe.run(compiled_prog,
提示:你可以用 ``Executor`` 来调试基于并行GPU实现的复杂网络,他们有完全一样的参数也会产生相同的结果。 feed=feed_dict,
fetch_list=[loss.name])
.. py:method:: close()
参数:
- **place** (core.CPUPlace|core.CUDAPlace(n)) – 指明了 ``Executor`` 的执行场所
关闭这个执行器(Executor)。调用这个方法后不可以再使用这个执行器。 对于分布式训练, 该函数会释放在PServers上涉及到目前训练器的资源。
**示例代码**
.. py:method:: close()
.. code-block:: python
cpu = core.CPUPlace() 关闭这个执行器(Executor)。
exe = Executor(cpu)
... 调用这个方法后不可以再使用这个执行器。 对于分布式训练, 该函数会释放在PServers上和目前Trainer有关联的资源。
exe.close()
**示例代码**
.. py:method:: run(program=None, feed=None, fetch_list=None, feed_var_name='feed', fetch_var_name='fetch', scope=None, return_numpy=True,use_program_cache=False) .. code-block:: python
cpu = core.CPUPlace()
调用该执行器对象的此方法可以执行program。通过feed map提供待学习数据,以及借助fetch_list得到相应的结果。 exe = Executor(cpu)
Python执行器(Executor)可以接收传入的program,并根据输入映射表(feed map)和结果获取表(fetch_list) ...
向program中添加数据输入算子(feed operators)和结果获取算子(fetch operators)。 exe.close()
feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量(或识别类场景中的命名)。
应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。 .. py:method:: run(program=None, feed=None, fetch_list=None, feed_var_name='feed', fetch_var_name='fetch', scope=None, return_numpy=True,use_program_cache=False)
参数:
- **program** (Program|CompiledProgram) – 需要执行的program,如果没有给定那么默认使用default_main_program (未编译的) 调用该执行器对象的此方法可以执行program。通过feed map提供待学习数据,以及借助fetch_list得到相应的结果。
- **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LabelData} Python执行器(Executor)可以接收传入的program,并根据输入映射表(feed map)和结果获取表(fetch_list)
- **fetch_list** (list) – 用户想得到的变量或者命名的列表, run会根据这个列表给与结果 向program中添加数据输入算子(feed operators)和结果获取算子(fetch operators)。
- **feed_var_name** (str) – 前向算子(feed operator)变量的名称 feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量(或识别类场景中的命名)。
- **fetch_var_name** (str) – 结果获取算子(fetch operator)的输出变量名称
- **scope** (Scope) – 执行这个program的域,用户可以指定不同的域。缺省为全局域 应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。
- **return_numpy** (bool) – 如果为True,则将结果张量(fetched tensor)转化为numpy
- **use_program_cache** (bool) – 当program较上次比没有改动则将其置为True 参数:
- **program** (Program|CompiledProgram) – 需要执行的program,如果没有给定那么默认使用default_main_program (未编译的)
返回: 根据fetch_list来获取结果 - **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LabelData}
- **fetch_list** (list) – 用户想得到的变量或者命名的列表, 该方法会根据这个列表给出结果
返回类型: list(numpy.array) - **feed_var_name** (str) – 前向算子(feed operator)变量的名称
- **fetch_var_name** (str) – 结果获取算子(fetch operator)的输出变量名称
- **scope** (Scope) – 执行这个program的域,用户可以指定不同的域。缺省为全局域
**示例代码** - **return_numpy** (bool) – 如果为True,则将结果张量(fetched tensor)转化为numpy
- **use_program_cache** (bool) – 是否跨批使用缓存程序设置。设置为True时,只有当(1)程序没有用数据并行编译,并且(2)program、 feed变量名和fetch_list变量名与上一步相比没有更改时,运行速度才会更快。
.. code-block:: python
返回: 根据fetch_list来获取结果
data = fluid.layers.data(name='X', shape=[1], dtype='float32') 返回类型: list(numpy.array)
hidden = fluid.layers.fc(input=data, size=10)
layers.assign(hidden, out)
loss = fluid.layers.mean(out) **示例代码**
adam = fluid.optimizer.Adam()
adam.minimize(loss) .. code-block:: python
.. code-block:: python data = fluid.layers.data(name='X', shape=[1], dtype='float32')
hidden = fluid.layers.fc(input=data, size=10)
layers.assign(hidden, out)
cpu = core.CPUPlace() loss = fluid.layers.mean(out)
exe = Executor(cpu) adam = fluid.optimizer.Adam()
exe.run(default_startup_program()) adam.minimize(loss)
.. code-block:: python
.. code-block:: python
x = numpy.random.random(size=(10, 1)).astype('float32')
outs = exe.run(
feed={'X': x}, cpu = core.CPUPlace()
fetch_list=[loss.name]) exe = Executor(cpu)
exe.run(default_startup_program())
.. code-block:: python
x = numpy.random.random(size=(10, 1)).astype('float32')
outs = exe.run(
feed={'X': x},
fetch_list=[loss.name])
.. _cn_api_fluid_global_scope:
global_scope
-------------------------------
.. py:function:: paddle.fluid.global_scope()
获取全局/默认作用域实例。很多api使用默认 ``global_scope`` ,例如 ``Executor.run`` 。 .. _cn_api_fluid_global_scope:
返回:全局/默认作用域实例 global_scope
-------------------------------
返回类型:Scope
.. py:function:: paddle.fluid.global_scope()
获取全局/默认作用域实例。很多api使用默认 ``global_scope`` ,例如 ``Executor.run`` 。
.. _cn_api_fluid_in_dygraph_mode: 返回:全局/默认作用域实例
in_dygraph_mode 返回类型:Scope
-------------------------------
.. py:function:: paddle.fluid.in_dygraph_mode()
返回:bool,如果Program是在动态图模式下运行的则为True。
.. _cn_api_fluid_in_dygraph_mode:
in_dygraph_mode
-------------------------------
.. py:function:: paddle.fluid.in_dygraph_mode()
.. _cn_api_fluid_LoDTensor:
返回:bool,如果Program是在动态图模式下运行的则为True。
LoDTensor
-------------------------------
.. py:class:: paddle.fluid.LoDTensor
LoDTensor是一个具有LoD信息的张量(Tensor) .. _cn_api_fluid_LoDTensor:
``np.array(lod_tensor)`` 可以将LoDTensor转换为numpy array。 LoDTensor
-------------------------------
``lod_tensor.lod()`` 可以获得LoD信息。
.. py:class:: paddle.fluid.LoDTensor
LoD是多层序列(Level of Details)的缩写,通常用于不同长度的序列。如果您不需要了解LoD信息,可以跳过下面的注解。
举例: LoDTensor是一个具有LoD信息的张量(Tensor)
X 为 LoDTensor,它包含两个序列。第一个长度是2,第二个长度是3。 ``np.array(lod_tensor)`` 可以将LoDTensor转换为numpy array。
从Lod中可以计算出X的第一维度为5, 因为5=2+3, 说明X中有5个序列。在X中的每个序列中的每个元素有2列,因此X的shape为[5,2]。 ``lod_tensor.lod()`` 可以获得LoD信息。
:: LoD是多层序列(Level of Details)的缩写,通常用于不同长度的序列。如果您不需要了解LoD信息,可以跳过下面的注解。
x.lod = [[2, 3]] 举例:
x.data = [[1, 2], [3, 4], // seq 1
X 为 LoDTensor,它包含两个序列。第一个长度是2,第二个长度是3。
[5, 6], [7, 8], [9, 10]] // seq 2
从Lod中可以计算出X的第一维度为5, 因为5=2+3, 说明X中有5个序列。在X中的每个序列中的每个元素有2列,因此X的shape为[5,2]。
x.shape = [5, 2]
::
LoD可以有多个level(例如,一个段落可以有多个句子,一个句子可以有多个单词)。下面的例子中,Y为LoDTensor ,lod_level为2。表示有2个序列,第一个序列的长度是2(有2个子序列),第二个序列的长度是1。第一序列的两个子序列长度分别为2和2。第二个序列的子序列的长度是3。 x.lod = [[2, 3]]
x.data = [[1, 2], [3, 4], // seq 1
:: [5, 6], [7, 8], [9, 10]] // seq 2
y.lod = [[2 1], [2 2 3]] y.shape = [2+2+3, ...] x.shape = [5, 2]
.. note:: LoD可以有多个level(例如,一个段落可以有多个句子,一个句子可以有多个单词)。下面的例子中,Y为LoDTensor ,lod_level为2。表示有2个序列,第一个序列的长度是2(有2个子序列),第二个序列的长度是1。第一序列的两个子序列长度分别为2和2。第二个序列的子序列的长度是3。
在上面的描述中,LoD是基于长度的。在paddle内部实现中,lod是基于偏移的。因此,在内部,y.lod表示为[[0,2,3],[0,2,4,7]](基于长度的Lod表示为为[[2-0,3-2],[2-0,4-2,7-4]])。
::
可以将LoD理解为recursive_sequence_length(递归序列长度)。此时,LoD必须是基于长度的。由于历史原因。当LoD在API中被称为lod时,它可能是基于偏移的。用户应该注意。
y.lod = [[2 1], [2 2 3]] y.shape = [2+2+3, ...]
.. note::
.. py:method:: has_valid_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → bool
在上面的描述中,LoD是基于长度的。在paddle内部实现中,lod是基于偏移的。因此,在内部,y.lod表示为[[0,2,3],[0,2,4,7]](基于长度的Lod表示为为[[2-0,3-2],[2-0,4-2,7-4]])。
检查LoDTensor的lod值的正确性。
可以将LoD理解为recursive_sequence_length(递归序列长度)。此时,LoD必须是基于长度的。由于历史原因。当LoD在API中被称为lod时,它可能是基于偏移的。用户应该注意。
返回: 是否带有正确的lod值
返回类型: out (bool)
.. py:method:: lod(self: paddle.fluid.core.LoDTensor) → List[List[int]] .. py:method:: has_valid_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → bool
得到LoD Tensor的LoD。 检查LoDTensor的lod值的正确性。
返回:LoD Tensor的LoD。 返回: 是否带有正确的lod值
返回类型:out(List [List [int]]) 返回类型: out (bool)
.. py:method:: lod(self: paddle.fluid.core.LoDTensor) → List[List[int]]
.. py:method:: recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → List[List[int]]
得到LoD Tensor的LoD。
得到与LoD对应的LoDTensor的序列长度。
返回:LoD Tensor的LoD。
返回:LoD对应的一至多个序列长度。
返回类型:out(List [List [int]])
返回类型:out(List [List [int])
.. py:method:: recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → List[List[int]]
.. py:method:: set_lod(self: paddle.fluid.core.LoDTensor, lod: List[List[int]]) → None 得到与LoD对应的LoDTensor的序列长度。
设置LoDTensor的LoD。 返回:LoD对应的一至多个序列长度。
参数: 返回类型:out(List [List [int])
- **lod** (List [List [int]]) - 要设置的lod。
.. py:method:: set_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor, recursive_sequence_lengths: List[List[int]]) → None
.. py:method:: set_lod(self: paddle.fluid.core.LoDTensor, lod: List[List[int]]) → None
根据递归序列长度recursive_sequence_lengths设置LoDTensor的LoD。
设置LoDTensor的LoD。
::
参数:
例如,如果recursive_sequence_lengths = [[2,3]], - **lod** (List [List [int]]) - 要设置的lod。
意味着有两个长度分别为2和3的序列,相应的lod将是[[0,2,2 + 3]],即[[0, 2,5]]。
.. py:method:: set_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor, recursive_sequence_lengths: List[List[int]]) → None
参数:
- **recursive_sequence_lengths** (List [List [int]]) - 序列长度。 根据递归序列长度recursive_sequence_lengths设置LoDTensor的LoD。
::
例如,如果recursive_sequence_lengths = [[2,3]],
意味着有两个长度分别为2和3的序列,相应的lod将是[[0,2,2 + 3]],即[[0, 2,5]]。
参数:
- **recursive_sequence_lengths** (List [List [int]]) - 序列长度。
.. _cn_api_fluid_LoDTensorArray:
LoDTensorArray
-------------------------------
.. py:class:: paddle.fluid.LoDTensorArray
.. py:method:: append(self: paddle.fluid.core.LoDTensorArray, tensor: paddle.fluid.core.LoDTensor) → None
.. _cn_api_fluid_LoDTensorArray:
将LoDTensor追加到LoDTensorArray后。
LoDTensorArray
-------------------------------
.. py:class:: paddle.fluid.LoDTensorArray
.. py:method:: append(self: paddle.fluid.core.LoDTensorArray, tensor: paddle.fluid.core.LoDTensor) → None
将LoDTensor追加到LoDTensorArray后。
.. _cn_api_fluid_memory_optimize:
memory_optimize
-------------------------------
.. py:function:: paddle.fluid.memory_optimize(input_program, skip_opt_set=None, print_log=False, level=0, skip_grads=False)
通过重用var内存来优化内存。 .. _cn_api_fluid_memory_optimize:
.. note:: memory_optimize
它不支持block中嵌套子block。 -------------------------------
参数: .. py:function:: paddle.fluid.memory_optimize(input_program, skip_opt_set=None, print_log=False, level=0, skip_grads=False)
- **input_program** (str) – 输入Program。
- **skip_opt_set** (set) – set中的vars将不被内存优化。
- **print_log** (bool) – 是否打印debug日志。 通过重用var内存来优化内存。
- **level** (int) 如果 level=0 并且shape是完全相等,则重用。
.. note::
返回: None 它不支持block中嵌套子block。
参数:
- **input_program** (str) – 输入Program。
- **skip_opt_set** (set) – set中的vars将不被内存优化。
- **print_log** (bool) – 是否打印debug日志。
- **level** (int) 如果 level=0 并且shape是完全相等,则重用。
返回: None
.. _cn_api_fluid_name_scope:
name_scope
-------------------------------
.. py:function:: paddle.fluid.name_scope(prefix=None)
为operators生成层次名称前缀 .. _cn_api_fluid_name_scope:
注意: 这个函数只能用于调试和可视化。不要将其用于分析,比如graph/program转换。 name_scope
-------------------------------
参数:
- **prefix** (str) - 前缀 .. py:function:: paddle.fluid.name_scope(prefix=None)
**示例代码**
为operators生成层次名称前缀
.. code-block:: python
注意: 这个函数只能用于调试和可视化。不要将其用于分析,比如graph/program转换。
with name_scope("encoder"):
... 参数:
with name_scope("decoder"): - **prefix** (str) - 前缀
...
with name_scope("attention"): **示例代码**
...
.. code-block:: python
with name_scope("encoder"):
...
with name_scope("decoder"):
...
with name_scope("attention"):
.. _cn_api_fluid_ParallelExecutor: ...
ParallelExecutor
-------------------------------
.. py:class:: paddle.fluid.ParallelExecutor(use_cuda, loss_name=None, main_program=None, share_vars_from=None, exec_strategy=None, build_strategy=None, num_trainers=1, trainer_id=0, scope=None)
.. _cn_api_fluid_ParallelExecutor:
``ParallelExecutor`` 专门设计用来实现数据并行计算,着力于向不同结点(node)分配数据,并行地在不同结点中对数据进行操作。如果在GPU上使用该类运行程序,node则用来指代GPU, ``ParallelExecutor`` 也将自动获取在当前机器上可用的GPU资源。如果在CPU上进行操作,node则指代CPU,同时你也可以通过添加环境变量 ``CPU_NUM`` 来设置CPU设备的个数。例如,``CPU_NUM=4``。但是如果没有设置该环境变量,该类会调用 ``multiprocessing.cpu_count`` 来获取当前系统中CPU的个数。 ParallelExecutor
-------------------------------
.. py:class:: paddle.fluid.ParallelExecutor(use_cuda, loss_name=None, main_program=None, share_vars_from=None, exec_strategy=None, build_strategy=None, num_trainers=1, trainer_id=0, scope=None)
参数:
- **use_cuda** (bool) – 是否使用CUDA
- **loss_name** (str) – 在训练阶段,必须提供loss function名称。默认为None
- **main_program** (Program) – 需要执行的program。如果未提供, 那么将使用 ``default_main_program``。 默认为None ``ParallelExecutor`` 专门设计用来实现数据并行计算,着力于向不同结点(node)分配数据,并行地在不同结点中对数据进行操作。如果在GPU上使用该类运行程序,node则用来指代GPU, ``ParallelExecutor`` 也将自动获取在当前机器上可用的GPU资源。如果在CPU上进行操作,node则指代CPU,同时你也可以通过添加环境变量 ``CPU_NUM`` 来设置CPU设备的个数。例如,``CPU_NUM=4``。但是如果没有设置该环境变量,该类会调用 ``multiprocessing.cpu_count`` 来获取当前系统中CPU的个数。
- **share_vars_from** (ParallelExecutor) – 如果提供了该参数, 则该 ``ParallelExecutor`` 与指定的 ``ParallelExecutor`` 共享变量。默 认为空
- **exec_strategy** (ExecutionStrategy) – ``exec_strategy`` 用于调控program在 ``ParallelExecutor`` 中的执行方式,例如,执行该program需要的线程数, 释放在执行过程中产生的临时变量需要的重复(iterations)次数。 请参考 ``fluid.ExecutionStrategy`` 获取详细介绍。该参数默认为 None
- **build_strategy** (BuildStrategy) – 设置成员 ``build_strategy`` 可以控制在 ``ParallelExecutor`` 中搭建SSA Graph的方式,例如, ``reduce_strategy`` , ``gradient_scale_strategy`` 。 请参考 ``fluid.BuildStrategy`` 获取详细介绍。 该参数默认为None
- **num_trainers** (int) – 如果该值大于1, NCCL将会通过多层级node的方式来初始化。每个node应有相同的GPU数目。 随之会启用分布式训练。该参数默认为1
- **trainer_id** (int) – 必须与 ``num_trainers`` 参数同时使用。``trainer_id`` 是当前所在node的 “rank”(层级),从0开始计数。该参数默认为0 参数:
- **scope** (Scope) – 指定执行program所在的作用域, 默认使用 ``fluid.global_scope()`` - **use_cuda** (bool) – 是否使用CUDA
- **loss_name** (str) – 在训练阶段,必须提供loss function名称。默认为None
返回:初始化后的 ``ParallelExecutor`` 对象 - **main_program** (Program) – 需要执行的program。如果未提供, 那么将使用 ``default_main_program``。 默认为None
- **share_vars_from** (ParallelExecutor) – 如果提供了该参数, 则该 ``ParallelExecutor`` 与指定的 ``ParallelExecutor`` 共享变量。默 认为空
返回类型: ParallelExecutor - **exec_strategy** (ExecutionStrategy) – ``exec_strategy`` 用于调控program在 ``ParallelExecutor`` 中的执行方式,例如,执行该program需要的线程数, 释放在执行过程中产生的临时变量需要的重复(iterations)次数。 请参考 ``fluid.ExecutionStrategy`` 获取详细介绍。该参数默认为 None
- **build_strategy** (BuildStrategy) – 设置成员 ``build_strategy`` 可以控制在 ``ParallelExecutor`` 中搭建SSA Graph的方式,例如, ``reduce_strategy`` , ``gradient_scale_strategy`` 。 请参考 ``fluid.BuildStrategy`` 获取详细介绍。 该参数默认为None
抛出异常:``TypeError`` - 如果提供的参数 ``share_vars_from`` 不是 ``ParallelExecutor`` 类型的,将会弹出此异常 - **num_trainers** (int) – 如果该值大于1, NCCL将会通过多层级node的方式来初始化。每个node应有相同的GPU数目。 随之会启用分布式训练。该参数默认为1
- **trainer_id** (int) – 必须与 ``num_trainers`` 参数同时使用。``trainer_id`` 是当前所在node的 “rank”(层级),从0开始计数。该参数默认为0
**代码示例** - **scope** (Scope) – 指定执行program所在的作用域, 默认使用 ``fluid.global_scope()``
.. code-block:: python 返回:初始化后的 ``ParallelExecutor`` 对象
train_exe = fluid.ParallelExecutor(use_cuda=True, loss_name=loss.name) 返回类型: ParallelExecutor
test_exe = fluid.ParallelExecutor(use_cuda=True,
main_program=test_program, 抛出异常:``TypeError`` - 如果提供的参数 ``share_vars_from`` 不是 ``ParallelExecutor`` 类型的,将会弹出此异常
share_vars_from=train_exe)
**代码示例**
train_loss, = train_exe.run([loss.name], feed=feed_dict)
test_loss, = test_exe.run([loss.name], feed=feed_dict) .. code-block:: python
train_exe = fluid.ParallelExecutor(use_cuda=True, loss_name=loss.name)
test_exe = fluid.ParallelExecutor(use_cuda=True,
.. py:method:: run(fetch_list, feed=None, feed_dict=None, return_numpy=True) main_program=test_program,
share_vars_from=train_exe)
使用 ``fetch_list`` 执行一个 ``ParallelExecutor`` 对象。
train_loss, = train_exe.run([loss.name], feed=feed_dict)
参数 ``feed`` 可以是 ``dict`` 或者 ``list`` 类型变量。如果该参数是 ``dict`` 类型,feed中的数据将会被分割(split)并分送给多个设备(CPU/GPU)。 test_loss, = test_exe.run([loss.name], feed=feed_dict)
反之,如果它是 ``list`` ,则列表中的各个元素都会直接分别被拷贝到各设备中。
例如,如果 ``feed`` 是个 ``dict`` 类型变量,则有
.. py:method:: run(fetch_list, feed=None, feed_dict=None, return_numpy=True)
.. code-block:: python
使用 ``fetch_list`` 执行一个 ``ParallelExecutor`` 对象。
exe = ParallelExecutor()
# 图像会被split到设备中。假设有两个设备,那么每个设备将会处理形为 (24, 1, 28, 28)的图像 参数 ``feed`` 可以是 ``dict`` 或者 ``list`` 类型变量。如果该参数是 ``dict`` 类型,feed中的数据将会被分割(split)并分送给多个设备(CPU/GPU)。
exe.run(feed={'image': numpy.random.random(size=(48, 1, 28, 28))}) 反之,如果它是 ``list`` ,则列表中的各个元素都会直接分别被拷贝到各设备中。
如果 ``feed`` 是个 ``list`` 类型变量,则有 例如,如果 ``feed`` 是个 ``dict`` 类型变量,则有
.. code-block:: python .. code-block:: python
exe = ParallelExecutor() exe = ParallelExecutor()
# 各设备挨个处理列表中的每个元素 # 图像会被split到设备中。假设有两个设备,那么每个设备将会处理形为 (24, 1, 28, 28)的图像
# 第一个设备处理形为 (48, 1, 28, 28) 的图像 exe.run(feed={'image': numpy.random.random(size=(48, 1, 28, 28))})
# 第二个设备处理形为 (32, 1, 28, 28) 的图像
# 如果 ``feed`` 是个 ``list`` 类型变量,则有
# 使用 exe.device_count 得到设备数目
exe.run(feed=[{"image": numpy.random.random(size=(48, 1, 28, 28))}, .. code-block:: python
{"image": numpy.random.random(size=(32, 1, 28, 28))},
]) exe = ParallelExecutor()
# 各设备挨个处理列表中的每个元素
参数: # 第一个设备处理形为 (48, 1, 28, 28) 的图像
- **fetch_list** (list) – 获取的变量名列表 # 第二个设备处理形为 (32, 1, 28, 28) 的图像
- **feed** (list|dict|None) – feed变量。 如果该参数是 ``dict`` 类型,feed中的数据将会被分割(split)并分送给多个设备(CPU/GPU)。反之,如果它是 ``list`` ,则列表中的各个元素都直接分别被拷贝到各设备中。默认为None #
- **feed_dict** – 该参数已经停止使用。feed参数的别名, 为向后兼容而立。默认为None # 使用 exe.device_count 得到设备数目
- **return_numpy** (bool) – 是否将fetched tensor转换为numpy。默认为True exe.run(feed=[{"image": numpy.random.random(size=(48, 1, 28, 28))},
{"image": numpy.random.random(size=(32, 1, 28, 28))},
返回: 获取的结果列表 ])
返回类型:List 参数:
- **fetch_list** (list) – 获取的变量名列表
抛出异常: - **feed** (list|dict|None) – feed变量。 如果该参数是 ``dict`` 类型,feed中的数据将会被分割(split)并分送给多个设备(CPU/GPU)。反之,如果它是 ``list`` ,则列表中的各个元素都直接分别被拷贝到各设备中。默认为None
- ``ValueError`` - 如果feed参数是list类型,但是它的长度不等于可用设备(执行场所)的数目,再或者给定的feed不是dict类型,抛出此异常 - **feed_dict** – 该参数已经停止使用。feed参数的别名, 为向后兼容而立。默认为None
- ``TypeError`` - 如果feed参数是list类型,但是它里面的元素不是dict类型时,弹出此异常 - **return_numpy** (bool) – 是否将fetched tensor转换为numpy。默认为True
.. note:: 返回: 获取的结果列表
1. 如果feed参数为dict类型,那么传入 ``ParallelExecutor`` 的数据量 *必须* 大于可用的CPU核数或GPU卡数。否则,C++端将会抛出异常。应额外注意核对数据集的最后一个batch是否比可用的CPU核数或GPU卡数大。
2. 如果可用的CPU核数或GPU卡数大于一个,则为每个变量最后获取的结果都是list类型,且这个list中的每个元素都是各CPU核或GPU卡上的变量 返回类型:List
**代码示例** 抛出异常:
- ``ValueError`` - 如果feed参数是list类型,但是它的长度不等于可用设备(执行场所)的数目,再或者给定的feed不是dict类型,抛出此异常
.. code-block:: python - ``TypeError`` - 如果feed参数是list类型,但是它里面的元素不是dict类型时,弹出此异常
pe = fluid.ParallelExecutor(use_cuda=use_cuda, .. note::
loss_name=avg_cost.name, 1. 如果feed参数为dict类型,那么传入 ``ParallelExecutor`` 的数据量 *必须* 大于可用的CPU核数或GPU卡数。否则,C++端将会抛出异常。应额外注意核对数据集的最后一个batch是否比可用的CPU核数或GPU卡数大。
main_program=fluid.default_main_program()) 2. 如果可用的CPU核数或GPU卡数大于一个,则为每个变量最后获取的结果都是list类型,且这个list中的每个元素都是各CPU核或GPU卡上的变量
loss = pe.run(feed=feeder.feed(cur_batch),
fetch_list=[avg_cost.name])) **代码示例**
.. code-block:: python
pe = fluid.ParallelExecutor(use_cuda=use_cuda,
loss_name=avg_cost.name,
main_program=fluid.default_main_program())
loss = pe.run(feed=feeder.feed(cur_batch),
fetch_list=[avg_cost.name]))
.. _cn_api_fluid_ParamAttr:
ParamAttr
-------------------------------
.. py:class:: paddle.fluid.ParamAttr(name=None, initializer=None, learning_rate=1.0, regularizer=None, trainable=True, gradient_clip=None, do_model_average=False)
.. _cn_api_fluid_ParamAttr:
该类代表了参数的各种属性。 为了使神经网络训练过程更加流畅,用户可以根据需要调整参数属性。比如learning rate(学习率), regularization(正则化), trainable(可训练性), do_model_average(平均化模型)和参数初始化方法.
参数: ParamAttr
- **name** (str) – 参数名。默认为None。 -------------------------------
- **initializer** (Initializer) – 初始化该参数的方法。 默认为None
- **learning_rate** (float) – 参数的学习率。计算方法为 :math:`global\_lr*parameter\_lr∗scheduler\_factor` 。 默认为1.0
- **regularizer** (WeightDecayRegularizer) – 正则因子. 默认为None .. py:class:: paddle.fluid.ParamAttr(name=None, initializer=None, learning_rate=1.0, regularizer=None, trainable=True, gradient_clip=None, do_model_average=False)
- **trainable** (bool) – 该参数是否可训练。默认为True
- **gradient_clip** (BaseGradientClipAttr) – 减少参数梯度的方法。默认为None 该类代表了参数的各种属性。 为了使神经网络训练过程更加流畅,用户可以根据需要调整参数属性。比如learning rate(学习率), regularization(正则化), trainable(可训练性), do_model_average(平均化模型)和参数初始化方法.
- **do_model_average** (bool) – 该参数是否服从模型平均值。默认为False
参数:
**代码示例** - **name** (str) – 参数名。默认为None。
- **initializer** (Initializer) – 初始化该参数的方法。 默认为None
.. code-block:: python - **learning_rate** (float) – 参数的学习率。计算方法为 :math:`global\_lr*parameter\_lr∗scheduler\_factor` 。 默认为1.0
- **regularizer** (WeightDecayRegularizer) – 正则因子. 默认为None
w_param_attrs = fluid.ParamAttr(name="fc_weight", - **trainable** (bool) – 该参数是否可训练。默认为True
learning_rate=0.5, - **gradient_clip** (BaseGradientClipAttr) – 减少参数梯度的方法。默认为None
regularizer=fluid.L2Decay(1.0), - **do_model_average** (bool) – 该参数是否服从模型平均值。默认为False
trainable=True)
y_predict = fluid.layers.fc(input=x, size=10, param_attr=w_param_attrs) **代码示例**
.. code-block:: python
w_param_attrs = fluid.ParamAttr(name="fc_weight",
learning_rate=0.5,
regularizer=fluid.L2Decay(1.0),
trainable=True)
y_predict = fluid.layers.fc(input=x, size=10, param_attr=w_param_attrs)
.. _cn_api_fluid_Program:
Program
-------------------------------
.. py:class:: paddle.fluid.Program
创建python program, 在paddleFluid内部会被转换为ProgramDesc描述语言,用来创建一段 c++ 程序。Program像容器一样,是一种自包含的程序语言。Program中包括至少一个块(Block),当 block 中存在条件选择的控制流op(例如 while_op)时,该Program将会含有嵌套块(nested block)。详情请参阅framework.proto。 .. _cn_api_fluid_Program:
注意:默认情况下,paddleFluid内部默认含有 ``default_startup_program`` 和 ``default_main_program`` ,它们将共享参数。 ``default_startup_program`` 只运行一次来初始化参数, ``default_main_program`` 在每个mini batch中运行并调整权重。 Program
-------------------------------
返回: empty program
.. py:class:: paddle.fluid.Program
**代码示例**
.. code-block:: python 创建python program, 在paddleFluid内部会被转换为ProgramDesc描述语言,用来创建一段 c++ 程序。Program像容器一样,是一种自包含的程序语言。Program中包括至少一个块(Block),当 block 中存在条件选择的控制流op(例如 while_op)时,该Program将会含有嵌套块(nested block)。详情请参阅framework.proto。
main_program = fluid.Program() 注意:默认情况下,paddleFluid内部默认含有 ``default_startup_program`` 和 ``default_main_program`` ,它们将共享参数。 ``default_startup_program`` 只运行一次来初始化参数, ``default_main_program`` 在每个mini batch中运行并调整权重。
startup_program = fluid.Program()
with fluid.program_guard(main_program=main_program, startup_program=startup_program): 返回: empty program
fluid.layers.data(name="x", shape=[-1, 784], dtype='float32')
fluid.layers.data(name="y", shape=[-1, 1], dtype='int32') **代码示例**
fluid.layers.fc(name="fc", shape=[10], dtype='float32', act="relu")
.. code-block:: python
main_program = fluid.Program()
.. py:attribute:: op_role startup_program = fluid.Program()
with fluid.program_guard(main_program=main_program, startup_program=startup_program):
operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。 fluid.layers.data(name="x", shape=[-1, 784], dtype='float32')
fluid.layers.data(name="y", shape=[-1, 1], dtype='int32')
注意:这是一个底层API。它仅用于 ``ParallelExecutor`` 复制或调度operator到设备。 fluid.layers.fc(name="fc", shape=[10], dtype='float32', act="relu")
例如,Forward operator应该在每个设备上执行。Backward operator在每个设备上执行,并将后向传播的参数梯度(使用 ``op_role_var`` 获得该变量)合并到一个设备上。Optimize operator只在一个设备上执行,并向其他设备广播新的参数,
.. py:attribute:: op_role
.. py:attribute:: set_op_role operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。
operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。 注意:这是一个底层API。它仅用于 ``ParallelExecutor`` 复制或调度operator到设备。
注意:这是一个底层API。它仅用于 ``ParallelExecutor`` 复制或调度operator到设备上执行。 例如,Forward operator应该在每个设备上执行。Backward operator在每个设备上执行,并将后向传播的参数梯度(使用 ``op_role_var`` 获得该变量)合并到一个设备上。Optimize operator只在一个设备上执行,并向其他设备广播新的参数,
例如,Forward operator应该在每个设备上执行。Backward operato应该在每个设备上执行,并将后向传播的参数梯度(使用op_role_var获得该变量)合并到一个设备上。Optimize operator只在一个设备上执行,并向其他设备广播新的参数
.. py:attribute:: set_op_role
.. py:attribute:: op_role_var operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。
``op_role`` 的辅助变量。 注意:这是一个底层API。它仅用于 ``ParallelExecutor`` 复制或调度operator到设备上执行。
参考: ``Program.op_role`` 文档。 例如,Forward operator应该在每个设备上执行。Backward operato应该在每个设备上执行,并将后向传播的参数梯度(使用op_role_var获得该变量)合并到一个设备上。Optimize operator只在一个设备上执行,并向其他设备广播新的参数
注意:这是一个底层API,用户不应该直接使用它。
.. py:attribute:: op_role_var
.. py:attribute:: set_op_role_var ``op_role`` 的辅助变量。
``op_role`` 的辅助变量。 参考: ``Program.op_role`` 文档。
参考: ``Program.op_role`` 文档。 注意:这是一个底层API,用户不应该直接使用它。
注意:这是一个底层API。用户不应该直接使用它。
.. py:attribute:: set_op_role_var
.. py:method:: to_string(throw_on_error, with_details=False) ``op_role`` 的辅助变量。
用于debug 参考: ``Program.op_role`` 文档。
参数: 注意:这是一个底层API。用户不应该直接使用它。
- **throw_on_error** (bool): 没有设置任何必需的字段时,抛出值错误。
- **with_details** (bool): 值为true时,打印更多关于变量和参数的信息,如trainable, optimize_attr等
返回:(str): debug 字符串 .. py:method:: to_string(throw_on_error, with_details=False)
返回类型: str 用于debug
抛出异常: 参数:
- ``ValueError`` - 当 ``throw_on_error == true`` ,但没有设置任何必需的字段时,抛出 ``ValueError`` 。 - **throw_on_error** (bool): 没有设置任何必需的字段时,抛出值错误。
- **with_details** (bool): 值为true时,打印更多关于变量和参数的信息,如trainable, optimize_attr等
返回:(str): debug 字符串
.. py:method:: clone(for_test=False)
返回类型: str
创建一个新的、相同的Program。
抛出异常:
有些operator,在训练和测试之间的行为是不同的,比如batch_norm。它们有一个属性is_test来控制行为。当for_test=True时,此方法将把它们的is_test属性更改为True。 - ``ValueError`` - 当 ``throw_on_error == true`` ,但没有设置任何必需的字段时,抛出 ``ValueError`` 。
- 克隆Program,该Program用于训练时,将 ``for_test`` 设置为False。
- 克隆Program,该Program用于测试时,将 ``for_test`` 设置为True。
.. py:method:: clone(for_test=False)
注意:此API不会删除任何操作符。请在backward和optimization之前使用clone(for_test=True)。
创建一个新的、相同的Program。
**代码示例**
有些operator,在训练和测试之间的行为是不同的,比如batch_norm。它们有一个属性is_test来控制行为。当for_test=True时,此方法将把它们的is_test属性更改为True。
.. code-block:: python
- 克隆Program,该Program用于训练时,将 ``for_test`` 设置为False。
test_program = fluid.default_main_program().clone(for_test=True) - 克隆Program,该Program用于测试时,将 ``for_test`` 设置为True。
optimizer = fluid.optimizer.Momentum(learning_rate=0.01, momentum=0.9)
optimizer.minimize() 注意:此API不会删除任何操作符。请在backward和optimization之前使用clone(for_test=True)。
参数: **代码示例**
- **for_test** (bool) – 取值为True时,clone方法内部会把operator的属性 ``is_test`` 设置为 True
.. code-block:: python
返回:一个新的、相同的Program
test_program = fluid.default_main_program().clone(for_test=True)
返回类型:Program optimizer = fluid.optimizer.Momentum(learning_rate=0.01, momentum=0.9)
optimizer.minimize()
**代码示例**
参数:
1.克隆一个Program,示例代码如下: - **for_test** (bool) – 取值为True时,clone方法内部会把operator的属性 ``is_test`` 设置为 True
.. code-block:: python 返回:一个新的、相同的Program
train_program = fluid.Program() 返回类型:Program
startup_program = fluid.Program()
with fluid.program_guard(train_program, startup_program): **代码示例**
img = fluid.layers.data(name='image', shape=[784])
hidden = fluid.layers.fc(input=img, size=200, act='relu') 1.克隆一个Program,示例代码如下:
hidden = fluid.layers.dropout(hidden, dropout_prob=0.5)
loss = fluid.layers.cross_entropy( .. code-block:: python
input=fluid.layers.fc(hidden, size=10, act='softmax'),
label=fluid.layers.data(name='label', shape=[1], dtype='int64')) train_program = fluid.Program()
test_program = train_program.clone(for_test=True) startup_program = fluid.Program()
sgd = fluid.optimizer.SGD(learning_rate=1e-3) with fluid.program_guard(train_program, startup_program):
with fluid.program_guard(train_program, startup_program): img = fluid.layers.data(name='image', shape=[784])
sgd.minimize(loss) hidden = fluid.layers.fc(input=img, size=200, act='relu')
hidden = fluid.layers.dropout(hidden, dropout_prob=0.5)
2.如果分别运行 train Program 和 test Program,则可以不使用clone。 loss = fluid.layers.cross_entropy(
input=fluid.layers.fc(hidden, size=10, act='softmax'),
.. code-block:: python label=fluid.layers.data(name='label', shape=[1], dtype='int64'))
test_program = train_program.clone(for_test=True)
import paddle.fluid as fluid sgd = fluid.optimizer.SGD(learning_rate=1e-3)
with fluid.program_guard(train_program, startup_program):
def network(is_test): sgd.minimize(loss)
img = fluid.layers.data(name='image', shape=[784])
hidden = fluid.layers.fc(input=img, size=200, act='relu') 2.如果分别运行 train Program 和 test Program,则可以不使用clone。
hidden = fluid.layers.dropout(hidden, dropout_prob=0.5, is_test=is_test)
loss = fluid.layers.cross_entropy( .. code-block:: python
input=fluid.layers.fc(hidden, size=10, act='softmax'),
label=fluid.layers.data(name='label', shape=[1], dtype='int64')) import paddle.fluid as fluid
return loss
def network(is_test):
train_program = fluid.Program() img = fluid.layers.data(name='image', shape=[784])
startup_program = fluid.Program() hidden = fluid.layers.fc(input=img, size=200, act='relu')
test_program = fluid.Program() hidden = fluid.layers.dropout(hidden, dropout_prob=0.5, is_test=is_test)
loss = fluid.layers.cross_entropy(
with fluid.program_guard(train_program, startup_program): input=fluid.layers.fc(hidden, size=10, act='softmax'),
with fluid.unique_name.guard(): label=fluid.layers.data(name='label', shape=[1], dtype='int64'))
loss = network(is_test=False) return loss
sgd = fluid.optimizer.SGD(learning_rate=1e-3)
sgd.minimize(loss) train_program = fluid.Program()
startup_program = fluid.Program()
# 不使用测试阶段的startup program test_program = fluid.Program()
with fluid.program_guard(test_program, fluid.Program()):
with fluid.unique_name.guard(): with fluid.program_guard(train_program, startup_program):
loss = network(is_test=True) with fluid.unique_name.guard():
loss = network(is_test=False)
上边两个代码片段生成的Program是一样的。 sgd = fluid.optimizer.SGD(learning_rate=1e-3)
sgd.minimize(loss)
.. py:staticmethod:: parse_from_string(binary_str)
# 不使用测试阶段的startup program
反序列化protobuf,转换成program with fluid.program_guard(test_program, fluid.Program()):
with fluid.unique_name.guard():
注意:在序列化和反序列化之后,所有关于参数的信息都会丢失。 loss = network(is_test=True)
参数: 上边两个代码片段生成的Program是一样的。
- **binary_str_type** (str) – prootbuf二进制字符串
.. py:staticmethod:: parse_from_string(binary_str)
返回: 反序列化后的ProgramDesc
反序列化protobuf,转换成program
返回类型:Program
注意:在序列化和反序列化之后,所有关于参数的信息都会丢失。
.. py:attribute:: num_blocks
参数:
该program中的block的个数 - **binary_str_type** (str) – prootbuf二进制字符串
.. py:attribute:: random_seed 返回: 反序列化后的ProgramDesc
返回类型:Program
程序中随机运算符的默认随机种子。0意味着从随机设备中获取随机种子。
.. py:attribute:: num_blocks
注意:必须在operator被添加之前设置。
该program中的block的个数
.. py:method:: global_block()
.. py:attribute:: random_seed
获取该program的第一个block。
.. py:method:: block(index) 程序中随机运算符的默认随机种子。0意味着从随机设备中获取随机种子。
返回该program中 , ``index`` 指定的block。 ``index`` 类型为int 注意:必须在operator被添加之前设置。
返回:index对应的block .. py:method:: global_block()
返回类型:Block 获取该program的第一个block。
.. py:method:: current_block() .. py:method:: block(index)
获取当前block。当前block是用来添加operators。 返回该program中 , ``index`` 指定的block。 ``index`` 类型为int
.. py:method:: list_vars() 返回:index对应的block
获取当前program中所有变量。返回值是一个可迭代对象(iterable object)。 返回类型:Block
返回:generator 会yield每个Program中的变量 .. py:method:: current_block()
返回类型:iterable 获取当前block。当前block是用来添加operators。
.. py:method:: list_vars()
获取当前program中所有变量。返回值是一个可迭代对象(iterable object)。
返回:generator 会yield每个Program中的变量
返回类型:iterable
.. _cn_api_fluid_program_guard:
program_guard
-------------------------------
.. py:function:: paddle.fluid.program_guard(main_program, startup_program=None)
.. _cn_api_fluid_program_guard:
该函数应配合使用python的“with”语句来改变全局主程序(main program)和启动程序(startup program)。
program_guard
“with”语句块中的layer函数将在新的main program(主程序)中添加operators(算子)和variables(变量)。 -------------------------------
**代码示例** .. py:function:: paddle.fluid.program_guard(main_program, startup_program=None)
.. code-block:: python
import paddle.fluid as fluid 该函数应配合使用python的“with”语句来改变全局主程序(main program)和启动程序(startup program)。
main_program = fluid.Program()
startup_program = fluid.Program() “with”语句块中的layer函数将在新的main program(主程序)中添加operators(算子)和variables(变量)。
with fluid.program_guard(main_program, startup_program):
data = fluid.layers.data(...) **代码示例**
hidden = fluid.layers.fc(...)
.. code-block:: python
需要注意的是,如果用户不需要构建自己的启动程序或者主程序,一个临时的program将会发挥作用。
import paddle.fluid as fluid
**代码示例** main_program = fluid.Program()
startup_program = fluid.Program()
.. code-block:: python with fluid.program_guard(main_program, startup_program):
data = fluid.layers.data(...)
import paddle.fluid as fluid hidden = fluid.layers.fc(...)
main_program = fluid.Program()
# 如果您不需要关心startup program,传入一个临时值即可 需要注意的是,如果用户不需要构建自己的启动程序或者主程序,一个临时的program将会发挥作用。
with fluid.program_guard(main_program, fluid.Program()):
data = ... **代码示例**
.. code-block:: python
参数:
- **main_program** (Program) – “with”语句中将使用的新的main program。 import paddle.fluid as fluid
- **startup_program** (Program) – “with”语句中将使用的新的startup program。若传入 ``None`` 则不改变当前的启动程序。 main_program = fluid.Program()
# 如果您不需要关心startup program,传入一个临时值即可
with fluid.program_guard(main_program, fluid.Program()):
data = ...
参数:
- **main_program** (Program) – “with”语句中将使用的新的main program。
- **startup_program** (Program) – “with”语句中将使用的新的startup program。若传入 ``None`` 则不改变当前的启动程序。
.. _cn_api_fluid_release_memory:
release_memory
-------------------------------
.. py:function:: paddle.fluid.release_memory(input_program, skip_opt_set=None)
该函数可以调整输入program,插入 ``delete_op`` 删除算子,提前删除不需要的变量。 .. _cn_api_fluid_release_memory:
改动是在变量本身上进行的。
release_memory
**提醒**: 该API还在试验阶段,会在后期版本中删除。不建议用户使用。 -------------------------------
参数: .. py:function:: paddle.fluid.release_memory(input_program, skip_opt_set=None)
- **input_program** (Program) – 在此program中插入 ``delete_op``
- **skip_opt_set** (set) – 在内存优化时跳过的变量的集合
该函数可以调整输入program,插入 ``delete_op`` 删除算子,提前删除不需要的变量。
返回: None 改动是在变量本身上进行的。
**提醒**: 该API还在试验阶段,会在后期版本中删除。不建议用户使用。
.. _cn_api_fluid_scope_guard: 参数:
- **input_program** (Program) – 在此program中插入 ``delete_op``
scope_guard - **skip_opt_set** (set) – 在内存优化时跳过的变量的集合
-------------------------------
返回: None
.. py:function:: paddle.fluid.scope_guard(scope)
修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。 .. _cn_api_fluid_scope_guard:
参数: scope_guard
- **scope** - 新的全局/默认 scope。 -------------------------------
**代码示例** .. py:function:: paddle.fluid.scope_guard(scope)
.. code-block:: python
修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。
import paddle.fluid as fluid
参数:
new_scope = fluid.Scope() - **scope** - 新的全局/默认 scope。
with fluid.scope_guard(new_scope):
... **代码示例**
.. code-block:: python
import paddle.fluid as fluid
new_scope = fluid.Scope()
with fluid.scope_guard(new_scope):
...
.. _cn_api_fluid_Tensor:
Tensor
-------------------------------
.. py:function:: paddle.fluid.Tensor
``LoDTensor`` 的别名
.. _cn_api_fluid_Tensor:
Tensor
-------------------------------
.. py:function:: paddle.fluid.Tensor
``LoDTensor`` 的别名
.. _cn_api_fluid_WeightNormParamAttr:
WeightNormParamAttr
-------------------------------
.. py:class:: paddle.fluid.WeightNormParamAttr(dim=None, name=None, initializer=None, learning_rate=1.0, regularizer=None, trainable=True, gradient_clip=None, do_model_average=False)
权重归一化。权重归一化是将权重向量的长度与其方向解耦。`Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks <https://arxiv.org/pdf/1602.07868.pdf>`_ 这篇paper中讨论了权重归一化的实现 .. _cn_api_fluid_WeightNormParamAttr:
参数: WeightNormParamAttr
- **dim** (list) - 参数的名称。默认None。 -------------------------------
- **name** (str) - 参数的名称。默认None。
- **initializer** (initializer) - 初始化参数的方法。默认None。 .. py:class:: paddle.fluid.WeightNormParamAttr(dim=None, name=None, initializer=None, learning_rate=1.0, regularizer=None, trainable=True, gradient_clip=None, do_model_average=False)
- **learning_rate** (float) - 学习率。优化时学习速率 :math:`global\_lr∗parameter\_lr∗scheduler\_factor` 。默认1.0。
- **regularizer** (WeightDecayRegularizer) - 正则化因子。默认None。
- **trainable** (bool) - 参数是否可训练。默认True。 权重归一化。权重归一化是将权重向量的长度与其方向解耦。`Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks <https://arxiv.org/pdf/1602.07868.pdf>`_ 这篇paper中讨论了权重归一化的实现
- **gradient_clip** (BaseGradientClipAttr) - 梯度下降裁剪(Gradient Clipping)的方法。默认None。
- **do_model_average** (bool) - 参数是否应该model average。默认False。 参数:
- **dim** (list) - 参数的名称。默认None。
返回: empty program - **name** (str) - 参数的名称。默认None。
- **initializer** (initializer) - 初始化参数的方法。默认None。
**代码示例** - **learning_rate** (float) - 学习率。优化时学习速率 :math:`global\_lr∗parameter\_lr∗scheduler\_factor` 。默认1.0。
- **regularizer** (WeightDecayRegularizer) - 正则化因子。默认None。
.. code-block:: python - **trainable** (bool) - 参数是否可训练。默认True。
- **gradient_clip** (BaseGradientClipAttr) - 梯度下降裁剪(Gradient Clipping)的方法。默认None。
data = fluid.layers.data(name="data", shape=[3, 32, 32], dtype="float32") - **do_model_average** (bool) - 参数是否应该model average。默认False。
fc = fluid.layers.fc(input=data,
size=1000, 返回: empty program
param_attr=WeightNormParamAttr(
dim=None, **代码示例**
name='weight_norm_param'))
.. code-block:: python
data = fluid.layers.data(name="data", shape=[3, 32, 32], dtype="float32")
fc = fluid.layers.fc(input=data,
size=1000,
param_attr=WeightNormParamAttr(
dim=None,
name='weight_norm_param'))
...@@ -289,8 +289,6 @@ PyReader ...@@ -289,8 +289,6 @@ PyReader
- **reader** (generator) – 返回LoDTensor类型的批处理数据的Python生成器 - **reader** (generator) – 返回LoDTensor类型的批处理数据的Python生成器
- **places** (None|list(CUDAPlace)|list(CPUPlace)) – 位置列表。当PyReader可迭代时必须被提供 - **places** (None|list(CUDAPlace)|list(CPUPlace)) – 位置列表。当PyReader可迭代时必须被提供
.. _cn_api_fluid_io_save_inference_model: .. _cn_api_fluid_io_save_inference_model:
save_inference_model save_inference_model
...@@ -313,7 +311,9 @@ save_inference_model ...@@ -313,7 +311,9 @@ save_inference_model
- **params_filename** (str|None) – 保存所有相关参数的文件名称。如果设置为None,则参数将保存在单独的文件中。 - **params_filename** (str|None) – 保存所有相关参数的文件名称。如果设置为None,则参数将保存在单独的文件中。
- **export_for_deployment** (bool) – 如果为真,Program将被修改为只支持直接预测部署的Program。否则,将存储更多的信息,方便优化和再训练。目前只支持True。 - **export_for_deployment** (bool) – 如果为真,Program将被修改为只支持直接预测部署的Program。否则,将存储更多的信息,方便优化和再训练。目前只支持True。
返回: None 返回: 获取的变量名列表
返回类型:target_var_name_list(list)
抛出异常: 抛出异常:
- ``ValueError`` – 如果 ``feed_var_names`` 不是字符串列表 - ``ValueError`` – 如果 ``feed_var_names`` 不是字符串列表
...@@ -406,8 +406,9 @@ save_persistables ...@@ -406,8 +406,9 @@ save_persistables
exe = fluid.Executor(fluid.CPUPlace()) exe = fluid.Executor(fluid.CPUPlace())
param_path = "./my_paddle_model" param_path = "./my_paddle_model"
prog = fluid.default_main_program() prog = fluid.default_main_program()
# `prog` 可以是由用户自定义的program
fluid.io.save_persistables(executor=exe, dirname=param_path, fluid.io.save_persistables(executor=exe, dirname=param_path,
main_program=None) main_program=prog)
......
...@@ -205,12 +205,13 @@ memory用于缓存分段数据。memory的初始值可以是零,也可以是 ...@@ -205,12 +205,13 @@ memory用于缓存分段数据。memory的初始值可以是零,也可以是
.. note:: .. note::
目前不支持在DynamicRNN中任何层上配置 is_sparse = True 目前不支持在DynamicRNN中任何层上配置 is_sparse = True
.. py:method:: step_input(x) .. py:method:: step_input(x, level=0)
将序列标记为动态RNN输入。 将序列标记为动态RNN输入。
参数: 参数:
- **x** (Variable) - 输入序列 - **x** (Variable) - 输入序列
- **level** (int) - 用于拆分步骤的LOD层级,默认值0
返回:当前的输入序列中的timestep。 返回:当前的输入序列中的timestep。
...@@ -1087,8 +1088,7 @@ py_reader ...@@ -1087,8 +1088,7 @@ py_reader
except fluid.core.EOFException: except fluid.core.EOFException:
reader.reset() reader.reset()
fluid.io.save_inference_model(dirname='./model', feeded_var_names=[img, label],target_vars=[loss], executor=fluid.Executor(fluid.CUDAPlace(0)))
2.训练和测试应使用不同的名称创建两个不同的py_reader,例如: 2.训练和测试应使用不同的名称创建两个不同的py_reader,例如:
...@@ -1483,7 +1483,7 @@ add_position_encoding ...@@ -1483,7 +1483,7 @@ add_position_encoding
affine_channel affine_channel
------------------------------- -------------------------------
.. py:function:: paddle.fluid.layers.affine_channel(x, scale=None, bias=None, data_layout='NCHW', name=None) .. py:function:: paddle.fluid.layers.affine_channel(x, scale=None, bias=None, data_layout='NCHW', name=None,act=None)
对输入的每个 channel 应用单独的仿射变换。用于将空间批处理范数替换为其等价的固定变换。 对输入的每个 channel 应用单独的仿射变换。用于将空间批处理范数替换为其等价的固定变换。
...@@ -1495,6 +1495,7 @@ affine_channel ...@@ -1495,6 +1495,7 @@ affine_channel
- **bias** (Variable):形状为(C)的一维输入,第C个元素是输入的第C个通道的仿射变换的偏置。 - **bias** (Variable):形状为(C)的一维输入,第C个元素是输入的第C个通道的仿射变换的偏置。
- **data_layout** (string, default NCHW): NCHW 或 NHWC,如果输入是一个2D张量,可以忽略该参数 - **data_layout** (string, default NCHW): NCHW 或 NHWC,如果输入是一个2D张量,可以忽略该参数
- **name** (str, default None): 此层的名称 - **name** (str, default None): 此层的名称
- **act** (str, default None): 应用于该层输出的激活函数
返回: out (Variable): 与x具有相同形状和数据布局的张量。 返回: out (Variable): 与x具有相同形状和数据布局的张量。
...@@ -1680,11 +1681,11 @@ batch_norm ...@@ -1680,11 +1681,11 @@ batch_norm
参数: 参数:
- **input** (Variable) - 输入变量,为LoDTensor - **input** (Variable) - 输入变量的排序,可以为 2, 3, 4, 5
- **act** (string,默认None)- 激活函数类型,linear|relu|prelu|... - **act** (string,默认None)- 激活函数类型,linear|relu|prelu|...
- **is_test** (bool,默认False) - 标志位,是否用于测试或训练 - **is_test** (bool,默认False) - 指示它是否在测试阶段。
- **momentum** (float,默认0.9)- (暂无说明,待更新) - **momentum** (float,默认0.9)- 此值用于计算 moving_mean and moving_var. 更新公式为: :math:`\(moving\_mean = moving\_mean * momentum + new\_mean * (1. - momentum)\)` :math:`\(moving\_var = moving\_var * momentum + new\_var * (1. - momentum)\)` , 默认值0.9.
- **epsilon** (float,默认1e-05)- (暂无说明,待更新) - **epsilon** (float,默认1e-05)- 加在分母上为了数值稳定的值。默认值为1e-5。
- **param_attr** (ParamAttr|None) - batch_norm参数范围的属性,如果设为None或者是ParamAttr的一个属性,batch_norm创建ParamAttr为param_attr。如果没有设置param_attr的初始化函数,参数初始化为Xavier。默认:None - **param_attr** (ParamAttr|None) - batch_norm参数范围的属性,如果设为None或者是ParamAttr的一个属性,batch_norm创建ParamAttr为param_attr。如果没有设置param_attr的初始化函数,参数初始化为Xavier。默认:None
- **bias_attr** (ParamAttr|None) - batch_norm bias参数的属性,如果设为None或者是ParamAttr的一个属性,batch_norm创建ParamAttr为bias_attr。如果没有设置bias_attr的初始化函数,参数初始化为0。默认:None - **bias_attr** (ParamAttr|None) - batch_norm bias参数的属性,如果设为None或者是ParamAttr的一个属性,batch_norm创建ParamAttr为bias_attr。如果没有设置bias_attr的初始化函数,参数初始化为0。默认:None
- **data_layout** (string,默认NCHW) - NCHW|NHWC - **data_layout** (string,默认NCHW) - NCHW|NHWC
...@@ -2763,7 +2764,7 @@ ctc_greedy_decoder ...@@ -2763,7 +2764,7 @@ ctc_greedy_decoder
data_norm data_norm
------------------------------- -------------------------------
.. py:function:: paddle.fluid.layers.data_norm(input, act=None, epsilon=1e-05, param_attr=None, data_layout='NCHW', in_place=False, use_mkldnn=False, name=None, moving_mean_name=None, moving_variance_name=None, do_model_average_for_mean_and_var=False) .. py:function:: paddle.fluid.layers.data_norm(input, act=None, epsilon=1e-05, param_attr=None, data_layout='NCHW', in_place=False, name=None, moving_mean_name=None, moving_variance_name=None, do_model_average_for_mean_and_var=False)
**数据正则化层** **数据正则化层**
...@@ -2790,7 +2791,6 @@ data_norm ...@@ -2790,7 +2791,6 @@ data_norm
- **param_attr** (ParamAttr) - 参数比例的参数属性。 - **param_attr** (ParamAttr) - 参数比例的参数属性。
- **data_layout** (string,默认NCHW) - NCHW | NHWC - **data_layout** (string,默认NCHW) - NCHW | NHWC
- **in_place** (bool,默认值False) - 使data_norm的输入和输出复用同一块内存。 - **in_place** (bool,默认值False) - 使data_norm的输入和输出复用同一块内存。
- **use_mkldnn** (bool,默认为false) - 是否使用mkldnn
- **name** (string,默认None) - 此层的名称(可选)。 如果设置为None,则将自动命名该层。 - **name** (string,默认None) - 此层的名称(可选)。 如果设置为None,则将自动命名该层。
- **moving_mean_name** (string,Default None) - 存储全局Mean的moving_mean的名称。 - **moving_mean_name** (string,Default None) - 存储全局Mean的moving_mean的名称。
- **moving_variance_name** (string,默认None) - 存储全局Variance的moving_variance的名称。 - **moving_variance_name** (string,默认None) - 存储全局Variance的moving_variance的名称。
...@@ -2884,7 +2884,7 @@ dropout op可以从Program中删除,提高执行效率。 ...@@ -2884,7 +2884,7 @@ dropout op可以从Program中删除,提高执行效率。
- train: out = input * mask - train: out = input * mask
- inference: out = input * dropout_prob - inference: out = input * (1.0 - dropout_prob)
(mask是一个张量,维度和输入维度相同,值为0或1,值为0的比例即为 ``dropout_prob`` ) (mask是一个张量,维度和输入维度相同,值为0或1,值为0的比例即为 ``dropout_prob`` )
...@@ -3111,7 +3111,7 @@ W 代表了权重矩阵(weight matrix),例如 :math:`W_{xi}` 是从输入门 ...@@ -3111,7 +3111,7 @@ W 代表了权重矩阵(weight matrix),例如 :math:`W_{xi}` 是从输入门
dynamic_lstmp dynamic_lstmp
------------------------------- -------------------------------
.. py:function:: paddle.fluid.layers.dynamic_lstmp(input, size, proj_size, param_attr=None, bias_attr=None, use_peepholes=True, is_reverse=False, gate_activation='sigmoid', cell_activation='tanh', candidate_activation='tanh', proj_activation='tanh', dtype='float32', name=None) .. py:function:: paddle.fluid.layers.dynamic_lstmp(input, size, proj_size, param_attr=None, bias_attr=None, use_peepholes=True, is_reverse=False, gate_activation='sigmoid', cell_activation='tanh', candidate_activation='tanh', proj_activation='tanh', dtype='float32', name=None, h_0=None, c_0=None, cell_clip=None, proj_clip=None)
动态LSTMP层(Dynamic LSTMP Layer) 动态LSTMP层(Dynamic LSTMP Layer)
...@@ -3179,7 +3179,16 @@ LSTMP层(具有循环映射的LSTM)在LSTM层后有一个分离的映射层, ...@@ -3179,7 +3179,16 @@ LSTMP层(具有循环映射的LSTM)在LSTM层后有一个分离的映射层,
- **candidate_activation** (str) - 候选隐藏状态(candidate hidden state)的激活状态。Choices = [“sigmoid”,“tanh”,“relu”,“identity”],默认“tanh”。 - **candidate_activation** (str) - 候选隐藏状态(candidate hidden state)的激活状态。Choices = [“sigmoid”,“tanh”,“relu”,“identity”],默认“tanh”。
- **proj_activation** (str) - 投影输出的激活函数。Choices = [“sigmoid”,“tanh”,“relu”,“identity”],默认“tanh”。 - **proj_activation** (str) - 投影输出的激活函数。Choices = [“sigmoid”,“tanh”,“relu”,“identity”],默认“tanh”。
- **dtype** (str) - 数据类型。Choices = [“float32”,“float64”],默认“float32”。 - **dtype** (str) - 数据类型。Choices = [“float32”,“float64”],默认“float32”。
- **name** (str|None) - 该层名称(可选)。若设为None,则自动为该层命名。 - **name** (str|None) - 该层名称(可选)。若设为None,则自动为该层命名。
- **h_0** (Variable) - 初始隐藏状态是可选输入,默认为0。这是一个具有形状的张量(N x D),其中N是批大小,D是投影大小。
- **c_0** (Variable) - 初始cell状态是可选输入,默认为0。这是一个具有形状(N x D)的张量,其中N是批大小。h_0和c_0可以为空,但只能同时为空。
- **cell_clip** (float) - 如果提供该参数,则在单元输出激活之前,单元状态将被此值剪裁。
- **proj_clip** (float) - 如果 num_proj > 0 并且 proj_clip 被提供,那么将投影值沿元素方向剪切到[-proj_clip,proj_clip]内
返回:含有两个输出变量的元组,隐藏状态(hidden state)的投影和LSTMP的cell状态。投影的shape为(T*P),cell state的shape为(T*D),两者的LoD和输入相同。 返回:含有两个输出变量的元组,隐藏状态(hidden state)的投影和LSTMP的cell状态。投影的shape为(T*P),cell state的shape为(T*D),两者的LoD和输入相同。
...@@ -3793,9 +3802,17 @@ fc ...@@ -3793,9 +3802,17 @@ fc
**全连接层** **全连接层**
该函数在神经网络中建立一个全连接层。 它可以同时将多个tensor( ``input`` 可使用多个tensor组成的一个list,详见参数说明)作为自己的输入,并为每个输入的tensor创立一个变量,称为“权”(weights),等价于一个从每个输入单元到每个输出单元的全连接权矩阵。FC层用每个tensor和它对应的权相乘得到输出tensor。如果有多个输入tensor,那么多个乘法运算将会加在一起得出最终结果。如果 ``bias_attr`` 非空,则会新创建一个偏向变量(bias variable),并把它加入到输出结果的运算中。最后,如果 ``act`` 非空,它也会加入最终输出的计算中。 该函数在神经网络中建立一个全连接层。 它可以将一个或多个tensor( ``input`` 可以是一个list或者Variable,详见参数说明)作为自己的输入,并为每个输入的tensor创立一个变量,称为“权”(weights),等价于一个从每个输入单元到每个输出单元的全连接权矩阵。FC层用每个tensor和它对应的权相乘得到形状为[M, size]输出tensor,M是批大小。如果有多个输入tensor,那么形状为[M, size]的多个输出张量的结果将会被加起来。如果 ``bias_attr`` 非空,则会新创建一个偏向变量(bias variable),并把它加入到输出结果的运算中。最后,如果 ``act`` 非空,它也会加入最终输出的计算中。
这个过程可以通过如下公式表现: 当输入为单个张量:
.. math::
\\Out = Act({XW + b})\\
当输入为多个张量:
.. math:: .. math::
...@@ -3803,13 +3820,29 @@ fc ...@@ -3803,13 +3820,29 @@ fc
上述等式中: 上述等式中:
- :math:`N` :输入tensor的数目 - :math:`N` :输入的数目,如果输入是变量列表,N等于len(input)
- :math:`X_i` : 输入的tensor - :math:`X_i` : 第i个输入的tensor
- :math:`W` :该层创立的权 - :math:`W_i` :对应第i个输入张量的第i个权重矩阵
- :math:`b` :该层创立的bias参数 - :math:`b` :该层创立的bias参数
- :math:`Act` : activation function(激励函数) - :math:`Act` : activation function(激励函数)
- :math:`Out` : 输出tensor - :math:`Out` : 输出tensor
::
Given:
data_1.data = [[[0.1, 0.2],
[0.3, 0.4]]]
data_1.shape = (1, 2, 2) # 1 is batch_size
data_2 = [[[0.1, 0.2, 0.3]]]
data_2.shape = (1, 1, 3)
out = fluid.layers.fc(input=[data_1, data_2], size=2)
Then:
out.data = [[0.18669507, 0.1893476]]
out.shape = (1, 2)
参数: 参数:
- **input** (Variable|list of Variable) – 该层的输入tensor(s)(张量),其维度至少是2 - **input** (Variable|list of Variable) – 该层的输入tensor(s)(张量),其维度至少是2
...@@ -3832,9 +3865,15 @@ fc ...@@ -3832,9 +3865,15 @@ fc
.. code-block:: python .. code-block:: python
# 当输入为单个张量时
data = fluid.layers.data(name="data", shape=[32, 32], dtype="float32") data = fluid.layers.data(name="data", shape=[32, 32], dtype="float32")
fc = fluid.layers.fc(input=data, size=1000, act="tanh") fc = fluid.layers.fc(input=data, size=1000, act="tanh")
# 当输入为多个张量时
data_1 = fluid.layers.data(name="data_1", shape=[32, 32], dtype="float32")
data_2 = fluid.layers.data(name="data_2", shape=[24, 36], dtype="float32")
fc = fluid.layers.fc(input=[data_1, data_2], size=1000, act="tanh")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册