Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
FluidDoc
提交
46f91c1e
F
FluidDoc
项目概览
PaddlePaddle
/
FluidDoc
通知
5
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
23
列表
看板
标记
里程碑
合并请求
111
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
FluidDoc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
23
Issue
23
列表
看板
标记
里程碑
合并请求
111
合并请求
111
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
46f91c1e
编写于
6月 27, 2018
作者:
Y
yuyang18
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Follow comments
上级
5a1a26e0
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
44 addition
and
44 deletion
+44
-44
source/user_guides/howto/training/index.rst
source/user_guides/howto/training/index.rst
+3
-3
source/user_guides/howto/training/save_load_variables.rst
source/user_guides/howto/training/save_load_variables.rst
+20
-20
source/user_guides/howto/training/single_node.rst
source/user_guides/howto/training/single_node.rst
+15
-15
source/user_guides/howto/training/test_while_training.rst
source/user_guides/howto/training/test_while_training.rst
+6
-6
未找到文件。
source/user_guides/howto/training/index.rst
浏览文件 @
46f91c1e
############
######################
使用PaddlePaddle Fluid
训练神经网络
############
######################
############
训练神经网络
############
PaddlePaddle Fluid支持单机训练,和多节点训练。每种训练模式下,都支持多种训练方法。
...
...
source/user_guides/howto/training/save_load_variables.rst
浏览文件 @
46f91c1e
...
...
@@ -19,7 +19,7 @@
2. 长期变量
长期变量指的是在整个训练过程中持续存在、不会因为一个迭代的结束而被销毁的变量,例如动态调节的全局学习率等。
在PaddlePaddle Fluid中,长期变量通过将 :ref:`api_fluid_Variable` 的 :code:`persistable`
在PaddlePaddle Fluid中,长期变量通过将 :ref:`api_fluid_Variable` 的 :code:`persistable`
属性设置为 :code:`True` 来表示。所有的模型参数都是长期变量,但并非所有的长期变量都是模型参数。
3. 临时变量
...
...
@@ -40,9 +40,9 @@
因此,根据需求的不同,我们提供了两套API来分别进行模型的参数和checkpoint的保存。
保存模型用于对新样本的预测
========================
========================
==
如果我们保存模型的目的是用于对新样本的预测,那么只保存模型参数就足够了。我们可以使用
如果我们保存模型的目的是用于对新样本的预测,那么只保存模型参数就足够了。我们可以使用
:code:`fluid.io.save_params` 接口来进行模型参数的保存。
例如:
...
...
@@ -56,13 +56,13 @@
prog = fluid.default_main_program()
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` 中的所有模型变量进行扫描,
筛选出其中所有的模型参数,并将这些模型参数保存到指定的 :code:`param_path` 之中。
保存checkpoint用于将来恢复训练
===========================
===========================
===
在训练过程中,我们可能希望在一些节点上将当前的训练状态保存下来,
以便在将来需要的时候恢复训练环境继续进行训练。这一般被称作“checkpoint”。
...
...
@@ -86,11 +86,11 @@
main_program=prog,
max_num_checkpoints=3)
上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对默认
上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对默认
:ref:`api_fluid_Program` 也就是 :code:`prog` 中的所有模型变量进行扫描,
根据一系列内置的规则自动筛选出其中所有需要保存的变量,并将他们保存到指定的 :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;
:code:`max_num_checkpoints` 用于表示的最大checkpoint数量,
如果目录中已经存在的checkpoint数量超过这个值,那最早的checkpoint将被删除。
...
...
@@ -101,16 +101,16 @@
与模型变量的保存相对应,我们提供了两套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
import paddle.fluid as fluid
import paddle.fluid as fluid
exe = fluid.Executor(fluid.CPUPlace())
param_path = "./my_paddle_model"
...
...
@@ -118,31 +118,31 @@
fluid.io.load_params(executor=exe, dirname=param_path,
main_program=prog)
上面的例子中,通过调用 :code:`fluid.io.load_params` 函数,PaddlePaddle Fluid会对
上面的例子中,通过调用 :code:`fluid.io.load_params` 函数,PaddlePaddle Fluid会对
:code:`prog` 中的所有模型变量进行扫描,筛选出其中所有的模型参数,
并尝试从 :code:`param_path` 之中读取加载它们。
需要格外注意的是,这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_params`
需要格外注意的是,这里的 :code:`prog` 必须和调用 :code:`fluid.io.save_params`
时所用的 :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`。
另外,需特别注意运行 :code:`fluid.default_startup_program()` 必须在调用 :code:`fluid.io.load_params`
另外,需特别注意运行 :code:`fluid.default_startup_program()` 必须在调用 :code:`fluid.io.load_params`
之前。如果在之后运行,可能会覆盖已加载的模型参数导致错误。
载入checkpoint用于恢复训练
==========================
=
==========================
对于通过 :code:`fluid.io.save_checkpoint` 保存的模型,可以使用 :code:`fluid.io.load_checkpoint`
对于通过 :code:`fluid.io.save_checkpoint` 保存的模型,可以使用 :code:`fluid.io.load_checkpoint`
来进行载入。
例如:
.. code-block:: python
import paddle.fluid as fluid
import paddle.fluid as fluid
exe = fluid.Executor(fluid.CPUPlace())
path = "./checkpoints"
...
...
@@ -150,7 +150,7 @@
fluid.io.load_checkpoint(executor=exe, checkpoint_dir=path,
serial=9, main_program=prog)
上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对
上面的例子中,通过调用 :code:`fluid.io.save_checkpoint` 函数,PaddlePaddle Fluid会对
:code:`prog` 中的所有模型变量进行扫描,根据内置规则自动筛选出需要加载的变量,
并尝试从 :code:`path` 之中读取加载它们。
...
...
@@ -158,7 +158,7 @@
一个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.default_startup_program()` 也必须在 :code:`fluid.io.load_checkpoint`
运行 :code:`fluid.default_startup_program()` 也必须在 :code:`fluid.io.load_checkpoint`
之前进行。
source/user_guides/howto/training/single_node.rst
浏览文件 @
46f91c1e
...
...
@@ -6,10 +6,10 @@
########
要进行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_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 @@
# Here the fluid.default_startup_program() and fluid.default_main_program()
# has been constructed.
在上述模型配置执行完毕后, :code:`fluid.default_startup_program()` 与
在上述模型配置执行完毕后, :code:`fluid.default_startup_program()` 与
\
:code:`fluid.default_main_program()` 配置完毕了。
初始化参数
...
...
@@ -43,7 +43,7 @@
参数随机初始化
==============
用户配置完模型后,参数初始化操作会被写入到
用户配置完模型后,参数初始化操作会被写入到
\
:code:`fluid.default_startup_program()` 中。使用 :ref:`api_fluid_Executor` 运行
这一程序,即可在全局 :ref:`api_fluid_Scope` 中随机初始化参数。例如:
...
...
@@ -52,23 +52,23 @@
exe = fluid.Executor(fluid.CUDAPlace(0))
exe.run(program=fluid.default_startup_program())
值得注意的是: 如果使用多GPU训练,参数需要先在GPU0上初始化,再经由
值得注意的是: 如果使用多GPU训练,参数需要先在GPU0上初始化,再经由
\
:ref:`api_fluid_ParallelExecutor` 分发到多张显卡上。
载入预定义参数
==============
在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。
在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。
\
如何载入预定义参数,请参考 :ref:`user_guide_save_load_vars`。
单卡训练
########
执行单卡训练可以使用 :ref:`api_fluid_Executor` 中的 :code:`run()` 方法,运行训练
:ref:`api_fluid_Program` 即可。在运行的时候,用户可以通过 :code:`run(feed=...)`
参数传入数据;用户可以通过 :code:`run(fetch=...)` 获取持久的数据。例如:
执行单卡训练可以使用 :ref:`api_fluid_Executor` 中的 :code:`run()` 方法,运行训练
\
:ref:`api_fluid_Program` 即可。在运行的时候,用户可以通过 :code:`run(feed=...)`
\
参数传入数据;用户可以通过 :code:`run(fetch=...)` 获取持久的数据。例如:
\
.. code-blocks:: python
...
...
@@ -82,9 +82,9 @@
这里有几点注意事项:
1. feed的数据格式,请参考文章 :ref:`user_guide_feed_data_to_executor`。
2. :code:`Executor.run` 的返回值是 :code:`fetch_list=[...]` 的variable值。被fetch
的Variable必须是persistable的。 :code:`fetch_list` 可以传入Variable的列表,
也可以传入Varialbe的名字列表。当只Fetch一个对象时,返回值是一个元素。否则,
2. :code:`Executor.run` 的返回值是 :code:`fetch_list=[...]` 的variable值。被fetch
\
的Variable必须是persistable的。 :code:`fetch_list` 可以传入Variable的列表,
\
也可以传入Varialbe的名字列表。当只Fetch一个对象时,返回值是一个元素。否则,
\
返回一个列表。
3. 如果需要取回的数据包含序列信息,可以设置
:code:`exe.run(return_numpy=False, ...)` 直接返回 :ref:`api_guide_lod_tensor`
...
...
@@ -106,8 +106,8 @@
1. :code:`ParallelExecutor` 的构造函数需要指明要执行的 :ref:`api_fluid_Program` ,
并在执行过程中不能修改。
2. :code:`ParallelExecutor` 需要明确指定是否使用 CUDA 显卡进行训练。在显卡训练
模式下会占用全部显卡。用户可以配置 `CUDA_VISIBLE_DEVICES <http://www.acceleware.com/blog/cudavisibledevices-masking-gpus>`_ 来修改占用
2. :code:`ParallelExecutor` 需要明确指定是否使用 CUDA 显卡进行训练。在显卡训练
\
模式下会占用全部显卡。用户可以配置 `CUDA_VISIBLE_DEVICES <http://www.acceleware.com/blog/cudavisibledevices-masking-gpus>`_ 来修改占用
\
的显卡。
进阶使用
...
...
source/user_guides/howto/training/test_while_training.rst
浏览文件 @
46f91c1e
...
...
@@ -39,20 +39,20 @@
adam = fluid.optimizer.Adam(learning_rate=0.001)
adam.minimize(loss)
在使用 :code:`Optimizer` 之前,将 :code:`fluid.default_main_program()` 复制
成一个 :code:`test_program` 。之后使用测试数据运行 :code:`test_program`,
在使用 :code:`Optimizer` 之前,将 :code:`fluid.default_main_program()` 复制
\
成一个 :code:`test_program` 。之后使用测试数据运行 :code:`test_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` 包来随机初始化用户未定义的
参数名称。通过 :code:`fluid.unique_name.guard` 可以确保多次调用某函数
PaddlePaddle Fluid中使用 :code:`fluid.unique_name` 包来随机初始化用户未定义的
\
参数名称。通过 :code:`fluid.unique_name.guard` 可以确保多次调用某函数
\
参数初始化的名称一致。
例如:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录