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

# Avgpooling

对NHWC格式的输入张量执行2D平均池化，并随后进行范围裁剪（Clip）激活。

该算子融合了两个步骤：

1. 平均池化 (Average Pooling):

\[\text{Pool}_{i,j} = \frac{1}{k_h \times k_w} \sum_{m=0}^{k_h-1} \sum_{n=0}^{k_w-1} \text{Input}_{i \cdot s_h + m, j \cdot s_w + n}\]

2. 裁剪激活 (Clipping Activation):

\[\text{Output} = \max(\min\_val, \min(\text{Pool}, \max\_val))\]

输入：

  - input - 输入张量的数据地址。格式: NHWC。

  - batch (N) - 批处理大小。

  - in_h (H) - 输入特征图的高度。

  - in_w (W) - 输入特征图的宽度。

  - channel (C) - 输入特征图的通道数。

  - win_h - 池化核的高度。

  - win_w - 池化核的宽度。

  - stride_h - 垂直方向的步长。

  - stride_w - 水平方向的步长。

  - pad_top - 上边距填充。

  - pad_bottom - 下边距填充。

  - pad_left - 左边距填充。

  - pad_right - 右边距填充。

  - min_val - 裁剪范围的最小值。

  - max_val - 裁剪范围的最大值。

  - core_mask - 核掩码。

输出：

  - output - 输出张量的数据地址。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持fp32, int8

- MT7004 支持fp16, fp32

共享存储版本:

void i8_avgpool_fusion_s(int8_t *input, int8_t *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, int8_t min_val, int8_t max_val, int core_mask)

void fp_avgpool_fusion_s(float *input, float *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, float min_val, float max_val, int core_mask)

void hp_avgpool_fusion_s(half *input, half *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, half min_val, half max_val, int core_mask)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <avgpooling.h>
     4int main(int argc, char* argv[]) {
     5    float *input = (float *)0xA0000000;      // input在DDR空间
     6    float *output = (float *)0xB0000000;     // output
     7
     8    // Shape parameters
     9    int batch = 2;
    10    int in_h = 224;
    11    int in_w = 224;
    12    int channel = 3;
    13
    14    // Pooling parameters
    15    int win_h = 3, win_w = 3;
    16    int stride_h = 2, stride_w = 2;
    17    int pad_top = 1, pad_bottom = 1, pad_left = 1, pad_right = 1;
    18
    19    // Fusion parameters (e.g., for ReLU6 activation)
    20    float min_val = 0.0f;
    21    float max_val = 6.0f;
    22
    23    int core_mask = 0xff;
    24
    25    fp_avgpool_fusion_s(input, output, batch, in_h, in_w, channel,
    26                        win_h, win_w, stride_h, stride_w,
    27                        pad_top, pad_bottom, pad_left, pad_right,
    28                        min_val, max_val, core_mask);
    29    return 0;
    30}

私有存储版本:

void i8_avgpool_fusion_p(int8_t *input, int8_t *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, int8_t min_val, int8_t max_val)

void fp_avgpool_fusion_p(float *input, float *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, float min_val, float max_val)

void hp_avgpool_fusion_p(half *input, half *output, int batch, int in_h, int in_w, int channel, int win_h, int win_w, int stride_h, int stride_w, int pad_top, int pad_bottom, int pad_left, int pad_right, half min_val, half max_val)

C调用示例：

     1//FT78NE示例
     2#include <stdio.h>
     3#include <avgpooling.h>
     4int main(int argc, char* argv[]) {
     5    float *input = (float *)0x10000000;      // input在L2空间
     6    float *output = (float *)0x10100000;     // output
     7
     8    // Shape parameters
     9    int batch = 2;
    10    int in_h = 32;
    11    int in_w = 32;
    12    int channel = 16;
    13
    14    // Pooling parameters
    15    int win_h = 2, win_w = 2;
    16    int stride_h = 2, stride_w = 2;
    17    int pad_top = 0, pad_bottom = 0, pad_left = 0, pad_right = 0;
    18
    19    // Fusion parameters
    20    float min_val = -127.0f;
    21    float max_val = 127.0f;
    22
    23    fp_avgpool_fusion_p(input, output, batch, in_h, in_w, channel,
    24                        win_h, win_w, stride_h, stride_w,
    25                        pad_top, pad_bottom, pad_left, pad_right,
    26                        min_val, max_val);
    27    return 0;
    28}