# AvgPoolingGrad — MindSpore Signal+ 使用手册 alpha 文档

# AvgPoolingGrad

根据输入梯度对平均池化前的特征图计算反向传播梯度。

> \[output_{b, x_h, x_w, c} += \frac{input_{b, y_h, y_w, c}}{\text{window}_h \cdot \text{window}_w}\]

> 其中 \((y_h, y_w)\) 与 \((x_h, x_w)\) 之间满足窗口与步长的映射关系。

> 输入：

>   - input - 反向传播输入梯度张量首地址。

>   - output - 反向传播输出梯度张量首地址。

>   - batch - 批大小。

>   - output_h - 池化输出高度。

>   - output_w - 池化输出宽度。

>   - channel - 通道数。

>   - input_w - 池化输入宽度。

>   - input_h - 池化输入高度。

>   - stride_w - 水平步长。

>   - stride_h - 垂直步长。

>   - pad_l - 左侧填充大小。

>   - pad_u - 上侧填充大小。

>   - window_w - 池化窗口宽度。

>   - window_h - 池化窗口高度。

>   - core_mask(int, 可选) - 核掩码（仅适用于共享存储版本）。

> 输出：

>   - output - 原地累加平均池化反向传播梯度。

> 支持平台：

>   `FT78NE` `MT7004`

> 备注

> - FT78NE 支持 fp32 数据类型。

> - MT7004 支持 fp16、fp32 数据类型。

共享存储版本:

void hp_avgpoolinggrad_s(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)

void fp_avgpoolinggrad_s(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)

  C调用示例：

       1// FT78NE 多核示例
       2#include <stdio.h>
       3
       4int main(void) {
       5    const float *input = (const float *)0xA0000000;  // DDR 存储
       6    float *output = (float *)0xB0000000;
       7    int batch = 16;
       8    int output_h = 7;
       9    int output_w = 7;
      10    int channel = 64;
      11    int input_w = 14;
      12    int input_h = 14;
      13    int stride_w = 2;
      14    int stride_h = 2;
      15    int pad_l = 0;
      16    int pad_u = 0;
      17    int window_w = 2;
      18    int window_h = 2;
      19    int core_mask = 0xff;
      20    fp_avgpoolinggrad_s(input, output, batch, output_h, output_w,
      21                         channel, input_w, input_h,
      22                         stride_w, stride_h,
      23                         pad_l, pad_u,
      24                         window_w, window_h,
      25                         core_mask);
      26    return 0;
      27}

私有存储版本:

void hp_avgpoolinggrad_p(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)

void fp_avgpoolinggrad_p(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)

  C调用示例：

       1// MT7004 单核示例
       2#include <stdio.h>
       3
       4int main(void) {
       5    const half *input = (const half *)0x10000000;    // L2 存储
       6    half *output = (half *)0x10004000;
       7    int batch = 4;
       8    int output_h = 4;
       9    int output_w = 4;
      10    int channel = 128;
      11    int input_w = 8;
      12    int input_h = 8;
      13    int stride_w = 2;
      14    int stride_h = 2;
      15    int pad_l = 0;
      16    int pad_u = 0;
      17    int window_w = 2;
      18    int window_h = 2;
      19    int start_idx = 0;
      20    int end_idx = batch * output_h * output_w * channel;
      21    hp_avgpoolinggrad_p(input, output, batch, output_h, output_w,
      22                        channel, input_w, input_h,
      23                        stride_w, stride_h,
      24                        pad_l, pad_u,
      25                        window_w, window_h,
      26                        start_idx, end_idx);
      27    return 0;
      28}