张量类 - GNN中所有数值计算的基础数据结构 支持多维数组的存储和基本数学运算
Tensor
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| InvalidateAllDeviceCaches | 1 | 让所有张量的设备端缓存副本失效。 |
| MarkHostModified | 1 | 声明本张量的主机数据已被绕过索引器就地修改过,从而让设备端缓存副本失效。 |
| .ctor | 5 | 创建一个空的张量(形状为 {0}、不含数据)。 |
| UpdateDimProds | 1 | 更新维度乘积数组 用于快速计算多维索引到一维索引的转换 |
| Get1DInd | 1 | 将多维索引转换为一维索引(来自旧版本) |
| MultAll | 1 | 计算数组所有元素的乘积(来自旧版本) |
| DimsEqual | 1 | 比较两个张量的维度是否相等(来自旧版本) |
| BroadcastedAddition | 1 | 广播加法(来自旧版本) 当两个向量进行加法时,生成一个矩阵,其中每个元素是两个向量对应元素的和 |
| Wrap | 2 | 用已有张量的底层存储与指定形状再创建一个张量视图(零拷贝 reshape)。 |
| From2DArray | 1 | 从二维数组创建张量 |
| Filled | 1 | 创建填充指定值的张量 |
| Identity | 1 | 创建单位矩阵 |
| Random | 1 | 创建随机张量(均匀分布) |
| RandomNormal | 1 | 创建随机张量(正态分布,Xavier初始化) 用于神经网络权重初始化,有助于梯度流动 |
| Range | 1 | 创建整数范围张量 Create integer range tensor |
| XavierInit | 1 | Xavier初始化 - 适用于sigmoid/tanh激活函数 |
| HeInit | 1 | He初始化 - 适用于ReLU激活函数 |
| Scalar | 1 | 创建标量张量 Create scalar tensor |
| Zeros | 1 | 创建全零张量 Create zero tensor |
| Ones | 1 | 创建全一张量 Create ones tensor |
| Clone | 1 | 克隆张量 Clone tensor |
| ToTensorF | 1 | 转换为单精度张量 TensorF。数据会被复制并逐元素窄化为 Single, 用于把双精度生态的结果交给 CFD 求解 / 三维可视化这类内存带宽受限的下游环节。 |
| Reshape | 1 | 重塑张量形状(来自旧版本) 改变张量的维度结构,但不改变数据 |
| GetValue | 1 | 获取指定索引的值 Get value at specified indices |
| SetValue | 1 | 设置指定索引的值 Set value at specified indices |
| Variable | 1 | 创建变量张量 Create variable tensor |
| GetFlatIndex | 1 | 将多维索引转换为扁平索引 Convert multi-dimensional indices to flat index |
| GetIndices | 1 | 将扁平索引转换为多维索引 Convert flat index to multi-dimensional indices |
| op_Addition | 2 | 张量加法(逐元素) |
| op_Subtraction | 2 | 张量减法(逐元素) |
| op_Multiply | 2 | 矩阵乘法运算符(来自旧版本) 两个二维张量进行矩阵乘法 |
| op_Division | 1 | 张量与标量相除 |
| ElementwiseMultiply | 1 | 逐元素乘法(Hadamard积) |
| MatMul | 1 | 矩阵乘法(二维张量) 这是GNN消息传递的核心运算 |
| Transpose | 1 | 转置 |
| Sum | 1 | 沿指定轴求和 |
| TotalSum | 1 | 计算所有元素的和 |
| Mean | 2 | 计算所有元素的平均值 |
| L2Norm | 1 | 计算L2范数(欧几里得范数) |
| Apply | 2 | 对每个元素应用函数(Double版本) |
| ToArray | 1 | 获取原始数据数组的副本(Single版本) |
| ToDoubleArray | 1 | 获取原始数据数组的副本(Double版本) |
| To2DArray | 1 | 转换为二维数组 |
| To2DArrayDouble | 1 | 转换为二维数组(Double版本) |
| GetRow | 1 | 获取指定行 |
| GetColumn | 1 | 获取指定列 |
| 1 | 打印张量内容(用于调试) | |
| ToString | 1 | 转换为字符串表示 Convert to string representation |
| Dispose | 1 | 释放资源 Dispose resources |
| Finalize | 1 | 析构函数 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| computeKernel | 1 | 当前生效的张量计算后端(策略模式)。 |
| DeviceEpoch | 1 | 当前的全局设备端缓存纪元号 |
| Shape | 1 | 张量的形状(各维度大小) |
| Data | 1 | 底层数据数组 Underlying data array |
| Rank | 1 | 张量的维度数 |
| Length | 1 | 张量中元素的总数 |
| TotalLength | 1 | 张量中元素的总数(兼容旧版本) |
| Dimensions | 1 | 张量的维度数组(兼容旧版本) |
| IsVariable | 1 | 是否为变量(可训练) Whether this is a variable (trainable) |
| Gradient | 1 | 梯度(用于反向传播) Gradient for backpropagation |
| Version | 1 | 数据版本号(只读)。任何原地写入都会使其自增,供设备端缓存判断失效。 |
| Item | 4 | 获取或设置指定位置处的元素值(三维访问) |
04 Fields
05 Members
让所有张量的设备端缓存副本失效。
仅在"绕过 Tensor 的索引器直接就地修改底层数组"之后需要调用; 通过索引器 / SetValue 的写入会自动使该张量自身的缓存失效,无需调用本方法。
声明本张量的主机数据已被绕过索引器就地修改过,从而让设备端缓存副本失效。
适用于"零拷贝视图 + 外部直接改写底层 Double()"的场景。 与全局的 Tensor.InvalidateAllDeviceCaches() 相比,本方法只失效当前这一个张量, 粒度更细,也不会把其它张量的缓存一并冲掉。
创建一个空的张量(形状为 {0}、不含数据)。
该重载的唯一用途是给反射式反序列化(Activator.CreateInstance,见 Microsoft.VisualBasic.Serialization.BinaryDumping 的 ObjectInputStream) 提供一个真正的无参构造函数:实例化之后由反序列化流程直接填充字段, 因此这里只做能够安全通过 Tensor.UpdateDimProds() 的最小初始化。
Int32())创建指定形状的张量,并用零初始化
| Name | Type | Description |
|---|---|---|
shape | Int32() | 张量的形状 |
Double(), Int32())使用指定数据创建张量
| Name | Type | Description |
|---|---|---|
data | Double() | 初始数据 |
shape | Int32() | 张量形状 |
Single(), Int32())使用指定数据创建张量(Single版本,兼容旧代码)
| Name | Type | Description |
|---|---|---|
data | Single() | 初始数据 |
shape | Int32() | 张量形状 |
Double[0:,0:])从二维数组创建张量 Create tensor from 2D array
更新维度乘积数组 用于快速计算多维索引到一维索引的转换
Int32())将多维索引转换为一维索引(来自旧版本)
| Name | Type | Description |
|---|---|---|
indexes | Int32() | 多维索引数组 |
一维数组索引
Int32())计算数组所有元素的乘积(来自旧版本)
| Name | Type | Description |
|---|---|---|
array | Int32() | 整数数组 |
所有元素的乘积
比较两个张量的维度是否相等(来自旧版本)
如果维度相等返回True,否则返回False
广播加法(来自旧版本) 当两个向量进行加法时,生成一个矩阵,其中每个元素是两个向量对应元素的和
广播加法结果矩阵
Double(), Int32())直接使用给定的数据数组创建张量(不做数据拷贝)。
与 New(data, shape) 的区别在于本方法不会克隆 data: 张量与调用方共享同一份底层存储,任一侧的就地修改都会立刻反映到另一侧, 因此它适合"把已有的 Double() 缓冲区包装成张量视图"的场景 (例如 CNN 把 DataBlock 的权重数组交给张量算子参与计算)。 需要独立副本时请使用构造函数。
| Name | Type | Description |
|---|---|---|
data | Double() | 底层数据数组,长度必须与 shape 的乘积一致 |
shape | Int32() | 张量形状 |
Int32())用已有张量的底层存储与指定形状再创建一个张量视图(零拷贝 reshape)。
元素总数必须保持不变,否则抛 ArgumentException。
Single[0:,0:])从二维数组创建张量
Int32(), Single)创建填充指定值的张量
Int32)创建单位矩阵
Int32(), Single, Single, Nullable(Of Int32))创建随机张量(均匀分布)
RandomUniform
Int32(), Single, Single, Nullable(Of Int32))创建随机张量(正态分布,Xavier初始化) 用于神经网络权重初始化,有助于梯度流动
Int32, Int32, Int32)创建整数范围张量 Create integer range tensor
Int32, Int32, Nullable(Of Int32))Xavier初始化 - 适用于sigmoid/tanh激活函数
Int32, Int32, Nullable(Of Int32))He初始化 - 适用于ReLU激活函数
Double)创建标量张量 Create scalar tensor
Int32())创建全零张量 Create zero tensor
Int32())创建全一张量 Create ones tensor
克隆张量 Clone tensor
转换为单精度张量 TensorF。数据会被复制并逐元素窄化为 Single, 用于把双精度生态的结果交给 CFD 求解 / 三维可视化这类内存带宽受限的下游环节。
同形状的单精度张量
Int32())重塑张量形状(来自旧版本) 改变张量的维度结构,但不改变数据
| Name | Type | Description |
|---|---|---|
newDims | Int32() | 新的维度数组 |
如果重塑成功返回True,否则返回False
Int32())获取指定索引的值 Get value at specified indices
Double, Int32())设置指定索引的值 Set value at specified indices
创建变量张量 Create variable tensor
Int32())将多维索引转换为扁平索引 Convert multi-dimensional indices to flat index
Int32)将扁平索引转换为多维索引 Convert flat index to multi-dimensional indices
张量加法(逐元素)
Single)张量加标量(来自旧版本)
张量减法(逐元素)
Single)张量减标量(来自旧版本)
Single)张量与标量相乘
矩阵乘法运算符(来自旧版本) 两个二维张量进行矩阵乘法
Single)张量与标量相除
逐元素乘法(Hadamard积)
矩阵乘法(二维张量) 这是GNN消息传递的核心运算
转置
Int32)沿指定轴求和
计算所有元素的和
计算所有元素的平均值
Int32)沿指定轴计算平均值
计算L2范数(欧几里得范数)
Func(Of Single, Single))对每个元素应用函数
Func(Of Double, Double))对每个元素应用函数(Double版本)
获取原始数据数组的副本(Single版本)
获取原始数据数组的副本(Double版本)
转换为二维数组
转换为二维数组(Double版本)
Int32)获取指定行
Int32)获取指定列
String)打印张量内容(用于调试)
转换为字符串表示 Convert to string representation
释放资源 Dispose resources
析构函数
当前生效的张量计算后端(策略模式)。
默认是 SIMD 加速的 CPU 实现(SIMDTensor.Default)。 通过 SIMDTensor.Register() 或 ILCuda.GPUTensor.CudaTensor.Register() 可以在运行时切换到其它后端(例如 CUDA GPU),下游调用方无需任何改动。
当前的全局设备端缓存纪元号
张量的形状(各维度大小)
底层数据数组 Underlying data array
存储张量数据的一维数组(行优先顺序)
张量的维度数
张量中元素的总数
张量中元素的总数(兼容旧版本)
张量的维度数组(兼容旧版本)
是否为变量(可训练) Whether this is a variable (trainable)
梯度(用于反向传播) Gradient for backpropagation
数据版本号(只读)。任何原地写入都会使其自增,供设备端缓存判断失效。
返回值 = 本实例自身的写入计数 + Tensor.DeviceEpoch。 加上全局纪元是为了覆盖"绕过 Tensor 直接就地修改底层数组"的场景 (见 Tensor.InvalidateAllDeviceCaches())。
Int32)获取或设置指定索引处的元素值(一维访问)
Int32, Int32)获取或设置指定位置处的元素值(二维访问)
Int32, Int32, Int32)获取或设置指定位置处的元素值(三维访问)
| Name | Type | Description |
|---|---|---|
row | Int32 | 第0维索引(通常对应行/高) |
col | Int32 | 第1维索引(通常对应列/宽) |
depth | Int32 | 第2维索引(通常对应深度/通道) |
Int32())获取或设置指定位置处的元素值(多维数组索引访问) 支持任意维度的索引访问
底层数据数组
张量的形状(各维度大小)
维度乘积数组,用于快速计算多维索引 dimProds(i) = dims(0) dims(1) ... * dims(i-1)
是否已释放资源
数据版本号:任何原地写入(索引器 setter / SetValue)都会自增, 供设备端后端判断其缓存的显存副本是否已经失效。
切换计算后端时使用的同步根对象
全局的设备端缓存纪元号。
后端(例如 CUDA)会把张量的主机数据上传到显存并做 LRU 缓存,缓存键是 "主机数组引用 + Tensor.Version"。当调用方绕过 Tensor 的索引器 / SetValue,直接就地修改了底层 Double() 数组(典型例子是 CNN 的 训练器直接改写权重数组)时,张量自身无从感知,显存副本会一直停留在旧值上, 导致后续计算静默使用过期数据。
这类调用方在修改完成之后必须调用一次 Tensor.InvalidateAllDeviceCaches(), 让所有张量的缓存副本失效(Tensor.Version 会随之改变)。