|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import unittest |
|
|
|
|
|
import torch |
|
|
|
|
|
from MinkowskiEngine import SparseTensor, MinkowskiConvolution, MinkowskiAlgorithm |
|
|
|
|
|
from tests.python.common import data_loader |
|
|
|
|
|
|
|
|
class TestKernelMap(unittest.TestCase): |
|
|
def test_kernelmap_gpu(self): |
|
|
print(f"{self.__class__.__name__}: test_kernelmap_gpu") |
|
|
if not torch.cuda.is_available(): |
|
|
return |
|
|
|
|
|
in_channels, out_channels, D = 2, 3, 2 |
|
|
coords, feats, labels = data_loader(in_channels) |
|
|
feats = feats.double() |
|
|
feats.requires_grad_() |
|
|
input = SparseTensor( |
|
|
feats, |
|
|
coordinates=coords, |
|
|
minkowski_algorithm=MinkowskiAlgorithm.SPEED_OPTIMIZED, |
|
|
device="cuda", |
|
|
) |
|
|
|
|
|
|
|
|
conv = ( |
|
|
MinkowskiConvolution( |
|
|
in_channels, |
|
|
out_channels, |
|
|
kernel_size=3, |
|
|
stride=2, |
|
|
bias=True, |
|
|
dimension=D, |
|
|
) |
|
|
.double() |
|
|
.cuda() |
|
|
) |
|
|
output = conv(input) |
|
|
|
|
|
iC = input.C.cpu().numpy() |
|
|
oC = output.C.cpu().numpy() |
|
|
print(iC) |
|
|
print(oC) |
|
|
kernel_maps = output.coordinate_manager.kernel_map( |
|
|
1, |
|
|
2, |
|
|
stride=2, |
|
|
kernel_size=3, |
|
|
) |
|
|
for kernel_index, in_out_map in kernel_maps.items(): |
|
|
for i, o in zip(in_out_map[0], in_out_map[1]): |
|
|
print(kernel_index, iC[i], "->", oC[o]) |
|
|
self.assertTrue(sum(len(in_map[0]) for k, in_map in kernel_maps.items()) == 16) |
|
|
|
|
|
def test_kernelmap(self): |
|
|
print(f"{self.__class__.__name__}: test_kernelmap") |
|
|
in_channels, out_channels, D = 2, 3, 2 |
|
|
coords, feats, labels = data_loader(in_channels) |
|
|
feats = feats.double() |
|
|
feats.requires_grad_() |
|
|
input = SparseTensor(feats, coordinates=coords) |
|
|
|
|
|
|
|
|
conv = MinkowskiConvolution( |
|
|
in_channels, |
|
|
out_channels, |
|
|
kernel_size=3, |
|
|
stride=2, |
|
|
bias=True, |
|
|
dimension=D, |
|
|
).double() |
|
|
output = conv(input) |
|
|
|
|
|
iC = input.C.numpy() |
|
|
oC = output.C.numpy() |
|
|
print(iC) |
|
|
print(oC) |
|
|
kernel_maps = output.coordinate_manager.kernel_map( |
|
|
1, 2, stride=2, kernel_size=3 |
|
|
) |
|
|
for kernel_index, in_out_map in kernel_maps.items(): |
|
|
for i, o in zip(in_out_map[0], in_out_map[1]): |
|
|
print(kernel_index, iC[i], "->", oC[o]) |
|
|
self.assertTrue(sum(len(in_map[0]) for k, in_map in kernel_maps.items()) == 16) |
|
|
|