已合并
modified md files #1118
gitee-duhuiping创建于 7月13日
modified md files #1118
已合并
共 42 个文件变更+674-661
| @@ -56,8 +56,8 @@ | |||
| 56 | | [aclnnUpsampleLinear1dBackward](../../image/upsample_bilinear2d_grad/docs/aclnnUpsampleLinear1dBackward.md) | [aclnnUpsampleLinear1d](../../image/upsample_linear1d/docs/aclnnUpsampleLinear1d.md)的反向传播。 |默认确定性实现|默认非确定性实现,支持配置开启| | 56 | | [aclnnUpsampleLinear1dBackward](../../image/upsample_bilinear2d_grad/docs/aclnnUpsampleLinear1dBackward.md) | [aclnnUpsampleLinear1d](../../image/upsample_linear1d/docs/aclnnUpsampleLinear1d.md)的反向传播。 |默认确定性实现|默认非确定性实现,支持配置开启| |
| 57 | | [aclnnUpsampleNearestExact1d](../../image/upsample_nearest/docs/aclnnUpsampleNearestExact1d.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| | 57 | | [aclnnUpsampleNearestExact1d](../../image/upsample_nearest/docs/aclnnUpsampleNearestExact1d.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| |
| 58 | | [aclnnUpsampleNearestExact2d](../../image/upsample_nearest/docs/aclnnUpsampleNearestExact2d.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| | 58 | | [aclnnUpsampleNearestExact2d](../../image/upsample_nearest/docs/aclnnUpsampleNearestExact2d.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| |
| 59 | -| [aclnnUpsampleNearest1dBackward](../../image/upsample_nearest2d_grad/docs/aclnnUpsampleNearest1dBackward.md) | [aclnnUpsampleNearestExact1d](../../image/upsample_nearest/docs/aclnnUpsampleNearestExact1d.md)的反向传播。 |默认确定性实现|默认确定性实现| | 59 | +| [aclnnUpsampleNearest1dBackward](../../image/upsample_nearest2d_grad/docs/aclnnUpsampleNearest1dBackward.md) | [aclnnUpsampleNearest1dV2](../../image/upsample_nearest3d/docs/aclnnUpsampleNearest1dV2.md)的反向传播。 |默认确定性实现|默认确定性实现| |
| 60 | -| [aclnnUpsampleNearest2dBackward](../../image/upsample_nearest2d_grad/docs/aclnnUpsampleNearest2dBackward.md) | [aclnnUpsampleNearestExact2d](../../image/upsample_nearest/docs/aclnnUpsampleNearestExact2d.md)的反向传播。 |默认确定性实现|默认确定性实现| | 60 | +| [aclnnUpsampleNearest2dBackward](../../image/upsample_nearest2d_grad/docs/aclnnUpsampleNearest2dBackward.md) | [aclnnUpsampleNearest2dV2](../../image/upsample_nearest3d/docs/aclnnUpsampleNearest2dV2.md)的反向传播。 |默认确定性实现|默认确定性实现| |
| 61 | | [aclnnUpsampleNearest1dV2](../../image/upsample_nearest3d/docs/aclnnUpsampleNearest1dV2.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| | 61 | | [aclnnUpsampleNearest1dV2](../../image/upsample_nearest3d/docs/aclnnUpsampleNearest1dV2.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| |
| 62 | | [aclnnUpsampleNearest2dV2](../../image/upsample_nearest3d/docs/aclnnUpsampleNearest2dV2.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| | 62 | | [aclnnUpsampleNearest2dV2](../../image/upsample_nearest3d/docs/aclnnUpsampleNearest2dV2.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| |
| 63 | | [aclnnUpsampleNearest3d](../../image/upsample_nearest3d/docs/aclnnUpsampleNearest3d.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| | 63 | | [aclnnUpsampleNearest3d](../../image/upsample_nearest3d/docs/aclnnUpsampleNearest3d.md) | 对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。 |默认确定性实现|默认确定性实现| |
| @@ -21,25 +21,25 @@ | |||
| 21 | - 计算流程: | 21 | - 计算流程: |
| 22 | 1. 根据grid存储的(x, y)或者(x, y, z)值,计算出映射到input上坐标,这些坐标和align_corners、padding_mode有关。 | 22 | 1. 根据grid存储的(x, y)或者(x, y, z)值,计算出映射到input上坐标,这些坐标和align_corners、padding_mode有关。 |
| 23 | 2. 坐标根据输入的interpolation_mode,选择使用bilinear、nearest、bicubic不同插值模式计算输出值。 | 23 | 2. 坐标根据输入的interpolation_mode,选择使用bilinear、nearest、bicubic不同插值模式计算输出值。 |
| 24 | - | 24 | + |
| 25 | - 其中: | 25 | - 其中: |
| 26 | - 3D场景: | 26 | - 3D场景: |
| 27 | - | 27 | + |
| 28 | 输入input、grid网格、输出output的尺寸如下: | 28 | 输入input、grid网格、输出output的尺寸如下: |
| 29 | - | 29 | + |
| 30 | $$ | 30 | $$ |
| 31 | input: (N, C, D_{in}, H_{in}, W_{in})\\ | 31 | input: (N, C, D_{in}, H_{in}, W_{in})\\ |
| 32 | grid: (N, D_{out}, H_{out}, W_{out}, 3)\\ | 32 | grid: (N, D_{out}, H_{out}, W_{out}, 3)\\ |
| 33 | output: (N, C, D_{out}, H_{out}, W_{out}) | 33 | output: (N, C, D_{out}, H_{out}, W_{out}) |
| 34 | $$ | 34 | $$ |
| 35 | - | 35 | + |
| 36 | 其中input、grid、output中的N是一致的,input和output中的C是一致的,grid和output中的$D_{out}$、$H_{out}$、$W_{out}$是一致的,grid最后一维大小为3,表示input像素位置信息为(x, y, z),会将x、y、z的取值范围归一化到[-1, 1]之间。 | 36 | 其中input、grid、output中的N是一致的,input和output中的C是一致的,grid和output中的$D_{out}$、$H_{out}$、$W_{out}$是一致的,grid最后一维大小为3,表示input像素位置信息为(x, y, z),会将x、y、z的取值范围归一化到[-1, 1]之间。 |
| 37 | 37 | ||
| 38 | - 反归一化的计算公式: | 38 | - 反归一化的计算公式: |
| 39 | - align_corners=true,表示特征值位于像素中心。 | 39 | - align_corners=true,表示特征值位于像素中心。 |
| 40 | 40 | ||
| 41 | $$ | 41 | $$ |
| 42 | - x' = (grid\_x + 1) / 2 * (D_{in} - 1) | 42 | + x' = (grid\_x + 1) / 2 * (W_{in} - 1) |
| 43 | $$ | 43 | $$ |
| 44 | 44 | ||
| 45 | $$ | 45 | $$ |
| @@ -47,13 +47,13 @@ | |||
| 47 | $$ | 47 | $$ |
| 48 | 48 | ||
| 49 | $$ | 49 | $$ |
| 50 | - z' = (grid\_z +1) / 2 * (W_{in} - 1) | 50 | + z' = (grid\_z +1) / 2 * (D_{in} - 1) |
| 51 | $$ | 51 | $$ |
| 52 | 52 | ||
| 53 | - align_corners=false,表示特征值位于像素的角点。 | 53 | - align_corners=false,表示特征值位于像素的角点。 |
| 54 | 54 | ||
| 55 | $$ | 55 | $$ |
| 56 | - x' = ((grid\_x +1) * D_{in} - 1) / 2 | 56 | + x' = ((grid\_x +1) * W_{in} - 1) / 2 |
| 57 | $$ | 57 | $$ |
| 58 | 58 | ||
| 59 | $$ | 59 | $$ |
| @@ -61,7 +61,7 @@ | |||
| 61 | $$ | 61 | $$ |
| 62 | 62 | ||
| 63 | $$ | 63 | $$ |
| 64 | - z' = ((grid\_z +1) * W_{in} - 1) / 2 | 64 | + z' = ((grid\_z +1) * D_{in} - 1) / 2 |
| 65 | $$ | 65 | $$ |
| 66 | 66 | ||
| 67 | - 对于超出范围的坐标,会根据paddingMode进行不同处理: | 67 | - 对于超出范围的坐标,会根据paddingMode进行不同处理: |
| @@ -72,7 +72,7 @@ | |||
| 72 | - interpolationMode="bilinear",表示取input中(x, y, z)周围八个坐标的加权平均值。 | 72 | - interpolationMode="bilinear",表示取input中(x, y, z)周围八个坐标的加权平均值。 |
| 73 | 73 | ||
| 74 | $$ | 74 | $$ |
| 75 | - {output(N, C, D_{out}, H_{out}, W_{out})} = \sum_{i=0}^{2}\sum_{j=0}^{2}\sum_{k=0}^{2}{w(i, j, k)} * {f(x', y', z')} | 75 | + {output(N, C, D_{out}, H_{out}, W_{out})} = \sum_{i=0}^{1}\sum_{j=0}^{1}\sum_{k=0}^{1}{w(i, j, k)} * {f(x', y', z')} |
| 76 | $$ | 76 | $$ |
| 77 | 77 | ||
| 78 | 其中: | 78 | 其中: |
| @@ -113,8 +113,8 @@ | |||
| 113 | 其中: | 113 | 其中: |
| 114 | 114 | ||
| 115 | $$ | 115 | $$ |
| 116 | - D_{out} = min(round(x'), H - 1)\\ | 116 | + W_{out} = min(round(x'), W - 1)\\ |
| 117 | - D_{out} = max(round(x'), 0) | 117 | + W_{out} = max(round(x'), 0) |
| 118 | $$ | 118 | $$ |
| 119 | 119 | ||
| 120 | $$ | 120 | $$ |
| @@ -123,10 +123,10 @@ | |||
| 123 | $$ | 123 | $$ |
| 124 | 124 | ||
| 125 | $$ | 125 | $$ |
| 126 | - W_{out} = min(round(z'), W - 1)\\ | 126 | + D_{out} = min(round(z'), D - 1)\\ |
| 127 | - W_{out} = max(round(z'), 0) | 127 | + D_{out} = max(round(z'), 0) |
| 128 | $$ | 128 | $$ |
| 129 | - | 129 | + |
| 130 | - 2D场景: | 130 | - 2D场景: |
| 131 | 131 | ||
| 132 | 输入input、grid网格、输出output的尺寸如下: | 132 | 输入input、grid网格、输出output的尺寸如下: |
| @@ -136,28 +136,28 @@ | |||
| 136 | grid: (N, H_{out}, W_{out}, 2)\\ | 136 | grid: (N, H_{out}, W_{out}, 2)\\ |
| 137 | output: (N, C, H_{out}, W_{out}) | 137 | output: (N, C, H_{out}, W_{out}) |
| 138 | $$ | 138 | $$ |
| 139 | - | 139 | + |
| 140 | 其中input、grid、output中的N是一致的,input和output中的C是一致的,grid和output中的$H_{out}$、$W_{out}$是一致的,grid最后一维大小为2,表示input像素位置信息为(x, y),会将x和y的取值范围归一化到[-1, 1]之间,(-1, 1)表示左上角坐标,(1, -1)表示右下角坐标。 | 140 | 其中input、grid、output中的N是一致的,input和output中的C是一致的,grid和output中的$H_{out}$、$W_{out}$是一致的,grid最后一维大小为2,表示input像素位置信息为(x, y),会将x和y的取值范围归一化到[-1, 1]之间,(-1, 1)表示左上角坐标,(1, -1)表示右下角坐标。 |
| 141 | 141 | ||
| 142 | - 反归一化的计算公式: | 142 | - 反归一化的计算公式: |
| 143 | - align_corners=true,表示特征值位于像素中心。 | 143 | - align_corners=true,表示特征值位于像素中心。 |
| 144 | 144 | ||
| 145 | $$ | 145 | $$ |
| 146 | - x' = (grid\_x + 1) / 2 * (H_{in} - 1) | 146 | + x' = (grid\_x + 1) / 2 * (W_{in} - 1) |
| 147 | $$ | 147 | $$ |
| 148 | 148 | ||
| 149 | $$ | 149 | $$ |
| 150 | - y' = (grid\_y +1) / 2 * (W_{in} - 1) | 150 | + y' = (grid\_y +1) / 2 * (H_{in} - 1) |
| 151 | $$ | 151 | $$ |
| 152 | 152 | ||
| 153 | - align_corners=false,表示特征值位于像素的角点。 | 153 | - align_corners=false,表示特征值位于像素的角点。 |
| 154 | 154 | ||
| 155 | $$ | 155 | $$ |
| 156 | - x' = ((grid\_x +1) * H_{in} - 1) / 2 | 156 | + x' = ((grid\_x +1) * W_{in} - 1) / 2 |
| 157 | $$ | 157 | $$ |
| 158 | 158 | ||
| 159 | $$ | 159 | $$ |
| 160 | - y' = ((grid\_y +1) * W_{in} - 1) / 2 | 160 | + y' = ((grid\_y +1) * H_{in} - 1) / 2 |
| 161 | $$ | 161 | $$ |
| 162 | 162 | ||
| 163 | - 对于超出范围的坐标,会根据paddingMode进行不同处理: | 163 | - 对于超出范围的坐标,会根据paddingMode进行不同处理: |
| @@ -205,13 +205,13 @@ | |||
| 205 | 其中: | 205 | 其中: |
| 206 | 206 | ||
| 207 | $$ | 207 | $$ |
| 208 | - H_{out} = min(round(x'), H - 1)\\ | 208 | + W_{out} = min(round(x'), W - 1)\\ |
| 209 | - H_{out} = max(round(x'), 0) | 209 | + W_{out} = max(round(x'), 0) |
| 210 | $$ | 210 | $$ |
| 211 | 211 | ||
| 212 | $$ | 212 | $$ |
| 213 | - W_{out} = min(round(y'), W - 1)\\ | 213 | + H_{out} = min(round(y'), H - 1)\\ |
| 214 | - W_{out} = max(round(y'), 0) | 214 | + H_{out} = max(round(y'), 0) |
| 215 | $$ | 215 | $$ |
| 216 | 216 | ||
| 217 | - interpolationMode=2,表示取(x, y)周围十六个坐标的加权平均值。 | 217 | - interpolationMode=2,表示取(x, y)周围十六个坐标的加权平均值。 |
| @@ -17,7 +17,7 @@ | |||
| 17 | 17 | ||
| 18 | - 接口功能:提供一个输入Tensor以及一个对应的grid网格,然后根据grid中每个位置提供的坐标信息,将input中对应位置的像素值填充到网格指定的位置,得到最终的输出。 | 18 | - 接口功能:提供一个输入Tensor以及一个对应的grid网格,然后根据grid中每个位置提供的坐标信息,将input中对应位置的像素值填充到网格指定的位置,得到最终的输出。 |
| 19 | - 计算公式: | 19 | - 计算公式: |
| 20 | - | 20 | + |
| 21 | 输入input、grid网格、输出output的尺寸如下: | 21 | 输入input、grid网格、输出output的尺寸如下: |
| 22 | 22 | ||
| 23 | $$ | 23 | $$ |
| @@ -31,21 +31,21 @@ | |||
| 31 | - alignCorners=true,表示特征值位于像素中心。 | 31 | - alignCorners=true,表示特征值位于像素中心。 |
| 32 | 32 | ||
| 33 | $$ | 33 | $$ |
| 34 | - x' = (grid\_x + 1) / 2 * (H_{in} - 1) | 34 | + x' = (grid\_x + 1) / 2 * (W_{in} - 1) |
| 35 | $$ | 35 | $$ |
| 36 | 36 | ||
| 37 | $$ | 37 | $$ |
| 38 | - y' = (grid\_y +1) / 2 * (W_{in} - 1) | 38 | + y' = (grid\_y +1) / 2 * (H_{in} - 1) |
| 39 | $$ | 39 | $$ |
| 40 | 40 | ||
| 41 | - alignCorners=false,表示特征值位于像素的角点。 | 41 | - alignCorners=false,表示特征值位于像素的角点。 |
| 42 | 42 | ||
| 43 | $$ | 43 | $$ |
| 44 | - x' = ((grid\_x +1) * H_{in} - 1) / 2 | 44 | + x' = ((grid\_x +1) * W_{in} - 1) / 2 |
| 45 | $$ | 45 | $$ |
| 46 | 46 | ||
| 47 | $$ | 47 | $$ |
| 48 | - y' = ((grid\_y +1) * W_{in} - 1) / 2 | 48 | + y' = ((grid\_y +1) * H_{in} - 1) / 2 |
| 49 | $$ | 49 | $$ |
| 50 | 50 | ||
| 51 | - 对于超出范围的坐标,会根据paddingMode进行不同处理: | 51 | - 对于超出范围的坐标,会根据paddingMode进行不同处理: |
| @@ -59,7 +59,7 @@ | |||
| 59 | - interpolationMode=0,表示取(x, y)周围四个坐标的加权平均值。 | 59 | - interpolationMode=0,表示取(x, y)周围四个坐标的加权平均值。 |
| 60 | 60 | ||
| 61 | $$ | 61 | $$ |
| 62 | - output(N, C, H_{out}, W_{out}) = \sum_{i=0}^{2}\sum_{j=0}^{2}{w(i, j)} * {f(x', y')} | 62 | + output(N, C, H_{out}, W_{out}) = \sum_{i=0}^{1}\sum_{j=0}^{1}{w(i, j)} * {f(x', y')} |
| 63 | $$ | 63 | $$ |
| 64 | 64 | ||
| 65 | 其中: | 65 | 其中: |
| @@ -93,13 +93,13 @@ | |||
| 93 | 其中: | 93 | 其中: |
| 94 | 94 | ||
| 95 | $$ | 95 | $$ |
| 96 | - H_{out} = min(round(x'), H - 1)\\ | 96 | + W_{out} = min(round(x'), W - 1)\\ |
| 97 | - H_{out} = max(round(x'), 0) | 97 | + W_{out} = max(round(x'), 0) |
| 98 | $$ | 98 | $$ |
| 99 | 99 | ||
| 100 | $$ | 100 | $$ |
| 101 | - W_{out} = min(round(y'), W - 1)\\ | 101 | + H_{out} = min(round(y'), H - 1)\\ |
| 102 | - W_{out} = max(round(y'), 0) | 102 | + H_{out} = max(round(y'), 0) |
| 103 | $$ | 103 | $$ |
| 104 | 104 | ||
| 105 | - interpolationMode=2,表示取(x, y)周围十六个坐标的加权平均值。 | 105 | - interpolationMode=2,表示取(x, y)周围十六个坐标的加权平均值。 |
| @@ -179,7 +179,7 @@ aclnnStatus aclnnGridSampler2D( | |||
| 179 | <td>input(aclTensor*)</td> | 179 | <td>input(aclTensor*)</td> |
| 180 | <td>输入</td> | 180 | <td>输入</td> |
| 181 | <td>进行插值计算的输入张量,对应公式中描述的`input`。</td> | 181 | <td>进行插值计算的输入张量,对应公式中描述的`input`。</td> |
| 182 | - <td><ul><li>支持空Tensor。</li><li>支持shape为(N, C, <em style='font-size: 14px'>H</em><em style='font-size: 8px'>in</em>, <em style='font-size: 14px'>W</em><em style='font-size: 8px'>in</em>)。H*W < INT32的最大值。`input`的shape最后两维的维度值不能为0。</li></ul></td> | 182 | + <td><ul><li>支持空Tensor。</li><li>支持shape为(N, C, H<sub>in</sub>, W<sub>in</sub>)。H*W < INT32的最大值。`input`的shape最后两维的维度值不能为0。</li></ul></td> |
| 183 | <td>FLOAT32、FLOAT16、DOUBLE、BFLOAT16</td> | 183 | <td>FLOAT32、FLOAT16、DOUBLE、BFLOAT16</td> |
| 184 | <td>ND</td> | 184 | <td>ND</td> |
| 185 | <td>4</td> | 185 | <td>4</td> |
| @@ -189,7 +189,7 @@ aclnnStatus aclnnGridSampler2D( | |||
| 189 | <td>grid(aclTensor*)</td> | 189 | <td>grid(aclTensor*)</td> |
| 190 | <td>输入</td> | 190 | <td>输入</td> |
| 191 | <td>采样的网格,对应公式中描述的`grid`。</td> | 191 | <td>采样的网格,对应公式中描述的`grid`。</td> |
| 192 | - <td><ul><li>支持空Tensor。</li><li>数据类型与入参`input`的数据类型一致。</li><li>支持shape为(N, <em style='font-size: 14px'>H</em><em style='font-size: 8px'>out</em>, <em style='font-size: 14px'>W</em><em style='font-size: 8px'>out</em>, 2),且N与入参`input`的shape中的N一致。</li></ul></td> | 192 | + <td><ul><li>支持空Tensor。</li><li>数据类型与入参`input`的数据类型一致。</li><li>支持shape为(N, H<sub>out</sub>, W<sub>out</sub>, 2),且N与入参`input`的shape中的N一致。</li></ul></td> |
| 193 | <td>FLOAT32、FLOAT16、DOUBLE、BFLOAT16</td> | 193 | <td>FLOAT32、FLOAT16、DOUBLE、BFLOAT16</td> |
| 194 | <td>ND</td> | 194 | <td>ND</td> |
| 195 | <td>4</td> | 195 | <td>4</td> |
| @@ -229,7 +229,7 @@ aclnnStatus aclnnGridSampler2D( | |||
| 229 | <td>out(aclTensor*)</td> | 229 | <td>out(aclTensor*)</td> |
| 230 | <td>输出</td> | 230 | <td>输出</td> |
| 231 | <td>插值计算的最终输出结果,对应公式中描述的`output`。</td> | 231 | <td>插值计算的最终输出结果,对应公式中描述的`output`。</td> |
| 232 | - <td><ul><li>支持空Tensor。</li><li>数据类型与input的数据类型一致。</li><li>支持shape为(N, C, <em style='font-size: 14px'>H</em><em style='font-size: 8px'>out</em>, <em style='font-size: 14px'>W</em><em style='font-size: 8px'>out</em>),且N、C与input的shape中的N、C一致,<em style='font-size: 14px'>H</em><em style='font-size: 8px'>out</em>、<em style='font-size: 14px'>W</em><em style='font-size: 8px'>out</em>与grid的shape中的<em style='font-size: 14px'>H</em><em style='font-size: 8px'>out</em>、<em style='font-size: 14px'>W</em><em style='font-size: 8px'>out</em>一致。</li></ul></td> | 232 | + <td><ul><li>支持空Tensor。</li><li>数据类型与input的数据类型一致。</li><li>支持shape为(N, C, H<sub>out</sub>, W<sub>out</sub>),且N、C与input的shape中的N、C一致,H<sub>out</sub>、W<sub>out</sub>与grid的shape中的H<sub>out</sub>、W<sub>out</sub>一致。</li></ul></td> |
| 233 | <td>FLOAT32、FLOAT16、DOUBLE、BFLOAT16</td> | 233 | <td>FLOAT32、FLOAT16、DOUBLE、BFLOAT16</td> |
| 234 | <td>ND</td> | 234 | <td>ND</td> |
| 235 | <td>4</td> | 235 | <td>4</td> |
| @@ -262,17 +262,17 @@ aclnnStatus aclnnGridSampler2D( | |||
| 262 | - 入参`interpolationMode`不支持插值模式2:bicubic(双三次插值)。 | 262 | - 入参`interpolationMode`不支持插值模式2:bicubic(双三次插值)。 |
| 263 | - 参数`input`、`grid`、`out`的数据类型不支持BFLOAT16。 | 263 | - 参数`input`、`grid`、`out`的数据类型不支持BFLOAT16。 |
| 264 | - <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>: | 264 | - <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>: |
| 265 | - | 265 | + |
| 266 | 入参`interpolationMode`,仅当input数据类型为FLOAT32、FLOAT16或者BFLOAT16时,支持2:bicubic(双三次插值)。 | 266 | 入参`interpolationMode`,仅当input数据类型为FLOAT32、FLOAT16或者BFLOAT16时,支持2:bicubic(双三次插值)。 |
| 267 | - <term>Atlas 200I/500 A2 推理产品</term>: | 267 | - <term>Atlas 200I/500 A2 推理产品</term>: |
| 268 | - | 268 | + |
| 269 | 当接口运行在AI Core时,需要满足如下条件: | 269 | 当接口运行在AI Core时,需要满足如下条件: |
| 270 | - 入参`interpolationMode`为bilinear。 | 270 | - 入参`interpolationMode`为bilinear。 |
| 271 | - 入参`paddingMode`为zeros。 | 271 | - 入参`paddingMode`为zeros。 |
| 272 | - 参数`input`、`grid`、`out`的数据类型为FLOAT16。 | 272 | - 参数`input`、`grid`、`out`的数据类型为FLOAT16。 |
| 273 | - 参数`input`的shape需要满足C维的值为32。 | 273 | - 参数`input`的shape需要满足C维的值为32。 |
| 274 | - <term>Atlas 推理系列产品</term>: | 274 | - <term>Atlas 推理系列产品</term>: |
| 275 | - | 275 | + |
| 276 | 当接口运行在AI Core时,需要满足如下条件: | 276 | 当接口运行在AI Core时,需要满足如下条件: |
| 277 | - 入参`interpolationMode`为bilinear。 | 277 | - 入参`interpolationMode`为bilinear。 |
| 278 | - 入参`paddingMode`为zeros。 | 278 | - 入参`paddingMode`为zeros。 |
| @@ -283,7 +283,7 @@ aclnnStatus aclnnGridSampler2D( | |||
| 283 | - **返回值** | 283 | - **返回值** |
| 284 | 284 | ||
| 285 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 285 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 286 | - | 286 | + |
| 287 | 第一段接口完成入参校验,出现以下场景时报错: | 287 | 第一段接口完成入参校验,出现以下场景时报错: |
| 288 | 288 | ||
| 289 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 289 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -17,7 +17,7 @@ | |||
| 17 | 17 | ||
| 18 | - 接口功能:提供一个输入张量input,以及一个对应的grid网格,根据grid中每个位置提供的坐标信息,将input中对应位置的像素值填充到grid指定的位置,得到最终的输出。 | 18 | - 接口功能:提供一个输入张量input,以及一个对应的grid网格,根据grid中每个位置提供的坐标信息,将input中对应位置的像素值填充到grid指定的位置,得到最终的输出。 |
| 19 | - 计算公式: | 19 | - 计算公式: |
| 20 | - | 20 | + |
| 21 | 输入input、grid网格、输出output的尺寸如下: | 21 | 输入input、grid网格、输出output的尺寸如下: |
| 22 | 22 | ||
| 23 | $$ | 23 | $$ |
| @@ -32,7 +32,7 @@ | |||
| 32 | - alignCorners=true,表示特征值位于像素中心。 | 32 | - alignCorners=true,表示特征值位于像素中心。 |
| 33 | 33 | ||
| 34 | $$ | 34 | $$ |
| 35 | - x' = (grid\_x + 1) / 2 * (D_{in} - 1) | 35 | + x' = (grid\_x + 1) / 2 * (W_{in} - 1) |
| 36 | $$ | 36 | $$ |
| 37 | 37 | ||
| 38 | $$ | 38 | $$ |
| @@ -40,13 +40,13 @@ | |||
| 40 | $$ | 40 | $$ |
| 41 | 41 | ||
| 42 | $$ | 42 | $$ |
| 43 | - z' = (grid\_z +1) / 2 * (W_{in} - 1) | 43 | + z' = (grid\_z +1) / 2 * (D_{in} - 1) |
| 44 | $$ | 44 | $$ |
| 45 | 45 | ||
| 46 | - alignCorners=false,表示特征值位于像素的角点。 | 46 | - alignCorners=false,表示特征值位于像素的角点。 |
| 47 | 47 | ||
| 48 | $$ | 48 | $$ |
| 49 | - x' = ((grid\_x +1) * D_{in} - 1) / 2 | 49 | + x' = ((grid\_x +1) * W_{in} - 1) / 2 |
| 50 | $$ | 50 | $$ |
| 51 | 51 | ||
| 52 | $$ | 52 | $$ |
| @@ -54,7 +54,7 @@ | |||
| 54 | $$ | 54 | $$ |
| 55 | 55 | ||
| 56 | $$ | 56 | $$ |
| 57 | - z' = ((grid\_z +1) * W_{in} - 1) / 2 | 57 | + z' = ((grid\_z +1) * D_{in} - 1) / 2 |
| 58 | $$ | 58 | $$ |
| 59 | 59 | ||
| 60 | - 对于超出范围的坐标,会根据paddingMode进行不同处理: | 60 | - 对于超出范围的坐标,会根据paddingMode进行不同处理: |
| @@ -65,7 +65,7 @@ | |||
| 65 | - interpolationMode="bilinear",表示取input中(x, y, z)周围八个坐标的加权平均值。 | 65 | - interpolationMode="bilinear",表示取input中(x, y, z)周围八个坐标的加权平均值。 |
| 66 | 66 | ||
| 67 | $$ | 67 | $$ |
| 68 | - {output(N, C, D_{out}, H_{out}, W_{out})} = \sum_{i=0}^{2}\sum_{j=0}^{2}\sum_{k=0}^{2}{w(i, j, k)} * {f(x', y', z')} | 68 | + {output(N, C, D_{out}, H_{out}, W_{out})} = \sum_{i=0}^{1}\sum_{j=0}^{1}\sum_{k=0}^{1}{w(i, j, k)} * {f(x', y', z')} |
| 69 | $$ | 69 | $$ |
| 70 | 70 | ||
| 71 | 其中: | 71 | 其中: |
| @@ -106,8 +106,8 @@ | |||
| 106 | 其中: | 106 | 其中: |
| 107 | 107 | ||
| 108 | $$ | 108 | $$ |
| 109 | - D_{out} = min(round(x'), H - 1)\\ | 109 | + W_{out} = min(round(x'), W - 1)\\ |
| 110 | - D_{out} = max(round(x'), 0) | 110 | + W_{out} = max(round(x'), 0) |
| 111 | $$ | 111 | $$ |
| 112 | 112 | ||
| 113 | $$ | 113 | $$ |
| @@ -116,8 +116,8 @@ | |||
| 116 | $$ | 116 | $$ |
| 117 | 117 | ||
| 118 | $$ | 118 | $$ |
| 119 | - W_{out} = min(round(z'), W - 1)\\ | 119 | + D_{out} = min(round(z'), D- 1)\\ |
| 120 | - W_{out} = max(round(z'), 0) | 120 | + D_{out} = max(round(z'), 0) |
| 121 | $$ | 121 | $$ |
| 122 | 122 | ||
| 123 | ## 函数原型 | 123 | ## 函数原型 |
| @@ -184,7 +184,7 @@ aclnnStatus aclnnGridSampler3D( | |||
| 184 | <td>grid(aclTensor*)</td> | 184 | <td>grid(aclTensor*)</td> |
| 185 | <td>输入</td> | 185 | <td>输入</td> |
| 186 | <td>采样的网格,对应公式中描述的`grid`。</td> | 186 | <td>采样的网格,对应公式中描述的`grid`。</td> |
| 187 | - <td><ul><li>支持空Tensor。</li><li>数据类型与入参`input`的数据类型一致。</li><li>支持shape为(N, <em style='font-size: 14px'>D</em><em style='font-size: 8px'>out</em>, <em style='font-size: 14px'>H</em><em style='font-size: 8px'>out</em>, <em style='font-size: 14px'>W</em><em style='font-size: 8px'>out</em>, 3),且N与入参`input`的shape中的N一致。</li></ul></td> | 187 | + <td><ul><li>支持空Tensor。</li><li>数据类型与入参`input`的数据类型一致。</li><li>支持shape为(N, D<sub>out</sub>, H<sub>out</sub>, W<sub>out</sub>, 3),且N与入参`input`的shape中的N一致。</li></ul></td> |
| 188 | <td>FLOAT16、FLOAT32、DOUBLE、BFLOAT16</td> | 188 | <td>FLOAT16、FLOAT32、DOUBLE、BFLOAT16</td> |
| 189 | <td>ND</td> | 189 | <td>ND</td> |
| 190 | <td>5</td> | 190 | <td>5</td> |
| @@ -254,13 +254,13 @@ aclnnStatus aclnnGridSampler3D( | |||
| 254 | </table> | 254 | </table> |
| 255 | 255 | ||
| 256 | - <term>Atlas 训练系列产品</term>: | 256 | - <term>Atlas 训练系列产品</term>: |
| 257 | - | 257 | + |
| 258 | 参数`input`、`grid`、`out`的数据类型不支持BFLOAT16。 | 258 | 参数`input`、`grid`、`out`的数据类型不支持BFLOAT16。 |
| 259 | - | 259 | + |
| 260 | - **返回值** | 260 | - **返回值** |
| 261 | 261 | ||
| 262 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 262 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 263 | - | 263 | + |
| 264 | 第一段接口完成入参校验,出现以下场景时报错: | 264 | 第一段接口完成入参校验,出现以下场景时报错: |
| 265 | 265 | ||
| 266 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 266 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -19,7 +19,7 @@ | |||
| 19 | 1. 根据grid存储的(x, y)值,计算出映射到input上的坐标,这些坐标和align_corners、padding_mode有关。 | 19 | 1. 根据grid存储的(x, y)值,计算出映射到input上的坐标,这些坐标和align_corners、padding_mode有关。 |
| 20 | 2. 根据输入的interpolationMode,选择使用bilinear、nearest、bicubic不同插值模式计算该坐标周围点分配到梯度的权重值。 | 20 | 2. 根据输入的interpolationMode,选择使用bilinear、nearest、bicubic不同插值模式计算该坐标周围点分配到梯度的权重值。 |
| 21 | 3. 根据grad存储的梯度值乘上对应点的权重值,计算出最终dx、dgrid的结果。 | 21 | 3. 根据grad存储的梯度值乘上对应点的权重值,计算出最终dx、dgrid的结果。 |
| 22 | - | 22 | + |
| 23 | - 计算公式: | 23 | - 计算公式: |
| 24 | 24 | ||
| 25 | grad、input、grid、dx、dgrid的尺寸如下: | 25 | grad、input、grid、dx、dgrid的尺寸如下: |
| @@ -32,7 +32,7 @@ | |||
| 32 | $$ | 32 | $$ |
| 33 | 33 | ||
| 34 | 其中grad、input、grid、dx、dgrid中的N均相同,grad、input和dx中的C相同,input和dx中的$H_{in}$、$W_{in}$相同,grad、grid和dgrid中的$H_{out}$、$W_{out}$相同,grid最后一维大小为2,表示input像素位置信息为(x, y)。x和y的取值范围归一化到[-1, 1],(-1, 1)表示左上角坐标,(1, -1)表示右下角坐标。 | 34 | 其中grad、input、grid、dx、dgrid中的N均相同,grad、input和dx中的C相同,input和dx中的$H_{in}$、$W_{in}$相同,grad、grid和dgrid中的$H_{out}$、$W_{out}$相同,grid最后一维大小为2,表示input像素位置信息为(x, y)。x和y的取值范围归一化到[-1, 1],(-1, 1)表示左上角坐标,(1, -1)表示右下角坐标。 |
| 35 | - | 35 | + |
| 36 | 1. 坐标反归一化: | 36 | 1. 坐标反归一化: |
| 37 | grid中的(x, y)需要先反归一化到input像素坐标(ix, iy),同时计算梯度乘子`gix_mult`、`giy_mult`(用于后续dgrid计算): | 37 | grid中的(x, y)需要先反归一化到input像素坐标(ix, iy),同时计算梯度乘子`gix_mult`、`giy_mult`(用于后续dgrid计算): |
| 38 | - align_corners = true: | 38 | - align_corners = true: |
| @@ -59,7 +59,7 @@ | |||
| 59 | 59 | ||
| 60 | 四个角点坐标和权重为: | 60 | 四个角点坐标和权重为: |
| 61 | 61 | ||
| 62 | - | 角点 | 坐标$(i_p, j_p)$ | 权重$w_p$ | | 62 | + | 角点 | 坐标$(iy_p, ix_p)$ | 权重$w_p$ | |
| 63 | |:------:|:------:|:----------:| | 63 | |:------:|:------:|:----------:| |
| 64 | | nw(西北) | $(iy_{nw}, ix_{nw})$ | $(ix_{se} - ix) × (iy_{se} - iy)$ | | 64 | | nw(西北) | $(iy_{nw}, ix_{nw})$ | $(ix_{se} - ix) × (iy_{se} - iy)$ | |
| 65 | | ne(东北) | $(iy_{ne}, ix_{ne})$ | $(ix - ix_{sw}) × (iy_{sw} - iy)$ | | 65 | | ne(东北) | $(iy_{ne}, ix_{ne})$ | $(ix - ix_{sw}) × (iy_{sw} - iy)$ | |
| @@ -82,7 +82,7 @@ | |||
| 82 | - dx(input梯度):将上游梯度按权重散射到input对应位置 | 82 | - dx(input梯度):将上游梯度按权重散射到input对应位置 |
| 83 | 83 | ||
| 84 | $$ | 84 | $$ |
| 85 | - dx(N, C, i_p, j_p) \mathrel{+}= w_p \cdot grad(N, C, H_{out}, W_{out}) | 85 | + dx(N, C, iy_p, ix_p) \mathrel{+}= w_p \cdot grad(N, C, H_{out}, W_{out}) |
| 86 | $$ | 86 | $$ |
| 87 | 87 | ||
| 88 | 即对每个输出像素(h, w),将其梯度乘以双线性权重,累加到input的四个相邻像素位置(越界位置不累加)。 | 88 | 即对每个输出像素(h, w),将其梯度乘以双线性权重,累加到input的四个相邻像素位置(越界位置不累加)。 |
| @@ -96,7 +96,7 @@ | |||
| 96 | giy = \sum_{c} \left[ -V_{nw} \cdot (ix_{se} - ix) - V_{ne} \cdot (ix - ix_{sw}) + V_{sw} \cdot (ix_{ne} - ix) + V_{se} \cdot (ix - ix_{nw}) \right] \cdot grad(N, C, H_{out}, W_{out}) | 96 | giy = \sum_{c} \left[ -V_{nw} \cdot (ix_{se} - ix) - V_{ne} \cdot (ix - ix_{sw}) + V_{sw} \cdot (ix_{ne} - ix) + V_{se} \cdot (ix - ix_{nw}) \right] \cdot grad(N, C, H_{out}, W_{out}) |
| 97 | $$ | 97 | $$ |
| 98 | 98 | ||
| 99 | - 其中 $V_p = input(N, C, i_p, j_p)$(仅当角点在边界内时参与计算)。 | 99 | + 其中 $V_p = input(N, C, iy_p, ix_p)$(仅当角点在边界内时参与计算)。 |
| 100 | - 最终: | 100 | - 最终: |
| 101 | 101 | ||
| 102 | $$ | 102 | $$ |
| @@ -127,44 +127,49 @@ | |||
| 127 | 127 | ||
| 128 | $(ix', iy') = (ix_{nw}-1+i, iy_{nw}-1+j)$,$i,j \in \{0,1,2,3\}$,越界位置根据padding_mode处理。 | 128 | $(ix', iy') = (ix_{nw}-1+i, iy_{nw}-1+j)$,$i,j \in \{0,1,2,3\}$,越界位置根据padding_mode处理。 |
| 129 | 129 | ||
| 130 | + $$ | ||
| 131 | + tx = ix - floor(ix) \\ | ||
| 132 | + ty = iy - floor(iy) \\ | ||
| 133 | + $$ | ||
| 134 | + | ||
| 130 | $$ | 135 | $$ |
| 131 | A = -0.75 \\ | 136 | A = -0.75 \\ |
| 132 | - x_0 = x + 1.0 \\ | 137 | + x_0 = tx + 1.0 \\ |
| 133 | x\_coeffs[0] = ((A * x_0 - 5* A) * x_0 + 8 * A) * x_0 - 4 * A | 138 | x\_coeffs[0] = ((A * x_0 - 5* A) * x_0 + 8 * A) * x_0 - 4 * A |
| 134 | $$ | 139 | $$ |
| 135 | 140 | ||
| 136 | $$ | 141 | $$ |
| 137 | - x_1 = x \\ | 142 | + x_1 = tx \\ |
| 138 | x\_coeffs[1] = ((A + 2)* x_1 - (A + 3)) * x_1 * x_1 + 1 | 143 | x\_coeffs[1] = ((A + 2)* x_1 - (A + 3)) * x_1 * x_1 + 1 |
| 139 | $$ | 144 | $$ |
| 140 | 145 | ||
| 141 | $$ | 146 | $$ |
| 142 | - x_2 = 1 - x \\ | 147 | + x_2 = 1 - tx \\ |
| 143 | x\_coeffs[2] = ((A + 2)* x_2 - (A + 3)) * x_2 * x_2 + 1 | 148 | x\_coeffs[2] = ((A + 2)* x_2 - (A + 3)) * x_2 * x_2 + 1 |
| 144 | $$ | 149 | $$ |
| 145 | 150 | ||
| 146 | $$ | 151 | $$ |
| 147 | - x_3 = 2 - x \\ | 152 | + x_3 = 2 - tx \\ |
| 148 | x\_coeffs[3] = ((A * x_3 - 5* A) * x_3 + 8 * A) * x_3 - 4 * A | 153 | x\_coeffs[3] = ((A * x_3 - 5* A) * x_3 + 8 * A) * x_3 - 4 * A |
| 149 | $$ | 154 | $$ |
| 150 | 155 | ||
| 151 | $$ | 156 | $$ |
| 152 | - y_0 = y + 1.0 \\ | 157 | + y_0 = ty + 1.0 \\ |
| 153 | y\_coeffs[0] = ((A * y_0 - 5* A) * y_0 + 8 * A) * y_0 - 4 * A | 158 | y\_coeffs[0] = ((A * y_0 - 5* A) * y_0 + 8 * A) * y_0 - 4 * A |
| 154 | $$ | 159 | $$ |
| 155 | 160 | ||
| 156 | $$ | 161 | $$ |
| 157 | - y_1 = y \\ | 162 | + y_1 = ty \\ |
| 158 | y\_coeffs[1] = ((A + 2)* y_1 - (A + 3)) * y_1 * y_1 + 1 | 163 | y\_coeffs[1] = ((A + 2)* y_1 - (A + 3)) * y_1 * y_1 + 1 |
| 159 | $$ | 164 | $$ |
| 160 | 165 | ||
| 161 | $$ | 166 | $$ |
| 162 | - y_2 = 1 - y \\ | 167 | + y_2 = 1 - ty \\ |
| 163 | y\_coeffs[2] = ((A + 2)* y_2 - (A + 3)) * y_2 * y_2 + 1 | 168 | y\_coeffs[2] = ((A + 2)* y_2 - (A + 3)) * y_2 * y_2 + 1 |
| 164 | $$ | 169 | $$ |
| 165 | 170 | ||
| 166 | $$ | 171 | $$ |
| 167 | - y_3 = 2 - y \\ | 172 | + y_3 = 2 - ty \\ |
| 168 | y\_coeffs[3] = ((A * y_3 - 5* A) * y_3 + 8 * A) * y_3 - 4 * A | 173 | y\_coeffs[3] = ((A * y_3 - 5* A) * y_3 + 8 * A) * y_3 - 4 * A |
| 169 | $$ | 174 | $$ |
| 170 | 175 | ||
| @@ -182,11 +187,6 @@ | |||
| 182 | 187 | ||
| 183 | $V_{ij} = get\_value\_bounded(input(N, C, H_{in}, W_{in}), ix_{nw}-1+i, iy_{nw}-1 +j)$,`x_coeffs_grad`和`y_coeffs_grad`是三次插值系数对tx/ty的导数: | 188 | $V_{ij} = get\_value\_bounded(input(N, C, H_{in}, W_{in}), ix_{nw}-1+i, iy_{nw}-1 +j)$,`x_coeffs_grad`和`y_coeffs_grad`是三次插值系数对tx/ty的导数: |
| 184 | 189 | ||
| 185 | - $$ | ||
| 186 | - tx = ix - floor(ix) \\ | ||
| 187 | - ty = iy - floor(iy) \\ | ||
| 188 | - $$ | ||
| 189 | - | ||
| 190 | $$ | 190 | $$ |
| 191 | x\_coeffs\_grad[0] = (-3A \cdot x - 10A) \cdot x - 8A \\ | 191 | x\_coeffs\_grad[0] = (-3A \cdot x - 10A) \cdot x - 8A \\ |
| 192 | \quad x = |-1 - tx| | 192 | \quad x = |-1 - tx| |
| @@ -22,7 +22,7 @@ | |||
| 22 | 1. 根据grid存储的(x, y)值,计算出映射到input上的坐标,这些坐标和alignCorners、paddingMode有关。 | 22 | 1. 根据grid存储的(x, y)值,计算出映射到input上的坐标,这些坐标和alignCorners、paddingMode有关。 |
| 23 | 2. 根据输入的interpolationMode,选择使用bilinear、nearest、bicubic不同插值模式计算该坐标周围点分配到梯度的权重值。 | 23 | 2. 根据输入的interpolationMode,选择使用bilinear、nearest、bicubic不同插值模式计算该坐标周围点分配到梯度的权重值。 |
| 24 | 3. 根据grad存储的梯度值乘上对应点的权重值,计算出最终dx、dgrid的结果。 | 24 | 3. 根据grad存储的梯度值乘上对应点的权重值,计算出最终dx、dgrid的结果。 |
| 25 | - | 25 | + |
| 26 | - 计算公式: | 26 | - 计算公式: |
| 27 | 27 | ||
| 28 | grad、input、grid、dx、dgrid的尺寸如下: | 28 | grad、input、grid、dx、dgrid的尺寸如下: |
| @@ -35,7 +35,7 @@ | |||
| 35 | $$ | 35 | $$ |
| 36 | 36 | ||
| 37 | 其中grad、input、grid、dx、dgrid中的N均相同,grad、input和dx中的C相同,input和dx中的$H_{in}$、$W_{in}$相同,grad、grid和dgrid中的$H_{out}$、$W_{out}$相同,grid最后一维大小为2,表示input像素位置信息为(x, y)。x和y的取值范围归一化到[-1, 1],(-1, 1)表示左上角坐标,(1, -1)表示右下角坐标。 | 37 | 其中grad、input、grid、dx、dgrid中的N均相同,grad、input和dx中的C相同,input和dx中的$H_{in}$、$W_{in}$相同,grad、grid和dgrid中的$H_{out}$、$W_{out}$相同,grid最后一维大小为2,表示input像素位置信息为(x, y)。x和y的取值范围归一化到[-1, 1],(-1, 1)表示左上角坐标,(1, -1)表示右下角坐标。 |
| 38 | - | 38 | + |
| 39 | 1. 坐标反归一化: | 39 | 1. 坐标反归一化: |
| 40 | grid中的(x, y)需要先反归一化到input像素坐标(ix, iy),同时计算梯度乘子`gix_mult`、`giy_mult`(用于后续dgrid计算): | 40 | grid中的(x, y)需要先反归一化到input像素坐标(ix, iy),同时计算梯度乘子`gix_mult`、`giy_mult`(用于后续dgrid计算): |
| 41 | - alignCorners = true: | 41 | - alignCorners = true: |
| @@ -62,7 +62,7 @@ | |||
| 62 | 62 | ||
| 63 | 四个角点坐标和权重为: | 63 | 四个角点坐标和权重为: |
| 64 | 64 | ||
| 65 | - | 角点 | 坐标$(i_p, j_p)$ | 权重$w_p$ | | 65 | + | 角点 | 坐标$(iy_p, ix_p)$ | 权重$w_p$ | |
| 66 | |:------:|:------:|:----------:| | 66 | |:------:|:------:|:----------:| |
| 67 | | nw (西北) | $(iy_{nw}, ix_{nw})$ | $(ix_{se} - ix) × (iy_{se} - iy)$ | | 67 | | nw (西北) | $(iy_{nw}, ix_{nw})$ | $(ix_{se} - ix) × (iy_{se} - iy)$ | |
| 68 | | ne (东北) | $(iy_{ne}, ix_{ne})$ | $(ix - ix_{sw}) × (iy_{sw} - iy)$ | | 68 | | ne (东北) | $(iy_{ne}, ix_{ne})$ | $(ix - ix_{sw}) × (iy_{sw} - iy)$ | |
| @@ -85,7 +85,7 @@ | |||
| 85 | - dx(input梯度):将上游梯度按权重散射到input对应位置 | 85 | - dx(input梯度):将上游梯度按权重散射到input对应位置 |
| 86 | 86 | ||
| 87 | $$ | 87 | $$ |
| 88 | - dx(N, C, i_p, j_p) \mathrel{+}= w_p \cdot grad(N, C, H_{out}, W_{out}) | 88 | + dx(N, C, iy_p, ix_p) \mathrel{+}= w_p \cdot grad(N, C, H_{out}, W_{out}) |
| 89 | $$ | 89 | $$ |
| 90 | 90 | ||
| 91 | 即对每个输出像素(h, w),将其梯度乘以双线性权重,累加到input的四个相邻像素位置(越界位置不累加)。 | 91 | 即对每个输出像素(h, w),将其梯度乘以双线性权重,累加到input的四个相邻像素位置(越界位置不累加)。 |
| @@ -99,7 +99,7 @@ | |||
| 99 | giy = \sum_{c} \left[ -V_{nw} \cdot (ix_{se} - ix) - V_{ne} \cdot (ix - ix_{sw}) + V_{sw} \cdot (ix_{ne} - ix) + V_{se} \cdot (ix - ix_{nw}) \right] \cdot grad(N, C, H_{out}, W_{out}) | 99 | giy = \sum_{c} \left[ -V_{nw} \cdot (ix_{se} - ix) - V_{ne} \cdot (ix - ix_{sw}) + V_{sw} \cdot (ix_{ne} - ix) + V_{se} \cdot (ix - ix_{nw}) \right] \cdot grad(N, C, H_{out}, W_{out}) |
| 100 | $$ | 100 | $$ |
| 101 | 101 | ||
| 102 | - 其中 $V_p = input(N, C, i_p, j_p)$(仅当角点在边界内时参与计算)。 | 102 | + 其中 $V_p = input(N, C, iy_p, ix_p)$(仅当角点在边界内时参与计算)。 |
| 103 | 103 | ||
| 104 | - 最终: | 104 | - 最终: |
| 105 | 105 | ||
| @@ -124,123 +124,123 @@ | |||
| 124 | - Bicubic(双三次插值) | 124 | - Bicubic(双三次插值) |
| 125 | - dx: | 125 | - dx: |
| 126 | 126 | ||
| 127 | - $$ | 127 | + $$ |
| 128 | - dx(N, C, iy', ix') \mathrel{+}= grad(N, C, H_{out}, W_{out}) \cdot x\_coeffs[i] \cdot y\_coeffs[j] | 128 | + dx(N, C, iy', ix') \mathrel{+}= grad(N, C, H_{out}, W_{out}) \cdot x\_coeffs[i] \cdot y\_coeffs[j] |
| 129 | - $$ | 129 | + $$ |
| 130 | 130 | ||
| 131 | - 其中: | 131 | + 其中: |
| 132 | 132 | ||
| 133 | - $(ix', iy') = (ix_{nw}-1+i, iy_{nw}-1+j)$,$i,j \in \{0,1,2,3\}$,越界位置根据paddingMode处理。 | 133 | + $(ix', iy') = (ix_{nw}-1+i, iy_{nw}-1+j)$,$i,j \in \{0,1,2,3\}$,越界位置根据paddingMode处理。 |
| 134 | 134 | ||
| 135 | - $$ | 135 | + $$ |
| 136 | - A = -0.75 \\ | 136 | + tx = ix - floor(ix) \\ |
| 137 | - x_0 = x + 1.0 \\ | 137 | + ty = iy - floor(iy) \\ |
| 138 | - x\_coeffs[0] = ((A * x_0 - 5* A) * x_0 + 8 * A) * x_0 - 4 * A | 138 | + $$ |
| 139 | - $$ | ||
| 140 | 139 | ||
| 141 | - $$ | 140 | + $$ |
| 142 | - x_1 = x \\ | 141 | + A = -0.75 \\ |
| 143 | - x\_coeffs[1] = ((A + 2)* x_1 - (A + 3)) * x_1 * x_1 + 1 | 142 | + x_0 = tx + 1.0 \\ |
| 144 | - $$ | 143 | + x\_coeffs[0] = ((A * x_0 - 5* A) * x_0 + 8 * A) * x_0 - 4 * A |
| 144 | + $$ | ||
| 145 | 145 | ||
| 146 | - $$ | 146 | + $$ |
| 147 | - x_2 = 1 - x \\ | 147 | + x_1 = tx \\ |
| 148 | - x\_coeffs[2] = ((A + 2)* x_2 - (A + 3)) * x_2 * x_2 + 1 | 148 | + x\_coeffs[1] = ((A + 2)* x_1 - (A + 3)) * x_1 * x_1 + 1 |
| 149 | - $$ | 149 | + $$ |
| 150 | 150 | ||
| 151 | - $$ | 151 | + $$ |
| 152 | - x_3 = 2 - x \\ | 152 | + x_2 = 1 - tx \\ |
| 153 | - x\_coeffs[3] = ((A * x_3 - 5* A) * x_3 + 8 * A) * x_3 - 4 * A | 153 | + x\_coeffs[2] = ((A + 2)* x_2 - (A + 3)) * x_2 * x_2 + 1 |
| 154 | - $$ | 154 | + $$ |
| 155 | 155 | ||
| 156 | - $$ | 156 | + $$ |
| 157 | - y_0 = y + 1.0 \\ | 157 | + x_3 = 2 - tx \\ |
| 158 | - y\_coeffs[0] = ((A * y_0 - 5* A) * y_0 + 8 * A) * y_0 - 4 * A | 158 | + x\_coeffs[3] = ((A * x_3 - 5* A) * x_3 + 8 * A) * x_3 - 4 * A |
| 159 | - $$ | 159 | + $$ |
| 160 | 160 | ||
| 161 | - $$ | 161 | + $$ |
| 162 | - y_1 = y \\ | 162 | + y_0 = ty + 1.0 \\ |
| 163 | - y\_coeffs[1] = ((A + 2)* y_1 - (A + 3)) * y_1 * y_1 + 1 | 163 | + y\_coeffs[0] = ((A * y_0 - 5* A) * y_0 + 8 * A) * y_0 - 4 * A |
| 164 | - $$ | 164 | + $$ |
| 165 | 165 | ||
| 166 | - $$ | 166 | + $$ |
| 167 | - y_2 = 1 - y \\ | 167 | + y_1 = ty \\ |
| 168 | - y\_coeffs[2] = ((A + 2)* y_2 - (A + 3)) * y_2 * y_2 + 1 | 168 | + y\_coeffs[1] = ((A + 2)* y_1 - (A + 3)) * y_1 * y_1 + 1 |
| 169 | - $$ | 169 | + $$ |
| 170 | 170 | ||
| 171 | - $$ | 171 | + $$ |
| 172 | - y_3 = 2 - y \\ | 172 | + y_2 = 1 - ty \\ |
| 173 | - y\_coeffs[3] = ((A * y_3 - 5* A) * y_3 + 8 * A) * y_3 - 4 * A | 173 | + y\_coeffs[2] = ((A + 2)* y_2 - (A + 3)) * y_2 * y_2 + 1 |
| 174 | - $$ | 174 | + $$ |
| 175 | + | ||
| 176 | + $$ | ||
| 177 | + y_3 = 2 - ty \\ | ||
| 178 | + y\_coeffs[3] = ((A * y_3 - 5* A) * y_3 + 8 * A) * y_3 - 4 * A | ||
| 179 | + $$ | ||
| 175 | 180 | ||
| 176 | - dgrid: | 181 | - dgrid: |
| 177 | 182 | ||
| 178 | - $$ | 183 | + $$ |
| 179 | - gix = -\sum_{C}\sum_{i=0}^{3}\sum_{j=0}^{3} V_{ij} \cdot x\_coeffs\_grad[i] \cdot y\_coeffs[j] \cdot grad(N, C, H_{out}, W_{out}) | 184 | + gix = -\sum_{C}\sum_{i=0}^{3}\sum_{j=0}^{3} V_{ij} \cdot x\_coeffs\_grad[i] \cdot y\_coeffs[j] \cdot grad(N, C, H_{out}, W_{out}) |
| 180 | - $$ | 185 | + $$ |
| 181 | 186 | ||
| 182 | - $$ | 187 | + $$ |
| 183 | - giy = -\sum_{C}\sum_{i=0}^{3}\sum_{j=0}^{3} V_{ij} \cdot y\_coeffs\_grad[j] \cdot x\_coeffs[i] \cdot grad(N, C, H_{out}, W_{out}) | 188 | + giy = -\sum_{C}\sum_{i=0}^{3}\sum_{j=0}^{3} V_{ij} \cdot y\_coeffs\_grad[j] \cdot x\_coeffs[i] \cdot grad(N, C, H_{out}, W_{out}) |
| 184 | - $$ | 189 | + $$ |
| 185 | 190 | ||
| 186 | - 其中: | 191 | + 其中: |
| 187 | 192 | ||
| 188 | - $V_{ij} = get\_value\_bounded(input(N, C, H_{in}, W_{in}), ix_{nw}-1+i, iy_{nw}-1 +j)$,`x_coeffs_grad`和`y_coeffs_grad`是三次插值系数对tx/ty的导数: | 193 | + $V_{ij} = get\_value\_bounded(input(N, C, H_{in}, W_{in}), ix_{nw}-1+i, iy_{nw}-1 +j)$,`x_coeffs_grad`和`y_coeffs_grad`是三次插值系数对tx/ty的导数: |
| 189 | 194 | ||
| 190 | - $$ | 195 | + $$ |
| 191 | - tx = ix - floor(ix) \\ | 196 | + x\_coeffs\_grad[0] = (-3A \cdot x - 10A) \cdot x - 8A \\ |
| 192 | - ty = iy - floor(iy) \\ | 197 | + \quad x = |-1 - tx| |
| 193 | - $$ | 198 | + $$ |
| 194 | 199 | ||
| 195 | - $$ | 200 | + $$ |
| 196 | - x\_coeffs\_grad[0] = (-3A \cdot x - 10A) \cdot x - 8A \\ | 201 | + x\_coeffs\_grad[1] = (-3(A+2) \cdot x - 2(A+3)) \cdot x \\ |
| 197 | - \quad x = |-1 - tx| | 202 | + \quad x = | 0 - tx| |
| 198 | - $$ | 203 | + $$ |
| 199 | 204 | ||
| 200 | - $$ | 205 | + $$ |
| 201 | - x\_coeffs\_grad[1] = (-3(A+2) \cdot x - 2(A+3)) \cdot x \\ | 206 | + x\_coeffs\_grad[2] = (3(A+2) \cdot x - 2(A+3)) \cdot x \\ |
| 202 | - \quad x = | 0 - tx| | 207 | + \quad x = |1 - tx| |
| 203 | - $$ | 208 | + $$ |
| 204 | 209 | ||
| 205 | - $$ | 210 | + $$ |
| 206 | - x\_coeffs\_grad[2] = (3(A+2) \cdot x - 2(A+3)) \cdot x \\ | 211 | + x\_coeffs\_grad[3] = (3A \cdot x - 10A) \cdot x + 8A \\ |
| 207 | - \quad x = |1 - tx| | 212 | + \quad x = |2 - tx| |
| 208 | - $$ | 213 | + $$ |
| 209 | 214 | ||
| 210 | - $$ | 215 | + $$ |
| 211 | - x\_coeffs\_grad[3] = (3A \cdot x - 10A) \cdot x + 8A \\ | 216 | + y\_coeffs\_grad[0] = (-3A \cdot y - 10A) \cdot y - 8A \\ |
| 212 | - \quad x = |2 - tx| | 217 | + \quad y = |-1 - ty| |
| 213 | - $$ | 218 | + $$ |
| 214 | 219 | ||
| 215 | - $$ | 220 | + $$ |
| 216 | - y\_coeffs\_grad[0] = (-3A \cdot y - 10A) \cdot y - 8A \\ | 221 | + y\_coeffs\_grad[1] = (-3(A+2) \cdot y - 2(A+3)) \cdot y \\ |
| 217 | - \quad y = |-1 - ty| | 222 | + \quad y = | 0 - ty| |
| 218 | - $$ | 223 | + $$ |
| 219 | 224 | ||
| 220 | - $$ | 225 | + $$ |
| 221 | - y\_coeffs\_grad[1] = (-3(A+2) \cdot y - 2(A+3)) \cdot y \\ | 226 | + y\_coeffs\_grad[2] = (3(A+2) \cdot y - 2(A+3)) \cdot y \\ |
| 222 | - \quad y = | 0 - ty| | 227 | + \quad y = |1 - ty| |
| 223 | - $$ | 228 | + $$ |
| 224 | 229 | ||
| 225 | - $$ | 230 | + $$ |
| 226 | - y\_coeffs\_grad[2] = (3(A+2) \cdot y - 2(A+3)) \cdot y \\ | 231 | + y\_coeffs\_grad[3] = (3A \cdot y - 10A) \cdot y + 8A \\ |
| 227 | - \quad y = |1 - ty| | 232 | + \quad y = |2 - ty| |
| 228 | - $$ | 233 | + $$ |
| 229 | 234 | ||
| 230 | - $$ | 235 | + 最终: |
| 231 | - y\_coeffs\_grad[3] = (3A \cdot y - 10A) \cdot y + 8A \\ | ||
| 232 | - \quad y = |2 - ty| | ||
| 233 | - $$ | ||
| 234 | 236 | ||
| 235 | - 最终: | 237 | + $$ |
| 238 | + dgrid(N, H_{out}, W_{out}, 0) = gix\_mult \cdot gix | ||
| 239 | + $$ | ||
| 236 | 240 | ||
| 237 | - $$ | 241 | + $$ |
| 238 | - dgrid(N, H_{out}, W_{out}, 0) = gix\_mult \cdot gix | 242 | + dgrid(N, H_{out}, W_{out}, 1) = giy\_mult \cdot giy |
| 239 | - $$ | 243 | + $$ |
| 240 | - | ||
| 241 | - $$ | ||
| 242 | - dgrid(N, H_{out}, W_{out}, 1) = giy\_mult \cdot giy | ||
| 243 | - $$ | ||
| 244 | 244 | ||
| 245 | ## 函数原型 | 245 | ## 函数原型 |
| 246 | 246 | ||
| @@ -409,13 +409,13 @@ aclnnStatus aclnnGridSampler2DBackward( | |||
| 409 | </table> | 409 | </table> |
| 410 | 410 | ||
| 411 | - <term>Atlas 训练系列产品</term>: | 411 | - <term>Atlas 训练系列产品</term>: |
| 412 | - | 412 | + |
| 413 | 参数`gradOutput`、`input`、`grid`、`inputGrad`、`gridGrad`的数据类型不支持BFLOAT16、DOUBLE。 | 413 | 参数`gradOutput`、`input`、`grid`、`inputGrad`、`gridGrad`的数据类型不支持BFLOAT16、DOUBLE。 |
| 414 | 414 | ||
| 415 | - **返回值** | 415 | - **返回值** |
| 416 | 416 | ||
| 417 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 417 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 418 | - | 418 | + |
| 419 | 第一段接口完成入参校验,出现以下场景时报错: | 419 | 第一段接口完成入参校验,出现以下场景时报错: |
| 420 | 420 | ||
| 421 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 421 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -460,7 +460,7 @@ aclnnStatus aclnnGridSampler2DBackward( | |||
| 460 | </tr> | 460 | </tr> |
| 461 | <tr> | 461 | <tr> |
| 462 | <td>input最后两维的维度值为0。</td> | 462 | <td>input最后两维的维度值为0。</td> |
| 463 | - </tr> | 463 | + </tr> |
| 464 | <tr> | 464 | <tr> |
| 465 | <td>grid最后一维的值不等于2。</td> | 465 | <td>grid最后一维的值不等于2。</td> |
| 466 | </tr> | 466 | </tr> |
| @@ -19,11 +19,11 @@ | |||
| 19 | 1. 根据grid存储的(x, y, z)值,计算出映射到input上的坐标,这些坐标和align_corners、padding_mode有关。 | 19 | 1. 根据grid存储的(x, y, z)值,计算出映射到input上的坐标,这些坐标和align_corners、padding_mode有关。 |
| 20 | 2. 坐标根据输入的interpolation_mode,选择使用bilinear、nearest不同插值模式计算输出值。 | 20 | 2. 坐标根据输入的interpolation_mode,选择使用bilinear、nearest不同插值模式计算输出值。 |
| 21 | 3. 根据grad存储的梯度值乘上对应点的权重值,计算出最终dx、dgrid的结果。 | 21 | 3. 根据grad存储的梯度值乘上对应点的权重值,计算出最终dx、dgrid的结果。 |
| 22 | - | 22 | + |
| 23 | - 计算公式: | 23 | - 计算公式: |
| 24 | - | 24 | + |
| 25 | grad、input、grid、dx、dgrid的尺寸如下: | 25 | grad、input、grid、dx、dgrid的尺寸如下: |
| 26 | - | 26 | + |
| 27 | $$ | 27 | $$ |
| 28 | grad: (N, C, D_{out}, H_{out}, W_{out})\\ | 28 | grad: (N, C, D_{out}, H_{out}, W_{out})\\ |
| 29 | input: (N, C, D_{in}, H_{in}, W_{in})\\ | 29 | input: (N, C, D_{in}, H_{in}, W_{in})\\ |
| @@ -32,10 +32,10 @@ | |||
| 32 | dgrid: (N, D_{out}, H_{out}, W_{out}, 3) | 32 | dgrid: (N, D_{out}, H_{out}, W_{out}, 3) |
| 33 | $$ | 33 | $$ |
| 34 | 34 | ||
| 35 | - 其中grad、input、grid、dx、dgrid中的N是一致的,grad、input和dx中的C是一致的,input和dx中的$D_{in}$、$H_{in}$、$W_{in}$是一致的,grad、grid和dgrid中的$D_{out}$、$H_{out}$、$W_{out}$一致的,grid最后一维大小为3,表示input像素位置信息为(x, y, z),会将x、y、z的取值范围归一化到[-1, 1]之间。 | 35 | + 其中grad、input、grid、dx、dgrid中的N是一致的,grad、input和dx中的C是一致的,input和dx中的$D_{in}$、$H_{in}$、$W_{in}$是一致的,grad、grid和dgrid中的$D_{out}$、$H_{out}$、$W_{out}$是一致的,grid最后一维大小为3,表示input像素位置信息为(x, y, z),会将x、y、z的取值范围归一化到[-1, 1]之间。 |
| 36 | 36 | ||
| 37 | 1. 坐标反归一化: | 37 | 1. 坐标反归一化: |
| 38 | - | 38 | + |
| 39 | grid中的(x, y, z)需要先反归一化到input像素坐标(ix, iy, iz),同时计算梯度乘子`gix_mult`、`giy_mult`、`giz_mult`(用于后续dgrid计算): | 39 | grid中的(x, y, z)需要先反归一化到input像素坐标(ix, iy, iz),同时计算梯度乘子`gix_mult`、`giy_mult`、`giz_mult`(用于后续dgrid计算): |
| 40 | - align_corners = true: | 40 | - align_corners = true: |
| 41 | 41 | ||
| @@ -63,7 +63,7 @@ | |||
| 63 | 63 | ||
| 64 | 四个角点坐标和权重为: | 64 | 四个角点坐标和权重为: |
| 65 | 65 | ||
| 66 | - | 角点 | 坐标$(i_p, j_p, k_p)$ | 权重$w_p$ | | 66 | + | 角点 | 坐标$(iz_p, iy_p, ix_p)$ | 权重$w_p$ | |
| 67 | |:------:|:------:|:----------:| | 67 | |:------:|:------:|:----------:| |
| 68 | | tnw(顶-北-西) | $(⌊iz⌋, ⌊iy⌋, ⌊ix⌋)$ | $(ix_{bse} - ix) × (iy_{bse} - iy) × (iz_{bse} - iz)$ | | 68 | | tnw(顶-北-西) | $(⌊iz⌋, ⌊iy⌋, ⌊ix⌋)$ | $(ix_{bse} - ix) × (iy_{bse} - iy) × (iz_{bse} - iz)$ | |
| 69 | | tne(顶-北-东) | $(⌊iz⌋, ⌊iy⌋, ⌊ix⌋+1)$ | $(ix - ix_{bsw}) × (iy_{bsw} - iy) × (iz_{bsw} - iz)$ | | 69 | | tne(顶-北-东) | $(⌊iz⌋, ⌊iy⌋, ⌊ix⌋+1)$ | $(ix - ix_{bsw}) × (iy_{bsw} - iy) × (iz_{bsw} - iz)$ | |
| @@ -73,7 +73,7 @@ | |||
| 73 | | bne(底-北-东) | $(⌊iz⌋+1, ⌊iy⌋, ⌊ix⌋+1)$ | $(ix - ix_{tsw}) × (iy_{tsw} - iy) × (iz - iz_{tsw})$ | | 73 | | bne(底-北-东) | $(⌊iz⌋+1, ⌊iy⌋, ⌊ix⌋+1)$ | $(ix - ix_{tsw}) × (iy_{tsw} - iy) × (iz - iz_{tsw})$ | |
| 74 | | bsw(底-南-西) | $(⌊iz⌋+1, ⌊iy⌋+1, ⌊ix⌋)$ | $(ix_{tne} - ix) × (iy - iy_{tne}) × (iz - iz_{tne})$ | | 74 | | bsw(底-南-西) | $(⌊iz⌋+1, ⌊iy⌋+1, ⌊ix⌋)$ | $(ix_{tne} - ix) × (iy - iy_{tne}) × (iz - iz_{tne})$ | |
| 75 | | bse(底-南-东) | $(⌊iz⌋+1, ⌊iy⌋+1, ⌊ix⌋+1)$ | $(ix - ix_{tnw}) × (iy - iy_{tnw}) × (iz - iz_{tnw})$ | | 75 | | bse(底-南-东) | $(⌊iz⌋+1, ⌊iy⌋+1, ⌊ix⌋+1)$ | $(ix - ix_{tnw}) × (iy - iy_{tnw}) × (iz - iz_{tnw})$ | |
| 76 | - | 76 | + |
| 77 | 其中: | 77 | 其中: |
| 78 | 78 | ||
| 79 | $$ | 79 | $$ |
| @@ -125,9 +125,9 @@ | |||
| 125 | $$ | 125 | $$ |
| 126 | 126 | ||
| 127 | - dx(input梯度):将上游梯度按三线性权重散射到input对应位置 | 127 | - dx(input梯度):将上游梯度按三线性权重散射到input对应位置 |
| 128 | - | 128 | + |
| 129 | $$ | 129 | $$ |
| 130 | - dx(N, C, i_p, j_p, k_p) \mathrel{+}= w_p \cdot grad(N, C, D_{out}, H_{out}, W_{out}) | 130 | + dx(N, C, iz_p, iy_p, ix_p) \mathrel{+}= w_p \cdot grad(N, C, D_{out}, H_{out}, W_{out}) |
| 131 | $$ | 131 | $$ |
| 132 | 132 | ||
| 133 | 即对每个输出像素(d, h, w),将其梯度乘以三线性权重,累加到input的8个相邻体素位置(越界位置不累加)。 | 133 | 即对每个输出像素(d, h, w),将其梯度乘以三线性权重,累加到input的8个相邻体素位置(越界位置不累加)。 |
| @@ -145,7 +145,7 @@ | |||
| 145 | giz = \sum_{c} \left[ -V_{tnw} \cdot (ix_{bse}-ix)(iy_{bse}-iy) - V_{tne} \cdot (ix-ix_{bsw})(iy_{bsw}-iy) - V_{tsw} \cdot (ix_{bne}-ix)(iy-iy_{bne}) - V_{tse} \cdot (ix-ix_{bnw})(iy-iy_{bnw}) + V_{bnw} \cdot (ix_{tse}-ix)(iy_{tse}-iy) + V_{bne} \cdot (ix-ix_{tsw})(iy_{tsw}-iy) + V_{bsw} \cdot (ix_{tne}-ix)(iy-iy_{tne}) + V_{bse} \cdot (ix-ix_{tnw})(iy-iy_{tnw}) \right] \cdot grad(N, C, D_{out}, H_{out}, W_{out}) | 145 | giz = \sum_{c} \left[ -V_{tnw} \cdot (ix_{bse}-ix)(iy_{bse}-iy) - V_{tne} \cdot (ix-ix_{bsw})(iy_{bsw}-iy) - V_{tsw} \cdot (ix_{bne}-ix)(iy-iy_{bne}) - V_{tse} \cdot (ix-ix_{bnw})(iy-iy_{bnw}) + V_{bnw} \cdot (ix_{tse}-ix)(iy_{tse}-iy) + V_{bne} \cdot (ix-ix_{tsw})(iy_{tsw}-iy) + V_{bsw} \cdot (ix_{tne}-ix)(iy-iy_{tne}) + V_{bse} \cdot (ix-ix_{tnw})(iy-iy_{tnw}) \right] \cdot grad(N, C, D_{out}, H_{out}, W_{out}) |
| 146 | $$ | 146 | $$ |
| 147 | 147 | ||
| 148 | - 其中 $V_p = input(N, C, i_p, j_p, k_p)$(仅当角点在边界内时参与计算)。 | 148 | + 其中 $V_p = input(N, C, iz_p, iy_p, ix_p)$(仅当角点在边界内时参与计算)。 |
| 149 | - 最终: | 149 | - 最终: |
| 150 | 150 | ||
| 151 | $$ | 151 | $$ |
| @@ -157,7 +157,7 @@ | |||
| 157 | $$ | 157 | $$ |
| 158 | 158 | ||
| 159 | $$ | 159 | $$ |
| 160 | - dgrid(N, D_{out}, H_{out}, W_{out}, 2) = giy\_mult \cdot giz | 160 | + dgrid(N, D_{out}, H_{out}, W_{out}, 2) = giz\_mult \cdot giz |
| 161 | $$ | 161 | $$ |
| 162 | 162 | ||
| 163 | - Nearest(最邻近插值) | 163 | - Nearest(最邻近插值) |
| @@ -204,7 +204,7 @@ | |||
| 204 | <tr> | 204 | <tr> |
| 205 | <td>grid</td> | 205 | <td>grid</td> |
| 206 | <td>输入</td> | 206 | <td>输入</td> |
| 207 | - <td>表示采用像素位置的张量,对应公式描述中的`grid`。shape仅支持五维,且需满足`grid`和`grad`的N轴、D轴、H轴、W轴的值保持一致,最后一维的值等于3。</td> | 207 | + <td>表示采样像素位置的张量,对应公式描述中的`grid`。shape仅支持五维,且需满足`grid`和`grad`的N轴、D轴、H轴、W轴的值保持一致,最后一维的值等于3。</td> |
| 208 | <td>FLOAT16、FLOAT32、DOUBLE、BFLOAT16</td> | 208 | <td>FLOAT16、FLOAT32、DOUBLE、BFLOAT16</td> |
| 209 | <td>NDHWC</td> | 209 | <td>NDHWC</td> |
| 210 | </tr> | 210 | </tr> |
| @@ -21,11 +21,11 @@ | |||
| 21 | 1. 根据grid存储的(x, y, z)值,计算出映射到input上的坐标,这些坐标和alignCorners、paddingMode有关。 | 21 | 1. 根据grid存储的(x, y, z)值,计算出映射到input上的坐标,这些坐标和alignCorners、paddingMode有关。 |
| 22 | 2. 坐标根据输入的interpolationMode,选择使用bilinear、nearest不同插值模式计算输出值。 | 22 | 2. 坐标根据输入的interpolationMode,选择使用bilinear、nearest不同插值模式计算输出值。 |
| 23 | 3. 根据grad存储的梯度值乘上对应点的权重值,计算出最终dx、dgrid的结果。 | 23 | 3. 根据grad存储的梯度值乘上对应点的权重值,计算出最终dx、dgrid的结果。 |
| 24 | - | 24 | + |
| 25 | - 计算公式: | 25 | - 计算公式: |
| 26 | - | 26 | + |
| 27 | grad、input、grid、dx、dgrid的尺寸如下: | 27 | grad、input、grid、dx、dgrid的尺寸如下: |
| 28 | - | 28 | + |
| 29 | $$ | 29 | $$ |
| 30 | grad: (N, C, D_{out}, H_{out}, W_{out})\\ | 30 | grad: (N, C, D_{out}, H_{out}, W_{out})\\ |
| 31 | input: (N, C, D_{in}, H_{in}, W_{in})\\ | 31 | input: (N, C, D_{in}, H_{in}, W_{in})\\ |
| @@ -34,10 +34,10 @@ | |||
| 34 | dgrid: (N, D_{out}, H_{out}, W_{out}, 3) | 34 | dgrid: (N, D_{out}, H_{out}, W_{out}, 3) |
| 35 | $$ | 35 | $$ |
| 36 | 36 | ||
| 37 | - 其中grad、input、grid、dx、dgrid中的N是一致的,grad、input和dx中的C是一致的,input和dx中的$D_{in}$、$H_{in}$、$W_{in}$是一致的,grad、grid和dgrid中的$D_{out}$、$H_{out}$、$W_{out}$一致的,grid最后一维大小为3,表示input像素位置信息为(x, y, z),会将x、y、z的取值范围归一化到[-1, 1]之间。 | 37 | + 其中grad、input、grid、dx、dgrid中的N是一致的,grad、input和dx中的C是一致的,input和dx中的$D_{in}$、$H_{in}$、$W_{in}$是一致的,grad、grid和dgrid中的$D_{out}$、$H_{out}$、$W_{out}$是一致的,grid最后一维大小为3,表示input像素位置信息为(x, y, z),会将x、y、z的取值范围归一化到[-1, 1]之间。 |
| 38 | 38 | ||
| 39 | 1. 坐标反归一化: | 39 | 1. 坐标反归一化: |
| 40 | - | 40 | + |
| 41 | grid中的(x, y, z)需要先反归一化到input像素坐标(ix, iy, iz),同时计算梯度乘子`gix_mult`、`giy_mult`、`giz_mult`(用于后续dgrid计算): | 41 | grid中的(x, y, z)需要先反归一化到input像素坐标(ix, iy, iz),同时计算梯度乘子`gix_mult`、`giy_mult`、`giz_mult`(用于后续dgrid计算): |
| 42 | - alignCorners = true: | 42 | - alignCorners = true: |
| 43 | 43 | ||
| @@ -55,7 +55,7 @@ | |||
| 55 | iz = \frac{(z+1) \cdot D_{in} - 1}{2}, \quad giz\_mult = \frac{D_{in}}{2} | 55 | iz = \frac{(z+1) \cdot D_{in} - 1}{2}, \quad giz\_mult = \frac{D_{in}}{2} |
| 56 | $$ | 56 | $$ |
| 57 | 57 | ||
| 58 | - 2. padding_mode对梯度乘子的影响: | 58 | + 2. paddingMode对梯度乘子的影响: |
| 59 | - paddingMode="zeros",`gix_mult`不变 | 59 | - paddingMode="zeros",`gix_mult`不变 |
| 60 | - paddingMode="border",$gix\_mult = gix\_mult × grad\_clip$(坐标在边界外时grad_clip=0,否则=1) | 60 | - paddingMode="border",$gix\_mult = gix\_mult × grad\_clip$(坐标在边界外时grad_clip=0,否则=1) |
| 61 | - paddingMode="reflection",$gix\_mult = gix\_mult × grad\_refl × grad\_clip$(grad_refl是反射坐标变换函数对输入坐标的导数,表示反射后输出坐标随输入坐标变化的方向和速率。取值为-1,0,1)。 | 61 | - paddingMode="reflection",$gix\_mult = gix\_mult × grad\_refl × grad\_clip$(grad_refl是反射坐标变换函数对输入坐标的导数,表示反射后输出坐标随输入坐标变化的方向和速率。取值为-1,0,1)。 |
| @@ -65,7 +65,7 @@ | |||
| 65 | 65 | ||
| 66 | 四个角点坐标和权重为: | 66 | 四个角点坐标和权重为: |
| 67 | 67 | ||
| 68 | - | 角点 | 坐标$(i_p, j_p, k_p)$ | 权重$w_p$ | | 68 | + | 角点 | 坐标$(iz_p, iy_p, ix_p)$ | 权重$w_p$ | |
| 69 | |:------:|:------:|:----------:| | 69 | |:------:|:------:|:----------:| |
| 70 | | tnw(顶-北-西) | $(⌊iz⌋, ⌊iy⌋, ⌊ix⌋)$ | $(ix_{bse} - ix) × (iy_{bse} - iy) × (iz_{bse} - iz)$ | | 70 | | tnw(顶-北-西) | $(⌊iz⌋, ⌊iy⌋, ⌊ix⌋)$ | $(ix_{bse} - ix) × (iy_{bse} - iy) × (iz_{bse} - iz)$ | |
| 71 | | tne(顶-北-东) | $(⌊iz⌋, ⌊iy⌋, ⌊ix⌋+1)$ | $(ix - ix_{bsw}) × (iy_{bsw} - iy) × (iz_{bsw} - iz)$ | | 71 | | tne(顶-北-东) | $(⌊iz⌋, ⌊iy⌋, ⌊ix⌋+1)$ | $(ix - ix_{bsw}) × (iy_{bsw} - iy) × (iz_{bsw} - iz)$ | |
| @@ -75,7 +75,7 @@ | |||
| 75 | | bne(底-北-东) | $(⌊iz⌋+1, ⌊iy⌋, ⌊ix⌋+1)$ | $(ix - ix_{tsw}) × (iy_{tsw} - iy) × (iz - iz_{tsw})$ | | 75 | | bne(底-北-东) | $(⌊iz⌋+1, ⌊iy⌋, ⌊ix⌋+1)$ | $(ix - ix_{tsw}) × (iy_{tsw} - iy) × (iz - iz_{tsw})$ | |
| 76 | | bsw(底-南-西) | $(⌊iz⌋+1, ⌊iy⌋+1, ⌊ix⌋)$ | $(ix_{tne} - ix) × (iy - iy_{tne}) × (iz - iz_{tne})$ | | 76 | | bsw(底-南-西) | $(⌊iz⌋+1, ⌊iy⌋+1, ⌊ix⌋)$ | $(ix_{tne} - ix) × (iy - iy_{tne}) × (iz - iz_{tne})$ | |
| 77 | | bse(底-南-东) | $(⌊iz⌋+1, ⌊iy⌋+1, ⌊ix⌋+1)$ | $(ix - ix_{tnw}) × (iy - iy_{tnw}) × (iz - iz_{tnw})$ | | 77 | | bse(底-南-东) | $(⌊iz⌋+1, ⌊iy⌋+1, ⌊ix⌋+1)$ | $(ix - ix_{tnw}) × (iy - iy_{tnw}) × (iz - iz_{tnw})$ | |
| 78 | - | 78 | + |
| 79 | 其中: | 79 | 其中: |
| 80 | 80 | ||
| 81 | $$ | 81 | $$ |
| @@ -129,7 +129,7 @@ | |||
| 129 | - dx(input梯度):将上游梯度按三线性权重散射到input对应位置 | 129 | - dx(input梯度):将上游梯度按三线性权重散射到input对应位置 |
| 130 | 130 | ||
| 131 | $$ | 131 | $$ |
| 132 | - dx(N, C, i_p, j_p, k_p) \mathrel{+}= w_p \cdot grad(N, C, D_{out}, H_{out}, W_{out}) | 132 | + dx(N, C, iz_p, iy_p, ix_p) \mathrel{+}= w_p \cdot grad(N, C, D_{out}, H_{out}, W_{out}) |
| 133 | $$ | 133 | $$ |
| 134 | 134 | ||
| 135 | 即对每个输出像素(d, h, w),将其梯度乘以三线性权重,累加到input的8个相邻体素位置(越界位置不累加)。 | 135 | 即对每个输出像素(d, h, w),将其梯度乘以三线性权重,累加到input的8个相邻体素位置(越界位置不累加)。 |
| @@ -147,7 +147,7 @@ | |||
| 147 | giz = \sum_{c} \left[ -V_{tnw} \cdot (ix_{bse}-ix)(iy_{bse}-iy) - V_{tne} \cdot (ix-ix_{bsw})(iy_{bsw}-iy) - V_{tsw} \cdot (ix_{bne}-ix)(iy-iy_{bne}) - V_{tse} \cdot (ix-ix_{bnw})(iy-iy_{bnw}) + V_{bnw} \cdot (ix_{tse}-ix)(iy_{tse}-iy) + V_{bne} \cdot (ix-ix_{tsw})(iy_{tsw}-iy) + V_{bsw} \cdot (ix_{tne}-ix)(iy-iy_{tne}) + V_{bse} \cdot (ix-ix_{tnw})(iy-iy_{tnw}) \right] \cdot grad(N, C, D_{out}, H_{out}, W_{out}) | 147 | giz = \sum_{c} \left[ -V_{tnw} \cdot (ix_{bse}-ix)(iy_{bse}-iy) - V_{tne} \cdot (ix-ix_{bsw})(iy_{bsw}-iy) - V_{tsw} \cdot (ix_{bne}-ix)(iy-iy_{bne}) - V_{tse} \cdot (ix-ix_{bnw})(iy-iy_{bnw}) + V_{bnw} \cdot (ix_{tse}-ix)(iy_{tse}-iy) + V_{bne} \cdot (ix-ix_{tsw})(iy_{tsw}-iy) + V_{bsw} \cdot (ix_{tne}-ix)(iy-iy_{tne}) + V_{bse} \cdot (ix-ix_{tnw})(iy-iy_{tnw}) \right] \cdot grad(N, C, D_{out}, H_{out}, W_{out}) |
| 148 | $$ | 148 | $$ |
| 149 | 149 | ||
| 150 | - 其中 $V_p = input(N, C, i_p, j_p, k_p)$(仅当角点在边界内时参与计算)。 | 150 | + 其中 $V_p = input(N, C, iz_p, iy_p, ix_p)$(仅当角点在边界内时参与计算)。 |
| 151 | - 最终: | 151 | - 最终: |
| 152 | 152 | ||
| 153 | $$ | 153 | $$ |
| @@ -159,7 +159,7 @@ | |||
| 159 | $$ | 159 | $$ |
| 160 | 160 | ||
| 161 | $$ | 161 | $$ |
| 162 | - dgrid(N, D_{out}, H_{out}, W_{out}, 2) = giy\_mult \cdot giz | 162 | + dgrid(N, D_{out}, H_{out}, W_{out}, 2) = giz\_mult \cdot giz |
| 163 | $$ | 163 | $$ |
| 164 | 164 | ||
| 165 | - Nearest(最邻近插值) | 165 | - Nearest(最邻近插值) |
| @@ -247,7 +247,7 @@ aclnnStatus aclnnGridSampler3DBackward( | |||
| 247 | <tr> | 247 | <tr> |
| 248 | <td>grid(aclTensor*)</td> | 248 | <td>grid(aclTensor*)</td> |
| 249 | <td>输入</td> | 249 | <td>输入</td> |
| 250 | - <td>表示采用像素位置的张量,对应公式描述中的`grid`。</td> | 250 | + <td>表示采样像素位置的张量,对应公式描述中的`grid`。</td> |
| 251 | <td><ul><li>支持空Tensor。</li><li>数据类型与`input`的数据类型一致。</li><li>`grid`和`gradOutput`的N轴、D轴、H轴、W轴的值保持一致,C轴的值必须为3。</li></ul></td> | 251 | <td><ul><li>支持空Tensor。</li><li>数据类型与`input`的数据类型一致。</li><li>`grid`和`gradOutput`的N轴、D轴、H轴、W轴的值保持一致,C轴的值必须为3。</li></ul></td> |
| 252 | <td>BFLOAT16、FLOAT16、FLOAT32、DOUBLE</td> | 252 | <td>BFLOAT16、FLOAT16、FLOAT32、DOUBLE</td> |
| 253 | <td>NDHWC</td> | 253 | <td>NDHWC</td> |
| @@ -338,13 +338,13 @@ aclnnStatus aclnnGridSampler3DBackward( | |||
| 338 | </table> | 338 | </table> |
| 339 | 339 | ||
| 340 | - <term>Atlas 训练系列产品</term>: | 340 | - <term>Atlas 训练系列产品</term>: |
| 341 | - | 341 | + |
| 342 | 参数`gradOutput`、`input`、`grid`、`inputGrad`、`gridGrad`的数据类型不支持BFLOAT16。 | 342 | 参数`gradOutput`、`input`、`grid`、`inputGrad`、`gridGrad`的数据类型不支持BFLOAT16。 |
| 343 | 343 | ||
| 344 | - **返回值** | 344 | - **返回值** |
| 345 | 345 | ||
| 346 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 346 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 347 | - | 347 | + |
| 348 | 第一段接口完成入参校验,出现以下场景时报错: | 348 | 第一段接口完成入参校验,出现以下场景时报错: |
| 349 | 349 | ||
| 350 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 350 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -19,62 +19,62 @@ | |||
| 19 | 19 | ||
| 20 | $findices$记录每个像素点最小深度对应的面索引,$barycentric$记录每个顶点相对于$findices$中记录的面的重心坐标透视矫正插值。 | 20 | $findices$记录每个像素点最小深度对应的面索引,$barycentric$记录每个顶点相对于$findices$中记录的面的重心坐标透视矫正插值。 |
| 21 | 计算过程中使用的Z-Buffer记录每个像素点$(x, y)$的最小深度$z_{\min}(x, y)$以及该深度对应的三角形面片索引$\text{face\_idx}(x, y)$。 | 21 | 计算过程中使用的Z-Buffer记录每个像素点$(x, y)$的最小深度$z_{\min}(x, y)$以及该深度对应的三角形面片索引$\text{face\_idx}(x, y)$。 |
| 22 | - | 22 | + |
| 23 | 计算过程如下: | 23 | 计算过程如下: |
| 24 | 对空间中的每个三角形面片$f$: | 24 | 对空间中的每个三角形面片$f$: |
| 25 | - | 25 | + |
| 26 | 1. 将$f$的三个顶点坐标$(v_0, v_1, v_2)$转换为屏幕坐标$(v_{s0}, v_{s1}, v_{s2})$ | 26 | 1. 将$f$的三个顶点坐标$(v_0, v_1, v_2)$转换为屏幕坐标$(v_{s0}, v_{s1}, v_{s2})$ |
| 27 | 2. 根据$(v_{s0}, v_{s1}, v_{s2})$计算包围$f$的矩形范围 | 27 | 2. 根据$(v_{s0}, v_{s1}, v_{s2})$计算包围$f$的矩形范围 |
| 28 | 3. 对矩形内每个像素点$v_i = (x_i, y_i)$,执行以下操作: | 28 | 3. 对矩形内每个像素点$v_i = (x_i, y_i)$,执行以下操作: |
| 29 | 29 | ||
| 30 | - a. 计算像素中心坐标$v_c$ | 30 | + a. 计算像素中心坐标$v_c$ |
| 31 | - b. 计算$v_c$相对于三角形$f$的重心坐标$(\alpha, \beta, \gamma)$ | 31 | + b. 计算$v_c$相对于三角形$f$的重心坐标$(\alpha, \beta, \gamma)$ |
| 32 | c. 根据$(\alpha, \beta, \gamma)$判断$v_c$是否在三角形内部。若$v_c$不在三角形内部,则处理矩形内下个像素点,否则执行下述步骤 | 32 | c. 根据$(\alpha, \beta, \gamma)$判断$v_c$是否在三角形内部。若$v_c$不在三角形内部,则处理矩形内下个像素点,否则执行下述步骤 |
| 33 | d. 使用$(\alpha, \beta, \gamma)$和$(v_{s0}, v_{s1}, v_{s2})$得到当前像素的深度值depth | 33 | d. 使用$(\alpha, \beta, \gamma)$和$(v_{s0}, v_{s1}, v_{s2})$得到当前像素的深度值depth |
| 34 | - e. 若启用了深度先验;否则,直接执行下一步“Z-Buffer更新” | 34 | + e. 若启用了深度先验,则使用深度先验图计算深度阈值depth_thres;否则,直接执行下一步“Z-Buffer更新” |
| 35 | 35 | ||
| 36 | - - 使用深度先验图计算深度阈值depth_thres | 36 | + - 使用深度先验图计算深度阈值depth_thres |
| 37 | - - 如果depth < depth_thres,处理矩形内下个像素点,否则执行下述步骤 | 37 | + - 如果depth < depth_thres,处理矩形内下个像素点,否则执行下述步骤 |
| 38 | 38 | ||
| 39 | f. Z-Buffer更新: | 39 | f. Z-Buffer更新: |
| 40 | - | 40 | + |
| 41 | - - 若$depth < z_{\min}(x_i, y_i)$: | 41 | + - 若$depth < z_{\min}(x_i, y_i)$: |
| 42 | - | 42 | + |
| 43 | - $$ | 43 | + $$ |
| 44 | - \quad z_{\min}(x_i, y_i) \gets \text{depth} \\ | 44 | + \quad z_{\min}(x_i, y_i) \gets \text{depth} \\ |
| 45 | - \quad \text{face\_idx}(x_i, y_i) \gets f | 45 | + \quad \text{face\_idx}(x_i, y_i) \gets f |
| 46 | - $$ | 46 | + $$ |
| 47 | - | 47 | + |
| 48 | - - 若$depth = z_{\min}(x_i, y_i)$: | 48 | + - 若$depth = z_{\min}(x_i, y_i)$: |
| 49 | - | 49 | + |
| 50 | - $$ | 50 | + $$ |
| 51 | - \quad \text{face\_idx}(x_i, y_i) \gets \min(\text{face\_idx}(x_i, y_i),\ f) | 51 | + \quad \text{face\_idx}(x_i, y_i) \gets \min(\text{face\_idx}(x_i, y_i),\ f) |
| 52 | - $$ | 52 | + $$ |
| 53 | - | 53 | + |
| 54 | 按上述步骤对空间中所有的三角形面片进行处理后,对大小为$height * width$的屏幕上每个像素点$v_i = (x_i, y_i)$: | 54 | 按上述步骤对空间中所有的三角形面片进行处理后,对大小为$height * width$的屏幕上每个像素点$v_i = (x_i, y_i)$: |
| 55 | - | 55 | + |
| 56 | 1. 取Z-Buffer中$v_i$对应的面片索引$f_{idx}$,$findices (x_i, y_i) \gets f_{idx}$ | 56 | 1. 取Z-Buffer中$v_i$对应的面片索引$f_{idx}$,$findices (x_i, y_i) \gets f_{idx}$ |
| 57 | 2. 将$f$的三个顶点坐标$(v_0, v_1, v_2)$转换为屏幕坐标$(v_{s0}, v_{s1}, v_{s2})$ | 57 | 2. 将$f$的三个顶点坐标$(v_0, v_1, v_2)$转换为屏幕坐标$(v_{s0}, v_{s1}, v_{s2})$ |
| 58 | 3. 计算$v_i$的中心点坐标$v_c$ | 58 | 3. 计算$v_i$的中心点坐标$v_c$ |
| 59 | 4. 计算$v_c$相对于三角形$f$的重心坐标$(\alpha, \beta, \gamma)$ | 59 | 4. 计算$v_c$相对于三角形$f$的重心坐标$(\alpha, \beta, \gamma)$ |
| 60 | 5. 使用$(\alpha, \beta, \gamma)$计算透视矫正插值$(\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})$ | 60 | 5. 使用$(\alpha, \beta, \gamma)$计算透视矫正插值$(\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})$ |
| 61 | 6. $barycentric(x_i, y_i) \gets (\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})$ | 61 | 6. $barycentric(x_i, y_i) \gets (\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})$ |
| 62 | - | 62 | + |
| 63 | 以下是涉及的各种具体计算方法: | 63 | 以下是涉及的各种具体计算方法: |
| 64 | - | 64 | + |
| 65 | - 顶点$v = (x, y, z, w)$转换为屏幕坐标$v_s = (x_s, y_s, z_s)$ | 65 | - 顶点$v = (x, y, z, w)$转换为屏幕坐标$v_s = (x_s, y_s, z_s)$ |
| 66 | - | 66 | + |
| 67 | $$ | 67 | $$ |
| 68 | x_s = (x / w * 0.5 + 0.5) * (width - 1) + 0.5\\ | 68 | x_s = (x / w * 0.5 + 0.5) * (width - 1) + 0.5\\ |
| 69 | y_s = (0.5 + 0.5 * y / w) * (height - 1) + 0.5\\ | 69 | y_s = (0.5 + 0.5 * y / w) * (height - 1) + 0.5\\ |
| 70 | z_s = z / w * 0.49999 + 0.5 | 70 | z_s = z / w * 0.49999 + 0.5 |
| 71 | $$ | 71 | $$ |
| 72 | - | 72 | + |
| 73 | - 点$v$相对于三角形 $(v_0, v_1, v_2)$的重心坐标$(\alpha, \beta, \gamma)$ | 73 | - 点$v$相对于三角形 $(v_0, v_1, v_2)$的重心坐标$(\alpha, \beta, \gamma)$ |
| 74 | - | 74 | + |
| 75 | - 1. 分别计算计算三角形$(v_0, v_1, v_2)$、$(v_0, v, v_2)$和$(v_0, v_1, v)$的有向面积$area$、$beta\_tri$和$gamma\_tri$ | 75 | + 1. 分别计算三角形$(v_0, v_1, v_2)$、$(v_0, v, v_2)$和$(v_0, v_1, v)$的有向面积$area$、$beta\_tri$和$gamma\_tri$ |
| 76 | 2. 若$area$为0,则$\alpha = \beta = \gamma = -1$,否则 | 76 | 2. 若$area$为0,则$\alpha = \beta = \gamma = -1$,否则 |
| 77 | - | 77 | + |
| 78 | $$ | 78 | $$ |
| 79 | \beta = beta\_tri / area\\ | 79 | \beta = beta\_tri / area\\ |
| 80 | \gamma = gamma\_tri / area\\ | 80 | \gamma = gamma\_tri / area\\ |
| @@ -82,23 +82,23 @@ | |||
| 82 | $$ | 82 | $$ |
| 83 | 83 | ||
| 84 | - 由顶点$v_0 = (x_0, y_0, z_0)$,$v_1 = (x_1, y_1, z_1)$和$v_2 = (x_2, y_2, z_2)$组成的三角形的有向面积 | 84 | - 由顶点$v_0 = (x_0, y_0, z_0)$,$v_1 = (x_1, y_1, z_1)$和$v_2 = (x_2, y_2, z_2)$组成的三角形的有向面积 |
| 85 | - | 85 | + |
| 86 | $$ | 86 | $$ |
| 87 | area = (x_2 - x_0) * (y_1 - y_0) - (x_1 - x_0) * (y_2 - y_0) | 87 | area = (x_2 - x_0) * (y_1 - y_0) - (x_1 - x_0) * (y_2 - y_0) |
| 88 | $$ | 88 | $$ |
| 89 | - | 89 | + |
| 90 | - 结合重心坐标$(\alpha, \beta, \gamma)$和三角形屏幕坐标$(v_0 = (x_0, y_0, z_0), v_1 = (x_1, y_1, z_1), v_2 = (x_2, y_2, z_2))$计算像素点$v = (x, y)$ 的深度$depth$ | 90 | - 结合重心坐标$(\alpha, \beta, \gamma)$和三角形屏幕坐标$(v_0 = (x_0, y_0, z_0), v_1 = (x_1, y_1, z_1), v_2 = (x_2, y_2, z_2))$计算像素点$v = (x, y)$ 的深度$depth$ |
| 91 | - | 91 | + |
| 92 | $$ | 92 | $$ |
| 93 | depth = \alpha * z_0 + \beta * z_1 + \gamma * z_2 | 93 | depth = \alpha * z_0 + \beta * z_1 + \gamma * z_2 |
| 94 | $$ | 94 | $$ |
| 95 | 95 | ||
| 96 | - 结合深度图$d$,遮挡截断$occlusion\_truncation$计算点$v = (x, y)$的深度阈值$depth\_thres$ | 96 | - 结合深度图$d$,遮挡截断$occlusion\_truncation$计算点$v = (x, y)$的深度阈值$depth\_thres$ |
| 97 | - | 97 | + |
| 98 | $$ | 98 | $$ |
| 99 | depth\_thres = d(x, y) * 0.49999 + 0.5 + occlusion\_truncation | 99 | depth\_thres = d(x, y) * 0.49999 + 0.5 + occlusion\_truncation |
| 100 | $$ | 100 | $$ |
| 101 | - | 101 | + |
| 102 | - 根据重心坐标$(\alpha, \beta, \gamma)$判断顶点是否在三角形内 | 102 | - 根据重心坐标$(\alpha, \beta, \gamma)$判断顶点是否在三角形内 |
| 103 | 如果$\alpha >= 0$且$\beta >= 0$且$\gamma >= 0$则点在三角形内(包括在三角形边上),否则点不在三角形内。 | 103 | 如果$\alpha >= 0$且$\beta >= 0$且$\gamma >= 0$则点在三角形内(包括在三角形边上),否则点不在三角形内。 |
| 104 | - 结合重心坐标$(\lambda_0, \lambda_1, \lambda_2)$以及三角形的三个顶点坐标$v_0 = (x_0, y_0, z_0, w_0)$,$v_1 = (x_1, y_1, z_1, w_1)$和$v_2 = (x_2, y_2, z_2, w_2)$计算透视矫正插值$(\lambda_0^{corrected}, \lambda_1^{corrected}, \lambda_2^{corrected})$ | 104 | - 结合重心坐标$(\lambda_0, \lambda_1, \lambda_2)$以及三角形的三个顶点坐标$v_0 = (x_0, y_0, z_0, w_0)$,$v_1 = (x_1, y_1, z_1, w_1)$和$v_2 = (x_2, y_2, z_2, w_2)$计算透视矫正插值$(\lambda_0^{corrected}, \lambda_1^{corrected}, \lambda_2^{corrected})$ |
| @@ -110,7 +110,7 @@ | |||
| 110 | ## 参数说明 | 110 | ## 参数说明 |
| 111 | 111 | ||
| 112 | - **参数说明**: | 112 | - **参数说明**: |
| 113 | - | 113 | + |
| 114 | <table style="undefined;table-layout: fixed; width: 1005px"><colgroup> | 114 | <table style="undefined;table-layout: fixed; width: 1005px"><colgroup> |
| 115 | <col style="width: 170px"> | 115 | <col style="width: 170px"> |
| 116 | <col style="width: 170px"> | 116 | <col style="width: 170px"> |
| @@ -21,62 +21,62 @@ | |||
| 21 | 21 | ||
| 22 | $findices$记录每个像素点最小深度对应的面索引,$barycentric$记录每个顶点相对于$findices$中记录的面的重心坐标透视矫正插值。 | 22 | $findices$记录每个像素点最小深度对应的面索引,$barycentric$记录每个顶点相对于$findices$中记录的面的重心坐标透视矫正插值。 |
| 23 | 计算过程中使用的Z-Buffer记录每个像素点$(x, y)$的最小深度$z_{\min}(x, y)$以及该深度对应的三角形面片索引$\text{face\_idx}(x, y)$。 | 23 | 计算过程中使用的Z-Buffer记录每个像素点$(x, y)$的最小深度$z_{\min}(x, y)$以及该深度对应的三角形面片索引$\text{face\_idx}(x, y)$。 |
| 24 | - | 24 | + |
| 25 | 计算过程如下: | 25 | 计算过程如下: |
| 26 | 对空间中的每个三角形面片$f$: | 26 | 对空间中的每个三角形面片$f$: |
| 27 | - | 27 | + |
| 28 | 1. 将$f$的三个顶点坐标$(v_0, v_1, v_2)$转换为屏幕坐标$(v_{s0}, v_{s1}, v_{s2})$ | 28 | 1. 将$f$的三个顶点坐标$(v_0, v_1, v_2)$转换为屏幕坐标$(v_{s0}, v_{s1}, v_{s2})$ |
| 29 | 2. 根据$(v_{s0}, v_{s1}, v_{s2})$计算包围$f$的矩形范围 | 29 | 2. 根据$(v_{s0}, v_{s1}, v_{s2})$计算包围$f$的矩形范围 |
| 30 | 3. 对矩形内每个像素点$v_i = (x_i, y_i)$,执行以下操作: | 30 | 3. 对矩形内每个像素点$v_i = (x_i, y_i)$,执行以下操作: |
| 31 | 31 | ||
| 32 | - a. 计算像素中心坐标$v_c$ | 32 | + a. 计算像素中心坐标$v_c$ |
| 33 | - b. 计算$v_c$相对于三角形$f$的重心坐标$(\alpha, \beta, \gamma)$ | 33 | + b. 计算$v_c$相对于三角形$f$的重心坐标$(\alpha, \beta, \gamma)$ |
| 34 | c. 根据$(\alpha, \beta, \gamma)$判断$v_c$是否在三角形内部。若$v_c$不在三角形内部,则处理矩形内下个像素点,否则执行下述步骤 | 34 | c. 根据$(\alpha, \beta, \gamma)$判断$v_c$是否在三角形内部。若$v_c$不在三角形内部,则处理矩形内下个像素点,否则执行下述步骤 |
| 35 | d. 使用$(\alpha, \beta, \gamma)$和$(v_{s0}, v_{s1}, v_{s2})$得到当前像素的深度值depth | 35 | d. 使用$(\alpha, \beta, \gamma)$和$(v_{s0}, v_{s1}, v_{s2})$得到当前像素的深度值depth |
| 36 | - e. 若启用了深度先验;否则,直接执行下一步“Z-Buffer更新” | 36 | + e. 若启用了深度先验,则使用深度先验图计算深度阈值depth_thres;否则,直接执行下一步“Z-Buffer更新” |
| 37 | 37 | ||
| 38 | - - 使用深度先验图计算深度阈值depth_thres | 38 | + - 使用深度先验图计算深度阈值depth_thres |
| 39 | - - 如果depth < depth_thres,处理矩形内下个像素点,否则执行下述步骤 | 39 | + - 如果depth < depth_thres,处理矩形内下个像素点,否则执行下述步骤 |
| 40 | 40 | ||
| 41 | f. Z-Buffer更新: | 41 | f. Z-Buffer更新: |
| 42 | - | 42 | + |
| 43 | - - 若$depth < z_{\min}(x_i, y_i)$: | 43 | + - 若$depth < z_{\min}(x_i, y_i)$: |
| 44 | - | 44 | + |
| 45 | - $$ | 45 | + $$ |
| 46 | - \quad z_{\min}(x_i, y_i) \gets \text{depth} \\ | 46 | + \quad z_{\min}(x_i, y_i) \gets \text{depth} \\ |
| 47 | - \quad \text{face\_idx}(x_i, y_i) \gets f | 47 | + \quad \text{face\_idx}(x_i, y_i) \gets f |
| 48 | - $$ | 48 | + $$ |
| 49 | - | 49 | + |
| 50 | - - 若$depth = z_{\min}(x_i, y_i)$: | 50 | + - 若$depth = z_{\min}(x_i, y_i)$: |
| 51 | - | 51 | + |
| 52 | - $$ | 52 | + $$ |
| 53 | - \quad \text{face\_idx}(x_i, y_i) \gets \min(\text{face\_idx}(x_i, y_i),\ f) | 53 | + \quad \text{face\_idx}(x_i, y_i) \gets \min(\text{face\_idx}(x_i, y_i),\ f) |
| 54 | - $$ | 54 | + $$ |
| 55 | - | 55 | + |
| 56 | 按上述步骤对空间中所有的三角形面片进行处理后,对大小为$height * width$的屏幕上每个像素点$v_i = (x_i, y_i)$: | 56 | 按上述步骤对空间中所有的三角形面片进行处理后,对大小为$height * width$的屏幕上每个像素点$v_i = (x_i, y_i)$: |
| 57 | - | 57 | + |
| 58 | 1. 取Z-Buffer中$v_i$对应的面片索引$f_{idx}$,$findices (x_i, y_i) \gets f_{idx}$ | 58 | 1. 取Z-Buffer中$v_i$对应的面片索引$f_{idx}$,$findices (x_i, y_i) \gets f_{idx}$ |
| 59 | 2. 将$f$的三个顶点坐标$(v_0, v_1, v_2)$转换为屏幕坐标$(v_{s0}, v_{s1}, v_{s2})$ | 59 | 2. 将$f$的三个顶点坐标$(v_0, v_1, v_2)$转换为屏幕坐标$(v_{s0}, v_{s1}, v_{s2})$ |
| 60 | 3. 计算$v_i$的中心点坐标$v_c$ | 60 | 3. 计算$v_i$的中心点坐标$v_c$ |
| 61 | 4. 计算$v_c$相对于三角形$f$的重心坐标$(\alpha, \beta, \gamma)$ | 61 | 4. 计算$v_c$相对于三角形$f$的重心坐标$(\alpha, \beta, \gamma)$ |
| 62 | 5. 使用$(\alpha, \beta, \gamma)$计算透视矫正插值$(\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})$ | 62 | 5. 使用$(\alpha, \beta, \gamma)$计算透视矫正插值$(\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})$ |
| 63 | 6. $barycentric(x_i, y_i) \gets (\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})$ | 63 | 6. $barycentric(x_i, y_i) \gets (\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})$ |
| 64 | - | 64 | + |
| 65 | 以下是涉及的各种具体计算方法: | 65 | 以下是涉及的各种具体计算方法: |
| 66 | - | 66 | + |
| 67 | - 顶点$v = (x, y, z, w)$转换为屏幕坐标$v_s = (x_s, y_s, z_s)$ | 67 | - 顶点$v = (x, y, z, w)$转换为屏幕坐标$v_s = (x_s, y_s, z_s)$ |
| 68 | - | 68 | + |
| 69 | $$ | 69 | $$ |
| 70 | x_s = (x / w * 0.5 + 0.5) * (width - 1) + 0.5\\ | 70 | x_s = (x / w * 0.5 + 0.5) * (width - 1) + 0.5\\ |
| 71 | y_s = (0.5 + 0.5 * y / w) * (height - 1) + 0.5\\ | 71 | y_s = (0.5 + 0.5 * y / w) * (height - 1) + 0.5\\ |
| 72 | z_s = z / w * 0.49999 + 0.5 | 72 | z_s = z / w * 0.49999 + 0.5 |
| 73 | $$ | 73 | $$ |
| 74 | - | 74 | + |
| 75 | - 点$v$相对于三角形 $(v_0, v_1, v_2)$的重心坐标$(\alpha, \beta, \gamma)$ | 75 | - 点$v$相对于三角形 $(v_0, v_1, v_2)$的重心坐标$(\alpha, \beta, \gamma)$ |
| 76 | - | 76 | + |
| 77 | - 1. 分别计算计算三角形$(v_0, v_1, v_2)$、$(v_0, v, v_2)$和$(v_0, v_1, v)$的有向面积$area$、$beta\_tri$和$gamma\_tri$ | 77 | + 1. 分别计算三角形$(v_0, v_1, v_2)$、$(v_0, v, v_2)$和$(v_0, v_1, v)$的有向面积$area$、$beta\_tri$和$gamma\_tri$ |
| 78 | 2. 若$area$为0,则$\alpha = \beta = \gamma = -1$,否则 | 78 | 2. 若$area$为0,则$\alpha = \beta = \gamma = -1$,否则 |
| 79 | - | 79 | + |
| 80 | $$ | 80 | $$ |
| 81 | \beta = beta\_tri / area\\ | 81 | \beta = beta\_tri / area\\ |
| 82 | \gamma = gamma\_tri / area\\ | 82 | \gamma = gamma\_tri / area\\ |
| @@ -84,23 +84,23 @@ | |||
| 84 | $$ | 84 | $$ |
| 85 | 85 | ||
| 86 | - 由顶点$v_0 = (x_0, y_0, z_0)$,$v_1 = (x_1, y_1, z_1)$和$v_2 = (x_2, y_2, z_2)$组成的三角形的有向面积 | 86 | - 由顶点$v_0 = (x_0, y_0, z_0)$,$v_1 = (x_1, y_1, z_1)$和$v_2 = (x_2, y_2, z_2)$组成的三角形的有向面积 |
| 87 | - | 87 | + |
| 88 | $$ | 88 | $$ |
| 89 | area = (x_2 - x_0) * (y_1 - y_0) - (x_1 - x_0) * (y_2 - y_0) | 89 | area = (x_2 - x_0) * (y_1 - y_0) - (x_1 - x_0) * (y_2 - y_0) |
| 90 | $$ | 90 | $$ |
| 91 | - | 91 | + |
| 92 | - 结合重心坐标$(\alpha, \beta, \gamma)$和三角形屏幕坐标$(v_0 = (x_0, y_0, z_0), v_1 = (x_1, y_1, z_1), v_2 = (x_2, y_2, z_2))$计算像素点$v = (x, y)$ 的深度$depth$ | 92 | - 结合重心坐标$(\alpha, \beta, \gamma)$和三角形屏幕坐标$(v_0 = (x_0, y_0, z_0), v_1 = (x_1, y_1, z_1), v_2 = (x_2, y_2, z_2))$计算像素点$v = (x, y)$ 的深度$depth$ |
| 93 | - | 93 | + |
| 94 | $$ | 94 | $$ |
| 95 | depth = \alpha * z_0 + \beta * z_1 + \gamma * z_2 | 95 | depth = \alpha * z_0 + \beta * z_1 + \gamma * z_2 |
| 96 | $$ | 96 | $$ |
| 97 | 97 | ||
| 98 | - 结合深度图$d$,遮挡截断$occlusion\_truncation$计算点$v = (x, y)$的深度阈值$depth\_thres$ | 98 | - 结合深度图$d$,遮挡截断$occlusion\_truncation$计算点$v = (x, y)$的深度阈值$depth\_thres$ |
| 99 | - | 99 | + |
| 100 | $$ | 100 | $$ |
| 101 | depth\_thres = d(x, y) * 0.49999 + 0.5 + occlusion\_truncation | 101 | depth\_thres = d(x, y) * 0.49999 + 0.5 + occlusion\_truncation |
| 102 | $$ | 102 | $$ |
| 103 | - | 103 | + |
| 104 | - 根据重心坐标$(\alpha, \beta, \gamma)$判断顶点是否在三角形内 | 104 | - 根据重心坐标$(\alpha, \beta, \gamma)$判断顶点是否在三角形内 |
| 105 | 如果$\alpha >= 0$且$\beta >= 0$且$\gamma >= 0$则点在三角形内(包括在三角形边上),否则点不在三角形内。 | 105 | 如果$\alpha >= 0$且$\beta >= 0$且$\gamma >= 0$则点在三角形内(包括在三角形边上),否则点不在三角形内。 |
| 106 | - 结合重心坐标$(\lambda_0, \lambda_1, \lambda_2)$以及三角形的三个顶点坐标$v_0 = (x_0, y_0, z_0, w_0)$,$v_1 = (x_1, y_1, z_1, w_1)$和$v_2 = (x_2, y_2, z_2, w_2)$计算透视矫正插值$(\lambda_0^{corrected}, \lambda_1^{corrected}, \lambda_2^{corrected})$ | 106 | - 结合重心坐标$(\lambda_0, \lambda_1, \lambda_2)$以及三角形的三个顶点坐标$v_0 = (x_0, y_0, z_0, w_0)$,$v_1 = (x_1, y_1, z_1, w_1)$和$v_2 = (x_2, y_2, z_2, w_2)$计算透视矫正插值$(\lambda_0^{corrected}, \lambda_1^{corrected}, \lambda_2^{corrected})$ |
| @@ -139,7 +139,7 @@ aclnnStatus aclnnRasterizer( | |||
| 139 | ## aclnnRasterizerGetWorkspaceSize | 139 | ## aclnnRasterizerGetWorkspaceSize |
| 140 | 140 | ||
| 141 | - **参数说明** | 141 | - **参数说明** |
| 142 | - | 142 | + |
| 143 | <table style="undefined;table-layout: fixed; width: 1550px"><colgroup> | 143 | <table style="undefined;table-layout: fixed; width: 1550px"><colgroup> |
| 144 | <col style="width: 170px"> | 144 | <col style="width: 170px"> |
| 145 | <col style="width: 120px"> | 145 | <col style="width: 120px"> |
| @@ -277,7 +277,7 @@ aclnnStatus aclnnRasterizer( | |||
| 277 | - **返回值** | 277 | - **返回值** |
| 278 | 278 | ||
| 279 | aclnnStatus:返回状态码,具体参见[aclnn返回码](https://gitcode.com/cann/ops-cv/blob/master/docs/zh/context/aclnn%E8%BF%94%E5%9B%9E%E7%A0%81.md)。 | 279 | aclnnStatus:返回状态码,具体参见[aclnn返回码](https://gitcode.com/cann/ops-cv/blob/master/docs/zh/context/aclnn%E8%BF%94%E5%9B%9E%E7%A0%81.md)。 |
| 280 | - | 280 | + |
| 281 | 第一段接口完成入参校验,出现以下场景时报错: | 281 | 第一段接口完成入参校验,出现以下场景时报错: |
| 282 | 282 | ||
| 283 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 283 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -352,7 +352,7 @@ aclnnStatus aclnnRasterizer( | |||
| 352 | </tbody> | 352 | </tbody> |
| 353 | </table> | 353 | </table> |
| 354 | - **返回值** | 354 | - **返回值** |
| 355 | - | 355 | + |
| 356 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 356 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 357 | 357 | ||
| 358 | ## 约束说明 | 358 | ## 约束说明 |
| @@ -146,7 +146,7 @@ aclnnStatus aclnnResize( | |||
| 146 | - **返回值** | 146 | - **返回值** |
| 147 | 147 | ||
| 148 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 148 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 149 | - | 149 | + |
| 150 | 第一段接口完成入参校验,出现以下场景时报错: | 150 | 第一段接口完成入参校验,出现以下场景时报错: |
| 151 | 151 | ||
| 152 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 152 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -178,7 +178,7 @@ aclnnStatus aclnnResize( | |||
| 178 | <tr> | 178 | <tr> |
| 179 | <td>out与self的数据格式或者数据类型不一致。</td></tr> | 179 | <td>out与self的数据格式或者数据类型不一致。</td></tr> |
| 180 | <tr> | 180 | <tr> |
| 181 | - <td>shape不满足要求:<ol><li>self和out的shape必须为4维。</li><li>self和out的N维和C维必须相同。</li><li>out在H维的size必须等于self的H维size乘以scales对应H维的值。</li><li>out在W维的size必须等于self的W维乘以scales对应W维的值。</li></ol></td> | 181 | + <td>shape不满足要求:<ol><li>self和out的shape必须为4维。</li><li>self和out的N维和C维必须相同。</li><li>out在H维的size必须等于self的H维size乘以scales对应H维的值。</li><li>out在W维的size必须等于self的W维size乘以scales对应W维的值。</li></ol></td> |
| 182 | </tr> | 182 | </tr> |
| 183 | </tbody></table> | 183 | </tbody></table> |
| 184 | 184 | ||
| @@ -36,18 +36,18 @@ | |||
| 36 | 36 | ||
| 37 | ```Cpp | 37 | ```Cpp |
| 38 | aclnnStatus aclnnUpsampleNearest2dGetWorkspaceSize( | 38 | aclnnStatus aclnnUpsampleNearest2dGetWorkspaceSize( |
| 39 | - const aclTensor *self, | 39 | + const aclTensor *self, |
| 40 | - const aclIntArray *outputSize, | 40 | + const aclIntArray *outputSize, |
| 41 | - aclTensor *out, | 41 | + aclTensor *out, |
| 42 | - uint64_t *workspaceSize, | 42 | + uint64_t *workspaceSize, |
| 43 | aclOpExecutor **executor) | 43 | aclOpExecutor **executor) |
| 44 | ``` | 44 | ``` |
| 45 | 45 | ||
| 46 | ```Cpp | 46 | ```Cpp |
| 47 | aclnnStatus aclnnUpsampleNearest2d( | 47 | aclnnStatus aclnnUpsampleNearest2d( |
| 48 | - void *workspace, | 48 | + void *workspace, |
| 49 | - uint64_t workspaceSize, | 49 | + uint64_t workspaceSize, |
| 50 | - aclOpExecutor *executor, | 50 | + aclOpExecutor *executor, |
| 51 | const aclrtStream stream) | 51 | const aclrtStream stream) |
| 52 | ``` | 52 | ``` |
| 53 | 53 | ||
| @@ -224,8 +224,8 @@ aclnnStatus aclnnUpsampleNearest2d( | |||
| 224 | - 参数`self`、`out`的shape约束: | 224 | - 参数`self`、`out`的shape约束: |
| 225 | - 每个维度的取值小于等于2^20。 | 225 | - 每个维度的取值小于等于2^20。 |
| 226 | - 参数`out`的N轴和C轴与`self`保持一致。 | 226 | - 参数`out`的N轴和C轴与`self`保持一致。 |
| 227 | - - 内存占用需小于60G。内存占用的计算公式如下: | 227 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 228 | - | 228 | + |
| 229 | $$ | 229 | $$ |
| 230 | N * (ceil(C/16) * 16) * (self\_H * self\_W + out\_H * out\_W) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 | 230 | N * (ceil(C/16) * 16) * (self\_H * self\_W + out\_H * out\_W) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 231 | $$ | 231 | $$ |
| @@ -233,6 +233,7 @@ aclnnStatus aclnnUpsampleNearest2d( | |||
| 233 | 其中: | 233 | 其中: |
| 234 | - N代表输入和输出的N轴。 | 234 | - N代表输入和输出的N轴。 |
| 235 | - C代表输入和输出的C轴。 | 235 | - C代表输入和输出的C轴。 |
| 236 | + - dtype代表输入张量的数据类型。 | ||
| 236 | - 确定性计算: | 237 | - 确定性计算: |
| 237 | - aclnnUpsampleNearest2d默认确定性实现。 | 238 | - aclnnUpsampleNearest2d默认确定性实现。 |
| 238 | 239 | ||
| @@ -97,22 +97,22 @@ | |||
| 97 | 97 | ||
| 98 | ```Cpp | 98 | ```Cpp |
| 99 | aclnnStatus aclnnUpsampleTrilinear3dGetWorkspaceSize( | 99 | aclnnStatus aclnnUpsampleTrilinear3dGetWorkspaceSize( |
| 100 | - const aclTensor *self, | 100 | + const aclTensor *self, |
| 101 | - const aclIntArray *outputSize, | 101 | + const aclIntArray *outputSize, |
| 102 | - bool alignCorners, | 102 | + bool alignCorners, |
| 103 | - double scalesD, | 103 | + double scalesD, |
| 104 | - double scalesH, | 104 | + double scalesH, |
| 105 | - double scalesW, | 105 | + double scalesW, |
| 106 | - aclTensor *out, | 106 | + aclTensor *out, |
| 107 | - uint64_t *workspaceSize, | 107 | + uint64_t *workspaceSize, |
| 108 | aclOpExecutor **executor) | 108 | aclOpExecutor **executor) |
| 109 | ``` | 109 | ``` |
| 110 | 110 | ||
| 111 | ```Cpp | 111 | ```Cpp |
| 112 | aclnnStatus aclnnUpsampleTrilinear3d( | 112 | aclnnStatus aclnnUpsampleTrilinear3d( |
| 113 | - void *workspace, | 113 | + void *workspace, |
| 114 | - uint64_t workspaceSize, | 114 | + uint64_t workspaceSize, |
| 115 | - aclOpExecutor *executor, | 115 | + aclOpExecutor *executor, |
| 116 | aclrtStream stream) | 116 | aclrtStream stream) |
| 117 | ``` | 117 | ``` |
| 118 | 118 | ||
| @@ -251,7 +251,7 @@ aclnnStatus aclnnUpsampleTrilinear3d( | |||
| 251 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 251 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 252 | 252 | ||
| 253 | 第一段接口完成入参校验,出现以下场景时报错: | 253 | 第一段接口完成入参校验,出现以下场景时报错: |
| 254 | - | 254 | + |
| 255 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 255 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| 256 | <col style="width: 268px"> | 256 | <col style="width: 268px"> |
| 257 | <col style="width: 140px"> | 257 | <col style="width: 140px"> |
| @@ -337,29 +337,30 @@ aclnnStatus aclnnUpsampleTrilinear3d( | |||
| 337 | - 输入数据缩放场景缩小倍数必须小于等于50,即: | 337 | - 输入数据缩放场景缩小倍数必须小于等于50,即: |
| 338 | 338 | ||
| 339 | $$ | 339 | $$ |
| 340 | - 输出shape的深度D/outputSize\_D <= 50 | 340 | + 输入shape的深度D/outputSize\_D <= 50 |
| 341 | $$ | 341 | $$ |
| 342 | - | 342 | + |
| 343 | $$ | 343 | $$ |
| 344 | - 输出shape的高度H/outputSize\_H <= 50 | 344 | + 输入shape的高度H/outputSize\_H <= 50 |
| 345 | $$ | 345 | $$ |
| 346 | - | 346 | + |
| 347 | $$ | 347 | $$ |
| 348 | - 输出shape的宽度W/outputSize\_W <=50 | 348 | + 输入shape的宽度W/outputSize\_W <=50 |
| 349 | $$ | 349 | $$ |
| 350 | 350 | ||
| 351 | - 参数`self`、`out`的shape约束: | 351 | - 参数`self`、`out`的shape约束: |
| 352 | - 每个维度的取值小于等于2^20。 | 352 | - 每个维度的取值小于等于2^20。 |
| 353 | - 参数`out`的N轴和C轴与`self`保持一致。 | 353 | - 参数`out`的N轴和C轴与`self`保持一致。 |
| 354 | - - 内存占用需小于60G。内存占用的计算公式如下: | 354 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 355 | 355 | ||
| 356 | $$ | 356 | $$ |
| 357 | - N * C * (self\_D * self\_H * self\_W + out\_D * out\_H * out\_W + self\_D * self\_H * out\_W + self\_D * out\_H * out\_W) * sizeof(float) < 60 * 1024 * 1024 * 1024 | 357 | + N * C * (self\_D * self\_H * self\_W + out\_D * out\_H * out\_W + self\_D * self\_H * out\_W + self\_D * out\_H * out\_W) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 358 | $$ | 358 | $$ |
| 359 | 359 | ||
| 360 | 其中: | 360 | 其中: |
| 361 | - N代表输入和输出的N轴。 | 361 | - N代表输入和输出的N轴。 |
| 362 | - C代表输入和输出的C轴。 | 362 | - C代表输入和输出的C轴。 |
| 363 | + - dtype代表输入张量的数据类型。 | ||
| 363 | - N \* C \* self_D \* self_H < 2^31 | 364 | - N \* C \* self_D \* self_H < 2^31 |
| 364 | - out_W * out_H < 2^31 | 365 | - out_W * out_H < 2^31 |
| 365 | - 参数self、outputSize、scalesD、scalesH、scalesW需要满足如下约束: | 366 | - 参数self、outputSize、scalesD、scalesH、scalesW需要满足如下约束: |
| @@ -17,11 +17,11 @@ | |||
| 17 | 17 | ||
| 18 | - 接口功能:对由多个输入通道组成的输入信号应用2D双三次上采样。如果输入Tensor x的shape为(N, C, H, W),则输出Tensor out的shape为(N, C, outputSize[0], outputSize[1])。 | 18 | - 接口功能:对由多个输入通道组成的输入信号应用2D双三次上采样。如果输入Tensor x的shape为(N, C, H, W),则输出Tensor out的shape为(N, C, outputSize[0], outputSize[1])。 |
| 19 | - 计算公式:对于一个二维插值点$(N, C, h, w)$,插值$out(N, C, h, w)$可以表示为: | 19 | - 计算公式:对于一个二维插值点$(N, C, h, w)$,插值$out(N, C, h, w)$可以表示为: |
| 20 | - | 20 | + |
| 21 | $$ | 21 | $$ |
| 22 | {out(N, C, h, w)}=\sum_{i=0}^{3}\sum_{j=0}^{3}{W(i, j)}*{f(h_i, w_j)} | 22 | {out(N, C, h, w)}=\sum_{i=0}^{3}\sum_{j=0}^{3}{W(i, j)}*{f(h_i, w_j)} |
| 23 | $$ | 23 | $$ |
| 24 | - | 24 | + |
| 25 | $$ | 25 | $$ |
| 26 | scaleH =\begin{cases} | 26 | scaleH =\begin{cases} |
| 27 | (self.dim(2)-1) / (outputSize[0]-1) & alignCorners=true \\ | 27 | (self.dim(2)-1) / (outputSize[0]-1) & alignCorners=true \\ |
| @@ -29,7 +29,7 @@ | |||
| 29 | self.dim(2) / outputSize[0] & otherwise | 29 | self.dim(2) / outputSize[0] & otherwise |
| 30 | \end{cases} | 30 | \end{cases} |
| 31 | $$ | 31 | $$ |
| 32 | - | 32 | + |
| 33 | $$ | 33 | $$ |
| 34 | scaleW =\begin{cases} | 34 | scaleW =\begin{cases} |
| 35 | (self.dim(3)-1) / (outputSize[1]-1) & alignCorners=true \\ | 35 | (self.dim(3)-1) / (outputSize[1]-1) & alignCorners=true \\ |
| @@ -37,7 +37,7 @@ | |||
| 37 | self.dim(3) / outputSize[1] & otherwise | 37 | self.dim(3) / outputSize[1] & otherwise |
| 38 | \end{cases} | 38 | \end{cases} |
| 39 | $$ | 39 | $$ |
| 40 | - | 40 | + |
| 41 | 其中: | 41 | 其中: |
| 42 | - alignCorners为true,表示输入和输出张量的角像素点对齐;alignCorners为false,表示输入和输出张量的边像素点对齐。 | 42 | - alignCorners为true,表示输入和输出张量的角像素点对齐;alignCorners为false,表示输入和输出张量的边像素点对齐。 |
| 43 | - i和j是$W(i, j)$的索引变量。 | 43 | - i和j是$W(i, j)$的索引变量。 |
| @@ -188,18 +188,18 @@ aclnnStatus aclnnUpsampleBicubic2d( | |||
| 188 | </tr> | 188 | </tr> |
| 189 | </tbody> | 189 | </tbody> |
| 190 | </table> | 190 | </table> |
| 191 | - | 191 | + |
| 192 | - <term>Atlas 200I/500 A2 推理产品</term>、<term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>: | 192 | - <term>Atlas 200I/500 A2 推理产品</term>、<term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>: |
| 193 | - 数据类型:参数`self`、`out`不支持BFLOAT16。 | 193 | - 数据类型:参数`self`、`out`不支持BFLOAT16。 |
| 194 | - 数据格式:参数`self`、`out`不支持NHWC。 | 194 | - 数据格式:参数`self`、`out`不支持NHWC。 |
| 195 | - <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>: | 195 | - <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>: |
| 196 | - | 196 | + |
| 197 | 参数`self`、`out`的数据格式不支持NHWC。 | 197 | 参数`self`、`out`的数据格式不支持NHWC。 |
| 198 | - | 198 | + |
| 199 | - **返回值** | 199 | - **返回值** |
| 200 | 200 | ||
| 201 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 201 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 202 | - | 202 | + |
| 203 | 第一段接口完成入参校验,出现以下场景时报错: | 203 | 第一段接口完成入参校验,出现以下场景时报错: |
| 204 | 204 | ||
| 205 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 205 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -256,7 +256,7 @@ aclnnStatus aclnnUpsampleBicubic2d( | |||
| 256 | <td>self、outputSize、scalesH、scalesW不满足约束。</td> | 256 | <td>self、outputSize、scalesH、scalesW不满足约束。</td> |
| 257 | </tr> | 257 | </tr> |
| 258 | </tbody></table> | 258 | </tbody></table> |
| 259 | - | 259 | + |
| 260 | ## aclnnUpsampleBicubic2d | 260 | ## aclnnUpsampleBicubic2d |
| 261 | 261 | ||
| 262 | - **参数说明** | 262 | - **参数说明** |
| @@ -305,15 +305,16 @@ aclnnStatus aclnnUpsampleBicubic2d( | |||
| 305 | - 参数`self`、`out`的shape约束: | 305 | - 参数`self`、`out`的shape约束: |
| 306 | - 每个维度的取值小于等于2^20。 | 306 | - 每个维度的取值小于等于2^20。 |
| 307 | - 参数`out`的N轴和C轴与`self`保持一致。 | 307 | - 参数`out`的N轴和C轴与`self`保持一致。 |
| 308 | - - 内存占用需小于60G。内存占用的计算公式如下: | 308 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 309 | 309 | ||
| 310 | $$ | 310 | $$ |
| 311 | - (self\_H * self\_W + out\_H * out\_W + self\_H * out\_W) * N * C * sizeof(float) < 60 * 1024 * 1024 * 1024 | 311 | + (self\_H * self\_W + out\_H * out\_W + self\_H * out\_W) * N * C * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 312 | $$ | 312 | $$ |
| 313 | 313 | ||
| 314 | 其中: | 314 | 其中: |
| 315 | - N代表输入和输出的N轴。 | 315 | - N代表输入和输出的N轴。 |
| 316 | - C代表输入和输出的C轴。 | 316 | - C代表输入和输出的C轴。 |
| 317 | + - dtype代表输入张量的数据类型。 | ||
| 317 | - N \* C \* self_H < 2^31 | 318 | - N \* C \* self_H < 2^31 |
| 318 | - 参数self、outputSize、scalesH、scalesW需要满足如下约束: | 319 | - 参数self、outputSize、scalesH、scalesW需要满足如下约束: |
| 319 | 320 | ||
| @@ -18,11 +18,11 @@ | |||
| 18 | - 接口功能:对由多个输入通道组成的输入信号应用双三次抗锯齿算法进行上采样。如果输入Tensor x的shape为(N, C, H, W),则输出Tensor out的shape为(N, C, outputSize[0], outputSize[1])。 | 18 | - 接口功能:对由多个输入通道组成的输入信号应用双三次抗锯齿算法进行上采样。如果输入Tensor x的shape为(N, C, H, W),则输出Tensor out的shape为(N, C, outputSize[0], outputSize[1])。 |
| 19 | 19 | ||
| 20 | - 计算公式:对于一个二维插值点$(N, C, h, w)$,插值$out(N, C, h, w)$可以表示为: | 20 | - 计算公式:对于一个二维插值点$(N, C, h, w)$,插值$out(N, C, h, w)$可以表示为: |
| 21 | - | 21 | + |
| 22 | $$ | 22 | $$ |
| 23 | {out(N, C, h, w)}=\sum_{i=0}^{kW}\sum_{j=0}^{kH}{W(i, j)}*{f(h_i, w_j)} | 23 | {out(N, C, h, w)}=\sum_{i=0}^{kW}\sum_{j=0}^{kH}{W(i, j)}*{f(h_i, w_j)} |
| 24 | $$ | 24 | $$ |
| 25 | - | 25 | + |
| 26 | $$ | 26 | $$ |
| 27 | scaleH =\begin{cases} | 27 | scaleH =\begin{cases} |
| 28 | (x.dim(2)-1) / (outputSize[0]-1) & alignCorners=true \\ | 28 | (x.dim(2)-1) / (outputSize[0]-1) & alignCorners=true \\ |
| @@ -30,7 +30,7 @@ | |||
| 30 | x.dim(2) / outputSize[0] & otherwise | 30 | x.dim(2) / outputSize[0] & otherwise |
| 31 | \end{cases} | 31 | \end{cases} |
| 32 | $$ | 32 | $$ |
| 33 | - | 33 | + |
| 34 | $$ | 34 | $$ |
| 35 | scaleW =\begin{cases} | 35 | scaleW =\begin{cases} |
| 36 | (x.dim(3)-1) / (outputSize[1]-1) & alignCorners=true \\ | 36 | (x.dim(3)-1) / (outputSize[1]-1) & alignCorners=true \\ |
| @@ -38,7 +38,7 @@ | |||
| 38 | x.dim(3) / outputSize[1] & otherwise | 38 | x.dim(3) / outputSize[1] & otherwise |
| 39 | \end{cases} | 39 | \end{cases} |
| 40 | $$ | 40 | $$ |
| 41 | - | 41 | + |
| 42 | 其中: | 42 | 其中: |
| 43 | - alignCorners为true,表示输入和输出张量的角像素点对齐;alignCorners为false,表示输入和输出张量的边像素点对齐。 | 43 | - alignCorners为true,表示输入和输出张量的角像素点对齐;alignCorners为false,表示输入和输出张量的边像素点对齐。 |
| 44 | - i和j是$W(i, j)$的索引变量。 | 44 | - i和j是$W(i, j)$的索引变量。 |
| @@ -135,7 +135,7 @@ aclnnStatus aclnnUpsampleBicubic2dAA( | |||
| 135 | <td>alignCorners(bool)</td> | 135 | <td>alignCorners(bool)</td> |
| 136 | <td>输入</td> | 136 | <td>输入</td> |
| 137 | <td>决定是否对齐角像素点,对应公式中的`alignCorners`。</td> | 137 | <td>决定是否对齐角像素点,对应公式中的`alignCorners`。</td> |
| 138 | - <td>alignCorners为True,则输入和输出张量的角像素点会被对齐,否则不对齐。</td> | 138 | + <td>alignCorners为true,则输入和输出张量的角像素点会被对齐,否则不对齐。</td> |
| 139 | <td>-</td> | 139 | <td>-</td> |
| 140 | <td>-</td> | 140 | <td>-</td> |
| 141 | <td>-</td> | 141 | <td>-</td> |
| @@ -197,7 +197,7 @@ aclnnStatus aclnnUpsampleBicubic2dAA( | |||
| 197 | - **返回值** | 197 | - **返回值** |
| 198 | 198 | ||
| 199 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 199 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 200 | - | 200 | + |
| 201 | 第一段接口完成入参校验,出现以下场景时报错: | 201 | 第一段接口完成入参校验,出现以下场景时报错: |
| 202 | 202 | ||
| 203 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 203 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -282,24 +282,25 @@ aclnnStatus aclnnUpsampleBicubic2dAA( | |||
| 282 | - 参数`x`、`out`的shape约束: | 282 | - 参数`x`、`out`的shape约束: |
| 283 | - 每个维度的取值小于等于2^20。 | 283 | - 每个维度的取值小于等于2^20。 |
| 284 | - 参数`out`的N轴和C轴与`x`保持一致,且C轴、H轴、W轴大于0。 | 284 | - 参数`out`的N轴和C轴与`x`保持一致,且C轴、H轴、W轴大于0。 |
| 285 | - - 内存占用需小于60G。内存占用的计算公式如下: | 285 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 286 | 286 | ||
| 287 | $$ | 287 | $$ |
| 288 | - (x\_H * x\_W + out\_H * out\_W + x\_H * out\_W) * N * C * sizeof(float) < 60 * 1024 * 1024 * 1024 | 288 | + (x\_H * x\_W + out\_H * out\_W + x\_H * out\_W) * N * C * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 289 | $$ | 289 | $$ |
| 290 | 290 | ||
| 291 | 其中: | 291 | 其中: |
| 292 | - N代表输入和输出的N轴。 | 292 | - N代表输入和输出的N轴。 |
| 293 | - C代表输入和输出的C轴。 | 293 | - C代表输入和输出的C轴。 |
| 294 | + - dtype代表输入张量的数据类型。 | ||
| 294 | - N \* C \* x_H < 2^31 | 295 | - N \* C \* x_H < 2^31 |
| 295 | - - <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>、<term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>: | 296 | - - <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>、<term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>: |
| 296 | 297 | ||
| 297 | 输入数据缩放场景缩小倍数必须小于等于50,即: | 298 | 输入数据缩放场景缩小倍数必须小于等于50,即: |
| 298 | - | 299 | + |
| 299 | $$ | 300 | $$ |
| 300 | 输入shape的高度H/outputSize\_H <= 50 | 301 | 输入shape的高度H/outputSize\_H <= 50 |
| 301 | $$ | 302 | $$ |
| 302 | - | 303 | + |
| 303 | $$ | 304 | $$ |
| 304 | 输入shape的宽度W/outputSize\_W <=50 | 305 | 输入shape的宽度W/outputSize\_W <=50 |
| 305 | $$ | 306 | $$ |
| @@ -17,11 +17,11 @@ | |||
| 17 | 17 | ||
| 18 | - 接口功能:[aclnnUpsampleBicubic2dAA](../../upsample_bicubic2d_aa/docs/aclnnUpsampleBicubic2dAA.md)的反向传播。如果输入张量的shape为(N, C, H, W),则输出张量的shape为(N, C, inputSize[2], inputSize[3])。 | 18 | - 接口功能:[aclnnUpsampleBicubic2dAA](../../upsample_bicubic2d_aa/docs/aclnnUpsampleBicubic2dAA.md)的反向传播。如果输入张量的shape为(N, C, H, W),则输出张量的shape为(N, C, inputSize[2], inputSize[3])。 |
| 19 | - 计算公式:对于一个二维插值点$(N, C, h, w)$,插值$gradInput(N, C, h, w)$可以表示为: | 19 | - 计算公式:对于一个二维插值点$(N, C, h, w)$,插值$gradInput(N, C, h, w)$可以表示为: |
| 20 | - | 20 | + |
| 21 | $$ | 21 | $$ |
| 22 | {gradInput(N, C, h, w)}=\sum_{i=0}^{3}\sum_{j=0}^{3}{W(i, j)}*{f(h_i, w_j)} | 22 | {gradInput(N, C, h, w)}=\sum_{i=0}^{3}\sum_{j=0}^{3}{W(i, j)}*{f(h_i, w_j)} |
| 23 | $$ | 23 | $$ |
| 24 | - | 24 | + |
| 25 | $$ | 25 | $$ |
| 26 | scaleH =\begin{cases} | 26 | scaleH =\begin{cases} |
| 27 | (inputSize[2]-1) / (outputSize[0]-1) & alignCorners=true \\ | 27 | (inputSize[2]-1) / (outputSize[0]-1) & alignCorners=true \\ |
| @@ -29,7 +29,7 @@ | |||
| 29 | inputSize[2] / outputSize[0] & otherwise | 29 | inputSize[2] / outputSize[0] & otherwise |
| 30 | \end{cases} | 30 | \end{cases} |
| 31 | $$ | 31 | $$ |
| 32 | - | 32 | + |
| 33 | $$ | 33 | $$ |
| 34 | scaleW =\begin{cases} | 34 | scaleW =\begin{cases} |
| 35 | (inputSize[3]-1) / (outputSize[1]-1) & alignCorners=true \\ | 35 | (inputSize[3]-1) / (outputSize[1]-1) & alignCorners=true \\ |
| @@ -37,7 +37,7 @@ | |||
| 37 | inputSize[3] / outputSize[1] & otherwise | 37 | inputSize[3] / outputSize[1] & otherwise |
| 38 | \end{cases} | 38 | \end{cases} |
| 39 | $$ | 39 | $$ |
| 40 | - | 40 | + |
| 41 | 其中: | 41 | 其中: |
| 42 | - alignCorners为true,表示输入和输出张量的角像素点对齐;alignCorners为false,表示输入和输出张量的边像素点对齐。 | 42 | - alignCorners为true,表示输入和输出张量的角像素点对齐;alignCorners为false,表示输入和输出张量的边像素点对齐。 |
| 43 | - i和j是$W(i, j)$的索引变量。 | 43 | - i和j是$W(i, j)$的索引变量。 |
| @@ -203,7 +203,7 @@ aclnnStatus aclnnUpsampleBicubic2dAAGrad( | |||
| 203 | - **返回值** | 203 | - **返回值** |
| 204 | 204 | ||
| 205 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 205 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 206 | - | 206 | + |
| 207 | 第一段接口完成入参校验,出现以下场景时报错: | 207 | 第一段接口完成入参校验,出现以下场景时报错: |
| 208 | 208 | ||
| 209 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 209 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -300,21 +300,22 @@ aclnnStatus aclnnUpsampleBicubic2dAAGrad( | |||
| 300 | - 内存占用需要满足如下条件: | 300 | - 内存占用需要满足如下条件: |
| 301 | 301 | ||
| 302 | $$ | 302 | $$ |
| 303 | - (gradOutput\_H * gradOutput\_W + out\_H * out\_W + gradOutput\_H * out\_W) * N * C * sizeof(float) < 60 * 1024 * 1024 * 1024 | 303 | + (gradOutput\_H * gradOutput\_W + out\_H * out\_W + gradOutput\_H * out\_W) * N * C * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 304 | $$ | 304 | $$ |
| 305 | 305 | ||
| 306 | 其中: | 306 | 其中: |
| 307 | - N代表输入和输出的N轴。 | 307 | - N代表输入和输出的N轴。 |
| 308 | - C代表输入和输出的C轴。 | 308 | - C代表输入和输出的C轴。 |
| 309 | + - dtype代表输入张量的数据类型。 | ||
| 309 | - N \* C \* gradOutput_H < 2^31 | 310 | - N \* C \* gradOutput_H < 2^31 |
| 310 | - <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>、<term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>: | 311 | - <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>、<term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>: |
| 311 | 312 | ||
| 312 | - 输入数据缩放场景放大倍数必须小于等于50,即: | 313 | + 反向接口的输入数据缩小倍数必须小于等于50,即: |
| 313 | 314 | ||
| 314 | $$ | 315 | $$ |
| 315 | outputSize\_H / 输出shape的高度H <= 50 | 316 | outputSize\_H / 输出shape的高度H <= 50 |
| 316 | $$ | 317 | $$ |
| 317 | - | 318 | + |
| 318 | $$ | 319 | $$ |
| 319 | outputSize\_W / 输出shape的宽度W <=50 | 320 | outputSize\_W / 输出shape的宽度W <=50 |
| 320 | $$ | 321 | $$ |
| @@ -24,7 +24,7 @@ | |||
| 24 | 2. 根据这个浮点数坐标,计算前后相邻的原始图像的点。 | 24 | 2. 根据这个浮点数坐标,计算前后相邻的原始图像的点。 |
| 25 | 3. 分别计算相邻点到对应目标点的权重,按照权重相乘累加即可得到目标点值。 | 25 | 3. 分别计算相邻点到对应目标点的权重,按照权重相乘累加即可得到目标点值。 |
| 26 | - 具体计算逻辑: | 26 | - 具体计算逻辑: |
| 27 | - 缩放方式分为角对齐和边对齐,角对齐(alignCorners为true)表示按照原始图片左上角像素中心点对齐,边对齐(alignCorners为true)表示按照原始图片左上角顶点及两条边对齐,在计算缩放系数和坐标位置时存在差异。对于一个二维插值点$(N, C, H, W)$,则有以下公式: | 27 | + 缩放方式分为角对齐和边对齐,角对齐(alignCorners为true)表示按照原始图片左上角像素中心点对齐,边对齐(alignCorners为false)表示按照原始图片左上角顶点及两条边对齐,在计算缩放系数和坐标位置时存在差异。对于一个二维插值点$(N, C, H, W)$,则有以下公式: |
| 28 | 28 | ||
| 29 | $$ | 29 | $$ |
| 30 | scale\_h =\begin{cases} | 30 | scale\_h =\begin{cases} |
| @@ -25,7 +25,7 @@ | |||
| 25 | 2. 根据这个浮点数坐标,计算前后相邻的原始图像的点。 | 25 | 2. 根据这个浮点数坐标,计算前后相邻的原始图像的点。 |
| 26 | 3. 分别计算相邻点到对应目标点的权重,按照权重相乘累加即可得到目标点值。 | 26 | 3. 分别计算相邻点到对应目标点的权重,按照权重相乘累加即可得到目标点值。 |
| 27 | - 具体计算逻辑: | 27 | - 具体计算逻辑: |
| 28 | - 缩放方式分为角对齐和边对齐,角对齐(alignCorners为true)表示按照原始图片左上角像素中心点对齐,边对齐(alignCorners为true)表示按照原始图片左上角顶点及两条边对齐,在计算缩放系数和坐标位置时存在差异。对于一个二维插值点$(N, C, H, W)$,则有以下公式: | 28 | + 缩放方式分为角对齐和边对齐,角对齐(alignCorners为true)表示按照原始图片左上角像素中心点对齐,边对齐(alignCorners为false)表示按照原始图片左上角顶点及两条边对齐,在计算缩放系数和坐标位置时存在差异。对于一个二维插值点$(N, C, H, W)$,则有以下公式: |
| 29 | 29 | ||
| 30 | $$ | 30 | $$ |
| 31 | scaleH =\begin{cases} | 31 | scaleH =\begin{cases} |
| @@ -218,7 +218,7 @@ aclnnStatus aclnnUpsampleBilinear2d( | |||
| 218 | - **返回值** | 218 | - **返回值** |
| 219 | 219 | ||
| 220 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 220 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 221 | - | 221 | + |
| 222 | 第一段接口完成入参校验,出现以下场景时报错: | 222 | 第一段接口完成入参校验,出现以下场景时报错: |
| 223 | 223 | ||
| 224 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 224 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -17,11 +17,11 @@ | |||
| 17 | 17 | ||
| 18 | - 接口功能:[aclnnUpsampleBilinear2dAA](../../upsample_bilinear2d_aa/docs/aclnnUpsampleBilinear2dAA.md)的反向传播。 | 18 | - 接口功能:[aclnnUpsampleBilinear2dAA](../../upsample_bilinear2d_aa/docs/aclnnUpsampleBilinear2dAA.md)的反向传播。 |
| 19 | - 计算公式:对于一个二维插值点$(N, C, H, W)$,插值$I(N, C, H, W)$可以表示为: | 19 | - 计算公式:对于一个二维插值点$(N, C, H, W)$,插值$I(N, C, H, W)$可以表示为: |
| 20 | - | 20 | + |
| 21 | $$ | 21 | $$ |
| 22 | {I(N, C, H, W)} = \sum_{i=0}^{kW}\sum_{j=0}^{kH}{w(i) * w(j)} * {f(h_i, w_j)}/\sum_{i=0}^{kW}w(i)/\sum_{j=0}^{kH}w(j) | 22 | {I(N, C, H, W)} = \sum_{i=0}^{kW}\sum_{j=0}^{kH}{w(i) * w(j)} * {f(h_i, w_j)}/\sum_{i=0}^{kW}w(i)/\sum_{j=0}^{kH}w(j) |
| 23 | $$ | 23 | $$ |
| 24 | - | 24 | + |
| 25 | $$ | 25 | $$ |
| 26 | scaleH =\begin{cases} | 26 | scaleH =\begin{cases} |
| 27 | (inputSize[2]-1) / (outputSize[0]-1) & alignCorners=true \\ | 27 | (inputSize[2]-1) / (outputSize[0]-1) & alignCorners=true \\ |
| @@ -29,7 +29,7 @@ | |||
| 29 | inputSize[2] / outputSize[0] & otherwise | 29 | inputSize[2] / outputSize[0] & otherwise |
| 30 | \end{cases} | 30 | \end{cases} |
| 31 | $$ | 31 | $$ |
| 32 | - | 32 | + |
| 33 | $$ | 33 | $$ |
| 34 | scaleW =\begin{cases} | 34 | scaleW =\begin{cases} |
| 35 | (inputSize[3]-1) / (outputSize[1]-1) & alignCorners=true \\ | 35 | (inputSize[3]-1) / (outputSize[1]-1) & alignCorners=true \\ |
| @@ -37,7 +37,7 @@ | |||
| 37 | inputSize[3] / outputSize[1] & otherwise | 37 | inputSize[3] / outputSize[1] & otherwise |
| 38 | \end{cases} | 38 | \end{cases} |
| 39 | $$ | 39 | $$ |
| 40 | - | 40 | + |
| 41 | - 其中: | 41 | - 其中: |
| 42 | - alignCorners为true,表示输入和输出张量的角像素点对齐;alignCorners为false,表示输入和输出张量的边像素点对齐。 | 42 | - alignCorners为true,表示输入和输出张量的角像素点对齐;alignCorners为false,表示输入和输出张量的边像素点对齐。 |
| 43 | - $kW$、$kH$分别表示W方向和H方向影响插值点大小的点的数量 | 43 | - $kW$、$kH$分别表示W方向和H方向影响插值点大小的点的数量 |
| @@ -60,11 +60,11 @@ | |||
| 60 | $$ | 60 | $$ |
| 61 | 61 | ||
| 62 | - 假设:正向插值的输出图像out $(h, w)$受原图像input $(h_i, w_j)$影响,则有: | 62 | - 假设:正向插值的输出图像out $(h, w)$受原图像input $(h_i, w_j)$影响,则有: |
| 63 | - | 63 | + |
| 64 | $$ | 64 | $$ |
| 65 | gradInput(h_i,w_j) += gradOutput(h,w) * w(i) * w(j) | 65 | gradInput(h_i,w_j) += gradOutput(h,w) * w(i) * w(j) |
| 66 | $$ | 66 | $$ |
| 67 | - | 67 | + |
| 68 | ## 函数原型 | 68 | ## 函数原型 |
| 69 | 69 | ||
| 70 | 每个算子分为[两段式接口](../../../docs/zh/context/两段式接口.md),必须先调用“aclnnUpsampleBilinear2dAABackwardGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnUpsampleBilinear2dAABackward”接口执行计算。 | 70 | 每个算子分为[两段式接口](../../../docs/zh/context/两段式接口.md),必须先调用“aclnnUpsampleBilinear2dAABackwardGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnUpsampleBilinear2dAABackward”接口执行计算。 |
| @@ -212,7 +212,7 @@ aclnnStatus aclnnUpsampleBilinear2dAABackward( | |||
| 212 | * **返回值**: | 212 | * **返回值**: |
| 213 | 213 | ||
| 214 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 214 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 215 | - | 215 | + |
| 216 | 第一段接口完成入参校验,出现以下场景时报错: | 216 | 第一段接口完成入参校验,出现以下场景时报错: |
| 217 | 217 | ||
| 218 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 218 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -313,12 +313,12 @@ aclnnStatus aclnnUpsampleBilinear2dAABackward( | |||
| 313 | 其中: | 313 | 其中: |
| 314 | - N代表输入和输出的N轴。 | 314 | - N代表输入和输出的N轴。 |
| 315 | - C代表输入和输出的C轴。 | 315 | - C代表输入和输出的C轴。 |
| 316 | - - 输入数据缩放场景放大倍数必须小于等于50,即: | 316 | + - 反向接口的输入数据缩小倍数必须小于等于50,即: |
| 317 | 317 | ||
| 318 | $$ | 318 | $$ |
| 319 | outputSize\_H / 输出shape的高度H <= 50 | 319 | outputSize\_H / 输出shape的高度H <= 50 |
| 320 | $$ | 320 | $$ |
| 321 | - | 321 | + |
| 322 | $$ | 322 | $$ |
| 323 | outputSize\_W / 输出shape的宽度W <=50 | 323 | outputSize\_W / 输出shape的宽度W <=50 |
| 324 | $$ | 324 | $$ |
| @@ -77,7 +77,7 @@ | |||
| 77 | $$ | 77 | $$ |
| 78 | 78 | ||
| 79 | - 假设:正向插值的输出图像out $(x, y)$受原图像input $(x_i, y_j)$影响,则有: | 79 | - 假设:正向插值的输出图像out $(x, y)$受原图像input $(x_i, y_j)$影响,则有: |
| 80 | - | 80 | + |
| 81 | $$ | 81 | $$ |
| 82 | gradInput(x_i,y_j) += gradOutput(x,y) * lambda(x_i,y_j) * lambdb(x_i,y_j) | 82 | gradInput(x_i,y_j) += gradOutput(x,y) * lambda(x_i,y_j) * lambdb(x_i,y_j) |
| 83 | $$ | 83 | $$ |
| @@ -227,13 +227,13 @@ aclnnStatus aclnnUpsampleBilinear2dBackwardV2( | |||
| 227 | </table> | 227 | </table> |
| 228 | 228 | ||
| 229 | - <term>Atlas 训练系列产品</term>、<term>Atlas 推理系列产品</term>: | 229 | - <term>Atlas 训练系列产品</term>、<term>Atlas 推理系列产品</term>: |
| 230 | - | 230 | + |
| 231 | 参数`gradOut`、`out`的数据类型不支持BFLOAT16。 | 231 | 参数`gradOut`、`out`的数据类型不支持BFLOAT16。 |
| 232 | 232 | ||
| 233 | - **返回值** | 233 | - **返回值** |
| 234 | 234 | ||
| 235 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 235 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 236 | - | 236 | + |
| 237 | 第一段接口完成入参校验,出现以下场景时报错: | 237 | 第一段接口完成入参校验,出现以下场景时报错: |
| 238 | 238 | ||
| 239 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 239 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -255,8 +255,8 @@ aclnnStatus aclnnUpsampleBilinear2dBackwardV2( | |||
| 255 | <td>传入的gradOut、outputSize、inputSize或out是空指针。</td> | 255 | <td>传入的gradOut、outputSize、inputSize或out是空指针。</td> |
| 256 | </tr> | 256 | </tr> |
| 257 | <tr> | 257 | <tr> |
| 258 | - <td rowspan="12">ACLNN_ERR_PARAM_INVALID</td> | 258 | + <td rowspan="10">ACLNN_ERR_PARAM_INVALID</td> |
| 259 | - <td rowspan="12">161002</td> | 259 | + <td rowspan="10">161002</td> |
| 260 | <td>gradOut、out的数据类型和数据格式不在支持的范围之内。</td> | 260 | <td>gradOut、out的数据类型和数据格式不在支持的范围之内。</td> |
| 261 | </tr> | 261 | </tr> |
| 262 | <tr> | 262 | <tr> |
| @@ -336,15 +336,16 @@ aclnnStatus aclnnUpsampleBilinear2dBackwardV2( | |||
| 336 | - 参数`gradOut`、`out`的shape约束: | 336 | - 参数`gradOut`、`out`的shape约束: |
| 337 | - 每个维度的取值小于等于2^20。 | 337 | - 每个维度的取值小于等于2^20。 |
| 338 | - 参数`out`的N轴和C轴与`gradOut`保持一致。 | 338 | - 参数`out`的N轴和C轴与`gradOut`保持一致。 |
| 339 | - - 内存占用需小于60G。内存占用的计算公式如下: | 339 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 340 | 340 | ||
| 341 | $$ | 341 | $$ |
| 342 | - (gradOut\_H * gradOut\_W + out\_H * out\_W + gradOut\_H * out\_W) * N * C * sizeof(float) < 60 * 1024 * 1024 * 1024 | 342 | + (gradOut\_H * gradOut\_W + out\_H * out\_W + gradOut\_H * out\_W) * N * C * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 343 | $$ | 343 | $$ |
| 344 | 344 | ||
| 345 | 其中: | 345 | 其中: |
| 346 | - N代表输入和输出的N轴。 | 346 | - N代表输入和输出的N轴。 |
| 347 | - C代表输入和输出的C轴。 | 347 | - C代表输入和输出的C轴。 |
| 348 | + - dtype代表输入张量的数据类型。 | ||
| 348 | - N \* C \* gradOut_H < 2^31 | 349 | - N \* C \* gradOut_H < 2^31 |
| 349 | - 参数inputSize、outputSize、scalesH、scalesW需要满足如下约束: | 350 | - 参数inputSize、outputSize、scalesH、scalesW需要满足如下约束: |
| 350 | 351 | ||
| @@ -33,7 +33,7 @@ | |||
| 33 | \end{cases} | 33 | \end{cases} |
| 34 | $$ | 34 | $$ |
| 35 | 35 | ||
| 36 | - 因此,对于output的某个方向上的点p(x,y),映射回原始图像中的点记为q(x',y'),则有关系: | 36 | + 因此,对于output的某个方向上的点p(x),映射回原始图像中的点记为q(x'),则有关系: |
| 37 | 37 | ||
| 38 | $$ | 38 | $$ |
| 39 | x' =\begin{cases} | 39 | x' =\begin{cases} |
| @@ -55,7 +55,7 @@ | |||
| 55 | $$ | 55 | $$ |
| 56 | 56 | ||
| 57 | - 假设:正向插值的输出图像out $(x)$受原图像input $(x_i)$影响,则有: | 57 | - 假设:正向插值的输出图像out $(x)$受原图像input $(x_i)$影响,则有: |
| 58 | - | 58 | + |
| 59 | $$ | 59 | $$ |
| 60 | gradInput(x_i) += gradOut(x) * lambda(x_i) | 60 | gradInput(x_i) += gradOut(x) * lambda(x_i) |
| 61 | $$ | 61 | $$ |
| @@ -66,21 +66,21 @@ | |||
| 66 | 66 | ||
| 67 | ```Cpp | 67 | ```Cpp |
| 68 | aclnnStatus aclnnUpsampleLinear1dBackwardGetWorkspaceSize( | 68 | aclnnStatus aclnnUpsampleLinear1dBackwardGetWorkspaceSize( |
| 69 | - const aclTensor * gradOut, | 69 | + const aclTensor * gradOut, |
| 70 | - const aclIntArray * outputSize, | 70 | + const aclIntArray * outputSize, |
| 71 | - const aclIntArray * inputSize, | 71 | + const aclIntArray * inputSize, |
| 72 | - bool alignCorners, | 72 | + bool alignCorners, |
| 73 | - double scales, | 73 | + double scales, |
| 74 | - aclTensor * out, | 74 | + aclTensor * out, |
| 75 | - uint64_t * workspaceSize, | 75 | + uint64_t * workspaceSize, |
| 76 | aclOpExecutor ** executor) | 76 | aclOpExecutor ** executor) |
| 77 | ``` | 77 | ``` |
| 78 | 78 | ||
| 79 | ```Cpp | 79 | ```Cpp |
| 80 | aclnnStatus aclnnUpsampleLinear1dBackward( | 80 | aclnnStatus aclnnUpsampleLinear1dBackward( |
| 81 | - void * workspace, | 81 | + void * workspace, |
| 82 | - uint64_t workspaceSize, | 82 | + uint64_t workspaceSize, |
| 83 | - aclOpExecutor * executor, | 83 | + aclOpExecutor * executor, |
| 84 | aclrtStream stream) | 84 | aclrtStream stream) |
| 85 | ``` | 85 | ``` |
| 86 | 86 | ||
| @@ -113,7 +113,7 @@ aclnnStatus aclnnUpsampleLinear1dBackward( | |||
| 113 | <tr> | 113 | <tr> |
| 114 | <td>gradOut(aclTensor*)</td> | 114 | <td>gradOut(aclTensor*)</td> |
| 115 | <td>输入</td> | 115 | <td>输入</td> |
| 116 | - <td>表示进行上采样的输入张量,对应公式中的`gradOut`。</td> | 116 | + <td>表示反向计算的梯度Tensor,对应公式中的`gradOut`。</td> |
| 117 | <td><ul><li>不支持空Tensor。</li><li>当数据格式为ND时,默认按照NCL格式处理。</li></ul></td> | 117 | <td><ul><li>不支持空Tensor。</li><li>当数据格式为ND时,默认按照NCL格式处理。</li></ul></td> |
| 118 | <td>FLOAT32、FLOAT16、BFLOAT16</td> | 118 | <td>FLOAT32、FLOAT16、BFLOAT16</td> |
| 119 | <td>ND、NCL</td> | 119 | <td>ND、NCL</td> |
| @@ -163,7 +163,7 @@ aclnnStatus aclnnUpsampleLinear1dBackward( | |||
| 163 | <tr> | 163 | <tr> |
| 164 | <td>out(aclTensor*)</td> | 164 | <td>out(aclTensor*)</td> |
| 165 | <td>输出</td> | 165 | <td>输出</td> |
| 166 | - <td>表示采样后的输出张量,对应公式中的`gradInput`。</td> | 166 | + <td>表示反向计算的输出Tensor,对应公式中的`gradInput`。</td> |
| 167 | <td><ul><li>不支持空Tensor</li><li>输出维度必须是3维。数据类型、数据格式与入参`gradOut`保持一致。</li></ul></td> | 167 | <td><ul><li>不支持空Tensor</li><li>输出维度必须是3维。数据类型、数据格式与入参`gradOut`保持一致。</li></ul></td> |
| 168 | <td>FLOAT32、FLOAT16、BFLOAT16</td> | 168 | <td>FLOAT32、FLOAT16、BFLOAT16</td> |
| 169 | <td>NCL</td> | 169 | <td>NCL</td> |
| @@ -196,7 +196,7 @@ aclnnStatus aclnnUpsampleLinear1dBackward( | |||
| 196 | - <term>Atlas 训练系列产品</term>: | 196 | - <term>Atlas 训练系列产品</term>: |
| 197 | 197 | ||
| 198 | 入参`gradOut`和出参`out`的数据类型仅支持FLOAT32、FLOAT16。 | 198 | 入参`gradOut`和出参`out`的数据类型仅支持FLOAT32、FLOAT16。 |
| 199 | - | 199 | + |
| 200 | - <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>: | 200 | - <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>: |
| 201 | 201 | ||
| 202 | 入参`gradOut`:当gradOut的shape对应轴的值与inputSize对应轴的值不相同时,数据类型仅支持FLOAT32、FLOAT16。 | 202 | 入参`gradOut`:当gradOut的shape对应轴的值与inputSize对应轴的值不相同时,数据类型仅支持FLOAT32、FLOAT16。 |
| @@ -204,7 +204,7 @@ aclnnStatus aclnnUpsampleLinear1dBackward( | |||
| 204 | - **返回值** | 204 | - **返回值** |
| 205 | 205 | ||
| 206 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 206 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 207 | - | 207 | + |
| 208 | 第一段接口完成入参校验,出现以下场景时报错: | 208 | 第一段接口完成入参校验,出现以下场景时报错: |
| 209 | 209 | ||
| 210 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 210 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -302,7 +302,7 @@ aclnnStatus aclnnUpsampleLinear1dBackward( | |||
| 302 | - 参数`gradOut`、`out`的shape约束: | 302 | - 参数`gradOut`、`out`的shape约束: |
| 303 | - 每个维度的取值小于等于2^20。 | 303 | - 每个维度的取值小于等于2^20。 |
| 304 | - 参数`out`的N轴和C轴与`gradOut`保持一致。 | 304 | - 参数`out`的N轴和C轴与`gradOut`保持一致。 |
| 305 | - - 内存占用需小于60G。内存占用的计算公式如下: | 305 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 306 | 306 | ||
| 307 | $$ | 307 | $$ |
| 308 | (gradOut\_L + out\_L + out\_L) * N * C * sizeof(dtype) < 60 * 1024 * 1024 * 1024 | 308 | (gradOut\_L + out\_L + out\_L) * N * C * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| @@ -311,10 +311,11 @@ aclnnStatus aclnnUpsampleLinear1dBackward( | |||
| 311 | 其中: | 311 | 其中: |
| 312 | - N代表输入和输出的N轴。 | 312 | - N代表输入和输出的N轴。 |
| 313 | - C代表输入和输出的C轴。 | 313 | - C代表输入和输出的C轴。 |
| 314 | + - dtype代表输入张量的数据类型。 | ||
| 314 | - N * C < 2^31 | 315 | - N * C < 2^31 |
| 315 | - 入参`gradOut`和出参`out`的数据格式不为NCL或ND时,输入其他数据格式默认按照NCL处理。 | 316 | - 入参`gradOut`和出参`out`的数据格式不为NCL或ND时,输入其他数据格式默认按照NCL处理。 |
| 316 | -- <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>:输入数据缩放场景放大倍数必须小于等于500,即: | 317 | +- <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>:反向接口的输入数据缩小倍数必须小于等于500,即: |
| 317 | - | 318 | + |
| 318 | $$ | 319 | $$ |
| 319 | outputSize[0] / 输出shape的长度L <= 500 | 320 | outputSize[0] / 输出shape的长度L <= 500 |
| 320 | $$ | 321 | $$ |
| @@ -35,8 +35,8 @@ | |||
| 35 | 35 | ||
| 36 | $$ | 36 | $$ |
| 37 | x' =\begin{cases} | 37 | x' =\begin{cases} |
| 38 | - x * scale\_h & alignCorners=true \\ | 38 | + x * scale & alignCorners=true \\ |
| 39 | - MAX(0,{(x+0.5)*scale\_h-0.5}) & alignCorners=false | 39 | + MAX(0,{(x+0.5)*scale-0.5}) & alignCorners=false |
| 40 | \end{cases} | 40 | \end{cases} |
| 41 | $$ | 41 | $$ |
| 42 | 42 | ||
| @@ -49,7 +49,7 @@ | |||
| 49 | - 则有以下公式: | 49 | - 则有以下公式: |
| 50 | 50 | ||
| 51 | $$ | 51 | $$ |
| 52 | - {V(p_{x})} = {V(p_{x0})} * {lambda_{0}} + {V(p_{x1})} * {lambda_{1}} | 52 | + {V(p_{x})} = {V(p_{x0})} * {lambda_{0}} + {V(p_{x1})} * {lambda_{1}} |
| 53 | $$ | 53 | $$ |
| 54 | 54 | ||
| 55 | ## 参数说明 | 55 | ## 参数说明 |
| @@ -37,8 +37,8 @@ | |||
| 37 | 37 | ||
| 38 | $$ | 38 | $$ |
| 39 | x' =\begin{cases} | 39 | x' =\begin{cases} |
| 40 | - x * scale\_h & alignCorners=true \\ | 40 | + x * scale & alignCorners=true \\ |
| 41 | - MAX(0,{(x+0.5)*scale\_h-0.5}) & alignCorners=false | 41 | + MAX(0,{(x+0.5)*scale-0.5}) & alignCorners=false |
| 42 | \end{cases} | 42 | \end{cases} |
| 43 | $$ | 43 | $$ |
| 44 | 44 | ||
| @@ -51,7 +51,7 @@ | |||
| 51 | - 则有以下公式: | 51 | - 则有以下公式: |
| 52 | 52 | ||
| 53 | $$ | 53 | $$ |
| 54 | - {V(p_{x})} = {V(p_{x0})} * {lambda_{0}} + {V(p_{x1})} * {lambda_{1}} | 54 | + {V(p_{x})} = {V(p_{x0})} * {lambda_{0}} + {V(p_{x1})} * {lambda_{1}} |
| 55 | $$ | 55 | $$ |
| 56 | 56 | ||
| 57 | ## 函数原型 | 57 | ## 函数原型 |
| @@ -60,20 +60,20 @@ | |||
| 60 | 60 | ||
| 61 | ```Cpp | 61 | ```Cpp |
| 62 | aclnnStatus aclnnUpsampleLinear1dGetWorkspaceSize( | 62 | aclnnStatus aclnnUpsampleLinear1dGetWorkspaceSize( |
| 63 | - const aclTensor *self, | 63 | + const aclTensor *self, |
| 64 | const aclIntArray *outputSize, | 64 | const aclIntArray *outputSize, |
| 65 | - const bool alignCorners, | 65 | + const bool alignCorners, |
| 66 | - const double scales, | 66 | + const double scales, |
| 67 | - aclTensor *out, | 67 | + aclTensor *out, |
| 68 | - uint64_t *workspaceSize, | 68 | + uint64_t *workspaceSize, |
| 69 | aclOpExecutor **executor) | 69 | aclOpExecutor **executor) |
| 70 | ``` | 70 | ``` |
| 71 | 71 | ||
| 72 | ```Cpp | 72 | ```Cpp |
| 73 | aclnnStatus aclnnUpsampleLinear1d( | 73 | aclnnStatus aclnnUpsampleLinear1d( |
| 74 | - void *workspace, | 74 | + void *workspace, |
| 75 | - uint64_t workspaceSize, | 75 | + uint64_t workspaceSize, |
| 76 | - aclOpExecutor *executor, | 76 | + aclOpExecutor *executor, |
| 77 | aclrtStream stream) | 77 | aclrtStream stream) |
| 78 | ``` | 78 | ``` |
| 79 | 79 | ||
| @@ -128,8 +128,8 @@ aclnnStatus aclnnUpsampleLinear1d( | |||
| 128 | <td>alignCorners(bool)</td> | 128 | <td>alignCorners(bool)</td> |
| 129 | <td>输入</td> | 129 | <td>输入</td> |
| 130 | <td>bool类型参数,决定是否对齐角像素点,对应公式中的`alignCorners`。</td> | 130 | <td>bool类型参数,决定是否对齐角像素点,对应公式中的`alignCorners`。</td> |
| 131 | - <td><ul><li>如果设置为True,则输入和输出张量按其角像素的中心点对齐,保留角像素处的值。</li> | 131 | + <td><ul><li>如果设置为true,则输入和输出张量按其角像素的中心点对齐,保留角像素处的值。</li> |
| 132 | - <li>如果设置为False,则输入和输出张量通过其角像素的角点对齐,并且插值使用边缘值填充用于外界边值,使此操作在保持不变时独立于输入大小scales。</li></ul></td> | 132 | + <li>如果设置为false,则输入和输出张量通过其角像素的角点对齐,并且插值使用边缘值填充用于外界边值,使此操作在保持不变时独立于输入大小scales。</li></ul></td> |
| 133 | <td>-</td> | 133 | <td>-</td> |
| 134 | <td>-</td> | 134 | <td>-</td> |
| 135 | <td>-</td> | 135 | <td>-</td> |
| @@ -185,7 +185,7 @@ aclnnStatus aclnnUpsampleLinear1d( | |||
| 185 | - **返回值** | 185 | - **返回值** |
| 186 | 186 | ||
| 187 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 187 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 188 | - | 188 | + |
| 189 | 第一段接口完成入参校验,出现以下场景时报错: | 189 | 第一段接口完成入参校验,出现以下场景时报错: |
| 190 | 190 | ||
| 191 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 191 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -17,9 +17,13 @@ | |||
| 17 | 17 | ||
| 18 | - 接口功能:对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。如果输入shape为(N, C, L),则输出shape为(N, C, outputSize)。 | 18 | - 接口功能:对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。如果输入shape为(N, C, L),则输出shape为(N, C, outputSize)。 |
| 19 | - 计算公式: | 19 | - 计算公式: |
| 20 | - | 20 | + |
| 21 | $$ | 21 | $$ |
| 22 | - out(N, C, l) = self(N, C, min(floor((l + 0.5) * scales), L-1)) | 22 | + l_{src} = min(floor((l_{dst} + 0.5) / scales), L - 1), \quad scales = outputSize[0] / L |
| 23 | + $$ | ||
| 24 | + | ||
| 25 | + $$ | ||
| 26 | + out(N, C, l_{dst}) = self(N, C, l_{src}) | ||
| 23 | $$ | 27 | $$ |
| 24 | 28 | ||
| 25 | ## 函数原型 | 29 | ## 函数原型 |
| @@ -28,19 +32,19 @@ | |||
| 28 | 32 | ||
| 29 | ```cpp | 33 | ```cpp |
| 30 | aclnnStatus aclnnUpsampleNearestExact1dGetWorkspaceSize( | 34 | aclnnStatus aclnnUpsampleNearestExact1dGetWorkspaceSize( |
| 31 | - const aclTensor *self, | 35 | + const aclTensor *self, |
| 32 | const aclIntArray *outputSize, | 36 | const aclIntArray *outputSize, |
| 33 | - double scales, | 37 | + double scales, |
| 34 | - aclTensor *out, | 38 | + aclTensor *out, |
| 35 | - uint64_t *workspaceSize, | 39 | + uint64_t *workspaceSize, |
| 36 | aclOpExecutor **executor) | 40 | aclOpExecutor **executor) |
| 37 | ``` | 41 | ``` |
| 38 | 42 | ||
| 39 | ```cpp | 43 | ```cpp |
| 40 | aclnnStatus aclnnUpsampleNearestExact1d( | 44 | aclnnStatus aclnnUpsampleNearestExact1d( |
| 41 | - void *workspace, | 45 | + void *workspace, |
| 42 | - uint64_t workspaceSize, | 46 | + uint64_t workspaceSize, |
| 43 | - aclOpExecutor *executor, | 47 | + aclOpExecutor *executor, |
| 44 | aclrtStream stream) | 48 | aclrtStream stream) |
| 45 | ``` | 49 | ``` |
| 46 | 50 | ||
| @@ -133,7 +137,7 @@ aclnnStatus aclnnUpsampleNearestExact1d( | |||
| 133 | </table> | 137 | </table> |
| 134 | 138 | ||
| 135 | - <term>Atlas 推理系列产品</term>: | 139 | - <term>Atlas 推理系列产品</term>: |
| 136 | - | 140 | + |
| 137 | 入参`self`和出参`out`的数据类型不支持BFLOAT16。 | 141 | 入参`self`和出参`out`的数据类型不支持BFLOAT16。 |
| 138 | 142 | ||
| 139 | - **返回值** | 143 | - **返回值** |
| @@ -222,8 +226,8 @@ aclnnStatus aclnnUpsampleNearestExact1d( | |||
| 222 | 参数`self`、`out`的shape约束: | 226 | 参数`self`、`out`的shape约束: |
| 223 | - 每个维度的取值小于等于2^20。 | 227 | - 每个维度的取值小于等于2^20。 |
| 224 | - 参数`out`的N轴和C轴与`self`保持一致。 | 228 | - 参数`out`的N轴和C轴与`self`保持一致。 |
| 225 | - - 内存占用需小于60G。内存占用的计算公式如下: | 229 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 226 | - | 230 | + |
| 227 | $$ | 231 | $$ |
| 228 | N * (ceil(C/16) * 16) * (self\_L + out\_L) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 | 232 | N * (ceil(C/16) * 16) * (self\_L + out\_L) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 229 | $$ | 233 | $$ |
| @@ -231,6 +235,7 @@ aclnnStatus aclnnUpsampleNearestExact1d( | |||
| 231 | 其中: | 235 | 其中: |
| 232 | - N代表输入和输出的N轴。 | 236 | - N代表输入和输出的N轴。 |
| 233 | - C代表输入和输出的C轴。 | 237 | - C代表输入和输出的C轴。 |
| 238 | + - dtype代表输入张量的数据类型。 | ||
| 234 | - 参数self、outputSize、scales需要满足如下约束: | 239 | - 参数self、outputSize、scales需要满足如下约束: |
| 235 | 240 | ||
| 236 | $$ | 241 | $$ |
| @@ -19,11 +19,11 @@ | |||
| 19 | - 计算公式: | 19 | - 计算公式: |
| 20 | 20 | ||
| 21 | $$ | 21 | $$ |
| 22 | - h_{src} = min(floor((h_{dst} + 0.5) / scalesH), H - 1),scalesH = outputSize[0] / H | 22 | + h_{src} = min(floor((h_{dst} + 0.5) / scalesH), H - 1), \quad scalesH = outputSize[0] / H |
| 23 | $$ | 23 | $$ |
| 24 | 24 | ||
| 25 | $$ | 25 | $$ |
| 26 | - w_{src} = min(floor((w_{dst} + 0.5) / scalesW), W - 1),scalesW = outputSize[1] / W | 26 | + w_{src} = min(floor((w_{dst} + 0.5) / scalesW), W - 1), \quad scalesW = outputSize[1] / W |
| 27 | $$ | 27 | $$ |
| 28 | 28 | ||
| 29 | $$ | 29 | $$ |
| @@ -36,20 +36,20 @@ | |||
| 36 | 36 | ||
| 37 | ```Cpp | 37 | ```Cpp |
| 38 | aclnnStatus aclnnUpsampleNearestExact2dGetWorkspaceSize( | 38 | aclnnStatus aclnnUpsampleNearestExact2dGetWorkspaceSize( |
| 39 | - const aclTensor *self, | 39 | + const aclTensor *self, |
| 40 | - const aclIntArray *outputSize, | 40 | + const aclIntArray *outputSize, |
| 41 | - double scalesH, | 41 | + double scalesH, |
| 42 | - double scalesW, | 42 | + double scalesW, |
| 43 | - aclTensor *out, | 43 | + aclTensor *out, |
| 44 | - uint64_t *workspaceSize, | 44 | + uint64_t *workspaceSize, |
| 45 | aclOpExecutor **executor) | 45 | aclOpExecutor **executor) |
| 46 | ``` | 46 | ``` |
| 47 | 47 | ||
| 48 | ```Cpp | 48 | ```Cpp |
| 49 | aclnnStatus aclnnUpsampleNearestExact2d( | 49 | aclnnStatus aclnnUpsampleNearestExact2d( |
| 50 | - void *workspace, | 50 | + void *workspace, |
| 51 | - uint64_t workspaceSize, | 51 | + uint64_t workspaceSize, |
| 52 | - aclOpExecutor *executor, | 52 | + aclOpExecutor *executor, |
| 53 | aclrtStream stream) | 53 | aclrtStream stream) |
| 54 | ``` | 54 | ``` |
| 55 | 55 | ||
| @@ -153,15 +153,15 @@ aclnnStatus aclnnUpsampleNearestExact2d( | |||
| 153 | </table> | 153 | </table> |
| 154 | 154 | ||
| 155 | - <term>Atlas 推理系列产品</term>: | 155 | - <term>Atlas 推理系列产品</term>: |
| 156 | - | 156 | + |
| 157 | 参数self、out的数据类型仅支持FLOAT32、FLOAT16。 | 157 | 参数self、out的数据类型仅支持FLOAT32、FLOAT16。 |
| 158 | - | 158 | + |
| 159 | - **返回值** | 159 | - **返回值** |
| 160 | 160 | ||
| 161 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 161 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 162 | 162 | ||
| 163 | 第一段接口完成入参校验,出现以下场景时报错: | 163 | 第一段接口完成入参校验,出现以下场景时报错: |
| 164 | - | 164 | + |
| 165 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 165 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| 166 | <col style="width: 268px"> | 166 | <col style="width: 268px"> |
| 167 | <col style="width: 140px"> | 167 | <col style="width: 140px"> |
| @@ -246,8 +246,8 @@ aclnnStatus aclnnUpsampleNearestExact2d( | |||
| 246 | 参数`self`、`out`的shape约束: | 246 | 参数`self`、`out`的shape约束: |
| 247 | - 每个维度的取值小于等于2^20。 | 247 | - 每个维度的取值小于等于2^20。 |
| 248 | - 参数`out`的N轴和C轴与`self`保持一致。 | 248 | - 参数`out`的N轴和C轴与`self`保持一致。 |
| 249 | - - 内存占用需小于60G。内存占用的计算公式如下: | 249 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 250 | - | 250 | + |
| 251 | $$ | 251 | $$ |
| 252 | N * (ceil(C/16) * 16) * (self\_H * self\_W + out\_H * out\_W) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 | 252 | N * (ceil(C/16) * 16) * (self\_H * self\_W + out\_H * out\_W) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 253 | $$ | 253 | $$ |
| @@ -255,6 +255,7 @@ aclnnStatus aclnnUpsampleNearestExact2d( | |||
| 255 | 其中: | 255 | 其中: |
| 256 | - N代表输入和输出的N轴。 | 256 | - N代表输入和输出的N轴。 |
| 257 | - C代表输入和输出的C轴。 | 257 | - C代表输入和输出的C轴。 |
| 258 | + - dtype代表输入张量的数据类型。 | ||
| 258 | - 参数self、outputSize、scalesH、scalesW需要满足如下约束: | 259 | - 参数self、outputSize、scalesH、scalesW需要满足如下约束: |
| 259 | 260 | ||
| 260 | $$ | 261 | $$ |
| @@ -25,27 +25,27 @@ | |||
| 25 | 其中: | 25 | 其中: |
| 26 | 26 | ||
| 27 | $$ | 27 | $$ |
| 28 | - scalesH = inputSize[2]/outputSize[0] | 28 | + scalesH = outputSize[0]/inputSize[2] |
| 29 | $$ | 29 | $$ |
| 30 | 30 | ||
| 31 | $$ | 31 | $$ |
| 32 | - scalesW = inputSize[3]/outputSize[1] | 32 | + scalesW = outputSize[1]/inputSize[3] |
| 33 | $$ | 33 | $$ |
| 34 | 34 | ||
| 35 | $$ | 35 | $$ |
| 36 | - srcH = Min(scalesH * H, outputSize[0]) | 36 | + srcH = Min(ceil(scalesH * H), outputSize[0]) |
| 37 | $$ | 37 | $$ |
| 38 | 38 | ||
| 39 | $$ | 39 | $$ |
| 40 | - srcHUp = Min(scalesH * (H + 1), outputSize[0]) | 40 | + srcHUp = Min(ceil(scalesH * (H + 1)), outputSize[0]) |
| 41 | $$ | 41 | $$ |
| 42 | 42 | ||
| 43 | $$ | 43 | $$ |
| 44 | - srcW = Min(scalesW * W, outputSize[1]) | 44 | + srcW = Min(ceil(scalesW * W), outputSize[1]) |
| 45 | $$ | 45 | $$ |
| 46 | 46 | ||
| 47 | $$ | 47 | $$ |
| 48 | - srcHUp = Min(scalesW * (W + 1), outputSize[1]) | 48 | + srcWUp = Min(ceil(scalesW * (W + 1)), outputSize[1]) |
| 49 | $$ | 49 | $$ |
| 50 | 50 | ||
| 51 | ## 参数说明 | 51 | ## 参数说明 |
| @@ -28,15 +28,15 @@ | |||
| 28 | 其中: | 28 | 其中: |
| 29 | 29 | ||
| 30 | $$ | 30 | $$ |
| 31 | - scalesL = inputSize[2]/outputSize[0] | 31 | + scalesL = outputSize[0]/inputSize[2] |
| 32 | $$ | 32 | $$ |
| 33 | 33 | ||
| 34 | $$ | 34 | $$ |
| 35 | - srcL = Min(scalesL * L, outputSize[0]) | 35 | + srcL = Min(ceil(scalesL * L), outputSize[0]) |
| 36 | $$ | 36 | $$ |
| 37 | 37 | ||
| 38 | $$ | 38 | $$ |
| 39 | - srcLUp = Min(scalesL * (L + 1), outputSize[0]) | 39 | + srcLUp = Min(ceil(scalesL * (L + 1)), outputSize[0]) |
| 40 | $$ | 40 | $$ |
| 41 | 41 | ||
| 42 | ## 函数原型 | 42 | ## 函数原型 |
| @@ -45,20 +45,20 @@ | |||
| 45 | 45 | ||
| 46 | ```Cpp | 46 | ```Cpp |
| 47 | aclnnStatus aclnnUpsampleNearest1dBackwardGetWorkspaceSize( | 47 | aclnnStatus aclnnUpsampleNearest1dBackwardGetWorkspaceSize( |
| 48 | - const aclTensor *gradOut, | 48 | + const aclTensor *gradOut, |
| 49 | - const aclIntArray *outputSize, | 49 | + const aclIntArray *outputSize, |
| 50 | - const aclIntArray *inputSize, | 50 | + const aclIntArray *inputSize, |
| 51 | - double scales, | 51 | + double scales, |
| 52 | - aclTensor *out, | 52 | + aclTensor *out, |
| 53 | - uint64_t *workspaceSize, | 53 | + uint64_t *workspaceSize, |
| 54 | aclOpExecutor **executor) | 54 | aclOpExecutor **executor) |
| 55 | ``` | 55 | ``` |
| 56 | 56 | ||
| 57 | ```Cpp | 57 | ```Cpp |
| 58 | aclnnStatus aclnnUpsampleNearest1dBackward( | 58 | aclnnStatus aclnnUpsampleNearest1dBackward( |
| 59 | - void *workspace, | 59 | + void *workspace, |
| 60 | - uint64_t workspaceSize, | 60 | + uint64_t workspaceSize, |
| 61 | - aclOpExecutor *executor, | 61 | + aclOpExecutor *executor, |
| 62 | aclrtStream stream) | 62 | aclrtStream stream) |
| 63 | ``` | 63 | ``` |
| 64 | 64 | ||
| @@ -164,11 +164,11 @@ aclnnStatus aclnnUpsampleNearest1dBackward( | |||
| 164 | </table> | 164 | </table> |
| 165 | 165 | ||
| 166 | - <term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>:入参`gradOut`和出参`out`的数据类型仅支持FLOAT16。 | 166 | - <term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>:入参`gradOut`和出参`out`的数据类型仅支持FLOAT16。 |
| 167 | - | 167 | + |
| 168 | - **返回值** | 168 | - **返回值** |
| 169 | 169 | ||
| 170 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 170 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 171 | - | 171 | + |
| 172 | 第一段接口完成入参校验,出现以下场景时报错: | 172 | 第一段接口完成入参校验,出现以下场景时报错: |
| 173 | 173 | ||
| 174 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 174 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -28,27 +28,27 @@ | |||
| 28 | 其中: | 28 | 其中: |
| 29 | 29 | ||
| 30 | $$ | 30 | $$ |
| 31 | - scalesH = inputSize[2]/outputSize[0] | 31 | + scalesH = outputSize[0]/inputSize[2] |
| 32 | $$ | 32 | $$ |
| 33 | 33 | ||
| 34 | $$ | 34 | $$ |
| 35 | - scalesW = inputSize[3]/outputSize[1] | 35 | + scalesW = outputSize[1]/inputSize[3] |
| 36 | $$ | 36 | $$ |
| 37 | 37 | ||
| 38 | $$ | 38 | $$ |
| 39 | - srcH = Min(scalesH * H, outputSize[0]) | 39 | + srcH = Min(ceil(scalesH * H), outputSize[0]) |
| 40 | $$ | 40 | $$ |
| 41 | 41 | ||
| 42 | $$ | 42 | $$ |
| 43 | - srcHUp = Min(scalesH * (H + 1), outputSize[0]) | 43 | + srcHUp = Min(ceil(scalesH * (H + 1)), outputSize[0]) |
| 44 | $$ | 44 | $$ |
| 45 | 45 | ||
| 46 | $$ | 46 | $$ |
| 47 | - srcW = Min(scalesW * W, outputSize[1]) | 47 | + srcW = Min(ceil(scalesW * W), outputSize[1]) |
| 48 | $$ | 48 | $$ |
| 49 | 49 | ||
| 50 | $$ | 50 | $$ |
| 51 | - srcHUp = Min(scalesW * (W + 1), outputSize[1]) | 51 | + srcWUp = Min(ceil(scalesW * (W + 1)), outputSize[1]) |
| 52 | $$ | 52 | $$ |
| 53 | 53 | ||
| 54 | ## 函数原型 | 54 | ## 函数原型 |
| @@ -57,21 +57,21 @@ | |||
| 57 | 57 | ||
| 58 | ```Cpp | 58 | ```Cpp |
| 59 | aclnnStatus aclnnUpsampleNearest2dBackwardGetWorkspaceSize( | 59 | aclnnStatus aclnnUpsampleNearest2dBackwardGetWorkspaceSize( |
| 60 | - const aclTensor *gradOut, | 60 | + const aclTensor *gradOut, |
| 61 | - const aclIntArray *outputSize, | 61 | + const aclIntArray *outputSize, |
| 62 | - const aclIntArray *inputSize, | 62 | + const aclIntArray *inputSize, |
| 63 | - double scalesH, | 63 | + double scalesH, |
| 64 | - double scalesW, | 64 | + double scalesW, |
| 65 | - aclTensor* gradInput, | 65 | + aclTensor* gradInput, |
| 66 | - uint64_t *workspaceSize, | 66 | + uint64_t *workspaceSize, |
| 67 | aclOpExecutor **executor) | 67 | aclOpExecutor **executor) |
| 68 | ``` | 68 | ``` |
| 69 | 69 | ||
| 70 | ```Cpp | 70 | ```Cpp |
| 71 | aclnnStatus aclnnUpsampleNearest2dBackward( | 71 | aclnnStatus aclnnUpsampleNearest2dBackward( |
| 72 | - void *workspace, | 72 | + void *workspace, |
| 73 | - uint64_t workspaceSize, | 73 | + uint64_t workspaceSize, |
| 74 | - aclOpExecutor *executor, | 74 | + aclOpExecutor *executor, |
| 75 | aclrtStream stream) | 75 | aclrtStream stream) |
| 76 | ``` | 76 | ``` |
| 77 | 77 | ||
| @@ -185,13 +185,13 @@ aclnnStatus aclnnUpsampleNearest2dBackward( | |||
| 185 | </table> | 185 | </table> |
| 186 | 186 | ||
| 187 | - <term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>: | 187 | - <term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>: |
| 188 | - | 188 | + |
| 189 | 入参`gradOut`和出参`gradInput`的数据类型仅支持FLOAT16。 | 189 | 入参`gradOut`和出参`gradInput`的数据类型仅支持FLOAT16。 |
| 190 | - | 190 | + |
| 191 | - **返回值** | 191 | - **返回值** |
| 192 | 192 | ||
| 193 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 193 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 194 | - | 194 | + |
| 195 | 第一段接口完成入参校验,出现以下场景时报错: | 195 | 第一段接口完成入参校验,出现以下场景时报错: |
| 196 | 196 | ||
| 197 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 197 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -25,18 +25,15 @@ | |||
| 25 | 对于out的某个方向上的点p(x,y,z),映射回原始图像中的点记为q(x',y',z'),则有关系: | 25 | 对于out的某个方向上的点p(x,y,z),映射回原始图像中的点记为q(x',y',z'),则有关系: |
| 26 | 26 | ||
| 27 | $$ | 27 | $$ |
| 28 | - x' = \min(\lfloor x * scales\_depth \rfloor, self\_D - 1) ,\ | 28 | + x' = \min(\lfloor x * scales\_depth \rfloor, self\_D - 1), \quad scales\_depth = self\_D / outputSize[0] |
| 29 | - scales\_depth = self\_D / outputSize[0] | ||
| 30 | $$ | 29 | $$ |
| 31 | 30 | ||
| 32 | $$ | 31 | $$ |
| 33 | - y' = \min(\lfloor y * scales\_height \rfloor, self\_H - 1) ,\ | 32 | + y' = \min(\lfloor y * scales\_height \rfloor, self\_H - 1), \quad scales\_height = self\_H / outputSize[1] |
| 34 | - scales\_height = self\_H / outputSize[1] | ||
| 35 | $$ | 33 | $$ |
| 36 | 34 | ||
| 37 | $$ | 35 | $$ |
| 38 | - z' = \min(\lfloor z * scales\_width \rfloor, self\_W - 1) ,\ | 36 | + z' = \min(\lfloor z * scales\_width \rfloor, self\_W - 1), \quad scales\_width = self\_W / outputSize[2] |
| 39 | - scales\_width = self\_W / outputSize[2] | ||
| 40 | $$ | 37 | $$ |
| 41 | 38 | ||
| 42 | 则有以下公式: | 39 | 则有以下公式: |
| @@ -18,9 +18,9 @@ | |||
| 18 | - 接口功能:对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。如果输入shape为(N, C, L),则输出shape为(N, C, outputSize)。本接口相较于[aclnnUpsampleNearest1d](../../resize_nearest_neighbor_v2/docs/aclnnUpsampleNearest1d.md),增加入参scaleL,请根据实际情况选择合适的接口。 | 18 | - 接口功能:对由多个输入通道组成的输入信号应用最近邻插值算法进行上采样。如果输入shape为(N, C, L),则输出shape为(N, C, outputSize)。本接口相较于[aclnnUpsampleNearest1d](../../resize_nearest_neighbor_v2/docs/aclnnUpsampleNearest1d.md),增加入参scaleL,请根据实际情况选择合适的接口。 |
| 19 | 19 | ||
| 20 | - 计算公式: | 20 | - 计算公式: |
| 21 | - | 21 | + |
| 22 | $$ | 22 | $$ |
| 23 | - out(N, C, l) = self(N, C, min(floor(l * scaleL), L-1)), \ scaleL = outputSize[0] / self\_L | 23 | + out(N, C, l) = self(N, C, min(floor(l * scaleL), L-1)), \quad scaleL = outputSize[0] / self\_L |
| 24 | $$ | 24 | $$ |
| 25 | 25 | ||
| 26 | ## 函数原型 | 26 | ## 函数原型 |
| @@ -29,19 +29,19 @@ | |||
| 29 | 29 | ||
| 30 | ```Cpp | 30 | ```Cpp |
| 31 | aclnnStatus aclnnUpsampleNearest1dV2GetWorkspaceSize( | 31 | aclnnStatus aclnnUpsampleNearest1dV2GetWorkspaceSize( |
| 32 | - const aclTensor *self, | 32 | + const aclTensor *self, |
| 33 | - const aclIntArray *outputSize, | 33 | + const aclIntArray *outputSize, |
| 34 | float scaleL, | 34 | float scaleL, |
| 35 | - aclTensor *out, | 35 | + aclTensor *out, |
| 36 | - uint64_t *workspaceSize, | 36 | + uint64_t *workspaceSize, |
| 37 | aclOpExecutor **executor) | 37 | aclOpExecutor **executor) |
| 38 | ``` | 38 | ``` |
| 39 | 39 | ||
| 40 | ```Cpp | 40 | ```Cpp |
| 41 | aclnnStatus aclnnUpsampleNearest1dV2( | 41 | aclnnStatus aclnnUpsampleNearest1dV2( |
| 42 | - void *workspace, | 42 | + void *workspace, |
| 43 | - uint64_t workspaceSize, | 43 | + uint64_t workspaceSize, |
| 44 | - aclOpExecutor *executor, | 44 | + aclOpExecutor *executor, |
| 45 | aclrtStream stream) | 45 | aclrtStream stream) |
| 46 | ``` | 46 | ``` |
| 47 | 47 | ||
| @@ -136,13 +136,13 @@ aclnnStatus aclnnUpsampleNearest1dV2( | |||
| 136 | </table> | 136 | </table> |
| 137 | 137 | ||
| 138 | - <term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>: | 138 | - <term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>: |
| 139 | - | 139 | + |
| 140 | 入参`self`和出参`out`的数据类型不支持BFLOAT16。 | 140 | 入参`self`和出参`out`的数据类型不支持BFLOAT16。 |
| 141 | - | 141 | + |
| 142 | - **返回值** | 142 | - **返回值** |
| 143 | 143 | ||
| 144 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 144 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 145 | - | 145 | + |
| 146 | 第一段接口完成入参校验,出现以下场景时报错: | 146 | 第一段接口完成入参校验,出现以下场景时报错: |
| 147 | 147 | ||
| 148 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 148 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| @@ -20,11 +20,11 @@ | |||
| 20 | - 计算公式: | 20 | - 计算公式: |
| 21 | 21 | ||
| 22 | $$ | 22 | $$ |
| 23 | - h_{src} = min(floor(h_{dst} * scalesH), H - 1), \ scalesH = outputSize[0] / self\_H | 23 | + h_{src} = min(floor(h_{dst} * scalesH), H - 1), \quad scalesH = outputSize[0] / self\_H |
| 24 | $$ | 24 | $$ |
| 25 | 25 | ||
| 26 | $$ | 26 | $$ |
| 27 | - w_{src} = min(floor(w_{dst} * scalesW), W - 1), \ scalesW = outputSize[1] / self\_W | 27 | + w_{src} = min(floor(w_{dst} * scalesW), W - 1), \quad scalesW = outputSize[1] / self\_W |
| 28 | $$ | 28 | $$ |
| 29 | 29 | ||
| 30 | $$ | 30 | $$ |
| @@ -37,20 +37,20 @@ | |||
| 37 | 37 | ||
| 38 | ```Cpp | 38 | ```Cpp |
| 39 | aclnnStatus aclnnUpsampleNearest2dV2GetWorkspaceSize( | 39 | aclnnStatus aclnnUpsampleNearest2dV2GetWorkspaceSize( |
| 40 | - const aclTensor *self, | 40 | + const aclTensor *self, |
| 41 | - const aclIntArray *outputSize, | 41 | + const aclIntArray *outputSize, |
| 42 | - float scalesH, | 42 | + float scalesH, |
| 43 | - float scalesW, | 43 | + float scalesW, |
| 44 | - aclTensor *out, | 44 | + aclTensor *out, |
| 45 | - uint64_t *workspaceSize, | 45 | + uint64_t *workspaceSize, |
| 46 | aclOpExecutor **executor) | 46 | aclOpExecutor **executor) |
| 47 | ``` | 47 | ``` |
| 48 | 48 | ||
| 49 | ```Cpp | 49 | ```Cpp |
| 50 | aclnnStatus aclnnUpsampleNearest2dV2( | 50 | aclnnStatus aclnnUpsampleNearest2dV2( |
| 51 | - void *workspace, | 51 | + void *workspace, |
| 52 | - uint64_t workspaceSize, | 52 | + uint64_t workspaceSize, |
| 53 | - aclOpExecutor *executor, | 53 | + aclOpExecutor *executor, |
| 54 | aclrtStream stream) | 54 | aclrtStream stream) |
| 55 | ``` | 55 | ``` |
| 56 | 56 | ||
| @@ -154,7 +154,7 @@ aclnnStatus aclnnUpsampleNearest2dV2( | |||
| 154 | </table> | 154 | </table> |
| 155 | 155 | ||
| 156 | - <term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>: | 156 | - <term>Atlas 推理系列产品</term>、<term>Atlas 训练系列产品</term>: |
| 157 | - | 157 | + |
| 158 | 入参`self`和出参`out`的数据类型不支持FLOAT32、BFLOAT16。 | 158 | 入参`self`和出参`out`的数据类型不支持FLOAT32、BFLOAT16。 |
| 159 | 159 | ||
| 160 | - **返回值** | 160 | - **返回值** |
| @@ -23,15 +23,15 @@ | |||
| 23 | - 具体计算逻辑: | 23 | - 具体计算逻辑: |
| 24 | 24 | ||
| 25 | $$ | 25 | $$ |
| 26 | - d_{src} = min(floor(d_{dst} / scalesD), self\_D - 1), \ scalesD = outputSize[0] / self\_D | 26 | + d_{src} = min(floor(d_{dst} / scalesD), self\_D - 1), \quad scalesD = outputSize[0] / self\_D |
| 27 | $$ | 27 | $$ |
| 28 | 28 | ||
| 29 | $$ | 29 | $$ |
| 30 | - h_{src} = min(floor(h_{dst} / scalesH), self\_H - 1), \ scalesH = outputSize[1] / self\_H | 30 | + h_{src} = min(floor(h_{dst} / scalesH), self\_H - 1), \quad scalesH = outputSize[1] / self\_H |
| 31 | $$ | 31 | $$ |
| 32 | 32 | ||
| 33 | $$ | 33 | $$ |
| 34 | - w_{src} = min(floor(w_{dst} / scalesW), self\_W - 1), \ scalesW = outputSize[2] / self\_W | 34 | + w_{src} = min(floor(w_{dst} / scalesW), self\_W - 1), \quad scalesW = outputSize[2] / self\_W |
| 35 | $$ | 35 | $$ |
| 36 | 36 | ||
| 37 | $$ | 37 | $$ |
| @@ -44,21 +44,21 @@ | |||
| 44 | 44 | ||
| 45 | ```Cpp | 45 | ```Cpp |
| 46 | aclnnStatus aclnnUpsampleNearest3dGetWorkspaceSize( | 46 | aclnnStatus aclnnUpsampleNearest3dGetWorkspaceSize( |
| 47 | - const aclTensor *self, | 47 | + const aclTensor *self, |
| 48 | - const aclIntArray *outputSize, | 48 | + const aclIntArray *outputSize, |
| 49 | - double scalesD, | 49 | + double scalesD, |
| 50 | - double scalesH, | 50 | + double scalesH, |
| 51 | - double scalesW, | 51 | + double scalesW, |
| 52 | - aclTensor *out, | 52 | + aclTensor *out, |
| 53 | - uint64_t *workspaceSize, | 53 | + uint64_t *workspaceSize, |
| 54 | aclOpExecutor **executor) | 54 | aclOpExecutor **executor) |
| 55 | ``` | 55 | ``` |
| 56 | 56 | ||
| 57 | ```Cpp | 57 | ```Cpp |
| 58 | aclnnStatus aclnnUpsampleNearest3d( | 58 | aclnnStatus aclnnUpsampleNearest3d( |
| 59 | - void *workspace, | 59 | + void *workspace, |
| 60 | - uint64_t workspaceSize, | 60 | + uint64_t workspaceSize, |
| 61 | - aclOpExecutor *executor, | 61 | + aclOpExecutor *executor, |
| 62 | aclrtStream stream) | 62 | aclrtStream stream) |
| 63 | ``` | 63 | ``` |
| 64 | 64 | ||
| @@ -183,9 +183,9 @@ aclnnStatus aclnnUpsampleNearest3d( | |||
| 183 | - **返回值** | 183 | - **返回值** |
| 184 | 184 | ||
| 185 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 185 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 186 | - | 186 | + |
| 187 | 第一段接口完成入参校验,出现以下场景时报错: | 187 | 第一段接口完成入参校验,出现以下场景时报错: |
| 188 | - | 188 | + |
| 189 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 189 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| 190 | <col style="width: 268px"> | 190 | <col style="width: 268px"> |
| 191 | <col style="width: 140px"> | 191 | <col style="width: 140px"> |
| @@ -15,7 +15,7 @@ | |||
| 15 | 15 | ||
| 16 | - 算子功能:[UpsampleNearest3d](../upsample_nearest3d/README.md)的反向计算。 | 16 | - 算子功能:[UpsampleNearest3d](../upsample_nearest3d/README.md)的反向计算。 |
| 17 | - 计算公式: | 17 | - 计算公式: |
| 18 | - | 18 | + |
| 19 | 对于输入gradOut(N, C, d, h, w),输出gradInput上任意一点(N, C, D, H, W),则有: | 19 | 对于输入gradOut(N, C, d, h, w),输出gradInput上任意一点(N, C, D, H, W),则有: |
| 20 | 20 | ||
| 21 | $$ | 21 | $$ |
| @@ -25,39 +25,39 @@ | |||
| 25 | 其中: | 25 | 其中: |
| 26 | 26 | ||
| 27 | $$ | 27 | $$ |
| 28 | - scalesD = inputSize[2]/outputSize[0] | 28 | + scalesD = outputSize[0]/inputSize[2] |
| 29 | $$ | 29 | $$ |
| 30 | 30 | ||
| 31 | $$ | 31 | $$ |
| 32 | - scalesH = inputSize[3]/outputSize[1] | 32 | + scalesH = outputSize[1]/inputSize[3] |
| 33 | $$ | 33 | $$ |
| 34 | 34 | ||
| 35 | $$ | 35 | $$ |
| 36 | - scalesW = inputSize[4]/outputSize[2] | 36 | + scalesW = outputSize[2]/inputSize[4] |
| 37 | - $$ | ||
| 38 | - | ||
| 39 | - $$ | ||
| 40 | - srcD = Min(scalesD * D, outputSize[0]) | ||
| 41 | $$ | 37 | $$ |
| 42 | 38 | ||
| 43 | $$ | 39 | $$ |
| 44 | - srcDUp = Min(scalesD * (D + 1), outputSize[0]) | 40 | + srcD = Min(ceil(scalesD * D), outputSize[0]) |
| 45 | $$ | 41 | $$ |
| 46 | 42 | ||
| 47 | $$ | 43 | $$ |
| 48 | - srcH = Min(scalesH * H, outputSize[1]) | 44 | + srcDUp = Min(ceil(scalesD * (D + 1)), outputSize[0]) |
| 49 | $$ | 45 | $$ |
| 50 | 46 | ||
| 51 | $$ | 47 | $$ |
| 52 | - srcHUp = Min(scalesH * (H + 1), outputSize[1]) | 48 | + srcH = Min(ceil(scalesH * H), outputSize[1]) |
| 53 | $$ | 49 | $$ |
| 54 | 50 | ||
| 55 | $$ | 51 | $$ |
| 56 | - srcW = Min(scalesW * W, outputSize[2]) | 52 | + srcHUp = Min(ceil(scalesH * (H + 1)), outputSize[1]) |
| 57 | $$ | 53 | $$ |
| 58 | 54 | ||
| 59 | $$ | 55 | $$ |
| 60 | - srcHUp = Min(scalesW * (W + 1), outputSize[2]) | 56 | + srcW = Min(ceil(scalesW * W), outputSize[2]) |
| 57 | + $$ | ||
| 58 | + | ||
| 59 | + $$ | ||
| 60 | + srcWUp = Min(ceil(scalesW * (W + 1)), outputSize[2]) | ||
| 61 | $$ | 61 | $$ |
| 62 | 62 | ||
| 63 | ## 参数说明 | 63 | ## 参数说明 |
| @@ -27,39 +27,39 @@ | |||
| 27 | 其中: | 27 | 其中: |
| 28 | 28 | ||
| 29 | $$ | 29 | $$ |
| 30 | - scalesD = inputSize[2]/outputSize[0] | 30 | + scalesD = outputSize[0]/inputSize[2] |
| 31 | $$ | 31 | $$ |
| 32 | 32 | ||
| 33 | $$ | 33 | $$ |
| 34 | - scalesH = inputSize[3]/outputSize[1] | 34 | + scalesH = outputSize[1]/inputSize[3] |
| 35 | $$ | 35 | $$ |
| 36 | 36 | ||
| 37 | $$ | 37 | $$ |
| 38 | - scalesW = inputSize[4]/outputSize[2] | 38 | + scalesW = outputSize[2]/inputSize[4] |
| 39 | - $$ | ||
| 40 | - | ||
| 41 | - $$ | ||
| 42 | - srcD = Min(scalesD * D, outputSize[0]) | ||
| 43 | $$ | 39 | $$ |
| 44 | 40 | ||
| 45 | $$ | 41 | $$ |
| 46 | - srcDUp = Min(scalesD * (D + 1), outputSize[0]) | 42 | + srcD = Min(ceil(scalesD * D), outputSize[0]) |
| 47 | $$ | 43 | $$ |
| 48 | 44 | ||
| 49 | $$ | 45 | $$ |
| 50 | - srcH = Min(scalesH * H, outputSize[1]) | 46 | + srcDUp = Min(ceil(scalesD * (D + 1)), outputSize[0]) |
| 51 | $$ | 47 | $$ |
| 52 | 48 | ||
| 53 | $$ | 49 | $$ |
| 54 | - srcHUp = Min(scalesH * (H + 1), outputSize[1]) | 50 | + srcH = Min(ceil(scalesH * H), outputSize[1]) |
| 55 | $$ | 51 | $$ |
| 56 | 52 | ||
| 57 | $$ | 53 | $$ |
| 58 | - srcW = Min(scalesW * W, outputSize[2]) | 54 | + srcHUp = Min(ceil(scalesH * (H + 1)), outputSize[1]) |
| 59 | $$ | 55 | $$ |
| 60 | 56 | ||
| 61 | $$ | 57 | $$ |
| 62 | - srcHUp = Min(scalesW * (W + 1), outputSize[2]) | 58 | + srcW = Min(ceil(scalesW * W), outputSize[2]) |
| 59 | + $$ | ||
| 60 | + | ||
| 61 | + $$ | ||
| 62 | + srcWUp = Min(ceil(scalesW * (W + 1)), outputSize[2]) | ||
| 63 | $$ | 63 | $$ |
| 64 | 64 | ||
| 65 | ## 函数原型 | 65 | ## 函数原型 |
| @@ -68,22 +68,22 @@ | |||
| 68 | 68 | ||
| 69 | ```Cpp | 69 | ```Cpp |
| 70 | aclnnStatus aclnnUpsampleNearest3dBackwardGetWorkspaceSize( | 70 | aclnnStatus aclnnUpsampleNearest3dBackwardGetWorkspaceSize( |
| 71 | - const aclTensor *gradOut, | 71 | + const aclTensor *gradOut, |
| 72 | - const aclIntArray *outputSize, | 72 | + const aclIntArray *outputSize, |
| 73 | - const aclIntArray *inputSize, | 73 | + const aclIntArray *inputSize, |
| 74 | - double scalesD, | 74 | + double scalesD, |
| 75 | - double scalesH, | 75 | + double scalesH, |
| 76 | - double scalesW, | 76 | + double scalesW, |
| 77 | - aclTensor *gradInput, | 77 | + aclTensor *gradInput, |
| 78 | - uint64_t *workspaceSize, | 78 | + uint64_t *workspaceSize, |
| 79 | aclOpExecutor **executor) | 79 | aclOpExecutor **executor) |
| 80 | ``` | 80 | ``` |
| 81 | 81 | ||
| 82 | ```Cpp | 82 | ```Cpp |
| 83 | aclnnStatus aclnnUpsampleNearest3dBackward( | 83 | aclnnStatus aclnnUpsampleNearest3dBackward( |
| 84 | - void *workspace, | 84 | + void *workspace, |
| 85 | - uint64_t workspaceSize, | 85 | + uint64_t workspaceSize, |
| 86 | - aclOpExecutor *executor, | 86 | + aclOpExecutor *executor, |
| 87 | aclrtStream stream) | 87 | aclrtStream stream) |
| 88 | ``` | 88 | ``` |
| 89 | 89 | ||
| @@ -151,7 +151,7 @@ aclnnStatus aclnnUpsampleNearest3dBackward( | |||
| 151 | <td>-</td> | 151 | <td>-</td> |
| 152 | <td>-</td> | 152 | <td>-</td> |
| 153 | <td>-</td> | 153 | <td>-</td> |
| 154 | - </tr> | 154 | + </tr> |
| 155 | <tr> | 155 | <tr> |
| 156 | <td>scalesH(double)</td> | 156 | <td>scalesH(double)</td> |
| 157 | <td>输入</td> | 157 | <td>输入</td> |
| @@ -161,7 +161,7 @@ aclnnStatus aclnnUpsampleNearest3dBackward( | |||
| 161 | <td>-</td> | 161 | <td>-</td> |
| 162 | <td>-</td> | 162 | <td>-</td> |
| 163 | <td>-</td> | 163 | <td>-</td> |
| 164 | - </tr> | 164 | + </tr> |
| 165 | <tr> | 165 | <tr> |
| 166 | <td>scalesW(double)</td> | 166 | <td>scalesW(double)</td> |
| 167 | <td>输入</td> | 167 | <td>输入</td> |
| @@ -210,7 +210,7 @@ aclnnStatus aclnnUpsampleNearest3dBackward( | |||
| 210 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 210 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 211 | 211 | ||
| 212 | 第一段接口完成入参校验,出现以下场景时报错: | 212 | 第一段接口完成入参校验,出现以下场景时报错: |
| 213 | - | 213 | + |
| 214 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 214 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| 215 | <col style="width: 268px"> | 215 | <col style="width: 268px"> |
| 216 | <col style="width: 140px"> | 216 | <col style="width: 140px"> |
| @@ -310,15 +310,16 @@ aclnnStatus aclnnUpsampleNearest3dBackward( | |||
| 310 | - 参数`gradOut`、`gradInput`的shape约束: | 310 | - 参数`gradOut`、`gradInput`的shape约束: |
| 311 | - 每个维度的取值小于等于2^20。 | 311 | - 每个维度的取值小于等于2^20。 |
| 312 | - 参数`gradInput`的N轴和C轴与`gradOut`保持一致。 | 312 | - 参数`gradInput`的N轴和C轴与`gradOut`保持一致。 |
| 313 | - - 内存占用需小于60G。内存占用的计算公式如下: | 313 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 314 | 314 | ||
| 315 | $$ | 315 | $$ |
| 316 | - N * C * (gradOut\_D * gradOut\_H * gradOut\_W + gradInput\_D * gradInput\_H * gradInput\_W + gradOut\_D * gradOut\_H * gradInput\_W + gradOut\_D * gradInput\_H * gradInput\_W) * sizeof(float) < 60 * 1024 * 1024 * 1024 | 316 | + N * C * (gradOut\_D * gradOut\_H * gradOut\_W + gradInput\_D * gradInput\_H * gradInput\_W + gradOut\_D * gradOut\_H * gradInput\_W + gradOut\_D * gradInput\_H * gradInput\_W) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 317 | $$ | 317 | $$ |
| 318 | 318 | ||
| 319 | 其中: | 319 | 其中: |
| 320 | - N代表输入和输出的N轴。 | 320 | - N代表输入和输出的N轴。 |
| 321 | - C代表输入和输出的C轴。 | 321 | - C代表输入和输出的C轴。 |
| 322 | + - dtype代表输入张量的数据类型。 | ||
| 322 | - N \* C \* gradOut_D \* gradOut_H < 2^31 | 323 | - N \* C \* gradOut_D \* gradOut_H < 2^31 |
| 323 | - gradInput_W * gradInput_H < 2^31 | 324 | - gradInput_W * gradInput_H < 2^31 |
| 324 | - 参数gradOut、gradInput的数据格式不为NCDHW或NDHWC时,输入其他数据格式默认按NCDHW处理。 | 325 | - 参数gradOut、gradInput的数据格式不为NCDHW或NDHWC时,输入其他数据格式默认按NCDHW处理。 |
| @@ -327,7 +328,7 @@ aclnnStatus aclnnUpsampleNearest3dBackward( | |||
| 327 | $$ | 328 | $$ |
| 328 | outputSize\_D = floor(inputSize\_D * scalesD) | 329 | outputSize\_D = floor(inputSize\_D * scalesD) |
| 329 | $$ | 330 | $$ |
| 330 | - | 331 | + |
| 331 | $$ | 332 | $$ |
| 332 | outputSize\_H = floor(inputSize\_H * scalesH) | 333 | outputSize\_H = floor(inputSize\_H * scalesH) |
| 333 | $$ | 334 | $$ |
| @@ -15,7 +15,7 @@ | |||
| 15 | 15 | ||
| 16 | - 算子功能:[UpsampleNearest](../upsample_nearest/README.md)在exact_mode为true时的反向传播。 | 16 | - 算子功能:[UpsampleNearest](../upsample_nearest/README.md)在exact_mode为true时的反向传播。 |
| 17 | - 计算公式: | 17 | - 计算公式: |
| 18 | - | 18 | + |
| 19 | 对于输入gradOut(N, C, h, w),输出gradInput上任意一点(N, C, H, W),则有: | 19 | 对于输入gradOut(N, C, h, w),输出gradInput上任意一点(N, C, H, W),则有: |
| 20 | 20 | ||
| 21 | $$ | 21 | $$ |
| @@ -25,27 +25,27 @@ | |||
| 25 | 其中: | 25 | 其中: |
| 26 | 26 | ||
| 27 | $$ | 27 | $$ |
| 28 | - scalesH = inputSize[2]/outputSize[0] | 28 | + scalesH = outputSize[0]/inputSize[2] |
| 29 | $$ | 29 | $$ |
| 30 | 30 | ||
| 31 | $$ | 31 | $$ |
| 32 | - scalesW = inputSize[3]/outputSize[1] | 32 | + scalesW = outputSize[1]/inputSize[3] |
| 33 | $$ | 33 | $$ |
| 34 | 34 | ||
| 35 | $$ | 35 | $$ |
| 36 | - srcH = Min(scalesH * H - 0.5, outputSize[0]) | 36 | + srcH = Min(ceil(scalesH * H - 0.5), outputSize[0]) |
| 37 | $$ | 37 | $$ |
| 38 | 38 | ||
| 39 | $$ | 39 | $$ |
| 40 | - srcHUp = Min(scalesH * (H + 1) - 0.5, outputSize[0]) | 40 | + srcHUp = Min(ceil(scalesH * (H + 1) - 0.5), outputSize[0]) |
| 41 | $$ | 41 | $$ |
| 42 | 42 | ||
| 43 | $$ | 43 | $$ |
| 44 | - srcW = Min(scalesW * W - 0.5, outputSize[1]) | 44 | + srcW = Min(ceil(scalesW * W - 0.5), outputSize[1]) |
| 45 | $$ | 45 | $$ |
| 46 | 46 | ||
| 47 | $$ | 47 | $$ |
| 48 | - srcHUp = Min(scalesW * (W + 1) - 0.5, outputSize[1]) | 48 | + srcWUp = Min(ceil(scalesW * (W + 1) - 0.5), outputSize[1]) |
| 49 | $$ | 49 | $$ |
| 50 | 50 | ||
| 51 | ## 参数说明 | 51 | ## 参数说明 |
| @@ -17,7 +17,7 @@ | |||
| 17 | 17 | ||
| 18 | - 接口功能:[aclnnUpsampleNearestExact1d](../../upsample_nearest/docs/aclnnUpsampleNearestExact1d.md)的反向传播。通过计算输出梯度张量的点映射到输入梯度张量的位置,将输出梯度的值累加到输入梯度张量上。 | 18 | - 接口功能:[aclnnUpsampleNearestExact1d](../../upsample_nearest/docs/aclnnUpsampleNearestExact1d.md)的反向传播。通过计算输出梯度张量的点映射到输入梯度张量的位置,将输出梯度的值累加到输入梯度张量上。 |
| 19 | - 计算公式: | 19 | - 计算公式: |
| 20 | - | 20 | + |
| 21 | 对于输入gradOut(N, C, l),输出gradInput上任意一点(N, C, L),则有: | 21 | 对于输入gradOut(N, C, l),输出gradInput上任意一点(N, C, L),则有: |
| 22 | 22 | ||
| 23 | $$ | 23 | $$ |
| @@ -27,15 +27,15 @@ | |||
| 27 | 其中: | 27 | 其中: |
| 28 | 28 | ||
| 29 | $$ | 29 | $$ |
| 30 | - scalesL = inputSize[2]/outputSize[0] | 30 | + scalesL = outputSize[0]/inputSize[2] |
| 31 | $$ | 31 | $$ |
| 32 | 32 | ||
| 33 | $$ | 33 | $$ |
| 34 | - srcL = Min(scalesL * L - 0.5, outputSize[0]) | 34 | + srcL = Min(ceil(scalesL * L - 0.5), outputSize[0]) |
| 35 | $$ | 35 | $$ |
| 36 | 36 | ||
| 37 | $$ | 37 | $$ |
| 38 | - srcLUp = Min(scalesL * (L + 1) - 0.5, outputSize[0]) | 38 | + srcLUp = Min(ceil(scalesL * (L + 1) - 0.5), outputSize[0]) |
| 39 | $$ | 39 | $$ |
| 40 | 40 | ||
| 41 | ## 函数原型 | 41 | ## 函数原型 |
| @@ -44,20 +44,20 @@ | |||
| 44 | 44 | ||
| 45 | ```cpp | 45 | ```cpp |
| 46 | aclnnStatus aclnnUpsampleNearestExact1dBackwardGetWorkspaceSize( | 46 | aclnnStatus aclnnUpsampleNearestExact1dBackwardGetWorkspaceSize( |
| 47 | - const aclTensor *gradOutput, | 47 | + const aclTensor *gradOutput, |
| 48 | - const aclIntArray *outputSize, | 48 | + const aclIntArray *outputSize, |
| 49 | - const aclIntArray *inputSize, | 49 | + const aclIntArray *inputSize, |
| 50 | - double scales, | 50 | + double scales, |
| 51 | - aclTensor *out, | 51 | + aclTensor *out, |
| 52 | - uint64_t *workspaceSize, | 52 | + uint64_t *workspaceSize, |
| 53 | aclOpExecutor **executor) | 53 | aclOpExecutor **executor) |
| 54 | ``` | 54 | ``` |
| 55 | 55 | ||
| 56 | ```cpp | 56 | ```cpp |
| 57 | aclnnStatus aclnnUpsampleNearestExact1dBackward( | 57 | aclnnStatus aclnnUpsampleNearestExact1dBackward( |
| 58 | - void *workspace, | 58 | + void *workspace, |
| 59 | - uint64_t workspaceSize, | 59 | + uint64_t workspaceSize, |
| 60 | - aclOpExecutor *executor, | 60 | + aclOpExecutor *executor, |
| 61 | aclrtStream stream) | 61 | aclrtStream stream) |
| 62 | ``` | 62 | ``` |
| 63 | 63 | ||
| @@ -119,7 +119,7 @@ aclnnStatus aclnnUpsampleNearestExact1dBackward( | |||
| 119 | <tr> | 119 | <tr> |
| 120 | <td>scales(double)</td> | 120 | <td>scales(double)</td> |
| 121 | <td>输入</td> | 121 | <td>输入</td> |
| 122 | - <td>表示输出out的缩放系数。</td> | 122 | + <td>公式中的`scalesL`,表示输出out的缩放系数。</td> |
| 123 | <td>不能传入负值。</td> | 123 | <td>不能传入负值。</td> |
| 124 | <td>-</td> | 124 | <td>-</td> |
| 125 | <td>-</td> | 125 | <td>-</td> |
| @@ -164,7 +164,7 @@ aclnnStatus aclnnUpsampleNearestExact1dBackward( | |||
| 164 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 164 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 165 | 165 | ||
| 166 | 第一段接口完成入参校验,出现以下场景时报错: | 166 | 第一段接口完成入参校验,出现以下场景时报错: |
| 167 | - | 167 | + |
| 168 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 168 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| 169 | <col style="width: 268px"> | 169 | <col style="width: 268px"> |
| 170 | <col style="width: 140px"> | 170 | <col style="width: 140px"> |
| @@ -249,8 +249,8 @@ aclnnStatus aclnnUpsampleNearestExact1dBackward( | |||
| 249 | 249 | ||
| 250 | ## 约束说明 | 250 | ## 约束说明 |
| 251 | 251 | ||
| 252 | -- 输入数据缩放场景放大倍数必须小于等于50,即: | 252 | +- 反向接口的输入数据缩小倍数必须小于等于50,即: |
| 253 | - | 253 | + |
| 254 | $$ | 254 | $$ |
| 255 | outputSize[0]/输出shape的高度L <= 50 | 255 | outputSize[0]/输出shape的高度L <= 50 |
| 256 | $$ | 256 | $$ |
| @@ -17,7 +17,7 @@ | |||
| 17 | 17 | ||
| 18 | - 接口功能:[aclnnUpsampleNearestExact2d](../../upsample_nearest/docs/aclnnUpsampleNearestExact2d.md)的反向传播。 | 18 | - 接口功能:[aclnnUpsampleNearestExact2d](../../upsample_nearest/docs/aclnnUpsampleNearestExact2d.md)的反向传播。 |
| 19 | - 计算公式: | 19 | - 计算公式: |
| 20 | - | 20 | + |
| 21 | 对于输入gradOut(N, C, h, w),输出gradInput上任意一点(N, C, H, W),则有: | 21 | 对于输入gradOut(N, C, h, w),输出gradInput上任意一点(N, C, H, W),则有: |
| 22 | 22 | ||
| 23 | $$ | 23 | $$ |
| @@ -27,50 +27,50 @@ | |||
| 27 | 其中: | 27 | 其中: |
| 28 | 28 | ||
| 29 | $$ | 29 | $$ |
| 30 | - scalesH = inputSize[2]/outputSize[0] | 30 | + scalesH = outputSize[0]/inputSize[2] |
| 31 | $$ | 31 | $$ |
| 32 | 32 | ||
| 33 | $$ | 33 | $$ |
| 34 | - scalesW = inputSize[3]/outputSize[1] | 34 | + scalesW = outputSize[1]/inputSize[3] |
| 35 | $$ | 35 | $$ |
| 36 | 36 | ||
| 37 | $$ | 37 | $$ |
| 38 | - srcH = Min(scalesH * H - 0.5, outputSize[0]) | 38 | + srcH = Min(ceil(scalesH * H - 0.5), outputSize[0]) |
| 39 | $$ | 39 | $$ |
| 40 | 40 | ||
| 41 | $$ | 41 | $$ |
| 42 | - srcHUp = Min(scalesH * (H + 1) - 0.5, outputSize[0]) | 42 | + srcHUp = Min(ceil(scalesH * (H + 1) - 0.5), outputSize[0]) |
| 43 | $$ | 43 | $$ |
| 44 | 44 | ||
| 45 | $$ | 45 | $$ |
| 46 | - srcW = Min(scalesW * W - 0.5, outputSize[1]) | 46 | + srcW = Min(ceil(scalesW * W - 0.5), outputSize[1]) |
| 47 | $$ | 47 | $$ |
| 48 | 48 | ||
| 49 | $$ | 49 | $$ |
| 50 | - srcHUp = Min(scalesW * (W + 1) - 0.5, outputSize[1]) | 50 | + srcWUp = Min(ceil(scalesW * (W + 1) - 0.5), outputSize[1]) |
| 51 | $$ | 51 | $$ |
| 52 | - | 52 | + |
| 53 | ## 函数原型 | 53 | ## 函数原型 |
| 54 | 54 | ||
| 55 | 每个算子分为[两段式接口](../../../docs/zh/context/两段式接口.md),必须先调用“aclnnUpsampleNearestExact2dBackwardGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnUpsampleNearestExact2dBackward”接口执行计算。 | 55 | 每个算子分为[两段式接口](../../../docs/zh/context/两段式接口.md),必须先调用“aclnnUpsampleNearestExact2dBackwardGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnUpsampleNearestExact2dBackward”接口执行计算。 |
| 56 | 56 | ||
| 57 | ```Cpp | 57 | ```Cpp |
| 58 | aclnnStatus aclnnUpsampleNearestExact2dBackwardGetWorkspaceSize( | 58 | aclnnStatus aclnnUpsampleNearestExact2dBackwardGetWorkspaceSize( |
| 59 | - const aclTensor *gradOutput, | 59 | + const aclTensor *gradOutput, |
| 60 | - const aclIntArray *outputSize, | 60 | + const aclIntArray *outputSize, |
| 61 | - const aclIntArray *inputSize, | 61 | + const aclIntArray *inputSize, |
| 62 | - double scalesH, | 62 | + double scalesH, |
| 63 | - double scalesW, | 63 | + double scalesW, |
| 64 | - aclTensor *out, | 64 | + aclTensor *out, |
| 65 | - uint64_t *workspaceSize, | 65 | + uint64_t *workspaceSize, |
| 66 | aclOpExecutor **executor) | 66 | aclOpExecutor **executor) |
| 67 | ``` | 67 | ``` |
| 68 | 68 | ||
| 69 | ```Cpp | 69 | ```Cpp |
| 70 | aclnnStatus aclnnUpsampleNearestExact2dBackward( | 70 | aclnnStatus aclnnUpsampleNearestExact2dBackward( |
| 71 | - void *workspace, | 71 | + void *workspace, |
| 72 | - uint64_t workspaceSize, | 72 | + uint64_t workspaceSize, |
| 73 | - aclOpExecutor *executor, | 73 | + aclOpExecutor *executor, |
| 74 | aclrtStream stream) | 74 | aclrtStream stream) |
| 75 | ``` | 75 | ``` |
| 76 | 76 | ||
| @@ -182,7 +182,7 @@ aclnnStatus aclnnUpsampleNearestExact2dBackward( | |||
| 182 | </tr> | 182 | </tr> |
| 183 | </tbody> | 183 | </tbody> |
| 184 | </table> | 184 | </table> |
| 185 | - | 185 | + |
| 186 | - **返回值** | 186 | - **返回值** |
| 187 | 187 | ||
| 188 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 188 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| @@ -274,12 +274,12 @@ aclnnStatus aclnnUpsampleNearestExact2dBackward( | |||
| 274 | 274 | ||
| 275 | ## 约束说明 | 275 | ## 约束说明 |
| 276 | 276 | ||
| 277 | -- 输入数据缩放场景放大倍数必须小于等于50,即: | 277 | +- 反向接口的输入数据缩小倍数必须小于等于50,即: |
| 278 | 278 | ||
| 279 | $$ | 279 | $$ |
| 280 | outputSize\_H / 输出shape的高度H <= 50 | 280 | outputSize\_H / 输出shape的高度H <= 50 |
| 281 | $$ | 281 | $$ |
| 282 | - | 282 | + |
| 283 | $$ | 283 | $$ |
| 284 | outputSize\_W / 输出shape的宽度W <=50 | 284 | outputSize\_W / 输出shape的宽度W <=50 |
| 285 | $$ | 285 | $$ |
| @@ -19,15 +19,15 @@ | |||
| 19 | - 计算公式: | 19 | - 计算公式: |
| 20 | 20 | ||
| 21 | $$ | 21 | $$ |
| 22 | - d_{src} = min(floor((d_{dst} + 0.5) / scalesD), D - 1),scalesD = outputSize[0] / D | 22 | + d_{src} = min(floor((d_{dst} + 0.5) / scalesD), D - 1), \quad scalesD = outputSize[0] / D |
| 23 | $$ | 23 | $$ |
| 24 | 24 | ||
| 25 | $$ | 25 | $$ |
| 26 | - h_{src} = min(floor((h_{dst} + 0.5) / scalesH), H - 1),scalesH = outputSize[1] / H | 26 | + h_{src} = min(floor((h_{dst} + 0.5) / scalesH), H - 1), \quad scalesH = outputSize[1] / H |
| 27 | $$ | 27 | $$ |
| 28 | 28 | ||
| 29 | $$ | 29 | $$ |
| 30 | - w_{src} = min(floor((w_{dst} + 0.5) / scalesW), W - 1),scalesW = outputSize[2] / W | 30 | + w_{src} = min(floor((w_{dst} + 0.5) / scalesW), W - 1), \quad scalesW = outputSize[2] / W |
| 31 | $$ | 31 | $$ |
| 32 | 32 | ||
| 33 | $$ | 33 | $$ |
| @@ -19,15 +19,15 @@ | |||
| 19 | - 计算公式: | 19 | - 计算公式: |
| 20 | 20 | ||
| 21 | $$ | 21 | $$ |
| 22 | - d_{src} = min(floor((d_{dst} + 0.5) / scalesD), D - 1),scalesD = outputSize[0] / D | 22 | + d_{src} = min(floor((d_{dst} + 0.5) / scalesD), D - 1), \quad scalesD = outputSize[0] / D |
| 23 | $$ | 23 | $$ |
| 24 | 24 | ||
| 25 | $$ | 25 | $$ |
| 26 | - h_{src} = min(floor((h_{dst} + 0.5) / scalesH), H - 1),scalesH = outputSize[1] / H | 26 | + h_{src} = min(floor((h_{dst} + 0.5) / scalesH), H - 1), \quad scalesH = outputSize[1] / H |
| 27 | $$ | 27 | $$ |
| 28 | 28 | ||
| 29 | $$ | 29 | $$ |
| 30 | - w_{src} = min(floor((w_{dst} + 0.5) / scalesW), W - 1),scalesW = outputSize[2] / W | 30 | + w_{src} = min(floor((w_{dst} + 0.5) / scalesW), W - 1), \quad scalesW = outputSize[2] / W |
| 31 | $$ | 31 | $$ |
| 32 | 32 | ||
| 33 | $$ | 33 | $$ |
| @@ -40,21 +40,21 @@ | |||
| 40 | 40 | ||
| 41 | ```Cpp | 41 | ```Cpp |
| 42 | aclnnStatus aclnnUpsampleNearestExact3dGetWorkspaceSize( | 42 | aclnnStatus aclnnUpsampleNearestExact3dGetWorkspaceSize( |
| 43 | - const aclTensor *self, | 43 | + const aclTensor *self, |
| 44 | - const aclIntArray *outputSize, | 44 | + const aclIntArray *outputSize, |
| 45 | - double scalesD, | 45 | + double scalesD, |
| 46 | - double scalesH, | 46 | + double scalesH, |
| 47 | - double scalesW, | 47 | + double scalesW, |
| 48 | - aclTensor *out, | 48 | + aclTensor *out, |
| 49 | - uint64_t *workspaceSize, | 49 | + uint64_t *workspaceSize, |
| 50 | aclOpExecutor **executor) | 50 | aclOpExecutor **executor) |
| 51 | ``` | 51 | ``` |
| 52 | 52 | ||
| 53 | ```Cpp | 53 | ```Cpp |
| 54 | aclnnStatus aclnnUpsampleNearestExact3d( | 54 | aclnnStatus aclnnUpsampleNearestExact3d( |
| 55 | - void *workspace, | 55 | + void *workspace, |
| 56 | - uint64_t workspaceSize, | 56 | + uint64_t workspaceSize, |
| 57 | - aclOpExecutor *executor, | 57 | + aclOpExecutor *executor, |
| 58 | aclrtStream stream) | 58 | aclrtStream stream) |
| 59 | ``` | 59 | ``` |
| 60 | 60 | ||
| @@ -168,7 +168,7 @@ aclnnStatus aclnnUpsampleNearestExact3d( | |||
| 168 | </table> | 168 | </table> |
| 169 | 169 | ||
| 170 | - <term>Atlas 推理系列产品</term>: | 170 | - <term>Atlas 推理系列产品</term>: |
| 171 | - | 171 | + |
| 172 | 参数`self`、`out`的数据类型仅支持FLOAT32、FLOAT16。 | 172 | 参数`self`、`out`的数据类型仅支持FLOAT32、FLOAT16。 |
| 173 | 173 | ||
| 174 | - **返回值** | 174 | - **返回值** |
| @@ -15,7 +15,7 @@ | |||
| 15 | 15 | ||
| 16 | - 算子功能:[UpsampleNearestExact3d](../upsample_nearest_exact3d/README.md)的反向计算。 | 16 | - 算子功能:[UpsampleNearestExact3d](../upsample_nearest_exact3d/README.md)的反向计算。 |
| 17 | - 计算公式: | 17 | - 计算公式: |
| 18 | - | 18 | + |
| 19 | 对于输入gradOut(N, C, d, h, w),输出gradInput上任意一点(N, C, D, H, W),则有: | 19 | 对于输入gradOut(N, C, d, h, w),输出gradInput上任意一点(N, C, D, H, W),则有: |
| 20 | 20 | ||
| 21 | $$ | 21 | $$ |
| @@ -25,39 +25,39 @@ | |||
| 25 | 其中: | 25 | 其中: |
| 26 | 26 | ||
| 27 | $$ | 27 | $$ |
| 28 | - scalesD = inputSize[2]/outputSize[0] | 28 | + scalesD = outputSize[0]/inputSize[2] |
| 29 | $$ | 29 | $$ |
| 30 | 30 | ||
| 31 | $$ | 31 | $$ |
| 32 | - scalesH = inputSize[3]/outputSize[1] | 32 | + scalesH = outputSize[1]/inputSize[3] |
| 33 | $$ | 33 | $$ |
| 34 | 34 | ||
| 35 | $$ | 35 | $$ |
| 36 | - scalesW = inputSize[4]/outputSize[2] | 36 | + scalesW = outputSize[2]/inputSize[4] |
| 37 | - $$ | ||
| 38 | - | ||
| 39 | - $$ | ||
| 40 | - srcD = Min(scalesD * D - 0.5, outputSize[0]) | ||
| 41 | $$ | 37 | $$ |
| 42 | 38 | ||
| 43 | $$ | 39 | $$ |
| 44 | - srcDUp = Min(scalesD * (D + 1) -0.5, outputSize[0]) | 40 | + srcD = Min(ceil(scalesD * D - 0.5), outputSize[0]) |
| 45 | $$ | 41 | $$ |
| 46 | 42 | ||
| 47 | $$ | 43 | $$ |
| 48 | - srcH = Min(scalesH * H - 0.5, outputSize[1]) | 44 | + srcDUp = Min(ceil(scalesD * (D + 1) -0.5), outputSize[0]) |
| 49 | $$ | 45 | $$ |
| 50 | 46 | ||
| 51 | $$ | 47 | $$ |
| 52 | - srcHUp = Min(scalesH * (H + 1) -0.5, outputSize[1]) | 48 | + srcH = Min(ceil(scalesH * H - 0.5), outputSize[1]) |
| 53 | $$ | 49 | $$ |
| 54 | 50 | ||
| 55 | $$ | 51 | $$ |
| 56 | - srcW = Min(scalesW * W - 0.5, outputSize[2]) | 52 | + srcHUp = Min(ceil(scalesH * (H + 1) -0.5), outputSize[1]) |
| 57 | $$ | 53 | $$ |
| 58 | 54 | ||
| 59 | $$ | 55 | $$ |
| 60 | - srcHUp = Min(scalesW * (W + 1) -0.5, outputSize[2]) | 56 | + srcW = Min(ceil(scalesW * W - 0.5), outputSize[2]) |
| 57 | + $$ | ||
| 58 | + | ||
| 59 | + $$ | ||
| 60 | + srcWUp = Min(ceil(scalesW * (W + 1) -0.5), outputSize[2]) | ||
| 61 | $$ | 61 | $$ |
| 62 | 62 | ||
| 63 | ## 参数说明 | 63 | ## 参数说明 |
| @@ -27,39 +27,39 @@ | |||
| 27 | 其中: | 27 | 其中: |
| 28 | 28 | ||
| 29 | $$ | 29 | $$ |
| 30 | - scalesD = inputSize[2]/outputSize[0] | 30 | + scalesD = outputSize[0]/inputSize[2] |
| 31 | $$ | 31 | $$ |
| 32 | 32 | ||
| 33 | $$ | 33 | $$ |
| 34 | - scalesH = inputSize[3]/outputSize[1] | 34 | + scalesH = outputSize[1]/inputSize[3] |
| 35 | $$ | 35 | $$ |
| 36 | 36 | ||
| 37 | $$ | 37 | $$ |
| 38 | - scalesW = inputSize[4]/outputSize[2] | 38 | + scalesW = outputSize[2]/inputSize[4] |
| 39 | - $$ | ||
| 40 | - | ||
| 41 | - $$ | ||
| 42 | - srcD = Min(scalesD * D - 0.5, outputSize[0]) | ||
| 43 | $$ | 39 | $$ |
| 44 | 40 | ||
| 45 | $$ | 41 | $$ |
| 46 | - srcDUp = Min(scalesD * (D + 1) -0.5, outputSize[0]) | 42 | + srcD = Min(ceil(scalesD * D - 0.5), outputSize[0]) |
| 47 | $$ | 43 | $$ |
| 48 | 44 | ||
| 49 | $$ | 45 | $$ |
| 50 | - srcH = Min(scalesH * H - 0.5, outputSize[1]) | 46 | + srcDUp = Min(ceil(scalesD * (D + 1) - 0.5), outputSize[0]) |
| 51 | $$ | 47 | $$ |
| 52 | 48 | ||
| 53 | $$ | 49 | $$ |
| 54 | - srcHUp = Min(scalesH * (H + 1) -0.5, outputSize[1]) | 50 | + srcH = Min(ceil(scalesH * H - 0.5), outputSize[1]) |
| 55 | $$ | 51 | $$ |
| 56 | 52 | ||
| 57 | $$ | 53 | $$ |
| 58 | - srcW = Min(scalesW * W - 0.5, outputSize[2]) | 54 | + srcHUp = Min(ceil(scalesH * (H + 1) - 0.5), outputSize[1]) |
| 59 | $$ | 55 | $$ |
| 60 | 56 | ||
| 61 | $$ | 57 | $$ |
| 62 | - srcHUp = Min(scalesW * (W + 1) -0.5, outputSize[2]) | 58 | + srcW = Min(ceil(scalesW * W - 0.5), outputSize[2]) |
| 59 | + $$ | ||
| 60 | + | ||
| 61 | + $$ | ||
| 62 | + srcWUp = Min(ceil(scalesW * (W + 1) - 0.5), outputSize[2]) | ||
| 63 | $$ | 63 | $$ |
| 64 | 64 | ||
| 65 | ## 函数原型 | 65 | ## 函数原型 |
| @@ -68,22 +68,22 @@ | |||
| 68 | 68 | ||
| 69 | ```Cpp | 69 | ```Cpp |
| 70 | aclnnStatus aclnnUpsampleNearestExact3dBackwardGetWorkspaceSize( | 70 | aclnnStatus aclnnUpsampleNearestExact3dBackwardGetWorkspaceSize( |
| 71 | - const aclTensor *gradOut, | 71 | + const aclTensor *gradOut, |
| 72 | - const aclIntArray *outputSize, | 72 | + const aclIntArray *outputSize, |
| 73 | - const aclIntArray *inputSize, | 73 | + const aclIntArray *inputSize, |
| 74 | - double scalesD, | 74 | + double scalesD, |
| 75 | - double scalesH, | 75 | + double scalesH, |
| 76 | - double scalesW, | 76 | + double scalesW, |
| 77 | - aclTensor *gradInput, | 77 | + aclTensor *gradInput, |
| 78 | - uint64_t *workspaceSize, | 78 | + uint64_t *workspaceSize, |
| 79 | aclOpExecutor **executor) | 79 | aclOpExecutor **executor) |
| 80 | ``` | 80 | ``` |
| 81 | 81 | ||
| 82 | ```Cpp | 82 | ```Cpp |
| 83 | aclnnStatus aclnnUpsampleNearestExact3dBackward( | 83 | aclnnStatus aclnnUpsampleNearestExact3dBackward( |
| 84 | - void *workspace, | 84 | + void *workspace, |
| 85 | - uint64_t workspaceSize, | 85 | + uint64_t workspaceSize, |
| 86 | - aclOpExecutor *executor, | 86 | + aclOpExecutor *executor, |
| 87 | aclrtStream stream) | 87 | aclrtStream stream) |
| 88 | ``` | 88 | ``` |
| 89 | 89 | ||
| @@ -211,7 +211,7 @@ aclnnStatus aclnnUpsampleNearestExact3dBackward( | |||
| 211 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 211 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 212 | 212 | ||
| 213 | 第一段接口完成入参校验,出现以下场景时报错: | 213 | 第一段接口完成入参校验,出现以下场景时报错: |
| 214 | - | 214 | + |
| 215 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 215 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| 216 | <col style="width: 268px"> | 216 | <col style="width: 268px"> |
| 217 | <col style="width: 140px"> | 217 | <col style="width: 140px"> |
| @@ -315,19 +315,20 @@ aclnnStatus aclnnUpsampleNearestExact3dBackward( | |||
| 315 | - 参数`gradOut`、`gradInput`的shape约束: | 315 | - 参数`gradOut`、`gradInput`的shape约束: |
| 316 | - 每个维度的取值小于等于2^20。 | 316 | - 每个维度的取值小于等于2^20。 |
| 317 | - 参数`gradInput`的N轴和C轴与`gradOut`保持一致。 | 317 | - 参数`gradInput`的N轴和C轴与`gradOut`保持一致。 |
| 318 | - - 内存占用需小于60G。内存占用的计算公式如下: | 318 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 319 | 319 | ||
| 320 | $$ | 320 | $$ |
| 321 | - N * C * (gradOut\_D * gradOut\_H * gradOut\_W + gradInput\_D * gradInput\_H * gradInput\_W + gradOut\_D * gradOut\_H * gradInput\_W + gradOut\_D * gradInput\_H * gradInput\_W) * sizeof(float) < 60 * 1024 * 1024 * 1024 | 321 | + N * C * (gradOut\_D * gradOut\_H * gradOut\_W + gradInput\_D * gradInput\_H * gradInput\_W + gradOut\_D * gradOut\_H * gradInput\_W + gradOut\_D * gradInput\_H * gradInput\_W) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 322 | $$ | 322 | $$ |
| 323 | 323 | ||
| 324 | 其中: | 324 | 其中: |
| 325 | - N代表输入和输出的N轴。 | 325 | - N代表输入和输出的N轴。 |
| 326 | - C代表输入和输出的C轴。 | 326 | - C代表输入和输出的C轴。 |
| 327 | + - dtype代表输入张量的数据类型。 | ||
| 327 | - N \* C \* gradOut_D \* gradOut_H < 2^31 | 328 | - N \* C \* gradOut_D \* gradOut_H < 2^31 |
| 328 | - gradInput_W * gradInput_H < 2^31 | 329 | - gradInput_W * gradInput_H < 2^31 |
| 329 | - 参数gradOut、gradInput的数据格式不为NCDHW或NDHWC时,输入其他数据格式默认按NCDHW处理。 | 330 | - 参数gradOut、gradInput的数据格式不为NCDHW或NDHWC时,输入其他数据格式默认按NCDHW处理。 |
| 330 | -- 输入数据缩放场景放大倍数必须小于等于50,即: | 331 | +- 反向接口的输入数据缩小倍数必须小于等于50,即: |
| 331 | 332 | ||
| 332 | $$ | 333 | $$ |
| 333 | outputSize\_D / 输出shape的深度D <= 50 | 334 | outputSize\_D / 输出shape的深度D <= 50 |
| @@ -336,7 +337,7 @@ aclnnStatus aclnnUpsampleNearestExact3dBackward( | |||
| 336 | $$ | 337 | $$ |
| 337 | outputSize\_H / 输出shape的高度H <= 50 | 338 | outputSize\_H / 输出shape的高度H <= 50 |
| 338 | $$ | 339 | $$ |
| 339 | - | 340 | + |
| 340 | $$ | 341 | $$ |
| 341 | outputSize\_W / 输出shape的宽度W <=50 | 342 | outputSize\_W / 输出shape的宽度W <=50 |
| 342 | $$ | 343 | $$ |
| @@ -346,7 +347,7 @@ aclnnStatus aclnnUpsampleNearestExact3dBackward( | |||
| 346 | $$ | 347 | $$ |
| 347 | outputSize\_D = floor(inputSize\_D * scalesD) | 348 | outputSize\_D = floor(inputSize\_D * scalesD) |
| 348 | $$ | 349 | $$ |
| 349 | - | 350 | + |
| 350 | $$ | 351 | $$ |
| 351 | outputSize\_H = floor(inputSize\_H * scalesH) | 352 | outputSize\_H = floor(inputSize\_H * scalesH) |
| 352 | $$ | 353 | $$ |
| @@ -90,11 +90,11 @@ | |||
| 90 | - 则有以下公式: | 90 | - 则有以下公式: |
| 91 | 91 | ||
| 92 | $$ | 92 | $$ |
| 93 | - {V(p_{x, y, z})} = {V(p_{x0, y0, z0})} * {lambda_{0}} * {lambdb_{0}} * {lambdc_{0}} + {V(p_{x0, y0, z1})} * {lambda_{0}} * {lambdb_{0}} * {lambdc_{1}} + {V(p_{x0, y1, z0})} * {lambda_{0}} * {lambdb_{1}} * {lambdc_{0}} + {V(p_{x0, y1, z1})} * {lambda_{0}} * {lambdb_{1}} * {lambdc_{1}} + {V(p_{x1, y0, z0})} * {lambda_{1}} * {lambdb_{0}} * {lambdc_{0}} + {V(p_{x1, y0, z1})} * {lambda_{1}} * {lambdb_{0}} * {lambdc_{1}} + {V(p_{x1, y1, z0})} * {lambda_{1}} * {lambdb_{1}} * {lambdc_{0}} + {V(p_{x1, y1, z1})} * {lambda_{1}} * {lambdb_{1}} * {lambdc_{1}} | 93 | + {V(p_{x, y, z})} = {V(p_{x0, y0, z0})} * {lambda_{0}} * {lambdb_{0}} * {lambdc_{0}} + {V(p_{x0, y0, z1})} * {lambda_{0}} * {lambdb_{0}} * {lambdc_{1}} + {V(p_{x0, y1, z0})} * {lambda_{0}} * {lambdb_{1}} * {lambdc_{0}} + {V(p_{x0, y1, z1})} * {lambda_{0}} * {lambdb_{1}} * {lambdc_{1}} + {V(p_{x1, y0, z0})} * {lambda_{1}} * {lambdb_{0}} * {lambdc_{0}} + {V(p_{x1, y0, z1})} * {lambda_{1}} * {lambdb_{0}} * {lambdc_{1}} + {V(p_{x1, y1, z0})} * {lambda_{1}} * {lambdb_{1}} * {lambdc_{0}} + {V(p_{x1, y1, z1})} * {lambda_{1}} * {lambdb_{1}} * {lambdc_{1}} |
| 94 | $$ | 94 | $$ |
| 95 | 95 | ||
| 96 | - 假设:正向插值的输出图像out $(x, y, z)$受原图像input $(x_i, y_j, z_k)$影响,则有: | 96 | - 假设:正向插值的输出图像out $(x, y, z)$受原图像input $(x_i, y_j, z_k)$影响,则有: |
| 97 | - | 97 | + |
| 98 | $$ | 98 | $$ |
| 99 | gradInput(x_i,y_j,z_k) += gradOut(x,y,z) * lambda(x_i,y_j,z_k)* lambdb(x_i,y_j,z_k)* lambdc(x_i,y_j,z_k) | 99 | gradInput(x_i,y_j,z_k) += gradOut(x,y,z) * lambda(x_i,y_j,z_k)* lambdb(x_i,y_j,z_k)* lambdc(x_i,y_j,z_k) |
| 100 | $$ | 100 | $$ |
| @@ -105,23 +105,23 @@ | |||
| 105 | 105 | ||
| 106 | ```Cpp | 106 | ```Cpp |
| 107 | aclnnStatus aclnnUpsampleTrilinear3dBackwardGetWorkspaceSize( | 107 | aclnnStatus aclnnUpsampleTrilinear3dBackwardGetWorkspaceSize( |
| 108 | - const aclTensor *gradOut, | 108 | + const aclTensor *gradOut, |
| 109 | - const aclIntArray *outputSize, | 109 | + const aclIntArray *outputSize, |
| 110 | - const aclIntArray *inputSize, | 110 | + const aclIntArray *inputSize, |
| 111 | - bool alignCorners, | 111 | + bool alignCorners, |
| 112 | - double scalesD, | 112 | + double scalesD, |
| 113 | - double scalesH, | 113 | + double scalesH, |
| 114 | - double scalesW, | 114 | + double scalesW, |
| 115 | - aclTensor *gradInput, | 115 | + aclTensor *gradInput, |
| 116 | - uint64_t *workspaceSize, | 116 | + uint64_t *workspaceSize, |
| 117 | aclOpExecutor **executor) | 117 | aclOpExecutor **executor) |
| 118 | ``` | 118 | ``` |
| 119 | 119 | ||
| 120 | ```Cpp | 120 | ```Cpp |
| 121 | aclnnStatus aclnnUpsampleTrilinear3dBackward( | 121 | aclnnStatus aclnnUpsampleTrilinear3dBackward( |
| 122 | - void *workspace, | 122 | + void *workspace, |
| 123 | - uint64_t workspaceSize, | 123 | + uint64_t workspaceSize, |
| 124 | - aclOpExecutor *executor, | 124 | + aclOpExecutor *executor, |
| 125 | aclrtStream stream) | 125 | aclrtStream stream) |
| 126 | ``` | 126 | ``` |
| 127 | 127 | ||
| @@ -255,7 +255,7 @@ aclnnStatus aclnnUpsampleTrilinear3dBackward( | |||
| 255 | </table> | 255 | </table> |
| 256 | 256 | ||
| 257 | - <term>Atlas 训练系列产品</term>: | 257 | - <term>Atlas 训练系列产品</term>: |
| 258 | - | 258 | + |
| 259 | 参数`gradOut`和`gradInput`的数据类型不支持BFLOAT16。 | 259 | 参数`gradOut`和`gradInput`的数据类型不支持BFLOAT16。 |
| 260 | 260 | ||
| 261 | - **返回值** | 261 | - **返回值** |
| @@ -263,7 +263,7 @@ aclnnStatus aclnnUpsampleTrilinear3dBackward( | |||
| 263 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 263 | aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 264 | 264 | ||
| 265 | 第一段接口完成入参校验,出现以下场景时报错: | 265 | 第一段接口完成入参校验,出现以下场景时报错: |
| 266 | - | 266 | + |
| 267 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> | 267 | <table style="undefined;table-layout: fixed;width: 1170px"><colgroup> |
| 268 | <col style="width: 268px"> | 268 | <col style="width: 268px"> |
| 269 | <col style="width: 140px"> | 269 | <col style="width: 140px"> |
| @@ -364,15 +364,16 @@ aclnnStatus aclnnUpsampleTrilinear3dBackward( | |||
| 364 | - 参数`gradOut`、`gradInput`的shape约束: | 364 | - 参数`gradOut`、`gradInput`的shape约束: |
| 365 | - 每个维度的取值小于等于2^20。 | 365 | - 每个维度的取值小于等于2^20。 |
| 366 | - 参数`gradInput`的N轴和C轴与`gradOut`保持一致。 | 366 | - 参数`gradInput`的N轴和C轴与`gradOut`保持一致。 |
| 367 | - - 内存占用需小于60G。内存占用的计算公式如下: | 367 | + - 内存占用需小于60GB。内存占用的计算公式如下: |
| 368 | 368 | ||
| 369 | $$ | 369 | $$ |
| 370 | - N * C * (gradOut\_D * gradOut\_H * gradOut\_W + gradInput\_D * gradInput\_H * gradInput\_W + gradOut\_D * gradOut\_H * gradInput\_W + gradOut\_D * gradInput\_H * gradInput\_W) * sizeof(float) < 60 * 1024 * 1024 * 1024 | 370 | + N * C * (gradOut\_D * gradOut\_H * gradOut\_W + gradInput\_D * gradInput\_H * gradInput\_W + gradOut\_D * gradOut\_H * gradInput\_W + gradOut\_D * gradInput\_H * gradInput\_W) * sizeof(dtype) < 60 * 1024 * 1024 * 1024 |
| 371 | $$ | 371 | $$ |
| 372 | 372 | ||
| 373 | 其中: | 373 | 其中: |
| 374 | - N代表输入和输出的N轴。 | 374 | - N代表输入和输出的N轴。 |
| 375 | - C代表输入和输出的C轴。 | 375 | - C代表输入和输出的C轴。 |
| 376 | + - dtype代表输入张量的数据类型。 | ||
| 376 | - N \* C \* gradOut_D \* gradOut_H < 2^31 | 377 | - N \* C \* gradOut_D \* gradOut_H < 2^31 |
| 377 | - gradInput_W * gradInput_H < 2^31 | 378 | - gradInput_W * gradInput_H < 2^31 |
| 378 | - 参数inputSize、outputSize、scalesD、scalesH、scalesW需要满足如下约束: | 379 | - 参数inputSize、outputSize、scalesD、scalesH、scalesW需要满足如下约束: |
| @@ -380,7 +381,7 @@ aclnnStatus aclnnUpsampleTrilinear3dBackward( | |||
| 380 | $$ | 381 | $$ |
| 381 | outputSize\_D = floor(inputSize\_D * scalesD) | 382 | outputSize\_D = floor(inputSize\_D * scalesD) |
| 382 | $$ | 383 | $$ |
| 383 | - | 384 | + |
| 384 | $$ | 385 | $$ |
| 385 | outputSize\_H = floor(inputSize\_H * scalesH) | 386 | outputSize\_H = floor(inputSize\_H * scalesH) |
| 386 | $$ | 387 | $$ |
🟡 Medium Priority
该 diff 将
aclnnUpsampleNearestExact1dBackward.md中的 scales 公式从scalesL = inputSize[2]/outputSize[0]改为scalesL = outputSize[0]/inputSize[2]。证据链:
aclnnUpsampleNearestExact1d.md第22行):out(N, C, l) = self(N, C, min(floor((l + 0.5) * scales), L-1))— 使用乘法。floor((l + 0.5) * scales_user) = L,其中scales_user ≈ outputSize/inputSize(来自约束outputSize = floor(inputSize * scales_user))。L * inputSize/outputSize - 0.5 ≤ l < (L+1) * inputSize/outputSize - 0.5,因此反向 scale 应为inputSize/outputSize。outputSize/inputSize会导致:srcL = Min(L * outputSize/inputSize - 0.5, outputSize),这与正确推导得出的L * inputSize/outputSize - 0.5完全不一致。具体反例(inputSize=4, outputSize=8, scales_user=2.0):
注意: 同样的 scales 反转在 Exact2d (
aclnnUpsampleNearestExact2dBackward.md) 和 Exact3d (aclnnUpsampleNearestExact3dBackward.md) 中是正确的,因为它们的正向使用除法 (/ scalesH,/ scalesD)。Exact1d 是唯一使用乘法 (* scales) 的正向,不应被反转。建议:将第30行改回
scalesL = inputSize[2]/outputSize[0],因为正向 Exact1d 使用乘法(* scales),其反向 scale 应为inputSize/outputSize而非outputSize/inputSize。outputSize[0]/inputSize[2]