|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import torch |
|
|
import unittest |
|
|
|
|
|
from MinkowskiEngine import SparseTensor, MinkowskiChannelwiseConvolution |
|
|
import MinkowskiEngine as ME |
|
|
|
|
|
|
|
|
from tests.common import data_loader |
|
|
|
|
|
|
|
|
def get_random_coords(dimension=2, tensor_stride=2): |
|
|
torch.manual_seed(0) |
|
|
|
|
|
coords = torch.rand(10, dimension + 1) |
|
|
coords[:, :dimension] *= 5 |
|
|
coords[:, -1] *= 2 |
|
|
coords = coords.floor().int() |
|
|
coords = ME.utils.sparse_quantize(coords) |
|
|
coords[:, :dimension] *= tensor_stride |
|
|
return coords, tensor_stride |
|
|
|
|
|
|
|
|
class TestConvolution(unittest.TestCase): |
|
|
|
|
|
def test(self): |
|
|
print(f"{self.__class__.__name__}: test") |
|
|
in_channels, D = 3, 2 |
|
|
coords, feats, labels = data_loader(in_channels, batch_size=2) |
|
|
|
|
|
|
|
|
out_coords, tensor_stride = get_random_coords() |
|
|
|
|
|
feats = feats.double() |
|
|
feats.requires_grad_() |
|
|
input = SparseTensor(feats, coords=coords) |
|
|
|
|
|
conv = MinkowskiChannelwiseConvolution( |
|
|
in_channels, |
|
|
kernel_size=3, |
|
|
stride=1, |
|
|
bias=False, |
|
|
dimension=D).double() |
|
|
|
|
|
print('Initial input: ', input) |
|
|
output = conv(input) |
|
|
print('Conv output: ', output) |
|
|
|
|
|
output.F.sum().backward() |
|
|
print(input.F.grad) |
|
|
|
|
|
def test_gpu(self): |
|
|
print(f"{self.__class__.__name__}: test_gpu") |
|
|
if not torch.cuda.is_available(): |
|
|
return |
|
|
|
|
|
device = torch.device('cuda') |
|
|
in_channels, D = 3, 2 |
|
|
coords, feats, labels = data_loader(in_channels, batch_size=2) |
|
|
|
|
|
|
|
|
out_coords, tensor_stride = get_random_coords() |
|
|
|
|
|
feats = feats.double() |
|
|
feats.requires_grad_() |
|
|
input = SparseTensor(feats, coords=coords).to(device) |
|
|
conv = MinkowskiChannelwiseConvolution( |
|
|
in_channels, |
|
|
kernel_size=3, |
|
|
stride=1, |
|
|
bias=False, |
|
|
dimension=D).double().to(device) |
|
|
|
|
|
print('Initial input: ', input) |
|
|
output = conv(input) |
|
|
print('Conv output: ', output) |
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
unittest.main() |
|
|
|