使用说明
接口定义
初始化NormalizationLayerFWD。构造时需要传入输入矩阵、缩放矩阵、输出矩阵的tensor信息,其中statsinfo是均值和方差的描述信息。
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
srcInfo |
KDNN::TensorInfo |
输入矩阵信息。 |
{shape{A, ... , D}, type, layout} |
statsInfo |
KDNN::TensorInfo |
均值和方差的信息。 |
{shape{A, ...}, type, layout} |
scaleShiftInfo |
KDNN::TensorInfo |
缩放矩阵信息。 |
{shape{D}, type, layout} |
dstInfo |
KDNN::TensorInfo |
输出矩阵信息。 |
{shape{A, ... , D}, type, layout} |
flags |
KDNN::NormalizationFlags |
枚举类,用于选择归一化方式。 |
默认NONE,可选以下参数:
|
执行算子运算。src和dst分别为输入和输出的指针,scale和shift为放缩和偏移的指针,mean和variance为均值和方差的指针,saveStats表示是否保存计算的均值和方差。eps用于避免除0异常。
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
src |
void* |
输入指针。 |
- |
dst |
void* |
输出指针。 |
- |
scale |
void* |
放缩指针。 |
- |
shift |
void* |
偏移指针。 |
- |
mean |
float* |
均值指针。 |
- |
variance |
float* |
方差指针。 |
- |
saveStats |
bool |
是否保存计算方差。 |
布尔值 |
eps |
float |
避免除0异常。 |
浮点数 |
假设输入数据形状为{A,B,C,D} 则在最后一个维度即D维上进行归一化,放缩和偏移操作也在D维度上进行。
验证NormalizationLayerFWD的输入参数,并在算子构造过程中自动触发执行。
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
srcInfo |
KDNN::TensorInfo |
输入矩阵信息。 |
{shape{A, ... , D}, type, layout} |
statsInfo |
KDNN::TensorInfo |
均值和方差的信息。 |
{shape{A, ...}, type, layout} |
scaleShiftInfo |
KDNN::TensorInfo |
缩放矩阵信息。 |
{shape{D}, type, layout} |
dstInfo |
KDNN::TensorInfo |
输出矩阵信息。 |
{shape{A, ... , D}, type, layout} |
flags |
KDNN::NormalizationFlags |
枚举类,用于选择归一化方式。 |
默认NONE,可选
|
支持数据类型
- NormalizationLayerFWD支持fp16/fp32数据类型。(TensorInfo对象初始化时需传入Shape、Type、Layout参数,此处列出为Type支持数据类型。)
表4 TensorInfo对象初始化时支持的Type类型 srcInfo
statInfo
scaleShiftInfo
dstInfo
KDNN::Element::Type::F16(fp16)
KDNN::Element::Type::F16(fp16)
KDNN::Element::Type::F16(fp16)
KDNN::Element::Type::F16(fp16)
KDNN::Element::Type::F32(float)
KDNN::Element::Type::F32(float)
KDNN::Element::Type::F32(float)
KDNN::Element::Type::F32(float)
使用示例
使用float数据类型层归一化,srcInfo数据排布为KDNN::Layout::ABCDE,statInfo数据排布为KDNN::Layout::ABCD,scaleShiftInfo数据排布为KDNN::Layout::A,dstInfo数据排布KDNN::Layout::ABCDE。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using SizeType = KDNN::SizeType; using Shape = KDNN::Shape; using Type KDNN::Element::TypeT Shape shape(5, 5, 5, 5, 5); // 定义张量信息 TensorInfo srcInfo = {shape, TypeF32, KDNN::Layout::ABCDE}; TensorInfo statInfo = {{shape[0], shape[1], shape[2], shape[3]}, TypeF32, KDNN::Layout::ABCD}; TensorInfo scaleShiftInfo = {{shape[4]}, TypeF32, KDNN::Layout::A}; TensorInfo dstInfo = {shape, TypeF32, KDNN::Layout::ABCDE}; KDNN::NormalizationFlags flags = KDNN::NormalizationFlags::NONE; // 算子构造 KDNN::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); |