append_backward

  • paddle.fluid.backward.append_backward(loss, parameter_list=None, no_grad_set=None, callbacks=None)[源代码]

该接口将向主程序(main_program)追加反向部分 。

完整的神经网络训练由前向和反向传播组成。但是当我们配置网络时,我们只需要指定其前向部分。 该接口使用链式法则,能够根据前向部分自动生成反向部分。

在大多数情况下,用户无需手动调用此接口,它将由优化器(Optimizer)的 minimize 函数自动调用。

  • 参数:
    • loss ( Variable ) - 网络的损失变量。
    • parameter_list (list [str],可选)- 指定优化器需要更新的参数名称列表。如果为 None ,则将更新所有参数。默认值为 None
    • no_grad_set (set [str],可选)- 在 block0 ( Block ) 中要忽略梯度的 Variable 的名字的集合。所有的 Block 中带有 stop_gradient = True 的所有 Variable 的名字都会被自动添加到此集合中。如果该参数不为 None,则会将该参数集合的内容添加到默认的集合中。默认值为 None
    • callbacks (list [callable object],可选)- 回调函数列表。用于在反向传播构建中执行一些自定义作业。每次将新的梯度OP添加到程序中时,将调用其中的所有可调用对象。可调用对象必须有两个输入参数: BlockcontextBlock 是将被添加到新梯度算子的块。 context 是一个映射,其键是梯度 Variable 名,值是对应的原始 Variable 。除此之外, context 还有另一个特殊的键值对:键是字符串 __ current_op_desc__ ,值是刚刚触发可调用对象的梯度OP的 op_desc 。默认值为 None

返回: 参数及其梯度 Variable 的元组的列表。元组的第一个值为参数,第二个值为该参数的梯度 Variable

返回类型: list[( Variable , Variable )]

  • 抛出:
    • AssertionError - 如果 loss 不是 Variable 的实例。

示例代码

  1. import paddle.fluid as fluid
  2.  
  3. x = fluid.layers.data(name='x', shape=[13], dtype='float32')
  4. y = fluid.layers.data(name='y', shape=[1], dtype='float32')
  5. y_predict = fluid.layers.fc(input=x, size=1, act=None)
  6. loss = fluid.layers.square_error_cost(input=y_predict, label=y)
  7. avg_loss = fluid.layers.mean(loss)
  8.  
  9. p_g_list1 = fluid.backward.append_backward(loss=avg_loss) # len(p_g_list1) == 2
  10. p_g_list2 = fluid.backward.append_backward(loss=avg_loss, parameter_list=[p_g_list1[0][0].name]) # len(p_g_list1) == 1
  11. p_g_list3 = fluid.backward.append_backward(loss=avg_loss, no_grad_set=set([p_g_list1[0][0].name])) # len(p_g_list1) == 1
  12. p_g_list4 = fluid.backward.append_backward(loss=avg_loss, parameter_list=[p_g_list1[0][0].name], no_grad_set=set([p_g_list1[0][0].name])) # len(p_g_list1) == 0