test_convtbc.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # Copyright (c) Facebook, Inc. and its affiliates.
  2. #
  3. # This source code is licensed under the MIT license found in the
  4. # LICENSE file in the root directory of this source tree.
  5. import unittest
  6. import torch
  7. import torch.nn as nn
  8. from fairseq.modules import ConvTBC
  9. class TestConvTBC(unittest.TestCase):
  10. def test_convtbc(self):
  11. # ksz, in_channels, out_channels
  12. conv_tbc = ConvTBC(4, 5, kernel_size=3, padding=1)
  13. # out_channels, in_channels, ksz
  14. conv1d = nn.Conv1d(4, 5, kernel_size=3, padding=1)
  15. conv_tbc.weight.data.copy_(conv1d.weight.data.transpose(0, 2))
  16. conv_tbc.bias.data.copy_(conv1d.bias.data)
  17. input_tbc = torch.randn(7, 2, 4, requires_grad=True)
  18. input1d = input_tbc.data.transpose(0, 1).transpose(1, 2)
  19. input1d.requires_grad = True
  20. output_tbc = conv_tbc(input_tbc)
  21. output1d = conv1d(input1d)
  22. self.assertAlmostEqual(
  23. output_tbc.data.transpose(0, 1).transpose(1, 2), output1d.data
  24. )
  25. grad_tbc = torch.randn(output_tbc.size())
  26. grad1d = grad_tbc.transpose(0, 1).transpose(1, 2).contiguous()
  27. output_tbc.backward(grad_tbc)
  28. output1d.backward(grad1d)
  29. self.assertAlmostEqual(
  30. conv_tbc.weight.grad.data.transpose(0, 2), conv1d.weight.grad.data
  31. )
  32. self.assertAlmostEqual(conv_tbc.bias.grad.data, conv1d.bias.grad.data)
  33. self.assertAlmostEqual(
  34. input_tbc.grad.data.transpose(0, 1).transpose(1, 2), input1d.grad.data
  35. )
  36. def assertAlmostEqual(self, t1, t2):
  37. self.assertEqual(t1.size(), t2.size(), "size mismatch")
  38. self.assertLess((t1 - t2).abs().max(), 1e-4)
  39. if __name__ == "__main__":
  40. unittest.main()