提交 4dec1599 编写于 作者: S songyouwei 提交者: hong

Allow Layer attr shadow (#22333)

* allow sublayer or param shadow attrs

* add unittest
test=develop

* change remove fn name
test=develop
上级 cf0e264e
...@@ -369,6 +369,11 @@ class Layer(core.Layer): ...@@ -369,6 +369,11 @@ class Layer(core.Layer):
return object.__getattribute__(self, name) return object.__getattribute__(self, name)
def __setattr__(self, name, value): def __setattr__(self, name, value):
def _remove_if_exist(*dicts):
for d in dicts:
if name in d:
del d[name]
if isinstance(getattr(type(self), name, None), property): if isinstance(getattr(type(self), name, None), property):
object.__setattr__(self, name, value) object.__setattr__(self, name, value)
if isinstance(value, framework.Parameter): if isinstance(value, framework.Parameter):
...@@ -382,12 +387,15 @@ class Layer(core.Layer): ...@@ -382,12 +387,15 @@ class Layer(core.Layer):
value.set_value(self._loaddict_holder[value.name]) value.set_value(self._loaddict_holder[value.name])
_remove_if_exist(self.__dict__, self._sub_layers)
params[name] = value params[name] = value
elif isinstance(value, core.Layer): elif isinstance(value, core.Layer):
layers = self.__dict__.get('_sub_layers', None) layers = self.__dict__.get('_sub_layers', None)
if layers is None: if layers is None:
raise ValueError( raise ValueError(
"super(YourLayer, self).__init__() should be called first") "super(YourLayer, self).__init__() should be called first")
_remove_if_exist(self.__dict__, self._parameters)
layers[name] = value layers[name] = value
else: else:
object.__setattr__(self, name, value) object.__setattr__(self, name, value)
......
...@@ -37,6 +37,7 @@ class MyLayer(fluid.Layer): ...@@ -37,6 +37,7 @@ class MyLayer(fluid.Layer):
class MLP(fluid.Layer): class MLP(fluid.Layer):
def __init__(self, input_size): def __init__(self, input_size):
super(MLP, self).__init__() super(MLP, self).__init__()
self._linear1 = None
self._linear1 = Linear( self._linear1 = Linear(
input_size, input_size,
3, 3,
...@@ -71,6 +72,7 @@ class SimpleRNNCell(fluid.Layer): ...@@ -71,6 +72,7 @@ class SimpleRNNCell(fluid.Layer):
i2h_param_shape = [self.step_input_size, self.hidden_size] i2h_param_shape = [self.step_input_size, self.hidden_size]
h2h_param_shape = [self.hidden_size, self.hidden_size] h2h_param_shape = [self.hidden_size, self.hidden_size]
h2o_param_shape = [self.output_size, self.hidden_size] h2o_param_shape = [self.output_size, self.hidden_size]
self._i2h_w = None
self._i2h_w = self.create_parameter( self._i2h_w = self.create_parameter(
attr=self.param_attr, attr=self.param_attr,
shape=i2h_param_shape, shape=i2h_param_shape,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册