From 408a9bb2e7705adeb7d8fc21e50d580cf65dcd05 Mon Sep 17 00:00:00 2001 From: Xin Pan Date: Tue, 29 Jan 2019 12:54:18 +0800 Subject: [PATCH] polish test=develop --- python/paddle/fluid/imperative/layers.py | 13 ++- .../fluid/tests/unittests/test_base_layer.py | 92 +++++++++++++++++++ 2 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 python/paddle/fluid/tests/unittests/test_base_layer.py diff --git a/python/paddle/fluid/imperative/layers.py b/python/paddle/fluid/imperative/layers.py index 2641ec4cddb..da8233fe394 100644 --- a/python/paddle/fluid/imperative/layers.py +++ b/python/paddle/fluid/imperative/layers.py @@ -34,16 +34,21 @@ class Layer(core.Layer): self._parameters = collections.OrderedDict() self._sub_layers = collections.OrderedDict() - def parameters(self): - """Returns an OrderedDict with parameters from current and sub-layers. + def parameters(self, include_sublayers=True): + """Returns a list of Parameters from current and sub-layers. """ - return self._parameters + ret = [p for p in self._parameters.values()] + if include_sublayers: + for l in self._sub_layers.values(): + for p in l.parameters(include_sublayers): + ret.append(p) + return ret def clear_gradients(self): for p in self.parameters(): p._clear_gradient() - def _build_once(self, inputs): + def _build_once(self, *args): pass def __call__(self, *inputs): diff --git a/python/paddle/fluid/tests/unittests/test_base_layer.py b/python/paddle/fluid/tests/unittests/test_base_layer.py new file mode 100644 index 00000000000..fe6cb7b2138 --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_base_layer.py @@ -0,0 +1,92 @@ +# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import contextlib +import unittest +import numpy as np +import six +import sys + +import paddle +import paddle.fluid as fluid +from paddle.fluid.layer_helper import LayerHelper + + +class L1(fluid.imperative.Layer): + def __init__(self): + super(L1, self).__init__() + self._helper = LayerHelper( + 'MyLayer', + param_attr=fluid.ParamAttr( + initializer=fluid.initializer.Constant(value=0.1))) + + self.w1 = self._helper.create_parameter( + attr=self._helper.param_attr, + shape=[2, 2], + dtype='float32', + is_bias=False) + self.w2 = self._helper.create_parameter( + attr=self._helper.param_attr, + shape=[2, 2], + dtype='float32', + is_bias=False) + + def forward(self): + return self.w1 + self.w2 + + +class L2(fluid.imperative.Layer): + def __init__(self): + super(L2, self).__init__() + self.layer1 = L1() + self.layer2 = L1() + + def forward(self): + return self.layer1() + self.layer2() + + +class L3(fluid.imperative.Layer): + def __init__(self): + super(L3, self).__init__() + self.layer1 = L2() + self.layer2 = L2() + + def forward(self): + return self.layer1() + self.layer2() + + +class TestBaseLayer(unittest.TestCase): + def test_one_level(self): + with fluid.imperative.guard(): + l = L1() + ret = l() + self.assertEqual(l.w1.name, "MyLayer_0.w_0") + self.assertEqual(l.w2.name, "MyLayer_0.w_1") + self.assertTrue(np.allclose(ret._numpy(), 0.2 * np.ones([2, 2]))) + sys.stderr.write( + '%s %s %s %s\n' % + (ret._numpy(), l.w1.name, l.w2.name, l._sub_layers)) + + def test_three_level(self): + with fluid.imperative.guard(): + l = L3() + ret = l() + sys.stderr.write('%s\n' % ret._numpy()) + + for p in l.parameters(): + sys.stderr.write('%s\n' % p.name) + + +if __name__ == '__main__': + unittest.main() -- GitLab