未验证 提交 8c75b255 编写于 作者: X xiaoting 提交者: GitHub

Support Tensor for attr_scale and attr_size (#28677)

* update interpolate, test=develop

* fix coverage, test=develop
上级 e880c90c
...@@ -623,5 +623,68 @@ class TestBilinearInterpOpAPI_dy(unittest.TestCase): ...@@ -623,5 +623,68 @@ class TestBilinearInterpOpAPI_dy(unittest.TestCase):
self.assertTrue(np.allclose(out.numpy(), expect_res)) self.assertTrue(np.allclose(out.numpy(), expect_res))
class TestBilinearInterpOpAPI_dy2(unittest.TestCase):
def test_case(self):
import paddle
if core.is_compiled_with_cuda():
place = core.CUDAPlace(0)
else:
place = core.CPUPlace()
with fluid.dygraph.guard(place):
input_data = np.random.random((2, 3, 6, 6)).astype("float32")
size_np = np.array([12, 12]).astype("int64")
input_x = paddle.to_tensor(input_data)
size = paddle.to_tensor(size_np)
expect_res = bilinear_interp_np(
input_data, out_h=12, out_w=12, align_corners=False)
out = interpolate(
x=input_x, size=size, mode="bilinear", align_corners=False)
self.assertTrue(np.allclose(out.numpy(), expect_res))
class TestBilinearInterpOpAPI_dy3(unittest.TestCase):
def test_case(self):
import paddle
if core.is_compiled_with_cuda():
place = core.CUDAPlace(0)
else:
place = core.CPUPlace()
with fluid.dygraph.guard(place):
input_data = np.random.random((2, 3, 6, 6)).astype("float32")
size_1 = np.array([12]).astype("int64")
input_x = paddle.to_tensor(input_data)
size = paddle.to_tensor(size_1)
expect_res = bilinear_interp_np(
input_data, out_h=12, out_w=12, align_corners=False)
out = interpolate(
x=input_x,
size=[size, size],
mode="bilinear",
align_corners=False)
self.assertTrue(np.allclose(out.numpy(), expect_res))
class TestBilinearInterpOpAPI_dy4(unittest.TestCase):
def test_case(self):
import paddle
if core.is_compiled_with_cuda():
place = core.CUDAPlace(0)
else:
place = core.CPUPlace()
with fluid.dygraph.guard(place):
input_data = np.random.random((2, 3, 6, 6)).astype("float32")
scale_np = np.array([2, 2]).astype("int64")
input_x = paddle.to_tensor(input_data)
scale = paddle.to_tensor(scale_np)
expect_res = bilinear_interp_np(
input_data, out_h=12, out_w=12, align_corners=False)
out = interpolate(
x=input_x,
scale_factor=scale,
mode="bilinear",
align_corners=False)
self.assertTrue(np.allclose(out.numpy(), expect_res))
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()
...@@ -366,10 +366,18 @@ def interpolate(x, ...@@ -366,10 +366,18 @@ def interpolate(x,
if out_shape is not None and scale is not None: if out_shape is not None and scale is not None:
raise ValueError("Only one of size or scale_factor should be defined.") raise ValueError("Only one of size or scale_factor should be defined.")
if out_shape is not None: if out_shape is not None:
if isinstance(out_shape, Variable):
if isinstance(out_shape, Variable) and not in_dygraph_mode():
out_shape.stop_gradient = True out_shape.stop_gradient = True
inputs['OutSize'] = out_shape inputs['OutSize'] = out_shape
else: else:
if in_dygraph_mode():
if isinstance(out_shape, Variable):
out_shape = list(out_shape.numpy())
for i, dim in enumerate(out_shape):
if isinstance(dim, Variable):
out_shape[i] = dim.numpy()[0]
if not (_is_list_or_turple_(out_shape)): if not (_is_list_or_turple_(out_shape)):
raise TypeError("size should be a list or tuple or Variable.") raise TypeError("size should be a list or tuple or Variable.")
# Validate the shape # Validate the shape
...@@ -435,6 +443,8 @@ def interpolate(x, ...@@ -435,6 +443,8 @@ def interpolate(x,
attrs['out_w'] = out_shape[2] attrs['out_w'] = out_shape[2]
else: else:
if in_dygraph_mode() and isinstance(scale, Variable):
scale = list(scale.numpy())
if isinstance(scale, Variable): if isinstance(scale, Variable):
scale.stop_gradient = True scale.stop_gradient = True
inputs["Scale"] = scale inputs["Scale"] = scale
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册