Softmax

class paddle.sparse.nn. Softmax ( axis=- 1, name=None ) [源代码]

稀疏 Softmax 激活层,输入 xSparseCooTensorSparseCsrTensor ,创建一个可调用对象以计算输入 xSoftmax

当输入 xSparseCsrTensor 时,仅支持 axis=-1,是由于 Csr 稀疏存储格式,更适合按行读取数据。

如果将 x 从稀疏矩阵转换为稠密矩阵, \(i\) 代表行数, \(j\) 代表列数,且 axis=-1 时有如下公式:

\[softmax_ij = \frac{\exp(x_ij - max_j(x_ij))}{\sum_j(exp(x_ij - max_j(x_ij))}\]

参数

  • axis (int, 可选) - 指定对输入 SparseTensor 计算 softmax 的轴。对于 SparseCsrTensor,仅支持 axis=-1。默认值:-1。

  • name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。

形状

  • input:任意形状的 SparseCooTensor 或 SparseCsrTensor,数据类型为 float32、float64。

  • output:和 input 具有相同形状和数据类型的 SparseTensor。

代码示例

>>> import paddle
>>> paddle.seed(2022)

>>> mask = paddle.rand((3, 4)) < 0.7
>>> x = paddle.rand((3, 4)) * mask.astype('float32')
>>> print(x)
Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
[[0.88156885, 0.14463395, 0.17831714, 0.43818203],
 [0.07617740, 0.75576496, 0.        , 0.61921930],
 [0.        , 0.        , 0.42460245, 0.03001321]])

>>> csr = x.to_sparse_csr()
>>> print(csr)
Tensor(shape=[3, 4], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
       crows=[0, 4, 7, 9],
       cols=[0, 1, 2, 3, 0, 1, 3, 2, 3],
       values=[0.88156885, 0.14463395, 0.17831714, 0.43818203, 0.07617740,
               0.75576496, 0.61921930, 0.42460245, 0.03001321])

>>> softmax = paddle.sparse.nn.Softmax()
>>> out = softmax(csr)
>>> print(out)
Tensor(shape=[3, 4], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
       crows=[0, 4, 7, 9],
       cols=[0, 1, 2, 3, 0, 1, 3, 2, 3],
       values=[0.38234913, 0.18298410, 0.18925257, 0.24541418, 0.21302439,
               0.42031071, 0.36666498, 0.59738696, 0.40261301])

>>> coo = x.to_sparse_coo(sparse_dim=2)
>>> print(coo)
Tensor(shape=[3, 4], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
       indices=[[0, 0, 0, 0, 1, 1, 1, 2, 2],
                [0, 1, 2, 3, 0, 1, 3, 2, 3]],
       values=[0.88156885, 0.14463395, 0.17831714, 0.43818203, 0.07617740,
               0.75576496, 0.61921930, 0.42460245, 0.03001321])

>>> out = softmax(coo)
>>> print(out)
Tensor(shape=[3, 4], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
       indices=[[0, 0, 0, 0, 1, 1, 1, 2, 2],
                [0, 1, 2, 3, 0, 1, 3, 2, 3]],
       values=[0.38234913, 0.18298411, 0.18925257, 0.24541420, 0.21302438,
               0.42031071, 0.36666498, 0.59738696, 0.40261301])