---
title: 使用说明
description: "初始化NormalizationLayerFWD。构造时需要传入输入矩阵、缩放矩阵、输出矩阵的tensor信息，其中statsinfo是均值和方差的描述信息。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_182.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_182.html
indexId: ff03d4e16d6ef09643ab71a3bc14e310c69d17a32b6d5dd9e6f385891957264867
---
# 使用说明

#### 接口定义

初始化NormalizationLayerFWD。构造时需要传入输入矩阵、缩放矩阵、输出矩阵的tensor信息，其中statsinfo是均值和方差的描述信息。

NormalizationLayerFWD(const TensorInfo &srcInfo, const TensorInfo &statsInfo, const TensorInfo &scaleshiftInfo, const TensorInfo &dstInfo, NormalizationFlags flags)->void
**表1 NormalizationLayerFWD函数输入参数**

| 参数名称 | 数据类型 | 描述 | 取值范围 |
| --- | --- | --- | --- |
| srcInfo | KuDNN::TensorInfo | 输入矩阵信息。 | {shape{A, ... , D}, type, layout} |
| statInfo | KuDNN::TensorInfo | 均值和方差的信息。 | {shape{A, ...}, type, layout} |
| scaleshiftInfo | KuDNN::TensorInfo | 缩放矩阵信息。 | {shape{D}, type, layout} |
| dstInfo | KuDNN::TensorInfo | 输出矩阵信息。 | {shape{A, ... , D}, type, layout} |
| flags | KuDNN::NormalizationFlags | 枚举类，用于选择归一化方式。 | 默认NONE，可选以下参数： USE\_GLOBAL\_STATS使用传入的mean和var计算。 USE\_SCALE对归一化结果再放缩。 USE\_SHIFT对归一化结果再偏移。 |


执行算子运算。src和dst分别为输入和输出的指针，scale和shift为放缩和偏移的指针，mean和variance为均值和方差的指针，saveStats表示是否保存计算的均值和方差。eps用于避免除0异常。

Run(const void *src, void *dst, const void *scale, const void *shift, float *mean, float *variance, bool saveStats, const float eps)->void
**表2 Run函数输入参数**

| 参数名称 | 数据类型 | 描述 | 取值范围 |
| --- | --- | --- | --- |
| src | void\* | 输入指针。 | \- |
| dst | void\* | 输出指针。 | \- |
| scale | void\* | 放缩指针。 | \- |
| shift | void\* | 偏移指针。 | \- |
| mean | float\* | 均值指针。 | \- |
| variance | float\* | 方差指针。 | \- |
| saveStats | bool | 是否保存计算方差。 | 布尔值 |
| eps | float | 避免除0异常。 | 浮点数 |


假设输入数据形状为{A，B，C，D},则在最后一个维度即D维上进行归一化，放缩和偏移操作也在D维度上进行。


验证NormalizationLayerFWD的输入参数，并在算子构造过程中自动触发执行。

ValidateInput(const TensorInfo &srcInfo, const TensorInfo &statsInfo,const TensorInfo &scaleshiftInfo, const TensorInfo &dstInfo, NormalizationFlags flags)->KuDNN::Status
**表3 ValidateInput函数输入参数**

| 参数名称 | 数据类型 | 描述 | 取值范围 |
| --- | --- | --- | --- |
| srcInfo | KuDNN::TensorInfo | 输入矩阵信息。 | {shape{A, ... , D}, type, layout} |
| statsInfo | KuDNN::TensorInfo | 均值和方差的信息。 | {shape{A, ...}, type, layout} |
| scaleshiftInfo | KuDNN::TensorInfo | 缩放矩阵信息。 | {shape{D}, type, layout} |
| dstInfo | KuDNN::TensorInfo | 输出矩阵信息。 | {shape{A, ... , D}, type, layout} |
| flags | KuDNN::NormalizationFlags | 枚举类，用于选择归一化方式。 | 默认NONE，可选 USE\_GLOBAL\_STATS USE\_SCALE USE\_SHIFT FUSE\_NORM\_RELU |


#### 支持数据类型

- NormalizationLayerFWD支持fp16/fp32数据类型。（TensorInfo对象初始化时需传入Shape、Type、Layout参数，此处列出为Type支持数据类型。）
**表4 TensorInfo对象初始化时支持的Type类型**

| srcInfo | statInfo | scaleShiftInfo | dstInfo |
| --- | --- | --- | --- |
| KuDNN::Element::Type::F16(fp16) | KuDNN::Element::Type::F16(fp16) | KuDNN::Element::Type::F16(fp16) | KuDNN::Element::Type::F16(fp16) |
| KuDNN::Element::Type::F32(float) | KuDNN::Element::Type::F32(float) | KuDNN::Element::Type::F32(float) | KuDNN::Element::Type::F32(float) |


- 最高支持5Dtensor，支持顺序数据排布：a、ab、abc、abcd、abcde。
  对应KuDNN::Layout::A、KuDNN::Layout::AB、KuDNN::Layout::ABC、KuDNN::Layout::ABCD、KuDNN::Layout::ABCDE。

**表5 TensorInfo对象初始化时支持的Layout类型**

| dimension | srcInfo数据排布 | dstInfo数据排布 |
| --- | --- | --- |
| 2D | ab | ab |
| 3D | abc | abc |
| 4D | abcd | abcd |
| 5D | abcde | abcde |


#### 使用示例

使用float数据类型层归一化，srcInfo数据排布为KuDNN::Layout::ABCDE，statInfo数据排布为KuDNN::Layout::ABCD，scaleShiftInfo数据排布为KuDNN::Layout::A，dstInfo数据排布KuDNN::Layout::ABCDE。

```
using SizeType = KuDNN::SizeType;
using Shape = KuDNN::Shape;
using Type KuDNN::Element::TypeT
Shape shape(5, 5, 5, 5, 5);
// 定义张量信息
TensorInfo srcInfo = {shape, TypeF32, KuDNN::Layout::ABCDE};
TensorInfo statInfo = {{shape[0], shape[1], shape[2], shape[3]}, TypeF32, KuDNN::Layout::ABCD};
TensorInfo scaleShiftInfo = {{shape[4]}, TypeF32, KuDNN::Layout::A};
TensorInfo dstInfo = {shape, TypeF32, KuDNN::Layout::ABCDE};
KuDNN::NormalizationFlags flags = KuDNN::NormalizationFlags::NONE;
// 算子构造KuDNN::NormalizationLayerFWD lnormLayer(srcInfo, statInfo, scaleShiftInfo, dstInfo,
flags);
// 初始化矩阵数据
SizeType srcSize = srcInfo.GetTotalTensorSize();
SizeType dstSize = dstInfo.GetTotalTensorSize();
SizeType statSize = statInfo.GetTotalTensorSize();
SizeType innerSize = scaleShiftInfo.GetTotalTensorSize();
float *src = (float *)malloc(srcSize * sizeof(float));
float *dst = (float *)malloc(dstSize * sizeof(float));
float *dstRef = (float *)malloc(dstSize * sizeof(float));
float *mean = (float *)malloc(statSize * sizeof(float));
float *variance = (float *)malloc(statSize * sizeof(float));
float *scale = (float *)malloc(innerSize * sizeof(float));
float *shift = (float *)malloc(innerSize * sizeof(float));
float eps = 1e-5;
// 执行算子
lnormLayer.Run(src, dst, scale, shift, mean, variance, true, eps);
```
