From: BBuf <1182563586@qq.com> Date: Fri, 27 Aug 2021 17:42:24 +0000 (-0700) Subject: fix resize bug (#61166) X-Git-Tag: accepted/tizen/8.0/unified/20231005.095509~646 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6ab3a210983b7eee417e7cd92a8ad2677065e470;p=platform%2Fupstream%2Fpytorch.git fix resize bug (#61166) Summary: I think the original intention here is to only take effect in the case of align_corners (because output_size = 1 and the divisor will be 0), but it affects non-align_corners too. For example: ```python input = torch.tensor( np.arange(1, 5, dtype=np.int32).reshape((1, 1, 2, 2)) ) m = torch.nn.Upsample(scale_factor=0.5, mode="bilinear") of_out = m(input) ``` The result we expect should be [[[[2.5]]]] but pytorch get [[[[1.0]]]] which is different from OpenCV and PIL, this pr try to fixed it。 Pull Request resolved: https://github.com/pytorch/pytorch/pull/61166 Reviewed By: malfet Differential Revision: D30543178 Pulled By: heitorschueroff fbshipit-source-id: 21a4035483981986b0ae4a401ef0efbc565ccaf1 --- diff --git a/aten/src/ATen/native/UpSample.h b/aten/src/ATen/native/UpSample.h index e50b053..602abce 100644 --- a/aten/src/ATen/native/UpSample.h +++ b/aten/src/ATen/native/UpSample.h @@ -251,12 +251,16 @@ static inline scalar_t area_pixel_compute_scale( bool align_corners, const c10::optional scale) { // see Note [area_pixel_compute_scale] - if (output_size > 1) { - return align_corners - ? static_cast(input_size - 1) / (output_size - 1) - : compute_scales_value(scale, input_size, output_size); - } else { - return scalar_t(0); + if(align_corners){ + if(output_size > 1) { + return static_cast(input_size - 1) / (output_size - 1); + } + else { + return static_cast(0); + } + } + else{ + return compute_scales_value(scale, input_size, output_size); } } diff --git a/aten/src/ATen/native/cuda/UpSample.cuh b/aten/src/ATen/native/cuda/UpSample.cuh index 71443e1..c69a259 100644 --- a/aten/src/ATen/native/cuda/UpSample.cuh +++ b/aten/src/ATen/native/cuda/UpSample.cuh @@ -94,11 +94,16 @@ __host__ __forceinline__ static accscalar_t area_pixel_compute_scale( int output_size, bool align_corners, const c10::optional scale) { - if (output_size > 1) { - return align_corners ? (accscalar_t)(input_size - 1) / (output_size - 1) - : compute_scales_value(scale, input_size, output_size); - } else { - return static_cast(0); + if(align_corners) { + if(output_size > 1) { + return (accscalar_t)(input_size - 1) / (output_size - 1); + } + else { + return static_cast(0); + } + } + else{ + return compute_scales_value(scale, input_size, output_size); } } diff --git a/test/test_nn.py b/test/test_nn.py index c6fe0b2..4e01c94 100644 --- a/test/test_nn.py +++ b/test/test_nn.py @@ -10475,6 +10475,13 @@ class TestNN(NNTestCase): out_t_5 = m(in_t_9[:, :, :5, :5, :5]) self.assertEqual(out_t_9[:, :, :15, :15, :15], out_t_5) + def test_upsampling_small_scale(self): + m = torch.nn.Upsample(scale_factor=0.5, mode="bilinear") + in_t = torch.arange(1, 5, dtype=torch.float64).reshape(1, 1, 2, 2) + out_t = m(in_t) + expected_out_t = torch.tensor([[[[2.5]]]]) + self.assertEqual(expected_out_t, out_t) + @unittest.skipIf(not TEST_CUDA, "CUDA unavailable") def test_interpolate_illegal_memory_access(self): in_s = 45