You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

mindspore.ops.GradOperation.rst 4.9 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. mindspore.ops.GradOperation
  2. ============================
  3. .. py:class:: mindspore.ops.GradOperation(get_all=False, get_by_list=False, sens_param=False)
  4. 一个高阶函数,为输入函数生成梯度函数。
  5. 由 `GradOperation` 高阶函数生成的梯度函数可以通过构造参数自定义。
  6. 构建一个以x和y为输入的函数 `net = Net()` ,并带有一个参数z,详见样例中的 `Net` 。
  7. 生成一个梯度函数,该函数返回第一个输入的梯度(见样例中的 `GradNetWrtX` )。
  8. 1. 构建一个带有默认参数的 `GradOperation` 高阶函数: `grad_op = GradOperation()` 。
  9. 2. 将 `net` 作为参数调用 `grad_op` ,得到梯度函数: `gradient_function = grad_op(net)` 。
  10. 3. 用 `net` 的输入作为参数调用梯度函数,得到第一个输入的梯度:`grad_op(net)(x, y)` 。
  11. 生成一个梯度函数,该函数返回所有输入的梯度(见样例中的 `GradNetWrtXY` )。
  12. 1. 构造一个带有 `get_all=True` 参数的 `GradOperation` 高阶函数,表示获得在样例中 `Net()` 中的x和y所有输入的梯度:`grad_op = GradOperation(get_all=True)` 。
  13. 2. 将 `net` 作为参数调用 `grad_op` ,得到梯度函数: `gradient_function = grad_op(net)` 。
  14. 3. 用 `net` 的输入作为参数调用梯度函数,得到所有输入的梯度:`gradient_function(x, y)` 。
  15. 生成一个梯度函数,该函数返回给定参数的梯度(见样例中的 `GradNetWithWrtParams` )。
  16. 1. 构造一个带有 `get_by_list=True` 参数的GradOperation高阶函数: grad_op = GradOperation(get_by_list=True)。
  17. 2. 当构建 `GradOperation` 高阶函数时,创建一个 `ParameterTuple` 和 `net` 作为参数输入, `ParameterTuple` 作为参数过滤器决定返回哪个梯度:`params = ParameterTuple(net.trainingable_params())` 。
  18. 3. 将 `net` 和 `params` 作为参数输入 `grad_op` ,得到梯度函数: `gradient_function = grad_op(net, params)` 。
  19. 4. 用 `net` 的输入作为参数调用梯度函数,得到关于给定参数的梯度: `gradient_function(x, y)` 。
  20. 生成一个梯度函数,该函数以((dx, dy), (dz))的格式返回关于所有输入和给定参数的梯度(见样例中的 `GradNetWrtInputsAndParams` )。
  21. 1. 构建一个带有 `get_all=True` 和 `get_by_list=True` 参数的 `GradOperation` 高阶函数:`grad_op = GradOperation(get_all=True, get_by_list=True)` 。
  22. 2. 当构建 `GradOperation` 高阶函数时,创建一个 `ParameterTuple` 和 `net` 作为参数输入:`params = ParameterTuple(net.trainingable_params())` 。
  23. 3. 将 `net` 和 `params` 作为参数输入 `grad_op` ,得到梯度函数: `gradient_function = grad_op(net, params)` 。
  24. 4. 用 `net` 的输入作为参数调用梯度函数,得到关于所有输入和给定参数的梯度:`gradient_function(x, y)` 。
  25. 我们可以设置 `sens_param` 等于True来配置灵敏度(关于输出的梯度),向梯度函数传递一个额外的灵敏度输入值。这个输入值必须与 `net` 的输出具有相同的形状和类型(见样例中的 `GradNetWrtXYWithSensParam` )。
  26. 1. 构建一个带有 `get_all=True` 和 `sens_param=True` 参数的 `GradOperation` 高阶函数:`grad_op = GradOperation(get_all=True, sens_param=True)` 。
  27. 2. 当 `sens_param=True` ,定义 `grad_wrt_output` (关于输出的梯度):`grad_wrt_output = Tensor(np.ones([2, 2]).astype(np.float32))` 。
  28. 3. 用 `net` 作为参数输入 `grad_op` ,得到梯度函数:`gradient_function = grad_op(net)` 。
  29. 4. 用 `net` 的输入和 `sens_param` 作为参数调用梯度函数,得到关于所有输入的梯度:`gradient_function(x, y, grad_wrt_output)` 。
  30. **参数:**
  31. - **get_all** (bool) - 计算梯度,如果等于False,获得第一个输入的梯度,如果等于True,获得所有输入的梯度。默认值:False。
  32. - **get_by_list** (bool) - 如果 `get_all` 和 `get_by_list` 都等于False,则得到第一个输入的梯度。如果等于True,获得所有参数变量的梯度。如果 `get_all` 和 `get_by_list` 都等于True,则同时得到输入和参数变量的梯度,输出形式为((输入的梯度),(参数变量的梯度))。默认值:False。
  33. - **sens_param** (bool) - 是否在输入中配置灵敏度(关于输出的梯度)。如果sens_param等于False,自动添加一个 `ones_like(output)` 灵敏度。如果sensor_param等于True,灵敏度(输出的梯度),必须通过location参数或key-value pair参数来传递,如果是通过key-value pair参数传递value,那么key必须为sens。默认值:False。
  34. **返回:**
  35. 将一个函数作为参数,并返回梯度函数的高阶函数。
  36. **异常:**
  37. - **TypeError** - 如果 `get_all` 、`get_by_list` 或者 `sens_params` 不是bool。