diff --git a/python/paddle/fluid/tests/unittests/test_add_position_encoding_op.py b/python/paddle/fluid/tests/unittests/test_add_position_encoding_op.py index 908b458cb0a199eb557e07905d6695204fc07b53..4dc1ed99df628af5fa4cd2cc9efd8d3b1820348c 100644 --- a/python/paddle/fluid/tests/unittests/test_add_position_encoding_op.py +++ b/python/paddle/fluid/tests/unittests/test_add_position_encoding_op.py @@ -17,9 +17,31 @@ import math import paddle.fluid.core as core from op_test import OpTest import paddle.fluid as fluid +import paddle +import paddle.nn.functional as F from paddle.fluid import Program, program_guard +def add_position_encoding(input, alpha=1.0, beta=1.0): + batch_size = input.shape[0] + max_length = input.shape[1] + enc_size = input.shape[2] + + out = np.copy(input) + + half_shape = int(enc_size / 2) + for i in range(batch_size): + for j in range(max_length): + for k in range(half_shape): + val = j / pow(10000.0, k * 1.0 / ( + half_shape - 1)) if half_shape > 1 else j / 10000.0 + out[i, j, k] = \ + input[i, j, k] * alpha + math.sin(val) * beta + out[i, j, half_shape + k] = \ + input[i, j, half_shape + k] * alpha + math.cos(val) * beta + return out + + class TestAddPositionEncodingTensorOp(OpTest): """ This class is to test the AddPositionEncodingOp @@ -56,22 +78,8 @@ class TestAddPositionEncodingTensorOp(OpTest): self.alpha = 0.6 self.beta = 0.5 self.x = np.random.uniform(0.1, 1, [2, 15, 4]).astype(self.dtype) - self.out = np.copy(self.x) - batch_size = self.x.shape[0] - max_length = self.x.shape[1] - enc_size = self.x.shape[2] - - half_shape = int(enc_size / 2) - for i in range(batch_size): - for j in range(max_length): - for k in range(half_shape): - val = j / pow(10000.0, k * 1.0 / ( - half_shape - 1)) if half_shape > 1 else j / 10000.0 - self.out[i, j, k] = \ - self.x[i, j, k] * self.alpha + math.sin(val) * self.beta - self.out[i, j, half_shape + k] = \ - self.x[i, j, half_shape + k] * self.alpha + math.cos(val) * self.beta + self.out = add_position_encoding(self.x, self.alpha, self.beta) class TestAddPositionEncodingLoDTensorOp(OpTest): @@ -145,5 +153,17 @@ class TestAddPositionEncodingOpError(unittest.TestCase): self.assertRaises(TypeError, test_Variable) +class TestAddPositionEncodingOpDygraph(unittest.TestCase): + def test_dygraph(self): + paddle.disable_static() + tensor = np.random.randn(16, 32, 64) + position_tensor = F.add_position_encoding( + input=paddle.to_tensor(tensor), alpha=1.0, beta=1.0).numpy() + paddle.enable_static() + + position_tensor_np = add_position_encoding(tensor, 1.0, 1.0) + self.assertTrue(np.allclose(position_tensor, position_tensor_np)) + + if __name__ == '__main__': unittest.main()