mindspore.nn.ClipByNorm

mindspore.nn.ClipByNorm(axis=None)[源代码]

对输入Tensor的值进行裁剪,使用 \(L_2\) 范数控制梯度。

如果输入Tensor的 \(L_2\) 范数不大于输入 clip_norm ,则此层的输出保持不变。 否则,Tensor将标准化为:

\[\text{output}(X) = \frac{\text{clip_norm} * X}{L_2(X)},\]

其中 \(L_2(X)\)\(X\)\(L_2\) 范数。

参数:

  • axis (Union[None, int, tuple(int)]) - 指定在哪个维度上计算 \(L_2\) 范数。如果为None,则计算所有维度。默认值:None。

输入:

  • x (Tensor) - 输入n维的Tensor,数据类型为float32或float16。

  • clip_norm (Tensor) - shape为 \(()\)\((1)\) 的Tensor。或者其shape可以广播到 x 的shape。

输出:

Tensor,裁剪后的Tensor与输入 x 的shape相同,数据类型为float32。

异常:

  • TypeError - axis 不是None、int、或tuple。

  • TypeError - x 的数据类型既不是float16也不是float32。

支持平台:

Ascend GPU CPU

样例:

>>> net = nn.ClipByNorm()
>>> x = Tensor(np.random.randint(0, 10, [4, 16]), mindspore.float32)
>>> clip_norm = Tensor(np.array([100]).astype(np.float32))
>>> output = net(x, clip_norm)
>>> print(output.shape)
(4, 16)