set_gradient_clip

查看属性与别名

API属性:声明式编程(静态图)专用API

paddle.fluid.clip.set_gradient_clip ( clip, param_list=None, program=None ) [源代码]

警告

此API对位置使用的要求较高,其必须位于组建网络之后, minimize 之前,因此在未来版本中可能被删除,故不推荐使用。推荐在 optimizer 初始化时设置梯度裁剪。 有三种裁剪策略: GradientClipByGlobalNormGradientClipByNormGradientClipByValue 。 如果在 optimizer 中设置过梯度裁剪,又使用了 set_gradient_clipset_gradient_clip 将不会生效。

给指定参数做梯度裁剪。

参数

  • clip (GradientClipBase) - 梯度裁剪的策略,如 GradientClipByGlobalNorm 等,用于描述具体的裁剪方法和属性。
  • param_list (list(Variable),可选) - 需要裁剪的参数列表,可以是参数或参数名称列表。默认值为None,表示裁剪 program 中的所有参数。
  • program (Program,可选) - 参数所在的Program。默认值为None,表示使用 default_main_program

返回

无。

代码示例

  1. import paddle.fluid as fluid
  2. def network():
  3. image = fluid.layers.data(name='image', shape=[28], dtype='float32')
  4. param_attr1 = fluid.ParamAttr("fc1_param")
  5. fc1 = fluid.layers.fc(image, size=10, param_attr=param_attr1)
  6. param_attr2 = fluid.ParamAttr("fc2_param")
  7. fc2 = fluid.layers.fc(fc1, size=10, param_attr=param_attr2)
  8. loss = fluid.layers.reduce_mean(fc2)
  9. return loss
  10. # network 1: clip all parameter gradient
  11. with fluid.program_guard(fluid.Program(), fluid.Program()):
  12. loss = network()
  13. fluid.clip.set_gradient_clip(
  14. fluid.clip.GradientClipByGlobalNorm(clip_norm=2.0))
  15. sgd = fluid.optimizer.SGD(learning_rate=1e-3)
  16. sgd.minimize(loss)
  17. # network 2: clip parameter gradient by name
  18. with fluid.program_guard(fluid.Program(), fluid.Program()):
  19. loss = network()
  20. fluid.clip.set_gradient_clip(
  21. fluid.clip.GradientClipByValue(min=-1.0, max=1.0),
  22. param_list=["fc1_param", "fc2_param"])
  23. sgd = fluid.optimizer.SGD(learning_rate=1e-3)
  24. sgd.minimize(loss)
  25. # network 3: clip parameter gradient by var
  26. with fluid.program_guard(fluid.Program(), fluid.Program()):
  27. loss = network()
  28. param_var1 = fluid.default_main_program().global_block().var("fc1_param")
  29. param_var2 = fluid.default_main_program().global_block().var("fc2_param")
  30. fluid.clip.set_gradient_clip(
  31. fluid.clip.GradientClipByValue(min=-1.0, max=1.0),
  32. param_list=[param_var1, param_var2])
  33. sgd = fluid.optimizer.SGD(learning_rate=1e-3)
  34. sgd.minimize(loss)
  35. # network 4: use set_gradient_clip and minimize(grad_clip=clip) together
  36. with fluid.program_guard(fluid.Program(), fluid.Program()):
  37. loss = network()
  38. param_var1 = fluid.default_main_program().global_block().var("fc1_param")
  39. param_var2 = fluid.default_main_program().global_block().var("fc2_param")
  40. clip1 = fluid.clip.GradientClipByValue(min=-1.0, max=1.0)
  41. clip2 = fluid.clip.GradientClipByNorm(clip_norm=1.0)
  42. # 设置梯度裁剪策略:clip1
  43. fluid.clip.set_gradient_clip(clip1)
  44. # 设置梯度裁剪策略:clip2
  45. sgd = fluid.optimizer.SGD(learning_rate=1e-3, grad_clip=clip2)
  46. sgd.minimize(loss)
  47. # 有设置冲突时,set_gradient_clip将不会生效,将以clip2的策略进行梯度裁剪