未验证 提交 46f91c1e 编写于 作者: Y yuyang18

Follow comments

上级 5a1a26e0
################################## ############
使用PaddlePaddle Fluid训练神经网络 训练神经网络
################################## ############
PaddlePaddle Fluid支持单机训练,和多节点训练。每种训练模式下,都支持多种训练方法。 PaddlePaddle Fluid支持单机训练,和多节点训练。每种训练模式下,都支持多种训练方法。
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
2. 长期变量 2. 长期变量
长期变量指的是在整个训练过程中持续存在、不会因为一个迭代的结束而被销毁的变量,例如动态调节的全局学习率等。 长期变量指的是在整个训练过程中持续存在、不会因为一个迭代的结束而被销毁的变量,例如动态调节的全局学习率等。
在PaddlePaddle Fluid中,长期变量通过将 :ref:`api_fluid_Variable` 的 :code:`persistable` 在PaddlePaddle Fluid中,长期变量通过将 :ref:`api_fluid_Variable` 的 :code:`persistable`
属性设置为 :code:`True` 来表示。所有的模型参数都是长期变量,但并非所有的长期变量都是模型参数。 属性设置为 :code:`True` 来表示。所有的模型参数都是长期变量,但并非所有的长期变量都是模型参数。
3. 临时变量 3. 临时变量
...@@ -40,9 +40,9 @@ ...@@ -40,9 +40,9 @@
因此,根据需求的不同,我们提供了两套API来分别进行模型的参数和checkpoint的保存。 因此,根据需求的不同,我们提供了两套API来分别进行模型的参数和checkpoint的保存。
保存模型用于对新样本的预测 保存模型用于对新样本的预测
======================== ==========================
如果我们保存模型的目的是用于对新样本的预测,那么只保存模型参数就足够了。我们可以使用 如果我们保存模型的目的是用于对新样本的预测,那么只保存模型参数就足够了。我们可以使用
:code:`fluid.io.save_params` 接口来进行模型参数的保存。 :code:`fluid.io.save_params` 接口来进行模型参数的保存。
例如: 例如:
...@@ -56,13 +56,13 @@ ...@@ -56,13 +56,13 @@
prog = fluid.default_main_program() prog = fluid.default_main_program()
fluid.io.save_params(executor=exe, dirname=param_path, main_program=None) fluid.io.save_params(executor=exe, dirname=param_path, main_program=None)
上面的例子中,通过调用 :code:`fluid.io.save_params` 函数,PaddlePaddle Fluid会对默认 上面的例子中,通过调用 :code:`fluid.io.save_params` 函数,PaddlePaddle Fluid会对默认
:ref:`api_fluid_Program` 也就是 :code:`prog` 中的所有模型变量进行扫描, :ref:`api_fluid_Program` 也就是 :code:`prog` 中的所有模型变量进行扫描,
筛选出其中所有的模型参数,并将这些模型参数保存到指定的 :code:`param_path` 之中。 筛选出其中所有的模型参数,并将这些模型参数保存到指定的 :code:`param_path` 之中。
保存checkpoint用于将来恢复训练 保存checkpoint用于将来恢复训练
=========================== ==============================
在训练过程中,我们可能希望在一些节点上将当前的训练状态保存下来, 在训练过程中,我们可能希望在一些节点上将当前的训练状态保存下来,
以便在将来需要的时候恢复训练环境继续进行训练。这一般被称作“checkpoint”。 以便在将来需要的时候恢复训练环境继续进行训练。这一般被称作“checkpoint”。
...@@ -86,11 +86,11 @@ ...@@ -86,11 +86,11 @@
main_program=prog, main_program=prog,
max_num_checkpoints=3) max_num_checkpoints=3)
上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对默认 上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对默认
:ref:`api_fluid_Program` 也就是 :code:`prog` 中的所有模型变量进行扫描, :ref:`api_fluid_Program` 也就是 :code:`prog` 中的所有模型变量进行扫描,
根据一系列内置的规则自动筛选出其中所有需要保存的变量,并将他们保存到指定的 :code:`path` 目录下。 根据一系列内置的规则自动筛选出其中所有需要保存的变量,并将他们保存到指定的 :code:`path` 目录下。
:code:`fluid.io.save_checkpoint` 的各个参数中, :code:`trainer_id` 在单机情况下设置为0即可; :code:`trainer_args` :code:`fluid.io.save_checkpoint` 的各个参数中, :code:`trainer_id` 在单机情况下设置为0即可; :code:`trainer_args`
为一个Python dict,用于给定当前的epoch_id和step_id; 为一个Python dict,用于给定当前的epoch_id和step_id;
:code:`max_num_checkpoints` 用于表示的最大checkpoint数量, :code:`max_num_checkpoints` 用于表示的最大checkpoint数量,
如果目录中已经存在的checkpoint数量超过这个值,那最早的checkpoint将被删除。 如果目录中已经存在的checkpoint数量超过这个值,那最早的checkpoint将被删除。
...@@ -101,16 +101,16 @@ ...@@ -101,16 +101,16 @@
与模型变量的保存相对应,我们提供了两套API来分别进行模型的参数和checkpoint的载入。 与模型变量的保存相对应,我们提供了两套API来分别进行模型的参数和checkpoint的载入。
载入模型用于对新样本的预测 载入模型用于对新样本的预测
======================== ==========================
对于通过 :code:`fluid.io.save_params` 保存的模型,可以使用 :code:`fluid.io.load_params` 对于通过 :code:`fluid.io.save_params` 保存的模型,可以使用 :code:`fluid.io.load_params`
来进行载入。 来进行载入。
例如: 例如:
.. code-block:: python .. code-block:: python
import paddle.fluid as fluid import paddle.fluid as fluid
exe = fluid.Executor(fluid.CPUPlace()) exe = fluid.Executor(fluid.CPUPlace())
param_path = "./my_paddle_model" param_path = "./my_paddle_model"
...@@ -118,31 +118,31 @@ ...@@ -118,31 +118,31 @@
fluid.io.load_params(executor=exe, dirname=param_path, fluid.io.load_params(executor=exe, dirname=param_path,
main_program=prog) main_program=prog)
上面的例子中,通过调用 :code:`fluid.io.load_params` 函数,PaddlePaddle Fluid会对 上面的例子中,通过调用 :code:`fluid.io.load_params` 函数,PaddlePaddle Fluid会对
:code:`prog` 中的所有模型变量进行扫描,筛选出其中所有的模型参数, :code:`prog` 中的所有模型变量进行扫描,筛选出其中所有的模型参数,
并尝试从 :code:`param_path` 之中读取加载它们。 并尝试从 :code:`param_path` 之中读取加载它们。
需要格外注意的是,这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_params` 需要格外注意的是,这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_params`
时所用的 :code:`prog` 中的前向部分完全一致,且不能包含任何参数更新的操作。如果两者存在不一致, 时所用的 :code:`prog` 中的前向部分完全一致,且不能包含任何参数更新的操作。如果两者存在不一致,
那么可能会导致一些变量未被正确加载;如果错误地包含了参数更新操作,那可能会导致正常预测过程中参数被更改。 那么可能会导致一些变量未被正确加载;如果错误地包含了参数更新操作,那可能会导致正常预测过程中参数被更改。
这两个 :ref:`api_fluid_Program` 之间的关系类似于训练 :ref:`api_fluid_Program` 这两个 :ref:`api_fluid_Program` 之间的关系类似于训练 :ref:`api_fluid_Program`
和测试 :ref:`api_fluid_Program` 之间的关系,详见: :ref:`user_guide_test_while_training`。 和测试 :ref:`api_fluid_Program` 之间的关系,详见: :ref:`user_guide_test_while_training`。
另外,需特别注意运行 :code:`fluid.default_startup_program()` 必须在调用 :code:`fluid.io.load_params` 另外,需特别注意运行 :code:`fluid.default_startup_program()` 必须在调用 :code:`fluid.io.load_params`
之前。如果在之后运行,可能会覆盖已加载的模型参数导致错误。 之前。如果在之后运行,可能会覆盖已加载的模型参数导致错误。
载入checkpoint用于恢复训练 载入checkpoint用于恢复训练
=========================== ==========================
对于通过 :code:`fluid.io.save_checkpoint` 保存的模型,可以使用 :code:`fluid.io.load_checkpoint` 对于通过 :code:`fluid.io.save_checkpoint` 保存的模型,可以使用 :code:`fluid.io.load_checkpoint`
来进行载入。 来进行载入。
例如: 例如:
.. code-block:: python .. code-block:: python
import paddle.fluid as fluid import paddle.fluid as fluid
exe = fluid.Executor(fluid.CPUPlace()) exe = fluid.Executor(fluid.CPUPlace())
path = "./checkpoints" path = "./checkpoints"
...@@ -150,7 +150,7 @@ ...@@ -150,7 +150,7 @@
fluid.io.load_checkpoint(executor=exe, checkpoint_dir=path, fluid.io.load_checkpoint(executor=exe, checkpoint_dir=path,
serial=9, main_program=prog) serial=9, main_program=prog)
上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对 上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对
:code:`prog` 中的所有模型变量进行扫描,根据内置规则自动筛选出需要加载的变量, :code:`prog` 中的所有模型变量进行扫描,根据内置规则自动筛选出需要加载的变量,
并尝试从 :code:`path` 之中读取加载它们。 并尝试从 :code:`path` 之中读取加载它们。
...@@ -158,7 +158,7 @@ ...@@ -158,7 +158,7 @@
一个checkpoint会被保存在一个子目录中,并在目录名上体现出自己的版本号。 一个checkpoint会被保存在一个子目录中,并在目录名上体现出自己的版本号。
一般越大的版本号表示这个checkpoint越新。 一般越大的版本号表示这个checkpoint越新。
这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_checkpoint` 时所用的 :code:`prog` 这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_checkpoint` 时所用的 :code:`prog`
完全一致,否则会导致变量加载错误或者未加载。另外,与 :code:`fluid.io.save_params` 类似, 完全一致,否则会导致变量加载错误或者未加载。另外,与 :code:`fluid.io.save_params` 类似,
运行 :code:`fluid.default_startup_program()` 也必须在 :code:`fluid.io.load_checkpoint` 运行 :code:`fluid.default_startup_program()` 也必须在 :code:`fluid.io.load_checkpoint`
之前进行。 之前进行。
...@@ -6,10 +6,10 @@ ...@@ -6,10 +6,10 @@
######## ########
要进行PaddlePaddle Fluid单机训练,需要先 :ref:`user_guide_prepare_data` 和 要进行PaddlePaddle Fluid单机训练,需要先 :ref:`user_guide_prepare_data` 和
:ref:`user_guide_config_neural_network` 。当 :ref:`user_guide_config_neural_network` 。当\
:ref:`user_guide_config_neural_network` 完毕后,可以得到两个 :ref:`user_guide_config_neural_network` 完毕后,可以得到两个\
:ref:`api_fluid_Program`, :code:`startup_program` 和 :code:`main_program`。 :ref:`api_fluid_Program`, :code:`startup_program` 和 :code:`main_program`。
默认情况下,可以使用 :ref:`api_fluid_default_startup_program` 与 :ref:`api_fluid_default_main_program` 获得全局的 :ref:`api_fluid_Program`。 默认情况下,可以使用 :ref:`api_fluid_default_startup_program` 与\ :ref:`api_fluid_default_main_program` 获得全局的 :ref:`api_fluid_Program`。
例如: 例如:
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
# Here the fluid.default_startup_program() and fluid.default_main_program() # Here the fluid.default_startup_program() and fluid.default_main_program()
# has been constructed. # has been constructed.
在上述模型配置执行完毕后, :code:`fluid.default_startup_program()` 与 在上述模型配置执行完毕后, :code:`fluid.default_startup_program()` 与\
:code:`fluid.default_main_program()` 配置完毕了。 :code:`fluid.default_main_program()` 配置完毕了。
初始化参数 初始化参数
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
参数随机初始化 参数随机初始化
============== ==============
用户配置完模型后,参数初始化操作会被写入到 用户配置完模型后,参数初始化操作会被写入到\
:code:`fluid.default_startup_program()` 中。使用 :ref:`api_fluid_Executor` 运行 :code:`fluid.default_startup_program()` 中。使用 :ref:`api_fluid_Executor` 运行
这一程序,即可在全局 :ref:`api_fluid_Scope` 中随机初始化参数。例如: 这一程序,即可在全局 :ref:`api_fluid_Scope` 中随机初始化参数。例如:
...@@ -52,23 +52,23 @@ ...@@ -52,23 +52,23 @@
exe = fluid.Executor(fluid.CUDAPlace(0)) exe = fluid.Executor(fluid.CUDAPlace(0))
exe.run(program=fluid.default_startup_program()) exe.run(program=fluid.default_startup_program())
值得注意的是: 如果使用多GPU训练,参数需要先在GPU0上初始化,再经由 值得注意的是: 如果使用多GPU训练,参数需要先在GPU0上初始化,再经由\
:ref:`api_fluid_ParallelExecutor` 分发到多张显卡上。 :ref:`api_fluid_ParallelExecutor` 分发到多张显卡上。
载入预定义参数 载入预定义参数
============== ==============
在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。 在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。\
如何载入预定义参数,请参考 :ref:`user_guide_save_load_vars`。 如何载入预定义参数,请参考 :ref:`user_guide_save_load_vars`。
单卡训练 单卡训练
######## ########
执行单卡训练可以使用 :ref:`api_fluid_Executor` 中的 :code:`run()` 方法,运行训练 执行单卡训练可以使用 :ref:`api_fluid_Executor` 中的 :code:`run()` 方法,运行训练\
:ref:`api_fluid_Program` 即可。在运行的时候,用户可以通过 :code:`run(feed=...)` :ref:`api_fluid_Program` 即可。在运行的时候,用户可以通过 :code:`run(feed=...)`\
参数传入数据;用户可以通过 :code:`run(fetch=...)` 获取持久的数据。例如: 参数传入数据;用户可以通过 :code:`run(fetch=...)` 获取持久的数据。例如:\
.. code-blocks:: python .. code-blocks:: python
...@@ -82,9 +82,9 @@ ...@@ -82,9 +82,9 @@
这里有几点注意事项: 这里有几点注意事项:
1. feed的数据格式,请参考文章 :ref:`user_guide_feed_data_to_executor`。 1. feed的数据格式,请参考文章 :ref:`user_guide_feed_data_to_executor`。
2. :code:`Executor.run` 的返回值是 :code:`fetch_list=[...]` 的variable值。被fetch 2. :code:`Executor.run` 的返回值是 :code:`fetch_list=[...]` 的variable值。被fetch\
的Variable必须是persistable的。 :code:`fetch_list` 可以传入Variable的列表, 的Variable必须是persistable的。 :code:`fetch_list` 可以传入Variable的列表,\
也可以传入Varialbe的名字列表。当只Fetch一个对象时,返回值是一个元素。否则, 也可以传入Varialbe的名字列表。当只Fetch一个对象时,返回值是一个元素。否则,\
返回一个列表。 返回一个列表。
3. 如果需要取回的数据包含序列信息,可以设置 3. 如果需要取回的数据包含序列信息,可以设置
:code:`exe.run(return_numpy=False, ...)` 直接返回 :ref:`api_guide_lod_tensor` :code:`exe.run(return_numpy=False, ...)` 直接返回 :ref:`api_guide_lod_tensor`
...@@ -106,8 +106,8 @@ ...@@ -106,8 +106,8 @@
1. :code:`ParallelExecutor` 的构造函数需要指明要执行的 :ref:`api_fluid_Program` , 1. :code:`ParallelExecutor` 的构造函数需要指明要执行的 :ref:`api_fluid_Program` ,
并在执行过程中不能修改。 并在执行过程中不能修改。
2. :code:`ParallelExecutor` 需要明确指定是否使用 CUDA 显卡进行训练。在显卡训练 2. :code:`ParallelExecutor` 需要明确指定是否使用 CUDA 显卡进行训练。在显卡训练\
模式下会占用全部显卡。用户可以配置 `CUDA_VISIBLE_DEVICES <http://www.acceleware.com/blog/cudavisibledevices-masking-gpus>`_ 来修改占用 模式下会占用全部显卡。用户可以配置 `CUDA_VISIBLE_DEVICES <http://www.acceleware.com/blog/cudavisibledevices-masking-gpus>`_ 来修改占用\
的显卡。 的显卡。
进阶使用 进阶使用
......
...@@ -39,20 +39,20 @@ ...@@ -39,20 +39,20 @@
adam = fluid.optimizer.Adam(learning_rate=0.001) adam = fluid.optimizer.Adam(learning_rate=0.001)
adam.minimize(loss) adam.minimize(loss)
在使用 :code:`Optimizer` 之前,将 :code:`fluid.default_main_program()` 复制 在使用 :code:`Optimizer` 之前,将 :code:`fluid.default_main_program()` 复制\
成一个 :code:`test_program` 。之后使用测试数据运行 :code:`test_program`, 成一个 :code:`test_program` 。之后使用测试数据运行 :code:`test_program`,\
就可以做到运行测试程序,而不影响训练结果。 就可以做到运行测试程序,而不影响训练结果。
分别配置训练 :ref:`api_fluid_Program` 和测试 :ref:`api_fluid_Program` 分别配置训练 :ref:`api_fluid_Program` 和测试 :ref:`api_fluid_Program`
===================================================================== =====================================================================
如果训练程序和测试程序相差较大时,用户也可以完全通过定义两个不同的 如果训练程序和测试程序相差较大时,用户也可以完全通过定义两个不同的
:ref:`api_fluid_Program`,分别进行训练和测试。在PaddlePaddle Fluid中, :ref:`api_fluid_Program`,分别进行训练和测试。在PaddlePaddle Fluid中,\
所有的参数都有名字。如果两个不同的操作,甚至两个不同的网络使用了同样名字的参数, 所有的参数都有名字。如果两个不同的操作,甚至两个不同的网络使用了同样名字的参数,\
那么他们的值和内存空间都是共享的。 那么他们的值和内存空间都是共享的。
PaddlePaddle Fluid中使用 :code:`fluid.unique_name` 包来随机初始化用户未定义的 PaddlePaddle Fluid中使用 :code:`fluid.unique_name` 包来随机初始化用户未定义的\
参数名称。通过 :code:`fluid.unique_name.guard` 可以确保多次调用某函数 参数名称。通过 :code:`fluid.unique_name.guard` 可以确保多次调用某函数\
参数初始化的名称一致。 参数初始化的名称一致。
例如: 例如:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册