From 932bcc2a094f4ead4fb8f17d9838cc312f31d810 Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Wed, 27 Oct 2021 12:39:33 +0100 Subject: [PATCH 1/3] Fix flakiness on the TestStochasticDepth test. --- test/test_ops.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/test/test_ops.py b/test/test_ops.py index 892496dffca..824ec7474f3 100644 --- a/test/test_ops.py +++ b/test/test_ops.py @@ -1149,9 +1149,11 @@ def _create_masks(image, masks): class TestStochasticDepth: + @pytest.mark.parametrize("seed", range(10)) @pytest.mark.parametrize("p", [0.2, 0.5, 0.8]) @pytest.mark.parametrize("mode", ["batch", "row"]) - def test_stochastic_depth(self, mode, p): + def test_stochastic_depth_random(self, seed, mode, p): + torch.manual_seed(seed) stats = pytest.importorskip("scipy.stats") batch_size = 5 x = torch.ones(size=(batch_size, 3, 4, 4)) @@ -1173,7 +1175,22 @@ def test_stochastic_depth(self, mode, p): num_samples += batch_size p_value = stats.binom_test(counts, num_samples, p=p) - assert p_value > 0.0001 + assert p_value > 0.01 + + @pytest.mark.parametrize("seed", range(10)) + @pytest.mark.parametrize("p", (0, 1)) + @pytest.mark.parametrize("mode", ["batch", "row"]) + def test_stochastic_depth(self, seed, mode, p): + torch.manual_seed(seed) + batch_size = 5 + x = torch.ones(size=(batch_size, 3, 4, 4)) + layer = ops.StochasticDepth(p=p, mode=mode).to(device=x.device, dtype=x.dtype) + + out = layer(x) + if p == 0: + assert out.equal(x) + elif p == 1: + assert out.equal(torch.zeros_like(x)) class TestUtils: From 34886cab9ea8b52c74bbb1b9963985c0ce72c12a Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Wed, 27 Oct 2021 12:40:02 +0100 Subject: [PATCH 2/3] Fix minor bug when p=1.0 --- torchvision/ops/stochastic_depth.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/torchvision/ops/stochastic_depth.py b/torchvision/ops/stochastic_depth.py index de120862941..4ee67167631 100644 --- a/torchvision/ops/stochastic_depth.py +++ b/torchvision/ops/stochastic_depth.py @@ -34,7 +34,9 @@ def stochastic_depth(input: Tensor, p: float, mode: str, training: bool = True) else: size = [1] * input.ndim noise = torch.empty(size, dtype=input.dtype, device=input.device) - noise = noise.bernoulli_(survival_rate).div_(survival_rate) + noise = noise.bernoulli_(survival_rate) + if survival_rate > 0.0: + noise.div_(survival_rate) return input * noise From b445bfb8a29b027d1b7a971b8f8094f6c2e634ed Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Wed, 27 Oct 2021 13:17:08 +0100 Subject: [PATCH 3/3] Remove device and dtype setting. --- test/test_ops.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_ops.py b/test/test_ops.py index 824ec7474f3..858880e35bc 100644 --- a/test/test_ops.py +++ b/test/test_ops.py @@ -1157,7 +1157,7 @@ def test_stochastic_depth_random(self, seed, mode, p): stats = pytest.importorskip("scipy.stats") batch_size = 5 x = torch.ones(size=(batch_size, 3, 4, 4)) - layer = ops.StochasticDepth(p=p, mode=mode).to(device=x.device, dtype=x.dtype) + layer = ops.StochasticDepth(p=p, mode=mode) layer.__repr__() trials = 250 @@ -1184,7 +1184,7 @@ def test_stochastic_depth(self, seed, mode, p): torch.manual_seed(seed) batch_size = 5 x = torch.ones(size=(batch_size, 3, 4, 4)) - layer = ops.StochasticDepth(p=p, mode=mode).to(device=x.device, dtype=x.dtype) + layer = ops.StochasticDepth(p=p, mode=mode) out = layer(x) if p == 0: