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

# LpNormalization

对输入张量按 实例（Instance）+ 通道（Channel） 维度执行 Lp 归一化操作。 该算子在每个样本的每个通道内，基于 `inner_size` 维度计算 Lp 范数， 并结合可学习参数 `gamma` 与 `beta` 完成缩放与偏移。

\[ \begin{align}\begin{aligned}\text{norm}_{b,c} = \left( \sum_{i=1}^{N} |x_{b,c,i}|^p + \epsilon \right)^{\frac{1}{p}}\\y_{b,c,i} = \frac{x_{b,c,i}}{\text{norm}_{b,c}} \cdot \gamma_c + \beta_c\end{aligned}\end{align} \]

其中：

- \(b\) 表示 batch 维度

- \(c\) 表示通道维度

- \(i\) 表示 `inner_size` 维度

- \(p\) 为范数阶数

- \(\gamma_c\)、\(\beta_c\) 为通道级缩放与偏移参数

输入：

  - input - 输入数据地址，形状为 `[batch, channel, inner_size]`。

  - gamma - 缩放参数地址，长度为 `channel`。

  - beta - 偏移参数地址，长度为 `channel`。

  - p - Lp 范数阶数。

  - batch - batch 数。

  - channel - 通道数。

  - inner_size - 每个通道内的归一化长度。

  - epsilon - 数值稳定因子。

  - core_mask - 核掩码（仅适用于共享存储版本）。

输出：

  - output - LpNormalization 计算结果地址。

支持平台：

  `FT78NE` `MT7004`

备注

- FT78NE 支持 `fp32` 类型

- MT7004 支持 `fp16`、`fp32` 类型

- 归一化统计量仅在单个样本、单个通道内计算

- `p` 为浮点数，可用于 L1、L2 等不同范数形式

共享存储版本:

void fp_lpnorm_s(float *input, float *gamma, float *beta, float *output, float p, int batch, int channel, int inner_size, float epsilon, int core_mask)

void hp_lpnorm_s(half *input, half *gamma, half *beta, half *output, float p, int batch, int channel, int inner_size, float epsilon, int core_mask)

C调用示例：

     1// FT78NE 示例
     2#include <stdio.h>
     3#include <lpnorm.h>
     4
     5int main(int argc, char* argv[]) {
     6    float *input  = (float *)0xA0000000;   // input 在 DDR 空间
     7    float *output = (float *)0xC0000000;
     8    float *gamma  = (float *)0xA1000000;
     9    float *beta   = (float *)0xA2000000;
    10
    11    int batch = 4;
    12    int channel = 64;
    13    int inner_size = 256;
    14    float p = 2.0f;
    15    float epsilon = 1e-6f;
    16    int core_mask = 0xff;
    17
    18    fp_lpnorm_s(input, gamma, beta, output,
    19                p, batch, channel, inner_size, epsilon, core_mask);
    20    return 0;
    21}

私有存储版本:

void fp_lpnorm_p(float *input, float *gamma, float *beta, float *output, float p, int batch, int channel, int inner_size, float epsilon)

void hp_lpnorm_p(half *input, half *gamma, half *beta, half *output, float p, int batch, int channel, int inner_size, float epsilon)

C调用示例：

     1// FT78NE 示例
     2#include <stdio.h>
     3#include <lpnorm.h>
     4
     5int main(int argc, char* argv[]) {
     6    float *input  = (float *)0x10810000;   // input 在 L2 空间
     7    float *output = (float *)0x10820000;
     8    float *gamma  = (float *)0x10830000;
     9    float *beta   = (float *)0x10840000;
    10
    11    int batch = 4;
    12    int channel = 64;
    13    int inner_size = 256;
    14    float p = 2.0f;
    15    float epsilon = 1e-6f;
    16
    17    fp_lpnorm_p(input, gamma, beta, output,
    18                p, batch, channel, inner_size, epsilon);
    19    return 0;
    20}