From e3e2b62116dc7b8ae659d31e9e1a9c33ae774262 Mon Sep 17 00:00:00 2001 From: lujun Date: Tue, 16 Apr 2019 15:08:31 +0800 Subject: [PATCH] fix save and load bug, test=release/1.4 --- paddle/fluid/imperative/layer.h | 6 +++++- python/paddle/fluid/dygraph/checkpoint.py | 6 +++--- python/paddle/fluid/dygraph/layers.py | 5 ++++- .../tests/unittests/test_imperative_checkpoint.py | 15 +++++++++------ 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/paddle/fluid/imperative/layer.h b/paddle/fluid/imperative/layer.h index 72c548d5e..316095b4f 100644 --- a/paddle/fluid/imperative/layer.h +++ b/paddle/fluid/imperative/layer.h @@ -464,7 +464,11 @@ class PYBIND11_HIDDEN RuntimeInferVarTypeContext void SetType(const std::string& name, framework::proto::VarType::Type type) override { - var_set_[name]->SetType(type); + if (name == "kLookupTablePath") { + VLOG(2) << "SUPER UGLY FIX, remove this when move imperative mode in C++"; + } else { + var_set_[name]->SetType(type); + } } framework::proto::VarType::Type GetDataType( diff --git a/python/paddle/fluid/dygraph/checkpoint.py b/python/paddle/fluid/dygraph/checkpoint.py index f2b01aece..462f11c8c 100644 --- a/python/paddle/fluid/dygraph/checkpoint.py +++ b/python/paddle/fluid/dygraph/checkpoint.py @@ -113,7 +113,7 @@ def load_persistables(vardict, dirname, filename=None): def _save_var_to_file(stat_dict, file_dir, file_name): save_block = default_main_program().global_block() save_var_map = {} - for each_var in stat_dict.items(): + for var_key, each_var in stat_dict.items(): save_var_map[each_var.name] = each_var if file_name is None: save_block.append_op( @@ -138,7 +138,7 @@ def _load_var_from_file(stat_dict, file_dir, file_name): load_block = default_main_program().global_block() load_var_map = {} - for each_var in stat_dict.items(): + for var_key, each_var in stat_dict.items(): assert isinstance(each_var, Variable) if each_var.type == core.VarDesc.VarType.RAW: continue @@ -175,5 +175,5 @@ def _clone_var_in_block_(block, var): shape=var.shape, dtype=var.dtype, type=var.type, - lod_level=var.lod_level, + lod_level=0, persistable=True) diff --git a/python/paddle/fluid/dygraph/layers.py b/python/paddle/fluid/dygraph/layers.py index 6b78e2abb..0e0827a6a 100644 --- a/python/paddle/fluid/dygraph/layers.py +++ b/python/paddle/fluid/dygraph/layers.py @@ -246,7 +246,10 @@ class Layer(core.Layer): def load_dict(self, stat_dict, include_sublayers=True): for name, item in self.__dict__.get('_parameters', None).items(): if item.name in stat_dict: - self.__setattr__(name, stat_dict[item.name]) + var = item._ivar.value() + tensor = var.get_tensor() + tensor.set(stat_dict[item.name].numpy(), + framework._current_expected_place()) if include_sublayers: for layer_name, layer_item in self._sub_layers.items(): diff --git a/python/paddle/fluid/tests/unittests/test_imperative_checkpoint.py b/python/paddle/fluid/tests/unittests/test_imperative_checkpoint.py index c28058100..000659174 100644 --- a/python/paddle/fluid/tests/unittests/test_imperative_checkpoint.py +++ b/python/paddle/fluid/tests/unittests/test_imperative_checkpoint.py @@ -99,7 +99,7 @@ class MNIST(fluid.Layer): class TestDygraphCheckpoint(unittest.TestCase): - def save_load_persistables(self): + def test_save_load_persistables(self): seed = 90 epoch_num = 1 @@ -135,23 +135,26 @@ class TestDygraphCheckpoint(unittest.TestCase): avg_loss.backward() sgd.minimize(avg_loss) - fluid.dygraph.save_persistables(mnist, "save_dir") + fluid.dygraph.save_persistables(mnist.state_dict(), + "save_dir") mnist.clear_gradients() for param in mnist.parameters(): dy_param_init_value[param.name] = param.numpy() mnist.load_dict( - fluid.dygraph.load_persistables(mnist, "save_dir")) + fluid.dygraph.load_persistables(mnist.state_dict(), + "save_dir")) restore = mnist.parameters() self.assertEqual(len(dy_param_init_value), len(restore)) for value in restore: self.assertTrue( - np.allclose(value, dy_param_init_value[value.name])) - self.assertTrue(np.isfinite(value.all())) - self.assertFalse(np.isnan(value.any())) + np.allclose(value.numpy(), dy_param_init_value[ + value.name])) + self.assertTrue(np.isfinite(value.numpy().all())) + self.assertFalse(np.isnan(value.numpy().any())) step += 1 -- GitLab