@@ -232,7 +232,7 @@ def _pickle_save(obj, f, protocol):
232
232
raise ValueError ("Expected 1<'protocol'<5, but received protocol={}" .
233
233
format (protocol ))
234
234
235
- def reudce_varbase (self ):
235
+ def reduce_varbase (self ):
236
236
data = self .numpy ()
237
237
name = self .name
238
238
@@ -243,16 +243,32 @@ def reduce_LoDTensor(self):
243
243
244
244
return (eval , ('data' , {'data' : data }))
245
245
246
+ def reduce_Layer (self ):
247
+ raise ValueError (
248
+ "paddle do not support saving `paddle.nn.Layer` object." )
249
+
250
+ dispatch_table_layer = dict ()
251
+
252
+ def create_layer_dispatch_table (layer ):
253
+ dispatch_table_layer [layer .__class__ ] = reduce_Layer
254
+ return layer
255
+
256
+ _parse_every_object (obj , lambda v : isinstance (v , core .Layer ),
257
+ create_layer_dispatch_table )
258
+
246
259
def add_dispatch_table ():
247
260
# This is not a good method, because the pickle module has been modified.
248
- pickle .dispatch_table [core .VarBase ] = reudce_varbase
249
- pickle .dispatch_table [ParamBase ] = reudce_varbase
261
+ pickle .dispatch_table [core .VarBase ] = reduce_varbase
262
+ pickle .dispatch_table [ParamBase ] = reduce_varbase
250
263
pickle .dispatch_table [core .LoDTensor ] = reduce_LoDTensor
264
+ pickle .dispatch_table .update (dispatch_table_layer )
251
265
252
266
def pop_dispatch_table ():
253
267
pickle .dispatch_table .pop (core .VarBase )
254
268
pickle .dispatch_table .pop (core .LoDTensor )
255
269
pickle .dispatch_table .pop (ParamBase )
270
+ for k in dispatch_table_layer :
271
+ pickle .dispatch_table .pop (k )
256
272
257
273
# When value of dict is lager than 4GB ,there is a Bug on 'MAC python3'
258
274
if sys .platform == 'darwin' and sys .version_info .major == 3 :
@@ -272,10 +288,10 @@ def pop_dispatch_table():
272
288
pickler = pickle .Pickler (f , protocol )
273
289
pickler .dispatch_table = copyreg .dispatch_table .copy ()
274
290
275
- pickler .dispatch_table [core .VarBase ] = reudce_varbase
291
+ pickler .dispatch_table [core .VarBase ] = reduce_varbase
276
292
pickler .dispatch_table [core .LoDTensor ] = reduce_LoDTensor
277
- pickler .dispatch_table [ParamBase ] = reudce_varbase
278
-
293
+ pickler .dispatch_table [ParamBase ] = reduce_varbase
294
+ pickler . dispatch_table . update ( dispatch_table_layer )
279
295
pickler .dump (obj )
280
296
281
297
@@ -496,7 +512,7 @@ def save(obj, path, protocol=4, **configs):
496
512
Save an object to the specified path.
497
513
498
514
.. note::
499
- Now supports saving ``state_dict`` of Layer/Optimizer, Layer, Tensor and nested structure containing Tensor, Program.
515
+ Now supports saving ``state_dict`` of Layer/Optimizer, Tensor and nested structure containing Tensor, Program.
500
516
501
517
.. note::
502
518
Different from ``paddle.jit.save``, since the save result of ``paddle.save`` is a single file,
@@ -690,7 +706,7 @@ def load(path, **configs):
690
706
Load an object can be used in paddle from specified path.
691
707
692
708
.. note::
693
- Now supports loading ``state_dict`` of Layer/Optimizer, Layer, Tensor and nested structure containing Tensor, Program.
709
+ Now supports loading ``state_dict`` of Layer/Optimizer, Tensor and nested structure containing Tensor, Program.
694
710
695
711
.. note::
696
712
In order to use the model parameters saved by paddle more efficiently,
0 commit comments