From d2cb28413e5728b819cc93ec68a5c81d62f75007 Mon Sep 17 00:00:00 2001 From: Yang Yu Date: Thu, 28 Dec 2017 16:58:39 +0800 Subject: [PATCH] Fix ALL RNN error --- paddle/operators/while_op.cc | 12 +++++++++++- paddle/pybind/tensor_py.h | 8 ++++---- .../v2/fluid/tests/test_dynrnn_gradient_check.py | 6 ++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/paddle/operators/while_op.cc b/paddle/operators/while_op.cc index 322270c829..341c163aa1 100644 --- a/paddle/operators/while_op.cc +++ b/paddle/operators/while_op.cc @@ -12,6 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ +#include #include #include "paddle/framework/executor.h" #include "paddle/framework/lod_tensor_array.h" @@ -201,6 +202,15 @@ class WhileGradOp : public framework::OperatorBase { VLOG(10) << "Checking " << var_name; PADDLE_ENFORCE(!framework::HasNAN(var->Get()), "%s has NAN", var_name); + if (var->Get().type() == + typeid(float)) { // NOLINT + auto &tensor = var->Get(); + auto *buf = tensor.data(); + for (int64_t i = 0; i < tensor.numel(); ++i) { + PADDLE_ENFORCE(!std::isnan(buf[i])); + } + VLOG(10) << buf[0]; + } } }; check_var_no_nan(cur_scope, inside_grad_name); @@ -210,7 +220,7 @@ class WhileGradOp : public framework::OperatorBase { "sum", {{"X", {pg_names[param_id], new_inside_name}}}, {{"Out", {pg_names[param_id]}}}, framework::AttributeMap{}); sum_op->Run(cur_scope, dev_place); - check_var_no_nan(cur_scope, pg_names[param_id]); + check_var_no_nan(scope, pg_names[param_id]); cur_scope.Rename(new_inside_name, inside_grad_name); } } diff --git a/paddle/pybind/tensor_py.h b/paddle/pybind/tensor_py.h index 4d5e73e2c2..6b4290972b 100644 --- a/paddle/pybind/tensor_py.h +++ b/paddle/pybind/tensor_py.h @@ -77,10 +77,10 @@ struct CastToPyBufferImpl { } else if (paddle::platform::is_cpu_place(tensor.place())) { dst_tensor = tensor; } - return py::buffer_info( - dst_tensor.mutable_data(dst_tensor.place()), - sizeof(CUR_TYPE), py::format_descriptor::format(), - (size_t)framework::arity(dst_tensor.dims()), dims_outside, strides); + return py::buffer_info(dst_tensor.data(), sizeof(CUR_TYPE), + py::format_descriptor::format(), + (size_t)framework::arity(dst_tensor.dims()), + dims_outside, strides); } else { constexpr bool less = I + 1 < std::tuple_size>::value; return CastToPyBufferImpl()(tensor); diff --git a/python/paddle/v2/fluid/tests/test_dynrnn_gradient_check.py b/python/paddle/v2/fluid/tests/test_dynrnn_gradient_check.py index 238fd1a8cb..6569ccb9e6 100644 --- a/python/paddle/v2/fluid/tests/test_dynrnn_gradient_check.py +++ b/python/paddle/v2/fluid/tests/test_dynrnn_gradient_check.py @@ -294,7 +294,7 @@ class TestSimpleMulWithMemory(unittest.TestCase): assert isinstance(Out, Output) Out.out(o) - # @many_times(10) + @many_times(10) @prog_scope() def test_forward_backward(self): py_rnn = TestSimpleMulWithMemory.SimpleMulWithMemory() @@ -330,10 +330,8 @@ class TestSimpleMulWithMemory(unittest.TestCase): ], return_numpy=False)) last_by_py, = py_rnn.exe().values() - print w_g[0] - self.assertTrue(numpy.allclose(last_np, last_by_py)) w_g_num = py_rnn.get_numeric_gradient_of_param(self.PARAM_NAME) - # print w_g_num[0], w_g[0] + self.assertTrue(numpy.allclose(last_np, last_by_py)) self.assertTrue(numpy.allclose(w_g_num, w_g, rtol=0.1)) i_g_num = py_rnn.get_numeric_gradient_of_input(self.DATA_NAME) -- GitLab