"""
函数形式Op
"""
import nndeploy._nndeploy_internal as _C
from nndeploy.device.tensor import Tensor
import numpy as np
from nndeploy.device.tensor import create_tensor_from_numpy, create_numpy_from_tensor
[文档]def conv(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1):
assert len(weight.shape) == 4 # 当前仅支持OIHW格式的权重
param = _C.ir.ConvParam()
param.dilations_ = [dilation, dilation]
param.group_ = groups
param.kernel_shape_ = [weight.shape[2], weight.shape[3]]
param.strides_ = [stride, stride]
param.pads_ = [padding, padding, padding, padding]
return Tensor(_C.op.conv(input, weight, bias, param))
[文档]def concat(input1, input2, axis=0):
param = _C.ir.ConcatParam()
param.axis_ = axis
return Tensor(_C.op.concat([input1, input2], param))
[文档]def batch_norm(input, scale, bias, mean, var, epsilon=1e-5):
param = _C.ir.BatchNormalizationParam()
param.epsilon_ = epsilon
return Tensor(_C.op.batch_norm(input, scale, bias, mean, var, param))
[文档]def relu(input):
return Tensor(_C.op.relu(input))
[文档]def hardsigmoid(input):
return Tensor(_C.op.hardsigmoid(input))
[文档]def selu(input):
return Tensor(_C.op.selu(input))
[文档]def tanh(input):
return Tensor(_C.op.tanh(input))
[文档]def abs(input):
return Tensor(_C.op.abs(input))
[文档]def acos(input):
return Tensor(_C.op.acos(input))
[文档]def asin(input):
return Tensor(_C.op.asin(input))
[文档]def atan(input):
return Tensor(_C.op.atan(input))
[文档]def ceil(input):
return Tensor(_C.op.ceil(input))
[文档]def cos(input):
return Tensor(_C.op.cos(input))
[文档]def cosh(input):
return Tensor(_C.op.cosh(input))
[文档]def erf(input):
return Tensor(_C.op.erf(input))
[文档]def exp(input):
return Tensor(_C.op.exp(input))
[文档]def floor(input):
return Tensor(_C.op.floor(input))
[文档]def log(input):
return Tensor(_C.op.log(input))
[文档]def reciprocal(input):
return Tensor(_C.op.reciprocal(input))
[文档]def round(input):
return Tensor(_C.op.round(input))
def sigmoid(input):
return Tensor(_C.op.sigmoid(input))
[文档]def sign(input):
return Tensor(_C.op.sign(input))
[文档]def sin(input):
return Tensor(_C.op.sin(input))
[文档]def sinh(input):
return Tensor(_C.op.sinh(input))
[文档]def sqrt(input):
return Tensor(_C.op.sqrt(input))
[文档]def tan(input):
return Tensor(_C.op.tan(input))
[文档]def add(input1, input2):
return Tensor(_C.op.add(input1, input2))
[文档]def flatten(input, axis=1):
param = _C.ir.FlattenParam()
param.axis_ = axis
return Tensor(_C.op.flatten(input, param))
[文档]def gather(input, index, axis=0):
param = _C.ir.GatherParam()
param.axis_ = axis
return Tensor(_C.op.gather(input, index, param))
[文档]def gemm(input_a, input_b, input_c=None, alpha=1.0, beta=1.0, trans_a=0, trans_b=0):
param = _C.ir.GemmParam()
param.alpha_ = alpha
param.beta_ = beta
param.trans_a_ = trans_a
param.trans_b_ = trans_b
return Tensor(_C.op.gemm(input_a, input_b, input_c, param))
[文档]def global_averagepool(input):
return Tensor(_C.op.global_averagepool(input))
[文档]def maxpool(input, kernel_size, stride=1, padding=0, dilation=1, ceil_mode=False):
param = _C.ir.MaxPoolParam()
param.kernel_shape_ = [kernel_size] * 2
param.strides_ = [stride] * 2
param.pads_ = [padding] * 4
param.dilations_ = [dilation] * 2
param.ceil_mode_ = ceil_mode
return Tensor(_C.op.maxpool(input, param))
[文档]def mat_mul(input1, input2, bias=None, transposeA=False, transposeB=False):
param = _C.ir.MatMulParam()
param.transposeA_ = transposeA
param.transposeB_ = transposeB
return Tensor(_C.op.mat_mul(input1, input2, param, bias))
[文档]def mul(input1, input2):
return Tensor(_C.op.mul(input1, input2))
[文档]def rms_norm(input, weight, epsilon=1e-5):
param = _C.ir.RMSNormParam()
param.epsilon_ = epsilon
return Tensor(_C.op.rms_norm(input, weight, param))
[文档]def reshape(input, shape, allowzero=0):
param = _C.ir.ReshapeParam()
param.allowzero_ = allowzero
return Tensor(_C.op.reshape(input, shape, param))
[文档]def softmax(input, axis=1):
param = _C.ir.SoftmaxParam()
param.axis_ = axis
return Tensor(_C.op.softmax(input, param))
[文档]def slice(input, starts, ends, axes, steps):
return _C.op.slice(input, starts, ends, axes, steps)
[文档]def sigmoid(input):
return Tensor(_C.op.sigmoid(input))
[文档]def quantize_linear(input, scale, zero_point, axis=1, saturate=True):
param = _C.ir.QuantizeLinearParam()
param.axis_ = axis
param.saturate_ = saturate
return Tensor(_C.op.quantize_linear(input, scale, zero_point, param))
[文档]def dequantize_linear(input, scale, zero_point, axis=1):
param = _C.ir.DequantizeLinearParam()
param.axis_ = axis
return Tensor(_C.op.dequantize_linear(input, scale, zero_point, param))
[文档]def qlinear_conv(
x,
x_scale,
x_zero_point,
w,
w_scale,
w_zero_point,
y_scale,
y_zero_point,
bias=None,
stride=1,
padding=0,
dilation=1,
groups=1,
):
param = _C.ir.QLinearConvParam()
param.kernel_shape_ = [w.shape[2], w.shape[3]]
param.stride_ = [stride, stride]
param.padding_ = [padding, padding]
param.dilation_ = [dilation, dilation]
param.groups_ = groups
return Tensor(
_C.op.qlinear_conv(
x,
x_scale,
x_zero_point,
w,
w_scale,
w_zero_point,
y_scale,
y_zero_point,
bias,
param,
)
)
[文档]def where(input1, input2, condition):
return Tensor(_C.op.where(input1, input2, condition))
[文档]def transpose(input, perm_axis):
param = _C.ir.TransposeParam()
param.perm_ = perm_axis
return Tensor(_C.op.transpose(input, param))
[文档]def split(input, section=None, num_outputs=None, axis=0):
"""
Python 封装的 Split 接口
支持两种互斥模式:
1) num_outputs:等分或最后一块变小
2) section:list/tuple/int 指定每段长度(自动转为 1-D int64 Tensor) ;具有更高优先级
返回值:tuple[Tensor, ...]
"""
param = _C.ir.SplitParam()
param.axis_ = axis
# 根据输入决定使用哪种模式
if section is not None:
# 统一转成 1-D int64 Tensor
if isinstance(section, (list, tuple)):
np_sec = np.array(section, dtype=np.int64)
else:
np_sec = np.array(section, dtype=np.int64)
sec_tensor = Tensor(create_tensor_from_numpy(np_sec))
param.num_outputs_ = 0 # 标记为使用 section
else:
if num_outputs is None:
raise ValueError("Either num_outputs or section must be provided")
sec_tensor = None
param.num_outputs_ = num_outputs
# 调 C++ splitFunc,返回 std::vector<device::Tensor*>
cpp_vec = _C.op.split(input, sec_tensor, param)
# 逐个包装成 Python Tensor 并转为 tuple
return tuple(Tensor(t) for t in cpp_vec)