@@ -390,4 +390,125 @@ PaddlePaddle保存的模型参数文件内容由16字节头信息和网络参数
390
390
391
391
* 如果发现最早的报错就是网络通信的问题,很有可能是非独占方式执行导致的端口冲突,可以联系OP,看当前MPI集群是否支持resource=full参数提交,如果支持增加此参数提交,并更换job 端口。
392
392
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
+
0 commit comments