稀疏張量基礎

稀疏張量是稀疏矩陣的高維擴展,其中非零元素表示為一組索引和關聯值。

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)

相关推荐阅读: