diff --git a/paddle/fluid/imperative/layer.h b/paddle/fluid/imperative/layer.h index ec5fb63f0d9339e8a511a59df05f515f01822597..892c864027d110a58546b93517242bed30a68d3a 100644 --- a/paddle/fluid/imperative/layer.h +++ b/paddle/fluid/imperative/layer.h @@ -281,16 +281,6 @@ class VarBase { static ThreadSafeNameSet name_set_; }; -class Layer { - public: - virtual ~Layer() {} - - virtual std::vector> Forward( - const std::vector>& inputs) { - return {}; - } -}; - std::shared_ptr CreateGradOpNode( const framework::OperatorBase& op, const NameVarBaseMap& ins, const NameVarBaseMap& outs, const framework::AttributeMap& attrs, diff --git a/paddle/fluid/pybind/imperative.cc b/paddle/fluid/pybind/imperative.cc index 5ff0e58d8580174299430bab428a7374a8231c06..cad0c1e70cc03c46c6c9f0f0fbd7326b2b74c0e3 100644 --- a/paddle/fluid/pybind/imperative.cc +++ b/paddle/fluid/pybind/imperative.cc @@ -59,18 +59,6 @@ PyTypeObject *g_varbase_pytype = nullptr; namespace py = ::pybind11; -class Layer : public imperative::Layer { - public: - using imperative::Layer::Layer; // Inherit constructors - - std::vector> Forward( - const std::vector> &inputs) - override { - PYBIND11_OVERLOAD(std::vector>, Layer, - Forward, inputs); // NOLINT - } -}; - template static T PyObjectCast(PyObject *obj) { try { @@ -2051,18 +2039,6 @@ void BindImperative(py::module *m_ptr) { .def_property_readonly("type", &imperative::VarBase::Type) .def_property_readonly("dtype", &imperative::VarBase::DataType); - // NOTE(zhiqiu): set the metaclass of Layer. - // See details: https://github.com/pybind/pybind11/pull/679 - // https://github.com/pybind/pybind11/blob/028812ae7eee307dca5f8f69d467af7b92cc41c8/tests/test_methods_and_attributes.cpp#L284 - py::class_ layer( - m, "Layer", py::metaclass((PyObject *)&PyType_Type)); // NOLINT - layer.def(py::init<>()) - .def("forward", - [](imperative::Layer &self, - const std::vector> &inputs) { - return self.Forward(inputs); - }); - py::class_(m, "ProgramDescTracer", "") .def("create_program_desc", &imperative::jit::ProgramDescTracer::CreateProgramDesc) diff --git a/python/paddle/fluid/dygraph/layers.py b/python/paddle/fluid/dygraph/layers.py index 662e233bd40d616d66f7807b23599f4a9d89103e..11812398ba455053bbc6fbcfbc1dfc99df31448d 100644 --- a/python/paddle/fluid/dygraph/layers.py +++ b/python/paddle/fluid/dygraph/layers.py @@ -78,7 +78,7 @@ class HookRemoveHelper(object): del hooks[self._hook_id] -class Layer(core.Layer): +class Layer(object): """ Dynamic graph Layer based on OOD, includes the parameters of the layer, the structure of the forward graph and so on. @@ -976,7 +976,7 @@ class Layer(core.Layer): for prefix, layer in model.named_sublayers(): print(prefix, layer) """ - assert (isinstance(sublayer, core.Layer) or sublayer == None) + assert (isinstance(sublayer, Layer) or sublayer == None) self._sub_layers[name] = sublayer return sublayer @@ -1143,7 +1143,7 @@ class Layer(core.Layer): params[name] = None else: layers = self.__dict__.get('_sub_layers', None) - if isinstance(value, core.Layer): + if isinstance(value, Layer): if layers is None: raise ValueError( "super(YourLayer, self).__init__() should be called first" diff --git a/python/paddle/fluid/tests/unittests/test_imperative_basic.py b/python/paddle/fluid/tests/unittests/test_imperative_basic.py index 3a1ff82290e0f34537fbe0dbd349d2b730c0cb8a..d6835069b9d2a0750174654b5eb19b2aa226cafe 100644 --- a/python/paddle/fluid/tests/unittests/test_imperative_basic.py +++ b/python/paddle/fluid/tests/unittests/test_imperative_basic.py @@ -400,8 +400,6 @@ class TestImperative(unittest.TestCase): def test_layer(self): with fluid.dygraph.guard(): - cl = core.Layer() - cl.forward([]) l = fluid.Layer("l") self.assertRaises(NotImplementedError, l.forward, []) diff --git a/python/paddle/framework/io.py b/python/paddle/framework/io.py index 8b72f05f363cba88cb0147fa96eea3a5747d04c8..8367205a7e7c2a5f77196771eb722f794ac66a30 100644 --- a/python/paddle/framework/io.py +++ b/python/paddle/framework/io.py @@ -253,7 +253,7 @@ def _pickle_save(obj, f, protocol): dispatch_table_layer[layer.__class__] = reduce_Layer return layer - _parse_every_object(obj, lambda v: isinstance(v, core.Layer), + _parse_every_object(obj, lambda v: isinstance(v, fluid.Layer), create_layer_dispatch_table) def add_dispatch_table(): @@ -316,7 +316,7 @@ def _is_state_dict(obj): if isinstance(obj, dict): def condition(obj): - return isinstance(obj, (core.Layer, Program, core.VarBase, + return isinstance(obj, (fluid.Layer, Program, core.VarBase, core.LoDTensor, core.SelectedRows)) # If the value of a dict is a core.VarBase/LoDTensor or a dict @@ -422,7 +422,7 @@ def _parse_every_object(obj, condition_func, convert_func): def _parse_load_result(obj, return_numpy): def is_layer(obj): - return isinstance(obj, core.Layer) + return isinstance(obj, fluid.Layer) def parse_layer(obj): temp_dict = _parse_load_result(obj.__dict__, False)