未验证 提交 5e4f01f5 编写于 作者: L Li Fuchen 提交者: GitHub

modified sample code of add_position_encoding to 2.0 (#27561)

* modified sample code of add_position_encoding to  2.0, test=document_fix

* use core.op in add_position_encoding API.

* add test for add_position_encoding in dygraph mode
上级 a4c25b2f
......@@ -13177,16 +13177,20 @@ def add_position_encoding(input, alpha, beta, name=None):
Examples:
.. code-block:: python
import paddle.fluid as fluid
import numpy as np
import paddle
import paddle.nn.functional as F
tensor = fluid.data(
name='tensor',
shape=[None, 64, 512],
dtype='float32')
position_tensor = fluid.layers.add_position_encoding(
input=tensor, alpha=1.0, beta=1.0)
tensor = np.random.randn(16, 32, 64)
tensor = paddle.to_tensor(tensor)
position_tensor = F.add_position_encoding(
input=tensor, alpha=1.0, beta=1.0)
"""
if in_dygraph_mode():
return core.ops.add_position_encoding(input, "alpha", alpha, "beta",
beta)
helper = LayerHelper('add_position_encoding', **locals())
check_variable_and_dtype(input, 'input', ['float32', 'float64'],
"add_position_encoding")
......
......@@ -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()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册