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.nn.ForwardValueAndGrad.rst 2.9 kB

4 years ago
4 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. mindspore.nn.ForwardValueAndGrad
  2. ===================================
  3. .. py:class:: mindspore.nn.ForwardValueAndGrad(network, weights=None, get_all=False, get_by_list=False, sens_param=False)
  4. 训练网络的封装。
  5. 包括正向网络和梯度函数。该类生成的Cell使用'\*inputs'输入来训练。
  6. 通过梯度函数来创建反向图,用以计算梯度。
  7. **参数:**
  8. - **network** (Cell) - 训练网络。
  9. - **weights** (ParameterTuple) - 训练网络中需要计算梯度的的参数。
  10. - **get_all** (bool) - 如果为True,则计算网络输入对应的梯度。默认值:False。
  11. - **get_by_list** (bool) - 如果为True,则计算参数变量对应的梯度。如果 `get_all` 和 `get_by_list` 都为False,则计算第一个输入对应的梯度。如果 `get_all` 和 `get_by_list` 都为True,则以((输入的梯度),(参数的梯度))的形式同时获取输入和参数变量的梯度。默认值:False。
  12. - **sens_param** (bool) - 是否将sens作为输入。如果 `sens_param` 为False,则sens默认为'ones_like(outputs)'。默认值:False。如果 `sens_param` 为True,则需要指定sens的值。
  13. **输入:**
  14. - **(\*inputs)** (Tuple(Tensor...)):shape为 :math:`(N, \ldots)` 的输入tuple。
  15. - **(sens)**:反向传播梯度的缩放值。如果网络有单个输出,则sens是tensor。如果网络有多个输出,则sens是tuple(tensor)。
  16. **输出:**
  17. - **forward value** - 网络运行的正向结果。
  18. - **gradients** (tuple(tensor)) - 网络反向传播的梯度。
  19. **支持平台:**
  20. ``Ascend`` ``GPU`` ``CPU``
  21. **样例:**
  22. >>> class Net(nn.Cell):
  23. ... def __init__(self):
  24. ... super(Net, self).__init__()
  25. ... self.weight = Parameter(Tensor(np.ones([2, 2]).astype(np.float32)), name="weight")
  26. ... self.matmul = P.MatMul()
  27. ...
  28. ... def construct(self, x):
  29. ... out = self.matmul(x, self.weight)
  30. ... return out
  31. ...
  32. >>> net = Net()
  33. >>> criterion = nn.SoftmaxCrossEntropyWithLogits()
  34. >>> net_with_criterion = nn.WithLossCell(net, criterion)
  35. >>> weight = ParameterTuple(net.trainable_params())
  36. >>> train_network = nn.ForwardValueAndGrad(net_with_criterion, weights=weight, get_all=True, get_by_list=True)
  37. >>> inputs = Tensor(np.ones([1, 2]).astype(np.float32))
  38. >>> labels = Tensor(np.zeros([1, 2]).astype(np.float32))
  39. >>> result = train_network(inputs, labels)
  40. >>> print(result)
  41. (Tensor(shape=[1], dtype=Float32, value=[0.00000000e+00]), ((Tensor(shape=[1, 2], dtype=Float32, value=
  42. [[1.00000000e+00, 1.00000000e+00]]), Tensor(shape=[1, 2], dtype=Float32, value=
  43. [[0.00000000e+00, 0.00000000e+00]])), (Tensor(shape=[2, 2], dtype=Float32, value=
  44. [[5.00000000e-01, 5.00000000e-01],
  45. [5.00000000e-01, 5.00000000e-01]]),)))