From e3699c070b453180c73eed2ed1359136b11cbdd1 Mon Sep 17 00:00:00 2001 From: Eric Junyuan Xie Date: Thu, 2 Nov 2017 10:29:12 -0700 Subject: [PATCH] fix makenonlossgrad bug (#8508) --- src/operator/operator_common.h | 4 ++-- src/operator/tensor/broadcast_reduce_op_index.cc | 5 +++-- src/operator/tensor/elemwise_unary_op_basic.cc | 12 ++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/operator/operator_common.h b/src/operator/operator_common.h index 63254e703c9f..875c79c2aeb9 100644 --- a/src/operator/operator_common.h +++ b/src/operator/operator_common.h @@ -412,8 +412,8 @@ inline std::vector MakeZeroGradNodes( // check whether all output grads are zero. inline bool CheckGradAllZero(const std::vector& ograds) { - const auto zero_op = nnvm::Op::Get("_zeros"); - const auto zero_like_op = nnvm::Op::Get("zeros_like"); + static const auto zero_op = nnvm::Op::Get("_zeros"); + static const auto zero_like_op = nnvm::Op::Get("zeros_like"); if (!ograds.size()) return false; for (const auto& grad : ograds) { if (!grad.node) return false; diff --git a/src/operator/tensor/broadcast_reduce_op_index.cc b/src/operator/tensor/broadcast_reduce_op_index.cc index 6887955880bc..98cd73607b82 100644 --- a/src/operator/tensor/broadcast_reduce_op_index.cc +++ b/src/operator/tensor/broadcast_reduce_op_index.cc @@ -154,8 +154,9 @@ Examples:: .set_attr("FCompute", PickOpForward) .set_attr("FGradient", [](const nnvm::NodePtr& n, const std::vector& ograds) { - auto ret = MakeNonlossGradNode("_backward_pick", n, ograds, - {n->inputs[1]}, n->attrs.dict); + if (CheckGradAllZero(ograds)) return MakeZeroGradNodes(n, ograds); + auto ret = MakeGradNode("_backward_pick", n, {ograds[0], n->inputs[1]}, + n->attrs.dict); auto p = MakeNode("zeros_like", n->attrs.name + "_index_backward", {n->inputs[1]}, nullptr, &n); ret.emplace_back(nnvm::NodeEntry{p, 0, 0}); diff --git a/src/operator/tensor/elemwise_unary_op_basic.cc b/src/operator/tensor/elemwise_unary_op_basic.cc index 55690c990cc5..c356c580bc55 100644 --- a/src/operator/tensor/elemwise_unary_op_basic.cc +++ b/src/operator/tensor/elemwise_unary_op_basic.cc @@ -241,9 +241,9 @@ NNVM_REGISTER_OP(_identity_with_attr_like_rhs) .set_attr( "FGradient", [](const nnvm::NodePtr& n, const std::vector& ograds) { - auto lhs = MakeNonlossGradNode( - "_backward_copy", n, ograds, {}, - std::unordered_map()); + if (CheckGradAllZero(ograds)) return MakeZeroGradNodes(n, ograds); + auto lhs = MakeGradNode("_backward_copy", n, ograds, + std::unordered_map()); auto ng = MakeNode("zeros_like", n->attrs.name + "_rhs_backward", {n->inputs[1]}, nullptr, &n); lhs.push_back(nnvm::NodeEntry{ng, 0, 0}); @@ -284,9 +284,9 @@ NNVM_REGISTER_OP(reshape_like) .set_attr( "FGradient", [](const nnvm::NodePtr& n, const std::vector& ograds) { - auto lhs = MakeNonlossGradNode( - "_backward_copy", n, ograds, {}, - std::unordered_map()); + if (CheckGradAllZero(ograds)) return MakeZeroGradNodes(n, ograds); + auto lhs = MakeGradNode("_backward_copy", n, ograds, + std::unordered_map()); auto ng = MakeNode("zeros_like", n->attrs.name + "_rhs_backward", {n->inputs[1]}, nullptr, &n); lhs.push_back(nnvm::NodeEntry{ng, 0, 0});