NeuralNetWorkOp
class NeuralNetWorkOp
成员函数
_Input
MNN_PUBLIC VARP _Input(INTS shape = {}, Dimensionformat data_format = NC4HW4, halide_type_t dtype = halide_type_of<float>());
创建一个输入变量
参数:
shape
一个矢量,变量的形状data_format
一个枚举值,允许为NCHW/NHWC/NC4HW4dtype
目的变量的元素类型
返回:变量
_Clone
MNN_PUBLIC VARP _Clone(VARP source, bool deepCopy = false);
克隆变量
参数:
source
被克隆的变量deepCopy
是否深度拷贝,默认为false
返回:与source类型相同的变量
_Scalar
MNN_PUBLIC VARP _Scalar(const void* ptr, halide_type_t type);
用于创建张量均值的标量类型
参数:
ptr
一个指针,标量的值type
目标变量的数据类型
返回:标量类型
_Const
MNN_PUBLIC VARP _Const(float value, INTS shape = {}, Dimensionformat format = NHWC);
创建一个不可变变量
参数:
value
显示的值shape
一个矢量,变量的形状format
一个枚举值,允许是NCHW/NHWC/NC4HW4
返回:一个不可变变量
_Const
MNN_PUBLIC VARP _Const(const void* ptr, INTS shape = {}, Dimensionformat format = NHWC,
halide_type_t type = halide_type_of<float>());
创建一个不可变变量
参数:
ptr
一个指针,显示的值shape
一个矢量,变量的形状format
一个枚举值,允许是NCHW/NHWC/NC4HW4type
目标变量的数据类型
返回:一个不可变变量
_TrainableParam
MNN_PUBLIC VARP _TrainableParam(float value, INTS dims, Dimensionformat format);
可训练的参数
参数:
value
参数的值dims
一个向量。置换后的索引轴顺序format
目标格式
返回:参数变量
_TrainableParam
MNN_PUBLIC VARP _TrainableParam(const void* ptr, INTS dims, Dimensionformat format,
halide_type_t type = halide_type_of<float>());
可训练的参数
参数:
ptr
一个指针,参数的值dims
一个向量,置换后的索引轴顺序format
目标格式type
目标变量的数据类型
返回:参数变量
_InnerProduct
MNN_PUBLIC VARP _InnerProduct(std::vector<float>&& weight, std::vector<float>&& bias, VARP x, INTS outputShape);
全连接层,运算实质上是若干的输入向量与权值矩阵中的权值向量做內积的过程
参数:
weight
权值矩阵bias
偏置项行向量x
输入变量outputShape
输出形状
返回:变量
_Conv
MNN_PUBLIC VARP _Conv(VARP weight, VARP bias, VARP x, PaddingMode pad = VALID, INTS stride = {1, 1},
INTS dilate = {1, 1}, int group = 1, INTS pads = {0, 0});
对由多个输入平面组成的输入信号进行卷积
参数:
weight
卷积产生的通道数bias
偏置项行向量,在输出中添加一个可学习的偏差x
输入变量pad
填充模式,默认为VALIDstride
卷积步长,默认为{1, 1}dilate
扩张操作:控制kernel点(卷积核点)的间距,默认值为{1, 1}group
控制分组卷积,默认不分组,为1组pads
填充操作,默认为{0, 0}
返回:卷积
_Conv
MNN_PUBLIC VARP _Conv(float weight, float bias, VARP x, INTS channel, INTS kernelSize, PaddingMode pad = VALID,
INTS stride = {1, 1}, INTS dilate = {1, 1}, int group = 1);
对由多个输入平面组成的输入信号进行卷积
参数:
weight
卷积产生的通道数bias
偏置项行向量,在输出中添加一个可学习的偏差x
输入变量channel
渠道kernelSize
卷积核大小pad
填充模式,默认为VALIDstride
卷积步长,默认为{1, 1}dilate
扩张操作:控制kernel点(卷积核点)的间距,默认值为{1, 1}group
控制分组卷积,默认不分组,为1组
返回:卷积
_Conv
MNN_PUBLIC VARP _Conv(std::vector<int8_t>&& weight, std::vector<float>&& bias, VARP x, INTS channel, INTS kernelSize,
PaddingMode pad = VALID, INTS stride = {1, 1}, INTS dilate = {1, 1}, int group = 1, INTS pads = {0, 0}, bool relu = false, bool relu6 = false, int nbits = 8);
对由多个输入平面组成的输入信号进行卷积
参数:
weight
卷积产生的通道数bias
偏置项行向量,在输出中添加一个可学习的偏差x
输入变量channel
渠道kernelSize
卷积核大小pad
填充模式,默认为VALIDstride
卷积步长,默认为{1, 1}dilate
扩张操作:控制kernel点(卷积核点)的间距,默认值为{1, 1}group
控制分组卷积,默认不分组,为1组pads
填充操作,默认为{0, 0}relu
是否修正线性单元,默认为faslerelu6
修正线性单元6,默认为faslenbits
默认为8
返回:卷积
_Conv
MNN_PUBLIC VARP _Conv(std::vector<float>&& weight, std::vector<float>&& bias, VARP x, INTS channel, INTS kernelSize,
PaddingMode pad = VALID, INTS stride = {1, 1}, INTS dilate = {1, 1}, int group = 1, INTS pads = {0, 0}, bool relu = false, bool relu6 = false);
对由多个输入平面组成的输入信号进行卷积
参数:
weight
卷积产生的通道数bias
偏置项行向量,在输出中添加一个可学习的偏差x
输入变量channel
渠道kernelSize
卷积核大小pad
填充模式,默认为VALIDstride
步长,默认为{1, 1}dilate
扩张操作:控制kernel点(卷积核点)的间距,默认值为{1, 1}group
控制分组卷积,默认不分组,为1组pads
填充操作,默认为{0, 0}relu
是否修正线性单元,默认为faslerelu6
修正线性单元6,默认为fasle
返回:卷积
_Deconv
MNN_PUBLIC VARP _Deconv(VARP weight, VARP bias, VARP x, PaddingMode pad = VALID, INTS stride = {1, 1},
INTS dilate = {1, 1}, int group = 1, INTS pads = {0, 0});
卷积的反向操作
参数:
weight
反卷积产生的通道数bias
偏置项行向量,在输出中添加一个可学习的偏差x
输入变量pad
填充模式,默认为VALIDstride
步长,默认为{1, 1}dilate
扩张操作:控制kernel点(反卷积核点)的间距,默认值为{1, 1}group
控制分组反卷积,默认不分组,为1组pads
填充操作,默认为{0, 0}
返回:转置卷积(反卷积)
_Deconv
MNN_PUBLIC VARP _Deconv(std::vector<float>&& weight, std::vector<float>&& bias, VARP x, INTS channel, INTS kernelSize,
PaddingMode pad, INTS stride = {1, 1}, INTS dilate = {1, 1}, int group = 1, INTS pads = {0, 0}, bool relu = false, bool relu6 = false);
卷积的反向操作
参数:
weight
反卷积产生的通道数bias
偏置项行向量,在输出中添加一个可学习的偏差x
输入变量channel
渠道kernelSize
反积核大小pad
填充模式,默认为VALIDstride
步长,默认为{1, 1}dilate
扩张操作:控制kernel点(反卷积核点)的间距,默认值为{1, 1}group
控制分组反卷积,默认不分组,为1组pads
填充操作,默认为{0, 0}relu
是否修正线性单元,默认为faslerelu6
是否修正线性单元6,默认为fasle
返回:转置卷积(反卷积)
_MaxPool
MNN_PUBLIC VARP _MaxPool(VARP x, INTS kernel, INTS stride = {1, 1}, PaddingMode pad = VALID, INTS pads= {0, 0});
最大值池化操作
参数:
x
池化的输入kernel
内核stride
窗口在每一个维度上滑动的步长pad
填充模式,默认为VALIDpads
填充操作,默认为{0, 0}
返回:最大池化值
_AvePool
MNN_PUBLIC VARP _AvePool(VARP x, INTS kernel, INTS stride = {1, 1}, PaddingMode pad = VALID, INTS pads= {0, 0});
平均池化操作
参数:
x
池化的输入kernel
内核stride
窗口在每一个维度上滑动的步长pad
填充模式,默认为VALIDpads
填充操作,默认为{0, 0}
返回:平均池化值
_Reshape
MNN_PUBLIC VARP _Reshape(VARP x, INTS shape, Dimensionformat original_format = NCHW);
重塑一个变量
参数:
x
被重塑的变量shape
一个矢量,目标的形状变量original_format
一个枚举值,只允许NCHW/NHWC,不允许NC4HW4,因为它提供额外的信息(x来自NCHW或NHWC)当x是NC4HW4时
返回:与’ x ‘类型相同的变量
_Reshape
MNN_PUBLIC VARP _Reshape(VARP x, VARP shape);;
重塑一个变量
参数:
x
被重塑的变量shape
一个矢量,目标的形状变量
返回:与’ x ‘类型相同的变量
_Scale
MNN_PUBLIC VARP _Scale(VARP x, int channels, std::vector<float>&& scales, std::vector<float>&& bias);
返回x * scale + bias
的值
参数:
x
输入变量channels
渠道scales
输入变量bias
输入变量
返回:x * scale + bias
的值
_Relu
MNN_PUBLIC VARP _Relu(VARP x, float slope = 0.0f);
给定一个输入值x,如果x > 0,它计算输出为x,如果x <= 0,则返回斜率 * x
参数:
x
一个输入变量slope
一个浮点数,一个正的浮点值,它通过乘以“斜率”而不是设置为0.0f来漏掉负的部分,默认为0.0f
返回:与’ x ‘类型相同的变量
_Relu6
MNN_PUBLIC VARP _Relu6(VARP x, float minValue = 0.0f, float maxValue = 6.0f);
给定一个输入值x,它计算修正线性6: min(max(x, 0), 6)
参数:
x
一个输入变量minValue
最小值maxValue
最大值
返回:与’ x ‘类型相同的变量
_PRelu
MNN_PUBLIC VARP _PRelu(VARP x, std::vector<float> &&slopes);
给定一个输入值x,如果x > 0,它计算输出为x,如果x <= 0,则返回斜率 * x
参数:
x
一个变量,必须是4-D的NC4HW4格式slopes
一个向量,保存大小为x
返回:与’ x ‘类型相同的变量
_Softmax
MNN_PUBLIC VARP _Softmax(VARP logits, int axis = -1);
归一化指数函数,作用是将多分类的结果以概率的形式展现出来
参数:
logits
一个非空的变量,必须Halide_Type_Floataxis
默认值是-1,表示最后一个维度
返回:与’ x ‘类型相同的变量
_Softplus
MNN_PUBLIC VARP _Softplus(VARP features);
激活函数,可以看作是ReLU函数的平滑:log(exp(features) + 1)
参数:
features
一个变量,必须Halide_Type_Float
返回:与’features’类型相同的变量
_Softsign
MNN_PUBLIC VARP _Softsign(VARP features);
激活函数,是Tanh函数的另一个替代选择:features / (abs(features) + 1)
参数:
features
一个变量,必须Halide_Type_Float
返回:与’features’类型相同的变量
_Split
MNN_PUBLIC std::vector<VARP> _Split(VARP value, INTS size_splits, int axis = 0);
将变量值拆分为子变量列表
参数:
value
要拆分的变量size_splits
一个矢量,一个一维整数,包含每个输出变量沿轴的大小axis
一个int型,沿其进行分割的维度,必须在范围[-rank(value), rank(value))内,默认值为0
返回:变量列表
_Slice
MNN_PUBLIC VARP _Slice(VARP x, VARP starts, VARP sizes);
返回从张量中提取想要的切片,此操作从由starts指定位置开始的张量x中提取一个尺寸sizes的切片,切片sizes被表示为张量形状,提供公式x[starts[0]:starts[0]+sizes[0], ..., starts[-1]:starts[-1]+sizes[-1]]
参数:
x
输入变量starts
切片提取起始位置sizes
切片提取的尺寸
返回:切片数据
_StridedSlice
MNN_PUBLIC VARP _StridedSlice(VARP input, VARP begin, VARP end, VARP strided,
int32_t beginMask, int32_t endMask, int32_t ellipsisMask,
int32_t newAxisMask, int32_t shrinkAxisMask);
从给定的 x 张量中提取一个尺寸 (end-begin)/stride 的片段,从 begin 片段指定的位置开始,以步长 stride 添加索引,直到所有维度都不小于 end,这里的 stride 可以是负值,表示反向切片,公式:x[begin[0]:strides[0]:end[0], ..., begin[-1]:strides[-1]:end[-1]]
。
参数:
input
输入变量begin
开始切片处end
终止切片处strided
步长beginMask
输入变量,默认为0endMask
输入变量,默认为0ellipsisMask
输入变量,默认为0newAxisMask
输入变量,默认为0shrinkAxisMask
输入变量,默认为0
返回:提取的片段
_StridedSliceWrite
MNN_PUBLIC VARP _StridedSliceWrite(VARP input, VARP begin, VARP end, VARP strided, VARP write,
int32_t beginMask, int32_t endMask, int32_t ellipsisMask,
int32_t newAxisMask, int32_t shrinkAxisMask);
从给定的 x 张量中提取一个尺寸 (end-begin)/stride 的片段,从 begin 片段指定的位置开始,以步长 stride 添加索引,直到所有维度都不小于 end,这里的 stride 可以是负值,表示反向切片,可以写入。公式:x[begin[0]:strides[0]:end[0], ..., begin[-1]:strides[-1]:end[-1]]
。
参数:
input
输入变量begin
开始切片处end
终止切片处strided
步长write
输入变量beginMask
输入变量,默认为0endMask
输入变量,默认为0ellipsisMask
输入变量,默认为0newAxisMask
输入变量,默认为0shrinkAxisMask
输入变量,默认为0
返回:提取的片段
_Concat
MNN_PUBLIC VARP _Concat(VARPS values, int axis);
沿某个维度连接变量
参数:
values
变量列表单个变量axis
一个int,要连接的维度,必须在范围[-rank(values),rank(values))内。与在Python中一样,axis的索引是基于0的,区间[0,rank(values))为轴第1维,负轴表示轴+秩(值)-第维
返回:由输入变量连接而产生的变量
_Convert
MNN_PUBLIC VARP _Convert(VARP input, Dimensionformat format);
将变量转换为另一种格式(可能添加在’ input ‘之后)
参数:
input
输入变量format
目标格式
返回:一个变量,如果’input’已经是’format’,那么直接返回’input’,否则在’input’后面加上’format’变量
_Transpose
MNN_PUBLIC VARP _Transpose(VARP x, INTS perm);
转置x
参数:
x
输入变量perm
一个向量,表示x的维数的排列
返回:转置变量
_Transpose
MNN_PUBLIC VARP _Transpose(VARP x, VARP perm);
转置x
参数:
x
输入变量perm
一个向量,表示x的维数的排列
返回:转置变量
_ChannelShuffle
MNN_PUBLIC VARP _ChannelShuffle(VARP x, int group);
做以下操作: x = _Convert(x, NHWC); x = _Reshape(x, {0, 0, 0, group, -1}, NHWC); x = _Transpose(x, {0, 1, 2, 4, 3}); x = _Reshape(x, {0, 0, 0, -1}, NHWC); channel_shuffle_res = _Convert(x, NC4HW4);
参数:
x
输入变量group
控制分组
返回:一个变量,如果’input’已经是’format’,那么直接返回’input’,否则在’input’后面加上’format’变量
_ChangeInputFormat
MNN_PUBLIC VARP _ChangeInputFormat(VARP input, Dimensionformat format);
将变量转换为另一种格式(可能添加在’ input ‘之前)
参数:
input
输入变量format
目标格式
返回:目标变量,如果’input’已经是’format’,那么直接返回’input’,否则在’input’之前加上一个’format’变量。
_Conv2DBackPropFilter
MNN_PUBLIC VARP _Conv2DBackPropFilter(VARP input, VARP inputGrad, INTS kernelSize, PaddingMode pad = VALID, INTS stride = {1, 1}, INTS dilate = {1, 1}, int group = 1, INTS pads = {0, 0});
计算卷积相对于滤波器的梯度
参数:
input
4-D形状’[batch, in_height, in_width, in_channels]’inputGrad
输入梯度kernelSize
卷积核大小pad
填充模式,默认为VALIDstride
滑动窗口的步长对每个维度的输入进行卷积,必须与格式指定的尺寸顺序相同dilate
扩张操作:控制kernel点(卷积核点)的间距,默认值为{1, 1}group
控制分组卷积,默认不分组,为1组pads
填充操作,默认为{0, 0}
返回:梯度
_PoolGrad
MNN_PUBLIC VARP _PoolGrad(VARP originInput, VARP originOutput, VARP inputGrad, INTS kernel, INTS stride, PoolingMode type, PaddingMode pad = VALID, INTS pads= {0, 0});
池化操作
参数:
originInput
起始输入originOutput
起始输出inputGrad
输入梯度kernel
内核stride
窗口在每一个维度上滑动的步长type
池化类型pad
填充模式,默认为VALIDpads
填充操作,默认为{0, 0}
返回:池化的值
_ReverseSequence
MNN_PUBLIC VARP _ReverseSequence(VARP x, VARP y, int batchDim, int seqDim);
沿着batch_dim维度对x进行切片并反转维度seq_dim上的y[i]元素
参数:
x
输入变量y
输入变量batchDim
切片的维度seqDim
反转的维度
返回:反转序列的值
_Crop
MNN_PUBLIC VARP _Crop(VARP images, VARP size, int axis, INTS offset);
裁剪图片
参数:
images
NC4HW4格式的4-D变量size
一个变量,它以’size’的形状作为输出裁剪变量的形状,而省略了’size’的值/格式axis
指示要裁剪的维度的整数,必须> = 2。所有在“axis”之前但不包括“axis”的维度都被保留,而包括和尾随“axis”的维度则被裁剪offset
表示偏移量的int型矢量,Length (’offset’)必须为>=1且<=2。如果length(’offset’)为1,那么所有维度都将被这个量所抵消。否则,偏移量的数量必须等于每个维度中裁剪轴的数量
返回:NC4HW4格式的裁剪4-D变量
_Resize
MNN_PUBLIC VARP _Resize(VARP images, float xScale, float yScale);
调整图像
参数:
images
NC4HW4格式的4-D变量xScale
在x轴的缩放比例yScale
在y轴的缩放比例
返回:NC4HW4格式的调整大小的4-D变量
_Pad
MNN_PUBLIC VARP _Pad(VARP x, VARP paddings, PadValueMode mode = CONSTANT);
对张量进行填充
参数:
x
输入变量paddings
Halide_Type_Int类型的变量,形状为[n, 2],其中n为变量的秩mode
一个枚举值,PadValueMode_CONSTANT、PadValueMode_SYMMETRIC或PadValueMode_REFLECT之一
返回:和x有相同的类型的变量
_ExpandDims
MNN_PUBLIC VARP _ExpandDims(VARP input, int axis);
返回在索引轴插入额外维度的变量
参数:
input
输入变量axis
一个int,指定在其上展开输入形状的维度索引,给定一个D维的输入,轴必须在范围-(D+1), D
返回:具有与输入相同数据的变量,在轴指定的索引处插入额外的维度
_ExpandDims
MNN_PUBLIC VARP _ExpandDims(VARP input, VARP axis);
返回在索引轴插入额外维度的变量
参数:
input
输入变量axis
一个int,指定在其上展开输入形状的维度索引,给定一个D维的输入,轴必须在范围-(D+1), D
返回:具有与输入相同数据的变量,在轴指定的索引处插入额外的维度
_Shape
MNN_PUBLIC VARP _Shape(VARP input, bool nchw = false);
返回变量的形状
参数:
input
输入变量nchw
默认为false
返回:Halide_Type_Int类型的变量
_Stack
MNN_PUBLIC VARP _Stack(VARPS values, int axis=0);
将一列rank-R变量堆叠成一个rank-(R+1)变量,将’values’中的变量列表打包到一个比values中的每个变量都高1的变量中,通过沿轴尺寸排列它们,给定一个长度为N的形状变量列表(a, B, C)。 如果axis == 0,那么输出变量将具有形状(N, A, B, C)。 如果axis == 1,那么输出变量将具有形状(A, N, B, C)。
参数:
values
具有相同形状和类型的变量对象列表axis
一个int,沿轴堆叠。默认为第一个维度。负值环绕,所以有效范围是[-(R+1), R+1)
返回:一个与values相同类型的堆叠变量
_CropAndResize
MNN_PUBLIC VARP _CropAndResize(VARP image, VARP boxes, VARP box_ind, VARP crop_size,
InterpolationMethod method, float extrapolation_value = 0.0);
从输入图像变量中提取作物,并使用双线性采样或最近邻采样(可能会改变长宽比)调整它们的大小,到由crop_size指定的通用输出大小。返回一个带有农作物的变量,该变量来自于框中边界框位置定义的输入图像位置。裁剪的盒子都被调整大小(双线性或最近邻插值)为固定大小= [crop_height, crop_width]。结果是一个4-D张量num_boxes, crop_height, crop_width, depth。
参数:
image
一个形状[batch, image_height, image_width, depth]的4-D变量(假设NHWC格式)。image_height和image_width都必须为正boxes
形状为[num_boxes, 4]的二维变量。变量的第i行指定了box_ind[i]图像中盒子的坐标,并以规范化坐标[y1, x1, y2, x2]指定将y的一个归一化坐标值映射到y * (image_height - 1)处的图像坐标,因此,在图像高度坐标中,归一化图像高度的[0,1]区间映射为[0,image_height - 1]。我们允许y1 > y2,在这种情况下,采样的裁剪是原始图像的上下翻转版本。宽度维度的处理方式类似。允许在[0,1]范围之外的规范化坐标,在这种情况下,我们使用extrapolation_value来外推输入图像值。box_ind
形状为[num_boxes]的1-D变量,其int值范围为[0,batch),box_ind[i]的值指定第i个框所指向的图像。crop_size
一个包含2个元素的1-D变量,size = [crop_height, crop_width]。所有裁剪的图像补丁都调整到这个大小。不保留图像内容的长宽比。作物高度和作物宽度都必须是正的。method
一个枚举值, CropAndResizeMethod_NEAREST或CropAndResizeMethod_BILINEAR,默认为CropAndResizeMethod_BILINEAR,extrapolation_value:适用时用于外推的值。extrapolation_value
推断值,默认为0.0
返回:形状[num_boxes, crop_height, crop_width, depth]的4-D变量(假设NHWC格式)
_Fill
MNN_PUBLIC VARP _Fill(VARP dims, VARP value);
创建一个填充标量值的变量
参数:
dims
一个变量,必须是1-D Halide_Type_Int。表示输出变量的形状value
一个变量,0-D(标量),值填充返回的变量
返回:一个变量,类型与值相同
_Tile
MNN_PUBLIC VARP _Tile(VARP input, VARP multiples);
通过平铺给定变量来构造一个变量
参数:
Fill
一个变量,一维或更高multiples
一个变量,必须是1-D Halide_Type_Int,长度必须与输入的维度数相同
返回:一个变量,与输入的类型相同
_Gather
MNN_PUBLIC VARP _Gather(VARP params, VARP indices);
根据索引从参数中收集切片
参数:
params
收集值的变量indices
指标变量,必须是范围[0,ndim (params)-1]的Halide_Type_Int
返回:从索引给出的索引中收集的参数值
_GatherV2
MNN_PUBLIC VARP _GatherV2(VARP params, VARP indices, VARP axis = nullptr);
根据索引从参数轴收集切片
参数:
params
收集值的变量indices
指标变量,必须是范围[0,ndim (params)-1]的Halide_Type_Intaxis
一个int,参数中用于收集下标的轴,支持负索引,如果设为0,它就和_Gather一样。目前只支持0
返回:从索引给出的索引收集的参数值
_Squeeze
MNN_PUBLIC VARP _Squeeze(VARP input, INTS axis = {});
从变量的形状中移除大小为1的维度
参数:
input
一个变量,挤压输入axis
一个向量,默认为{}。如果指定,只挤压所列的尺寸。维度索引从0开始。必须在范围内[-rank(input), rank(input))
返回:一个变量,与输入的类型相同。包含与输入相同的数据,但删除了一个或多个大小为1的维度
_Unsqueeze
MNN_PUBLIC VARP _Unsqueeze(VARP input, INTS axis = {});
插入到指定位置的尺寸为1的新数据
参数:
input
输入变量axis
默认为{},用来指定要增加的为1的维度
返回:变换后的数据
_BatchToSpaceND
MNN_PUBLIC VARP _BatchToSpaceND(VARP input, VARP block_shape, VARP crops);
BatchToSpace用于N-D变量,该操作将“batch”维度0重塑为形状block_shape + [batch]的M + 1个维度,将这些块插入由空间维度定义的网格中[1,…]M],获得与输入相同秩的结果。这个中间结果的空间维度然后根据作物选择性地裁剪产生的输出。这与SpaceToBatch正好相反。请参阅下面的精确描述。
参数:
input
必须为4-D格式,且为NC4HW4格式。N-D的形状input_shape = [batch] + spatial_shape + remaining_shape,其中spatial_shape有M个维度。block_shape
形状为[M]的1- d,所有值必须为>= 1crops
形状为[M, 2]的二维,所有值必须为>= 0。Crops [i] = [crop_start, crop_end]指定从输入维度i + 1开始的作物数量,对应空间维度i,要求crop_start[i] + crop_end[i] <= block_shape[i] * input_shape[i + 1]。 该操作相当于以下步骤: shape的整形输入:[block_shape[0],…], block_shape[M-1], batch / prod(block_shape),input_shape[1],……, input_shape [n]]置换变形的尺寸产生置换的形状: [batch / prod(block_shape),input_shape[1], block_shape[0],…], input_shape [M], block_shape [M - 1], input_shape [M + 1],…, input_shape [n]] 重塑排列以产生形状的重塑: [batch / prod(block_shape),input_shape[1] * block_shape[0],…], input_shape [M] * block_shape [M - 1], input_shape [M + 1],…, input_shape [n]] 裁剪开始和结束的维度[1,…, M]的reshaped_per组合根据作物产生形状的输出: [batch / prod(block_shape),input_shape[1] * block_shape[0] -庄稼[0,0]-庄稼[0,1],…], input_shape [M] * block_shape [M - 1] -作物[M - 1,0]作物(M - 1, - 1), input_shape [M + 1],…, input_shape [n]] 例子: 对于以下形状[4,1,1,3],block_shape = [2,2], and crops =[[0,0],[0,0]]的输入: [[[[1, 2, 3]]],[[[4、5、6]]],[[[7 8 9]]],[[[10 11 12]]]] 输出变量的形状为[1,2,2,3],值为: X = [[[[1,2,3], [4,5,6], [[7, 8, 9], [10, 11, 12]]]]
返回:输出变量
_GatherND
MNN_PUBLIC VARP _GatherND(VARP params, VARP indices);
将参数中的切片收集到一个由索引指定形状的变量中
参数:
input
一个变量,用于收集值的变量indices
一个变量,Halide_Type_Int类型
返回:一个变量,与参数有相同的类型
_GatherElements
MNN_PUBLIC VARP _GatherElements(VARP params, VARP indices);
返回将参数中的切片收集到一个由索引指定形状的变量
参数:
params
输出参数indices
一个变量,Halide_Type_Int类型
返回:一个变量,与参数有相同的类型
_GatherElements
MNN_PUBLIC VARP _GatherElements(VARP params, VARP indices, VARP axis);
返回将参数中的切片收集到一个由索引指定形状的变量
参数:
params
输出参数indices
一个变量,Halide_Type_Int类型axis
操作的维度
返回:一个变量,与参数有相同的类型
_Selu
MNN_PUBLIC VARP _Selu(VARP features, float scale, float alpha);
计算缩放指数线性:scale * alpha * (exp(特征)- 1),如果< 0,scale * 特征
参数:
features
Halide_Type_Float类型的变量scale
比例因子(正浮点数)alpha
透明度因子(正浮动)
返回:一个变量,具有与功能相同的类型
_Size
MNN_PUBLIC VARP _Size(VARP input);
计算变量的大小
参数:
input
Halide_Type_Float或Halide_Type_Int类型的变量
返回:一个变量,形状是(),类型是Halide_Type_Int
_Elu
MNN_PUBLIC VARP _Elu(VARP features, float alpha=1.0);
计算指数线性:alpha * (exp(特征)- 1),如果< 0,则特征为其他,Halide_Type_Float类型的变量
参数:
features
一个变量,必须Halide_Type_Floatalpha
Alpha因子(正浮动)
返回:一个变量,具有与功能相同的类型
_Threshold
MNN_PUBLIC VARP _Threshold(VARP features, float threshold);
给定一个输入值x,如果x > threshold,它计算输出为1.0,如果x <= threshold,则为0.0
参数:
features
一个变量,必须Halide_Type_Floatthreshold
阈值
返回:一个变量,具有与功能相同的类型
_MatrixBandPart
MNN_PUBLIC VARP _MatrixBandPart(VARP input, VARP num_lower, VARP num_upper);
复制一个变量,设置每个最内层矩阵中中心带以外的所有内容
参数:
input
秩为k的变量num_lower
要保留的子对角线数。如果是负的,保持整个下三角形num_upper
要保持的超对角线的数量。如果是负的,保持整个上三角形
返回:将k变量的形状与输入相同,提取的带状张量
_Moments
MNN_PUBLIC std::vector<VARP> _Moments(VARP x, INTS axis, VARP shift, bool keepDims);
计算x的均值和方差
参数:
x
一个变量,必须是4-D的NC4HW4格式axis
整数的数组。计算平均值和方差的轴。忽略此实现:必须为{2,3}shift
在当前实现中未使用keepDims
产生与输入相同维度的力矩。忽略此实现:必须为true
返回:均值和方差
_SetDiff1D
MNN_PUBLIC VARP _SetDiff1D(VARP x, VARP y);
计算两个数字或字符串列表之间的差值,给定一个列表x和一个列表y,该操作返回一个列表,该列表表示在x中但不在y中所有的值。返回的列表的排序顺序与x中数字出现的顺序相同(保留重复的数)。此操作还返回一个列表idx,该列表表示x中每个out元素的位置。
参数:
x
Halide_Type_Int类型的1-D变量y
Halide_Type_Int类型的1-D变量,值删除
返回:Halide_Type_Int类型的1-D变量。值在x中存在,但在y中不存在
_SpaceToDepth
MNN_PUBLIC VARP _SpaceToDepth(VARP input, int block_size);
重新排列空间数据块,进入深度。更具体地说,它输出输入变量的副本,其中高度和宽度维度的值被移动到深度维度。block_size表示输入块的大小。大小为block_size x block_size的非重叠块在每个位置重新排列为深度。输出变量的深度是block_size * block_size * input_depth。每个输入块中的Y、X坐标成为输出通道索引的高阶分量。输入变量的高度和宽度必须能被block_size整除
参数:
input
输入变量block_size
一个整数>= 2。空间块的大小
返回:一个变量。与输入的类型相同
_SpaceToBatchND
MNN_PUBLIC VARP _SpaceToBatchND(VARP input, VARP block_shape, VARP paddings);
他的操作划分了“空间”维度[1,…, M]输入到形状块block_shape的网格中,并将这些块与“批处理”维度交织使得在输出中,空间维度[1,…], M]对应网格内的位置,批处理尺寸结合了空间块内的位置和原始批处理位置。在划分为块之前,输入的空间维度可以根据填充值选择零填充。请参阅下面的精确描述
参数:
input
一个变量。必须为4-D格式,且为NC4HW4格式。N-D的形状input_shape = [batch] + spatial_shape + remaining_shape,其中spatial_shape有M个维度。block_shape:一个变量。必须是以下类型之一:int32, int64。形状为[M]的1- d,所有值必须为>= 1。block_size
一个整数>= 2。空间块的大小paddings
一个变量。必须是以下类型之一:int32, int64。形状为[M, 2]的二维,所有值必须为>= 0。padding [i] = [pad_start, pad_end]指定输入维度i + 1的填充,对应空间维度i。要求block_shape[i]除input_shape[i + 1] + pad_start + pad_end。
返回:一个变量。与输入的类型相同
_ZerosLike
MNN_PUBLIC VARP _ZerosLike(VARP input);
创建一个所有元素都设为零的变量
参数:
input
输入变量
返回:一个所有元素都设为零的变量
_Unstack
MNN_PUBLIC std::vector<VARP> _Unstack(VARP value, int axis=0);
将秩为r的张量的给定维度解包为秩-(R-1)变量。 例如,给定一个形状变量(a, B, C, D): 如果axis == 0,那么输出中的第i个变量是切片值[i,:,:,:],输出中的每个变量将具有形状(B, C, D)(注意,与拆分不同,沿着拆分的维度消失了)。 如果axis == 1,那么输出中的第i个变量是切片值[:,i,:,:],输出中的每个变量都有形状(A, C, D)。
参数:
value
一个秩为R>0的变量axis
一个int。沿轴线解叠。默认为第一个维度。负值环绕,所以有效范围是[-R, R)
返回:从值中分离出来的变量对象列表
_Rank
MNN_PUBLIC VARP _Rank(VARP input);
返回变量的秩,返回一个0-D的int32变量,表示输入的秩。 注意:变量的秩与矩阵的秩是不同的。 它是唯一选择变量的每个元素所需的索引数。它也被称为“顺序”、“程度”或“ndim”。
参数:
input
输入变量
返回:Halide_Type_Int类型的0-D变量
_Range
MNN_PUBLIC VARP _Range(VARP start, VARP limit, VARP delta);
创建一个数字序列
参数:
start
0-D变量(标量)limit
0-D变量(标量)delta
0-D变量(标量)
返回:数字序列
_DepthToSpace
MNN_PUBLIC VARP _DepthToSpace(VARP input, int block_size);
将深度数据重新排列为空间数据块。这是SpaceToDepth的反向转换。更具体地说,它输出输入变量的副本,其中深度维度的值在空间块中移动到高度和宽度维度
参数:
input
输入变量block_size
一个整数>= 2。空间块的大小,与Space2Depth相同
返回:一个变量。与输入的类型相同
_PriorBox
MNN_PUBLIC VARP _PriorBox(VARP feature, VARP image,
std::vector<float> min_size, std::vector<float> max_size, std::vector<float>aspect_ratio,
bool flip, bool clip, std::vector<float>variance,
unsigned int img_h, unsigned int img_w, float step_h, float step_w, float offset = 0.5);
SSD网络的priorbox层,人脸检测网络
参数:
feature
一个变量。包含特性图,也就是caffprior中的底部[0]image
一个变量。包含图像,也就是caffe中的底部[1]min_size
最小区域大小(像素)max_size
最大区域大小(像素)aspect_ratio
各种纵横比。重复比率被忽略。如果没有提供,则使用默认1.0flip
如果为true,则翻转每个纵横比。例如,如果有高宽比“r”,也会生成高宽比“1.0/r”,违约事实clip
如果为true,则剪辑之前,使其在[0,1]内。默认为false。variance
在bboxes之前调整方差img_h
图像的高度。如果为0,则使用图像中的信息img_w
图像的宽度。如果为0,则使用图像中的信息step_h
步高step_w
步宽offset
每个单元格的左上角的偏移
返回:一个变量
_Permute
MNN_PUBLIC VARP _Permute(VARP input, INTS dims);
SSD网络的交换层,用于置换索引轴顺序的
参数:
input
一个变量。包含特性图,也就是caffe中的底部[0]dims
一个向量。置换后的索引轴顺序
返回:一个变量
_DetectionOutput
MNN_PUBLIC VARP _DetectionOutput(VARP location, VARP confidence, VARP priorbox,
unsigned int num_classes, bool share_location, int background_label_id,
float nms_threshhold, int nms_topk, int code_type,
bool variance_encoded_in_target,
int keep_top_k, float confidence_threshold, float visualize_threshold);
SSD网络的detectionoutput层,用于整合预选框、预选框偏移以及得分三项结果,最终输出满足条件的目标检测框、目标的label和得分
参数:
location
位置confidence
得分priorbox
SSD网络的priorbox层,人脸检测网络num_classes
预测种类share_location
指示不同类之间是否共享位置,默认为truebackground_label_id
默认为0nms_threshhold
nms的阈值nms_topk
nms的topkcode_type
表示bbox编码模式,默认= CORNERvariance_encoded_in_target
variance是否被编码,默认为falsekeep_top_k
每张图片在nms处理后保留框的数量,默认值-1(保留所有boxes)confidence_threshold
得分阈值visualize_threshold
阈值用于将检测结果可视化
返回:目标检测框、目标的label和得分
_DetectionPostProcess
MNN_PUBLIC std::vector<VARP> _DetectionPostProcess(VARP encode_boxes, VARP class_predictions, VARP anchors,
int num_classes, int max_detections,
int max_class_per_detection, int detections_per_class,
float nms_threshold, float iou_threshold,
bool use_regular_nms, std::vector<float> centersize_encoding);
SSD网络的detectionpostprocess层,对于预测阶段,模型输出的结果比较多,需要筛选最终结果
参数:
encode_boxes
盒子编码class_predictions
类预测anchors
一个变量num_classes
预测种类max_detections
最大检测次数max_class_per_detection
每次检测的最大类detections_per_class
表示每个类的检测nms_threshold
nms的阈值iou_threshold
iou的阈值use_regular_nms
是否使用常规的NMS方法,目前只支持falsecentersize_encoding
一个浮点向量,表示中心大小编码
返回:4个变量,detection_boxes, detection_class, detection_scores, num_detections
_Interp
MNN_PUBLIC VARP _Interp(VARPS xs, float widthScale, float heightScale, int outputWidth, int outputHeight, int resizeType, bool alignCorners);
一维线性插值,返回离散数据的一维分段线性插值结果
参数:
xs
待插入数据的横坐标widthScale
宽度比heightScale
高度比outputWidth
输出宽度outputHeight
输出高度resizeType
调整类型alignCorners
是否边缘对齐
返回:离散数据的一维分段线性插值结果
_ZeroGrad
MNN_PUBLIC VARP _ZeroGrad(VARP x);
参数梯度置0.
参数:
x
输入变量
返回:梯度为0的变量
_Conv
MNN_PUBLIC VARP _Conv(std::vector<int8_t>&& weight, std::vector<int>&& bias, std::vector<float>&& scale, VARP x, INTS channel, INTS kernelSize, PaddingMode pad, INTS stride, INTS dilate, int group, INTS pads, bool relu, int nbits = 8);
对由多个输入平面组成的输入信号进行卷积
参数:
weight
卷积产生的通道数bias
偏置项行向量,在输出中添加一个可学习的偏差scale
缩放因子x
输入变量channel
渠道kernelSize
卷积核大小pad
填充模式,默认为VALIDstride
卷积步长,默认为{1, 1}dilate
扩张操作:控制kernel点(卷积核点)的间距,默认值为{1, 1}group
控制分组卷积,默认不分组,为1组pads
填充操作,默认为{0, 0}relu
是否修正线性单元,默认为faslenbits
默认为8
返回:卷积
_Conv
MNN_PUBLIC VARP _Conv(std::vector<int8_t>&& weight, std::vector<int>&& bias, std::vector<float>&& scale,
VARP x, INTS channel, INTS kernelSize,
PaddingMode pad, INTS stride, INTS dilate, int group, INTS pads, bool relu,
int8_t inputZeroPoint, int8_t outputZeroPoint,
int8_t minValue, int8_t maxValue, bool accumulateToInt16);
对由多个输入平面组成的输入信号进行卷积
参数:
weight
卷积产生的通道数bias
偏置项行向量,在输出中添加一个可学习的偏差scale
缩放因子x
输入变量channel
渠道kernelSize
卷积核大小pad
填充模式,默认为VALIDstride
卷积步长,默认为{1, 1}dilate
扩张操作:控制kernel点(卷积核点)的间距,默认值为{1, 1}group
控制分组卷积,默认不分组,为1组pads
填充操作,默认为{0, 0}relu
是否修正线性单元,默认为fasleinputZeroPoint
输入变量outputZeroPoint
输入变量minValue
最小值maxValue
最大值accumulateToInt16
输入变量
返回:卷积
_Conv
MNN_PUBLIC VARP _Conv(std::vector<int8_t>&& weight, std::vector<float>&& bias, std::vector<float>&& weightScale,
VARP x, INTS channel, INTS kernelSize,
PaddingMode pad, INTS stride, INTS dilate, int group, INTS pads, bool relu,
float scaleIn, float scaleOut,
int8_t inputZeroPoint, int8_t outputZeroPoint,
int8_t minValue, int8_t maxValue, float weightClampValue, bool accumulateToInt16);
对由多个输入平面组成的输入信号进行卷积
参数:
weight
卷积产生的通道数bias
偏置项行向量,在输出中添加一个可学习的偏差weightScale
卷积产生的通道数的缩放因子x
输入变量channel
渠道kernelSize
卷积核大小pad
填充模式,默认为VALIDstride
卷积步长,默认为{1, 1}dilate
扩张操作:控制kernel点(卷积核点)的间距,默认值为{1, 1}group
控制分组卷积,默认不分组,为1组pads
填充操作,默认为{0, 0}relu
是否修正线性单元,默认为faslescaleIn
向内扩展值scaleOut
向外扩展值inputZeroPoint
输入变量outputZeroPoint
输入变量minValue
最小值maxValue
最大值weightClampValue
输入变量accumulateToInt16
输入变量
返回:卷积
_CosineSimilarity
MNN_PUBLIC VARP _CosineSimilarity(VARP input0, VARP input1, VARP inputDim);
余弦相似度,又称为余弦相似性,是通过测量两个向量的夹角的余弦值来度量它们之间的相似性
参数:
input0
输入变量input1
输入变量inputDim
表示对应行或者列的向量之间进行cos相似度计算
返回:和input0类型一致的数据
_GridSample
MNN_PUBLIC VARP _GridSample(VARP input, VARP grid, InterpolationMethod mode=BILINEAR, GridSamplePaddingMode paddingMode=GRID_SAMPLE_PADDING_ZEROS, bool alignCorners=false);
提供一个input的Tensor以及一个对应的flow-field网格(比如光流,体素流等),然后根据grid中每个位置提供的坐标信息(这里指input中pixel的坐标),将input中对应位置的像素值填充到grid指定的位置,得到最终的输出。
参数:
input
输入数据grid
flow-field网格mode
定义了在input中指定位置的pixel value中进行插值的方法,默认为BILINEARpaddingMode
对于越界的位置在网格中采用填充方式,默认为GRID_SAMPLE_PADDING_ZEROSalignCorners
默认为false
返回:网格数据
_FloatToInt8
MNN_PUBLIC VARP _FloatToInt8(VARP x, VARP scale, char minValue, char maxValue);
float类型转换为Int8类型
参数:
x
输入变量scale
比例因子minValue
最小值maxValue
最大值
返回:Int8类型数据
_FloatToInt8
MNN_PUBLIC VARP _FloatToInt8(VARP x, VARP scale, int8_t minValue, int8_t maxValue, int8_t zeroPoint);
float类型转换为Int8类型
参数:
x
输入变量scale
比例因子minValue
最小值maxValue
最大值zeroPoint
原点
返回:Int8类型数据
_Int8ToFloat
MNN_PUBLIC VARP _Int8ToFloat(VARP x, VARP scale);
Int8转换为float类型
参数:
x
输入变量scale
比例因子
返回:float类型数据
_Int8ToFloat
MNN_PUBLIC VARP _Int8ToFloat(VARP x, VARP scale, int8_t zeroPoint);
Int8转换为float类型
参数:
x
输入变量scale
比例因子zeroPoint
原点
返回:float类型数据
_Select
MNN_PUBLIC VARP _Select(VARP select, VARP input0, VARP input1);
返回根据’cond’从’x’或’y’中选择的元素
参数:
select
输入变量input0
输入变量input1
输入变量
返回:根据条件选中的元素
_TopKV2
MNN_PUBLIC std::vector<VARP> _TopKV2(VARP input0, VARP input1);
查找排序后的数据的值和索引。
参数:
input0
输入变量input1
输入变量
返回:值和索引
_ImageProcess
MNN_PUBLIC VARP _ImageProcess(VARP input, CV::ImageProcess::Config config, CV::Matrix matrix, int oh, int ow, int oc, int dtype, uint8_t padVal = 0);
图像处理
参数:
input
输入变量config
配置信息matrix
输出矩阵oh
图像高ow
图像宽oc
卷积计算类型dtype
返回数据类型padVal
默认为0
返回:图像
_Where
MNN_PUBLIC VARP _Where(VARP x);
返回满足条件x > 0
的索引
参数:
x
输入变量
返回:索引
_Sort
MNN_PUBLIC VARP _Sort(VARP x, int axis = -1, bool arg = false, bool descend = false);
排序
参数:
x
输入变量axis
输入变量,int类型,操作的坐标轴,默认为-1arg
是否返回排序元素的index, 默认为falsedescend
true代表倒序,false代表正序,默认为false
返回:排序结果
_Raster
MNN_PUBLIC VARP _Raster(const std::vector<VARP>& vars, const std::vector<int>& regions, const std::vector<int>& shape);
光栅化
参数:
vars
输入变量regions
区域shape
输出形状
返回:光栅化的值
_Nms
MNN_PUBLIC VARP _Nms(VARP boxes, VARP scores, int maxDetections, float iouThreshold = -1, float scoreThreshold = -1);
非极大值抑制算法,搜索局部极大值,抑制非极大值元素
参数:
boxes
形状必须为[num, 4]scores
float类型的大小为[num_boxes]代表上面boxes的每一行,对应的每一个box的一个scoremaxDetections
一个整数张量,代表最多可以利用NMS选中多少个边框iouThreshold
IOU阙值展示的是否与选中的那个边框具有较大的重叠度,默认为-1scoreThreshold
默认为-1,来决定什么时候删除这个边框
返回:搜索局部极大值,抑制非极大值元素
_Im2Col
MNN_PUBLIC VARP _Im2Col(VARP x, INTS kernelSize, INTS dilate, INTS pads, INTS stride);
我们沿着原始矩阵逐行计算,将得到的新的子矩阵展开成列,放置在列块矩阵中
参数:
x
输入变量kernelSize
内核大小dilate
扩张操作:控制kernel点的间距pads
填充操作stride
步长
返回:列块矩阵
_Col2Im
MNN_PUBLIC VARP _Col2Im(VARP x, VARP outputShape, INTS kernelSize, INTS dilate, INTS pads, INTS stride);
我们沿着列块矩阵逐行计算,将得到的行展成子矩阵,然后将子矩阵放置在最终结果对应的位置(每次当前值进行相加),同时记录每个位置的值放置的次数。最后,将当前位置的值除以放置的次数,即可得到结果(原始矩阵)
参数:
x
输入变量outputShape
输出形状kernelSize
内核大小dilate
扩张操作:控制kernel点的间距pads
填充操作stride
步长
返回:原始矩阵