张量计算后端契约。
ITensorCompute
00 Remarks
形状校验、广播等“语义边界”仍然由 Tensor 层负责, 后端只需要实现纯粹的数值计算。后端应当是无状态(或线程安全)的, 因为 Tensor.computeKernel 是一个全局共享变量。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| Heaviside | 1 | 阶跃函数(Heaviside): 大于 0 的元素取 1, 否则取 0。 |
| Conv2D | 1 | 二维卷积(严格来说是互相关,与主流深度学习框架一致)。 |
| Conv2DBackwardInput | 1 | 卷积反向:计算对输入的梯度。 |
| Conv2DBackwardFilter | 1 | 卷积反向:计算对卷积核的梯度。 |
| Conv2DBackwardBias | 1 | 卷积反向:计算对偏置的梯度(沿 N / OH / OW 三个维度求和)。 |
| MaxPool2D | 1 | 二维最大池化前向,同时输出每个输出位置所对应的输入扁平下标(供反向 scatter)。 |
| MaxPool2DBackward | 1 | 二维最大池化反向:按前向记录的 argMax 把梯度回填到输入位置。 |
| Sum | 1 | 沿指定轴(Nothing 表示整体)求和 |
| SumAll | 1 | 整体求和 |
| Mean | 1 | 沿指定轴(Nothing 表示整体)求均值 |
| MeanAll | 1 | 整体求均值 |
| StdDev | 1 | 总体标准差 |
| L2Norm | 1 | L2 范数(欧几里得范数) |
| Add | 1 | |
| Subtract | 1 | |
| Multiply | 1 | |
| Divide | 1 | |
| Maximum | 1 | |
| Minimum | 1 | |
| Exp | 1 | |
| Log | 1 | |
| Sqrt | 1 | |
| Square | 1 | |
| Abs | 1 | |
| Sin | 1 | |
| Cos | 1 | |
| Tanh | 1 | |
| Sigmoid | 1 | |
| Negate | 1 | |
| Reciprocal | 1 | |
| Relu | 1 | |
| LeakyRelu | 1 | |
| Elu | 1 | |
| Gelu | 1 | |
| Swish | 1 | |
| AddScalar | 1 | |
| MultiplyScalar | 1 | |
| DivideScalar | 1 | |
| Pow | 1 | |
| Clip | 1 | |
| MatMul | 1 | |
| Transpose | 1 | |
| Max | 1 | |
| Min | 1 | |
| Prod | 1 | |
| ArgMax | 1 | |
| ArgMin | 1 | |
| Softmax | 1 | |
| LogSoftmax | 1 | |
| SigmoidCrossEntropyWithLogits | 1 | |
| MseLoss | 1 | |
| L2Loss | 1 | |
| HuberLoss | 1 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| Name | 1 | 后端名称,用于诊断输出(例如 "SIMD" / "CUDA")。 |
04 Members
阶跃函数(Heaviside): 大于 0 的元素取 1, 否则取 0。
后端本身没有比较/掩码算子, 而 ReLU 系激活函数的反向传播需要的正是 (x > 0) ? dy : 0 这样的逐元素掩码; 有了本算子之后就可以写成 Heaviside(x) 与上游梯度逐元素相乘, 从而让整个反向过程同样可以下放到 GPU。 (命名为 Heaviside 而不是 Step, 是因为 Step 是 VB 的保留字)
二维卷积(严格来说是互相关,与主流深度学习框架一致)。
| Name | Type | Description |
|---|---|---|
x | Tensor | 输入,形状 (N, H, W, C) |
filters | Tensor | 卷积核,形状 (KH, KW, C, OutC) |
bias | Tensor | 偏置,形状 (OutC);传 Nothing 表示不加偏置 |
stride | Int32 | 步长 |
padding | Int32 | 四周零填充宽度 |
输出,形状 (N, OH, OW, OutC)
卷积反向:计算对输入的梯度。
| Name | Type | Description |
|---|---|---|
gradOutput | Tensor | 上游梯度,形状 (N, OH, OW, OutC) |
filters | Tensor | 前向使用过的卷积核,形状 (KH, KW, C, OutC) |
inputShape | Int32() | 前向输入的形状 (N, H, W, C),用于确定输出形状 |
对输入的梯度,形状 (N, H, W, C)
卷积反向:计算对卷积核的梯度。
| Name | Type | Description |
|---|---|---|
gradOutput | Tensor | 上游梯度,形状 (N, OH, OW, OutC) |
x | Tensor | 前向使用过的输入,形状 (N, H, W, C) |
filterShape | Int32() | 卷积核形状 (KH, KW, C, OutC),用于确定输出形状 |
对卷积核的梯度,形状 (KH, KW, C, OutC)
卷积反向:计算对偏置的梯度(沿 N / OH / OW 三个维度求和)。
| Name | Type | Description |
|---|---|---|
gradOutput | Tensor | 上游梯度,形状 (N, OH, OW, OutC) |
对偏置的梯度,形状 (OutC)
二维最大池化前向,同时输出每个输出位置所对应的输入扁平下标(供反向 scatter)。
| Name | Type | Description |
|---|---|---|
x | Tensor | 输入,形状 (N, H, W, C) |
size | Int32 | 池化窗口边长 |
stride | Int32 | 步长 |
padding | Int32 | 四周零填充宽度 |
argMax | Tensor | 输出参数:形状 (N, OH, OW, C),元素为获胜元素在输入张量之中的扁平下标 (即 |
输出,形状 (N, OH, OW, C)
二维最大池化反向:按前向记录的 argMax 把梯度回填到输入位置。
| Name | Type | Description |
|---|---|---|
gradOutput | Tensor | 上游梯度,形状 (N, OH, OW, C) |
argMax | Tensor | 前向返回的输入扁平下标,形状 (N, OH, OW, C) |
inputShape | Int32() | 前向输入的形状 (N, H, W, C) |
对输入的梯度,形状 (N, H, W, C)
沿指定轴(Nothing 表示整体)求和
整体求和
沿指定轴(Nothing 表示整体)求均值
整体求均值
总体标准差
L2 范数(欧几里得范数)
后端名称,用于诊断输出(例如 "SIMD" / "CUDA")。
Double)Double)Double)Double)Double)Double)Nullable(Of Int32))Nullable(Of Int32))Nullable(Of Int32))Int32)Int32)