Skip to content

Commit 14a7399

Browse files
authored
Merge pull request #4329 from ranqiu92/r-doc
Update annotation in layers.py and update FAQ.
2 parents 47fbc96 + 732c897 commit 14a7399

File tree

2 files changed

+124
-2
lines changed

2 files changed

+124
-2
lines changed

doc/faq/index_cn.rst

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,4 +390,125 @@ PaddlePaddle保存的模型参数文件内容由16字节头信息和网络参数
390390

391391
* 如果发现最早的报错就是网络通信的问题,很有可能是非独占方式执行导致的端口冲突,可以联系OP,看当前MPI集群是否支持resource=full参数提交,如果支持增加此参数提交,并更换job 端口。
392392

393-
* 如果当前MPI集群并不支持任务独占模式,可以联系OP是否可以更换集群或升级当前集群。
393+
* 如果当前MPI集群并不支持任务独占模式,可以联系OP是否可以更换集群或升级当前集群。
394+
395+
19. PaddlePaddle如何输出多个层
396+
------------------------------
397+
398+
* 将需要输出的层作为 :code:`paddle.inference.Inference()` 接口的 :code:`output_layer` 参数输入,代码如下:
399+
400+
.. code-block:: python
401+
402+
inferer = paddle.inference.Inference(output_layer=[layer1, layer2], parameters=parameters)
403+
404+
* 指定要输出的字段进行输出。以输出 :code:`value` 字段为例,代码如下:
405+
406+
.. code-block:: python
407+
408+
out = inferer.infer(input=data_batch, flatten_result=False, field=["value"])
409+
410+
这里设置 :code:`flatten_result=False`,得到的输出结果是元素个数等于输出字段数的 :code:`list`,该 :code:`list` 的每个元素是由所有输出层相应字段结果组成的 :code:`list`,每个字段结果的类型是 :code:`numpy.array`。:code:`flatten_result` 的默认值为 :code:`True`,该情况下,PaddlePaddle会分别对每个字段将所有输出层的结果按行进行拼接,如果各输出层该字段 :code:`numpy.array` 结果的相应维数不匹配,程序将不能正常运行。
411+
412+
20. :code:`paddle.layer.memory` 的参数 :code:`name` 如何使用
413+
-------------------------------------------------------------
414+
415+
* :code:`paddle.layer.memory` 用于获取特定layer上一时间步的输出,该layer是通过参数 :code:`name` 指定,即,:code:`paddle.layer.memory` 会关联参数 :code:`name` 取值相同的layer,并将该layer上一时间步的输出作为自身当前时间步的输出。
416+
417+
* PaddlePaddle的所有layer都有唯一的name,用户通过参数 :code:`name` 设定,当用户没有显式设定时,PaddlePaddle会自动设定。而 :code:`paddle.layer.memory` 不是真正的layer,其name由参数 :code:`memory_name` 设定,当用户没有显式设定时,PaddlePaddle会自动设定。:code:`paddle.layer.memory` 的参数 :code:`name` 用于指定其要关联的layer,需要用户显式设定。
418+
419+
21. dropout 使用
420+
-----------------
421+
422+
* 在PaddlePaddle中使用dropout有两种方式
423+
424+
* 在相应layer的 :code:`layer_atter` 设置 :code:`drop_rate`,以 :code:`paddle.layer.fc` 为例,代码如下:
425+
426+
.. code-block:: python
427+
428+
fc = paddle.layer.fc(input=input, layer_attr=paddle.attr.ExtraLayerAttribute(drop_rate=0.5))
429+
430+
* 使用 :code:`paddle.layer.dropout`,以 :code:`paddle.layer.fc` 为例,代码如下:
431+
432+
.. code-block:: python
433+
434+
fc = paddle.layer.fc(input=input)
435+
drop_fc = paddle.layer.dropout(input=fc, dropout_rate=0.5)
436+
437+
* :code:`paddle.layer.dropout` 实际上使用了 :code:`paddle.layer.add_to`,并在该layer里采用第一种方式设置 :code:`drop_rate` 来使用dropout的。这种方式对内存消耗较大。
438+
439+
* PaddlePaddle在激活函数里实现dropout,而不是在layer里实现。
440+
441+
* :code:`paddle.layer.lstmemory`、:code:`paddle.layer.grumemory`、:code:`paddle.layer.recurrent` 不是通过一般的方式来实现对输出的激活,所以不能采用第一种方式在这几个layer里设置 :code:`drop_rate` 来使用dropout。若要对这几个layer使用dropout,可采用第二种方式,即使用 :code:`paddle.layer.dropout`。
442+
443+
22. 如何设置学习率退火(learning rate annealing)
444+
------------------------------------------------
445+
446+
在相应的优化算法里设置learning_rate_schedule及相关参数,以使用Adam算法为例,代码如下:
447+
448+
.. code-block:: python
449+
450+
optimizer = paddle.optimizer.Adam(
451+
learning_rate=1e-3,
452+
learning_rate_decay_a=0.5,
453+
learning_rate_decay_b=0.75,
454+
learning_rate_schedule="poly",)
455+
456+
PaddlePaddle目前支持8种learning_rate_schedule,这8种learning_rate_schedule及其对应学习率计算方式如下:
457+
458+
* "constant"
459+
460+
lr = learning_rate
461+
462+
* "poly"
463+
464+
lr = learning_rate * pow(1 + learning_rate_decay_a * num_samples_processed, -learning_rate_decay_b)
465+
466+
其中,num_samples_processed为已训练样本数,下同。
467+
468+
* "caffe_poly"
469+
470+
lr = learning_rate * pow(1.0 - num_samples_processed / learning_rate_decay_a, learning_rate_decay_b)
471+
472+
* "exp"
473+
474+
lr = learning_rate * pow(learning_rate_decay_a, num_samples_processed / learning_rate_decay_b)
475+
476+
* "discexp"
477+
478+
lr = learning_rate * pow(learning_rate_decay_a, floor(num_samples_processed / learning_rate_decay_b))
479+
480+
* "linear"
481+
482+
lr = max(learning_rate - learning_rate_decay_a * num_samples_processed, learning_rate_decay_b)
483+
484+
* "manual"
485+
486+
这是一种按已训练样本数分段取值的学习率退火方法。使用该learning_rate_schedule时,用户通过参数 :code:`learning_rate_args` 设置学习率衰减因子分段函数,当前的学习率为所设置 :code:`learning_rate` 与当前的衰减因子的乘积。以使用Adam算法为例,代码如下:
487+
488+
.. code-block:: python
489+
490+
optimizer = paddle.optimizer.Adam(
491+
learning_rate=1e-3,
492+
learning_rate_schedule="manual",
493+
learning_rate_args="1000:1.0,2000:0.9,3000:0.8",)
494+
495+
在该示例中,当已训练样本数小于等于1000时,学习率为 :code:`1e-3 * 1.0`;当已训练样本数大于1000小于等于2000时,学习率为 :code:`1e-3 * 0.9`;当已训练样本数大于2000时,学习率为 :code:`1e-3 * 0.8`。
496+
497+
* "pass_manual"
498+
499+
这是一种按已训练pass数分段取值的学习率退火方法。使用该learning_rate_schedule时,用户通过参数 :code:`learning_rate_args` 设置学习率衰减因子分段函数,当前的学习率为所设置 :code:`learning_rate` 与当前的衰减因子的乘积。以使用Adam算法为例,代码如下:
500+
501+
.. code-block:: python
502+
503+
optimizer = paddle.optimizer.Adam(
504+
learning_rate=1e-3,
505+
learning_rate_schedule="manual",
506+
learning_rate_args="1:1.0,2:0.9,3:0.8",)
507+
508+
在该示例中,当已训练pass数小于等于1时,学习率为 :code:`1e-3 * 1.0`;当已训练pass数大于1小于等于2时,学习率为 :code:`1e-3 * 0.9`;当已训练pass数大于2时,学习率为 :code:`1e-3 * 0.8`。
509+
510+
23. 出现 :code:`Duplicated layer name` 错误怎么办
511+
--------------------------------------------------
512+
513+
出现该错误的原因一般是用户对不同layer的参数 :code:`name` 设置了相同的取值。遇到该错误时,先找出参数 :code:`name` 取值相同的layer,然后将这些layer的参数 :code:`name` 设置为不同的值。
514+

python/paddle/trainer_config_helpers/layers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,7 @@ def data_layer(name, size, depth=None, height=None, width=None,
921921
922922
data = data_layer(name="input", size=1000)
923923
924-
:param name: The name of this layer. It is optional.
924+
:param name: The name of this layer.
925925
:type name: basestring
926926
:param size: Size of this data layer.
927927
:type size: int
@@ -3668,6 +3668,7 @@ def gru_step_naive_layer(input,
36683668
:param param_attr:
36693669
:param layer_attr:
36703670
:return:
3671+
:rtype: LayerOutput
36713672
"""
36723673
if input.size % 3 != 0:
36733674
raise ValueError("GruStep input size must be divided by 3")

0 commit comments

Comments
 (0)