From b555378e18f918928679ca5c39f6d64aeb1b34ee Mon Sep 17 00:00:00 2001 From: Zhou Wei <52485244+zhouwei25@users.noreply.github.com> Date: Fri, 3 Jul 2020 14:45:28 +0800 Subject: [PATCH] fix Layer.__dir__ to show the parameters/sublayers/buffers/attr/method of the Layer (#25197) * show the attr and functions of the Layer,test=develop * add buffer for dir,test=develop * fix __dir__,test=develop * fix doc of Layer.__dir__, test=develop --- python/paddle/fluid/dygraph/layers.py | 35 +++++++++++++++++++ .../test_imperative_named_members.py | 35 +++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/python/paddle/fluid/dygraph/layers.py b/python/paddle/fluid/dygraph/layers.py index 539376e9a0..bba4eb071a 100644 --- a/python/paddle/fluid/dygraph/layers.py +++ b/python/paddle/fluid/dygraph/layers.py @@ -752,6 +752,41 @@ class Layer(core.Layer): else: object.__delattr__(self, name) + def __dir__(self): + """ + Return a list. Get all parameters, buffers(non-parameter variables), sublayers, method and attr of Layer. + + Examples: + import paddle.fluid as fluid + import numpy as np + + fluid.dygraph.enable_dygraph() + + class Mylayer(fluid.dygraph.Layer): + def __init__(self): + super(Mylayer, self).__init__() + self.linear1 = fluid.dygraph.Linear(10, 10) + self.linear2 = fluid.dygraph.Linear(5, 5) + self.conv2d = fluid.dygraph.Conv2D(3, 2, 3) + self.embedding = fluid.dygraph.Embedding(size=[128, 16]) + self.h_0 = fluid.dygraph.to_variable(np.zeros([10, 10]).astype('float32')) + + mylayer = Mylayer() + print(dir(mylayer)) + # only parts are shown, because of list have too much content + # ['__call__', '__class__', ... , 'conv2d', 'embedding', 'h_0', 'linear1', 'linear2', ... , 'sublayers', 'train'] + + """ + method = dir(self.__class__) + attrs = list(self.__dict__.keys()) + parameters = list(self._parameters.keys()) + sublayers = list(self._sub_layers.keys()) + buffers = list(self._buffers.keys()) + + keys = method + attrs + parameters + sublayers + buffers + + return keys + def state_dict(self, destination=None, include_sublayers=True, diff --git a/python/paddle/fluid/tests/unittests/test_imperative_named_members.py b/python/paddle/fluid/tests/unittests/test_imperative_named_members.py index c7151463d1..721453c512 100644 --- a/python/paddle/fluid/tests/unittests/test_imperative_named_members.py +++ b/python/paddle/fluid/tests/unittests/test_imperative_named_members.py @@ -79,6 +79,41 @@ class TestImperativeNamedParameters(unittest.TestCase): self.assertListEqual(expected_named_parameters, named_parameters) + def test_dir_layer(self): + with fluid.dygraph.guard(): + + class Mymodel(fluid.dygraph.Layer): + def __init__(self): + super(Mymodel, self).__init__() + self.linear1 = fluid.dygraph.Linear(10, 10) + self.linear2 = fluid.dygraph.Linear(5, 5) + self.conv2d = fluid.dygraph.Conv2D(3, 2, 3) + self.embedding = fluid.dygraph.Embedding(size=[128, 16]) + self.h_0 = fluid.dygraph.to_variable( + np.zeros([10, 10]).astype('float32')) + self.weight = self.create_parameter( + shape=[2, 3], + attr=fluid.ParamAttr(), + dtype="float32", + is_bias=False) + + model = Mymodel() + + expected_members = dir(model) + + self.assertTrue("linear1" in expected_members, + "model should contain Layer: linear1") + self.assertTrue("linear2" in expected_members, + "model should contain Layer: linear2") + self.assertTrue("conv2d" in expected_members, + "model should contain Layer: conv2d") + self.assertTrue("embedding" in expected_members, + "model should contain Layer: embedding") + self.assertTrue("h_0" in expected_members, + "model should contain buffer: h_0") + self.assertTrue("weight" in expected_members, + "model should contain parameter: weight") + if __name__ == '__main__': unittest.main() -- GitLab