test_rnn_memory_helper_op.py 3.9 KB
Newer Older
Y
Yang Yang(Tony) 已提交
1 2
import unittest

Q
Qiao Longfei 已提交
3 4
from paddle.v2.fluid.framework import Program
from paddle.v2.fluid.executor import Executor
F
fengjiayi 已提交
5
from paddle.v2.fluid.backward import append_backward
Y
Yang Yang(Tony) 已提交
6
import numpy as np
Q
Qiao Longfei 已提交
7
import paddle.v2.fluid.core as core
Y
Yang Yang(Tony) 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26


class RNNMemoryHelperOpTest(unittest.TestCase):
    def setUp(self):
        self.program = Program()
        self.place = core.CPUPlace()

        self.X = self.program.global_block().create_var(
            name='X', shape=[2, 3], dtype='float32')
        self.Out = self.program.global_block().create_var(
            name='Out', shape=[2, 3], dtype='float32')
        self.program.global_block().append_op(
            type='rnn_memory_helper',
            inputs={"X": self.X},
            outputs={"Out": self.Out},
            attrs={})

    def test_forward(self):
        x_np = np.random.normal(size=(2, 3)).astype("float32")
D
dzhwinter 已提交
27
        self.feed_map = {'X': x_np}
Y
Yang Yang(Tony) 已提交
28 29 30 31 32
        self.fetch_list = [self.Out]
        exe = Executor(self.place)
        out = exe.run(self.program,
                      feed=self.feed_map,
                      fetch_list=self.fetch_list)
D
dzhwinter 已提交
33
        self.assertTrue(np.allclose(out[0], x_np, rtol=1e-5))
Y
Yang Yang(Tony) 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62


class RNNMemoryHelperGradOpTest(unittest.TestCase):
    def setUp(self):
        self.program = Program()
        self.place = core.CPUPlace()

        self.input_names = ['X', 'Out', 'Out@GRAD']
        self.input_vars = {
            name: self.program.global_block().create_var(
                name=name, shape=[2, 3], dtype='float32')
            for name in self.input_names
        }

        self.output_names = ['X@GRAD']
        self.output_vars = {
            name: self.program.global_block().create_var(
                name=name, shape=[2, 3], dtype='float32')
            for name in self.output_names
        }

        self.program.global_block().append_op(
            type='rnn_memory_helper_grad',
            inputs=self.input_vars,
            outputs=self.output_vars,
            attrs={})

    def test_backward(self):
        self.feed_map = {
D
dzhwinter 已提交
63
            name: np.random.normal(size=(2, 3)).astype("float32")
Y
Yang Yang(Tony) 已提交
64 65 66 67 68 69 70 71
            for name in self.input_names
        }
        self.fetch_list = [self.output_vars['X@GRAD']]

        exe = Executor(self.place)
        out = exe.run(self.program,
                      feed=self.feed_map,
                      fetch_list=self.fetch_list)
D
dzhwinter 已提交
72
        np.isclose(out[0], self.feed_map['Out@GRAD'], rtol=1e-5)
Y
Yang Yang(Tony) 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105


class RNNMemoryHelperGradOpWithoutInputTest(unittest.TestCase):
    def setUp(self):
        self.program = Program()
        self.fake_program = Program()
        self.place = core.CPUPlace()

        self.input_names = ['X', 'Out']
        self.input_vars = {
            name: self.program.global_block().create_var(
                name=name, shape=[2, 3], dtype='float32')
            for name in self.input_names
        }
        self.input_vars["Out@GRAD"] = \
            self.fake_program.global_block().create_var(
                name="Out@GRAD", shape=[2, 3], dtype='float32')

        self.output_names = ['X@GRAD']
        self.output_vars = {
            name: self.program.global_block().create_var(
                name=name, shape=[2, 3], dtype='float32')
            for name in self.output_names
        }

        self.program.global_block().append_op(
            type='rnn_memory_helper_grad',
            inputs=self.input_vars,
            outputs=self.output_vars,
            attrs={})

    def test_backward(self):
        self.feed_map = {
D
dzhwinter 已提交
106
            name: np.random.normal(size=(2, 3)).astype("float32")
Y
Yang Yang(Tony) 已提交
107 108 109 110 111 112 113 114
            for name in ['X', 'Out']
        }
        self.fetch_list = [self.output_vars['X@GRAD']]

        exe = Executor(self.place)
        out = exe.run(self.program,
                      feed=self.feed_map,
                      fetch_list=self.fetch_list)
D
dzhwinter 已提交
115 116 117
        self.assertTrue(
            np.allclose(
                out[0], np.zeros(shape=(2, 3)).astype("float32"), rtol=1e-5))
Y
Yang Yang(Tony) 已提交
118 119 120 121


if __name__ == '__main__':
    unittest.main()