API名称 | paddle.nn.softmax2D |
---|---|
提交作者 | Asthestarsfalll |
提交时间 | 2022-03-18 |
版本号 | V1.1 |
依赖飞桨版本 | develop |
文件名 | 20220318_api_design_for_nn_Softmax2D.md |
paddle.nn.Softmax2D 是 paddle.nn.Softmax 的变体,其针对 3D 或者 4D 的 tensor 在空间维度计算softmax,从而输出 tensor 在每个空间维度(channels, hj, wj)的 tensor 求和为1。
在 paddle 框架中新增 Softmax2D API,调用路径为:paddle.nn.Softmax2D。
飞桨支持Softmax2D组网API。
paddle中有相关API paddle.nn.softmax和paddle.nn.functional.softmax,调用底层算子实现,softmax2d
可以使用paddle.nn.functional.softmax
API进行实现。
softmax
的整体逻辑如下:
-
检查输入的数据类型是否为float;
-
若指定了
dtype
,则先将输入转换为该数据类型; -
将输入指定的维度置换到最后一维;
-
将置换后的结果变换为二维矩阵,二维矩阵第一维(列的长度)是输入除最后一维之外的其他维度值的乘积,第二维(行长度)和输入
axis
维的长度相同;对于矩阵的每一行,softmax操作对其进行重新缩放,使得该行的每个元素在 [0,1] 范围内,并且总和为1; -
对每一行都计算softmax的结果,计算公式如下: $$ Softmax[i,j] = \frac{\exp(x[i,j])}{\sum_j(exp(x[i,j])} $$ 对于第i行上的第j个值,其计算结果为该值的指数值比上第i行上所有值的指数值之和;
-
执行3、4步的逆步骤,将结果恢复到输入的维度。
softmax2d
实际上就是在空间维度计算softmax,从而使输出 tensor 在每个空间维度$(channels, h_j, w_j)$的 tensor 求和为1,即表示空间位置上的某个通道向量求和为1。
由上述第4步描述可知,将axis
参数固定为-3, 即在channels的维度上进行计算即可,在实际运算中,会将输入的形状reshape
为$heightwidth, channels$或$batchheight*width, channels$,这样一来每一行的结果求和都为1,便符合了Softmax2D的需求。
Pytorch中有APItorch.nn.Softmax2d()
。
在Pytorch中,介绍为:
Applies SoftMax over features to each spatial location.
When given an image of Channels x Height x Width,
it will apply Softmax to each location (Channels, h_i, w_j)
在实现方法上, Pytorch直接调用torch.nn.functional.softmax
实现,代码位置。
核心代码为:
def forward(self, input: Tensor) -> Tensor:
assert input.dim() == 4 or input.dim(
) == 3, 'Softmax2d requires a 3D or 4D tensor as input'
return F.softmax(input, -3, _stacklevel=5)
主要逻辑如下:
- 对输入的维度进行判断;
- 直接调用
torch.functional.softmax
,并将dim
固定为-3。
并未找到其他实现。
API 设计为 paddle.nn.Softmax2D()
。
直接调用现有API,无需设计底层OP。
- 判断输入的维度,若不是3维或4维,则抛出错误;
- 固定
paddle.nn.functional.softmax
中的axis
参数为-3,封装在paddle.nn.Softmax2D
中; - 返回上述
softmax
的结果即可。
- 在静态图、动态图下,与numpy结果的一致性;
- 在GPU、CPU上,与numpy结果的一致性;
- 错误检查:当输入Tensor不是3维或4维时能正确抛出错误。
方案直接依赖现有APIpaddle.nn.functional.softmax
完成,工期上可以满足在当前版本周期内开发完成。
为独立新增API,对其他模块没有影响。
无
无