|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import torch |
|
|
import unittest |
|
|
|
|
|
from MinkowskiEngine import SparseTensor, MinkowskiConvolution, \ |
|
|
MinkowskiConvolutionTranspose |
|
|
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, out_channels, D = 2, 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) |
|
|
cm = input.coords_man |
|
|
print(cm._get_coords_key(1)) |
|
|
|
|
|
conv = MinkowskiConvolution( |
|
|
in_channels, |
|
|
out_channels, |
|
|
kernel_size=3, |
|
|
stride=1, |
|
|
bias=False, |
|
|
dimension=D).double() |
|
|
|
|
|
print('Initial input: ', input) |
|
|
print('Specified output coords: ', out_coords) |
|
|
output = conv(input, out_coords) |
|
|
|
|
|
|
|
|
out_coords_key = cm.create_coords_key(out_coords, tensor_stride=2) |
|
|
output = conv(input, out_coords_key) |
|
|
print('Conv output: ', output) |
|
|
|
|
|
output.F.sum().backward() |
|
|
print(input.F.grad) |
|
|
|
|
|
def test_tr(self): |
|
|
print(f"{self.__class__.__name__}: test_tr") |
|
|
in_channels, out_channels, D = 2, 3, 2 |
|
|
coords, feats, labels = data_loader(in_channels, batch_size=2) |
|
|
|
|
|
coords[:, :2] *= 2 |
|
|
out_coords = torch.rand(10, 3) |
|
|
out_coords[:, :2] *= 10 |
|
|
out_coords[:, 2] *= 2 |
|
|
out_coords = out_coords.floor().int() |
|
|
|
|
|
feats = feats.double() |
|
|
feats.requires_grad_() |
|
|
|
|
|
input = SparseTensor(feats, coords=coords, tensor_stride=2) |
|
|
cm = input.coords_man |
|
|
print(cm._get_coords_key(2)) |
|
|
|
|
|
conv_tr = MinkowskiConvolutionTranspose( |
|
|
in_channels, |
|
|
out_channels, |
|
|
kernel_size=3, |
|
|
stride=2, |
|
|
bias=False, |
|
|
dimension=D).double() |
|
|
print('Initial input: ', input) |
|
|
print('Specified output coords: ', out_coords) |
|
|
output = conv_tr(input, out_coords) |
|
|
print('Conv output: ', output) |
|
|
|
|
|
output.F.sum().backward() |
|
|
print(input.F.grad) |
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
unittest.main() |
|
|
|