稀疏張量基礎
稀疏張量是稀疏矩陣的高維擴展,其中非零元素表示為一組索引和關聯值。
Data Generation
可以通過提取非零元素直接生成數據。本文展示瞭一個簡單的2D數組,其中心有5個非零元素。
data = [
[0, 0, 2.1, 0, 0],
[0, 1, 1.4, 3, 0],
[0, 0, 4.0, 0, 0]
]
def to_sparse_coo(data):
# An intuitive way to extract coordinates and features
coords, feats = [], []
for i, row in enumerate(data):
for j, val in enumerate(row):
if val != 0:
coords.append([i, j])
feats.append([val])
return torch.IntTensor(coords), torch.FloatTensor(feats)
to_sparse_coo(data)
註意,將坐標與特征一起提取。這是一個簡單的示例,效率很低而且是人為的。在許多實際應用中,不太可能獲得離散坐標。
稀疏張量初始化
流水線的下一步是初始化稀疏張量。AMinkowskiEngine.SparseTensor需要具有批次索引的坐標;導致張量稀疏D+1 維空間尺寸(如果原始坐標具有 D維 尺寸)。
coords0, feats0 = to_sparse_coo(data_batch_0)
coords1, feats1 = to_sparse_coo(data_batch_1)
coords, feats = ME.utils.sparse_collate(
coords=[coords0, coords1], feats=[feats0, feats1])
這裡使用瞭MinkowskiEngine.utils.sparse_collate函數,但是可以使用MinkowskiEngine.utils.batched_coordinates將坐標列表轉換為MinkowskiEngine.SparseTensor兼容坐標。
連續坐標的稀疏張量
在許多情況下,神經網絡中使用的坐標是連續的。稀疏張量網絡中使用的稀疏張量是在離散坐標系中定義的。要將連續坐標中的特征轉換為離散坐標,提供瞭特征平均功能,可將連續坐標中的特征轉換為離散坐標。可以為此簡單地使用稀疏張量初始化。例如,
sinput = ME.SparseTensor(
feats=torch.from_numpy(colors), # Convert to a tensor
coords=ME.utils.batched_coordinates([coordinates / voxel_size]), # coordinates must be defined in a integer grid. If the scale
quantization_mode=ME.SparseTensorQuantizationMode.UNWEIGHTED_AVERAGE # when used with continuous coordinates, average features in the same coordinate
)
logits = model(sinput).slice(sinput)