def test_rectangular(self): t = torch.Tensor([[[ [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.1, 0.0, 0.0, 0.0], [0.0, 0.1, 0.6, 0.1, 0.0, 0.0], [0.0, 0.0, 0.1, 0.0, 0.0, 0.0], ]]]) actual = average_loss(variance_reg_losses(t, 2.0)) self.assertEqual(28.88, actual.item())
def test_exact(self): t = torch.Tensor([[[ [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.1, 0.0], [0.0, 0.1, 0.6, 0.1], [0.0, 0.0, 0.1, 0.0], ]]]) actual = average_loss(variance_reg_losses(Variable(t), 2.0)) self.assertEqual(28.88, actual.data[0])
def test_variance_rectangular(): t = torch.Tensor([[[ [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.1, 0.0, 0.0, 0.0], [0.0, 0.1, 0.6, 0.1, 0.0, 0.0], [0.0, 0.0, 0.1, 0.0, 0.0, 0.0], ]]]) actual = average_loss(variance_reg_losses(t, 2.0)) assert actual.item() == 28.88
def test_batch(self): t = torch.Tensor([[[ [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.1, 0.0], [0.0, 0.1, 0.6, 0.1], [0.0, 0.0, 0.1, 0.0], ]], [[ [0.0, 0.0, 0.0, 0.0], [0.0, 0.2, 0.0, 0.0], [0.1, 0.5, 0.1, 0.0], [0.0, 0.1, 0.0, 0.0], ]]]) actual = average_loss(variance_reg_losses(t, 2.0)) self.assertEqual(28.54205, actual.item())
def test_variance_batch(): t = torch.Tensor([[[ [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.1, 0.0], [0.0, 0.1, 0.6, 0.1], [0.0, 0.0, 0.1, 0.0], ]], [[ [0.0, 0.0, 0.0, 0.0], [0.0, 0.2, 0.0, 0.0], [0.1, 0.5, 0.1, 0.0], [0.0, 0.1, 0.0, 0.0], ]]]) actual = average_loss(variance_reg_losses(t, 2.0)) assert actual.item() == approx(28.54205)
def test_3d(self): t = torch.Tensor([[[[ [0.000035, 0.000002, 0.000000], [0.009165, 0.000570, 0.000002], [0.147403, 0.009165, 0.000035], ], [ [0.000142, 0.000009, 0.000000], [0.036755, 0.002285, 0.000009], [0.591145, 0.036755, 0.000142], ], [ [0.000035, 0.000002, 0.000000], [0.009165, 0.000570, 0.000002], [0.147403, 0.009165, 0.000035], ]]]]) actual = average_loss(variance_reg_losses(Variable(t), 0.6)) self.assertEqual(0.18564102213775013, actual.data[0])
def _calculate_reg_loss(self, target_var, reg, hm_var, hm_sigma): # Convert sigma (aka standard deviation) from pixels to normalized units sigma = (2.0 * hm_sigma / hm_var.size(-1)) # Apply a regularisation term relating to the shape of the heatmap. if reg == 'var': reg_loss = dsntnn.variance_reg_losses(hm_var, sigma, ) elif reg == 'kl': reg_loss = dsntnn.kl_reg_losses(hm_var, target_var, sigma) elif reg == 'js': reg_loss = dsntnn.js_reg_losses(hm_var, target_var, sigma) # elif reg == 'mse': # reg_loss = dsntnn.mse_reg_losses(hm_var, target_var, sigma, mask_var) else: reg_loss = 0 return reg_loss
def test_variance_3d(): t = torch.Tensor([[[[ [0.000035, 0.000002, 0.000000], [0.009165, 0.000570, 0.000002], [0.147403, 0.009165, 0.000035], ], [ [0.000142, 0.000009, 0.000000], [0.036755, 0.002285, 0.000009], [0.591145, 0.036755, 0.000142], ], [ [0.000035, 0.000002, 0.000000], [0.009165, 0.000570, 0.000002], [0.147403, 0.009165, 0.000035], ]]]]) actual = average_loss(variance_reg_losses(t, 0.6)) assert actual.item() == approx(0.18564102213775013)
import torch import numpy from dsntnn import variance_reg_losses if __name__ == "__main__": b, c, h, w = 5, 1, 256, 512 batch = torch.rand(b, c, h, w) heatmaps = torch.nn.Softmax(dim=2)( batch.reshape(b, c, -1) ).reshape(b, c, h, w) var_loss = variance_reg_losses(heatmaps, 1.5) print(var_loss)