@@ -150,15 +150,11 @@ def parameters(self, include_sublayers=True):
150
150
Returns:
151
151
list of :ref:`api_guide_Variable_en` : a list of Parameters.
152
152
"""
153
- ret = [p for p in self ._parameters .values ()]
154
- parameters_set = set (ret )
155
- if include_sublayers :
156
- for l in self ._sub_layers .values ():
157
- for p in l .parameters (include_sublayers ):
158
- if p in parameters_set :
159
- continue
160
- parameters_set .add (p )
161
- ret .append (p )
153
+ ret = [
154
+ param
155
+ for _ , param in self .named_parameters (
156
+ include_sublayers = include_sublayers )
157
+ ]
162
158
return ret
163
159
164
160
def sublayers (self , include_sublayers = True ):
@@ -170,11 +166,11 @@ def sublayers(self, include_sublayers=True):
170
166
Returns:
171
167
list of Layer : a list of sub layers.
172
168
"""
173
- ret = [l for l in self . _sub_layers . values ()]
174
- if include_sublayers :
175
- for l in self ._sub_layers . values ():
176
- for sub_l in l . sublayers ( include_sublayers ):
177
- ret . append ( sub_l )
169
+ ret = [
170
+ layer
171
+ for _ , layer in self .named_sublayers (
172
+ include_sublayers = include_sublayers )
173
+ ]
178
174
return ret
179
175
180
176
def named_parameters (self , prefix = '' , include_sublayers = True ):
@@ -349,7 +345,12 @@ def add_parameter(self, name, parameter):
349
345
Returns:
350
346
Parameter: the parameter passed in.
351
347
"""
352
- assert isinstance (parameter , framework .Parameter )
348
+ if parameter is None :
349
+ self ._parameters [name ] = None
350
+ elif not isinstance (parameter , framework .Parameter ):
351
+ raise TypeError (
352
+ "parameter assignment requires Parameter or None, but got '{}'"
353
+ .format (type (parameter ).__name__ ))
353
354
354
355
if len (self ._loaddict_holder ) > 0 :
355
356
assert parameter .name in self ._loaddict_holder , "Parameter not found, Can't not find [ {} ] in stat_dict" .format (
@@ -376,8 +377,8 @@ def _remove_if_exist(*dicts):
376
377
377
378
if isinstance (getattr (type (self ), name , None ), property ):
378
379
object .__setattr__ (self , name , value )
380
+ params = self .__dict__ .get ('_parameters' , None )
379
381
if isinstance (value , framework .Parameter ):
380
- params = self .__dict__ .get ('_parameters' , None )
381
382
if params is None :
382
383
raise ValueError (
383
384
"super(YourLayer, self).__init__() should be called first" )
@@ -389,16 +390,30 @@ def _remove_if_exist(*dicts):
389
390
390
391
_remove_if_exist (self .__dict__ , self ._sub_layers )
391
392
params [name ] = value
392
- elif isinstance (value , core .Layer ):
393
- layers = self .__dict__ .get ('_sub_layers' , None )
394
- if layers is None :
395
- raise ValueError (
396
- "super(YourLayer, self).__init__() should be called first" )
397
-
398
- _remove_if_exist (self .__dict__ , self ._parameters )
399
- layers [name ] = value
393
+ elif params is not None and name in params :
394
+ if value is not None :
395
+ raise TypeError (
396
+ "assignment to parameter '{}' should be of type Parameter or None, but got '{}'"
397
+ .format (name , type (value ).__name__ ))
398
+ params [name ] = None
400
399
else :
401
- object .__setattr__ (self , name , value )
400
+ layers = self .__dict__ .get ('_sub_layers' , None )
401
+ if isinstance (value , core .Layer ):
402
+ if layers is None :
403
+ raise ValueError (
404
+ "super(YourLayer, self).__init__() should be called first"
405
+ )
406
+
407
+ _remove_if_exist (self .__dict__ , self ._parameters )
408
+ layers [name ] = value
409
+ elif layers is not None and name in layers :
410
+ if value is not None :
411
+ raise TypeError (
412
+ "assignment to sublayer '{}' should be of type Layer or None, but got '{}'"
413
+ .format (name , type (value ).__name__ ))
414
+ layers [name ] = None
415
+ else :
416
+ object .__setattr__ (self , name , value )
402
417
403
418
def __delattr__ (self , name ):
404
419
if name in self ._parameters :
0 commit comments