You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by GitBox <gi...@apache.org> on 2018/12/03 14:43:18 UTC

[GitHub] larroy commented on a change in pull request #13409: [MXNET-1234] Fix shape inference problems in Activation backward

larroy commented on a change in pull request #13409: [MXNET-1234] Fix shape inference problems in Activation backward
URL: https://github.com/apache/incubator-mxnet/pull/13409#discussion_r238294269
 
 

 ##########
 File path: tests/cpp/operator/activation_perf.cc
 ##########
 @@ -38,13 +38,21 @@ const kwargs_t basic_activation_args = { };
  * \brief Generic bidirectional sanity test
  */
 TEST(ACTIVATION_PERF, ExecuteBidirectional) {
+  using namespace std;
   TShape shape({5, 5});
-  kwargs_t kwargs = basic_activation_args;
-  kwargs.push_back({"act_type", "tanh"});
-
-  test::op::CoreOperatorRunner<float> runner;
-  runner.RunBidirectional(false, { shape }, test::op::CoreOpExecutor<float>::ArgsWithOpName(
-          kwargs, "Activation", "_backward_Activation"), 1);
+  vector<string> activations = {
+    "relu",
+    "sigmoid",
+    "tanh",
+    "softrelu",
+    "softsign"
+  };
+  for (const string& activation : activations) {
+    kwargs_t activation_args = {{"act_type", activation}};
+    test::op::CoreOperatorRunner<float> runner;
+    runner.RunBidirectional(false, { shape }, test::op::CoreOpExecutor<float>::ArgsWithOpName(
+            activation_args, "Activation", "_backward_Activation"), 1);
+  }
 
 Review comment:
   @TaoLv  you are right, this statement is not true in the master branch. I retract it.
   
   We can use this patch to reproduce the bug and see what runs and doesn't run:
   
   ```
   diff --git a/src/operator/nn/activation-inl.h b/src/operator/nn/activation-inl.h
   index 2705177..c656e33 100644
   --- a/src/operator/nn/activation-inl.h
   +++ b/src/operator/nn/activation-inl.h
   @@ -88,6 +88,7 @@ void ActivationForward(const OpContext &ctx, const TBlob &in_data,
                           const OpReqType &req, const TBlob &out_data) {
      using namespace mshadow;
      using namespace mshadow::expr;
   +  std::cout << "ActivationForward" << std::endl;
      Stream<xpu> *s = ctx.get_stream<xpu>();
      const size_t sz = in_data.shape_.Size();
      if (sz) {
   @@ -104,6 +105,7 @@ template<typename xpu, typename ForwardOp, typename BackwardOp>
    void ActivationBackward(const OpContext &ctx, const TBlob &out_grad,
                            const TBlob &out_data, const OpReqType &req,
                            const TBlob &in_grad) {
   +  std::cout << "ActivationBackward" << std::endl;
      using namespace mshadow;
      using namespace mshadow::expr;
      Stream<xpu> *s = ctx.get_stream<xpu>();
   @@ -123,6 +125,7 @@ template<typename xpu>
    void ActivationComputeImpl(const nnvm::NodeAttrs& attrs, const OpContext &ctx,
                               const std::vector<TBlob>& inputs, const std::vector<OpReqType>& req,
                               const std::vector<TBlob>& outputs) {
   +  std::cout << "ActivationComputeImpl" << std::endl;
      const ActivationParam& param = nnvm::get<ActivationParam>(attrs.parsed);
      switch (param.act_type) {
        case activation::kReLU:
   @@ -154,6 +157,7 @@ template<typename xpu>
    void ActivationGradComputeImpl(const nnvm::NodeAttrs& attrs, const OpContext &ctx,
                               const std::vector<TBlob>& inputs, const std::vector<OpReqType>& req,
                               const std::vector<TBlob>& outputs) {
   +  std::cout << "ActivationGradComputeImpl" << std::endl;
      const ActivationParam& param = nnvm::get<ActivationParam>(attrs.parsed);
      switch (param.act_type) {
        case activation::kReLU:
   @@ -187,6 +191,7 @@ void ActivationCompute(const nnvm::NodeAttrs& attrs,
                           const std::vector<TBlob>& inputs,
                           const std::vector<OpReqType>& req,
                           const std::vector<TBlob>& outputs) {
   +  std::cout << "ActivationCompute" << std::endl;
      CHECK_EQ(inputs.size(), 1U);
      CHECK_EQ(outputs.size(), 1U);
      ActivationComputeImpl<xpu>(attrs, ctx, inputs, req, outputs);
   @@ -198,6 +203,7 @@ void ActivationGradCompute(const nnvm::NodeAttrs& attrs,
                               const std::vector<TBlob>& inputs,
                               const std::vector<OpReqType>& req,
                               const std::vector<TBlob>& outputs) {
   +  std::cout << "ActivationGradCompute" << std::endl;
      const ActivationParam& param = nnvm::get<ActivationParam>(attrs.parsed);
    #if (MXNET_USE_CUDNN == 1 || MXNET_USE_MKLDNN == 1)
      bool relu = param.act_type == activation::kReLU;
   diff --git a/src/operator/nn/activation.cc b/src/operator/nn/activation.cc
   index ba44ebd..cb5d5ab 100644
   --- a/src/operator/nn/activation.cc
   +++ b/src/operator/nn/activation.cc
   @@ -72,6 +72,7 @@ static void ActivationComputeExCPU(const nnvm::NodeAttrs& attrs,
                                       const std::vector<NDArray>& inputs,
                                       const std::vector<OpReqType>& req,
                                       const std::vector<NDArray>& outputs) {
   +  std::cout << "ActivationComputeExCPU" << std::endl;
      CHECK_EQ(inputs.size(), 1U);
      CHECK_EQ(outputs.size(), 1U);
      if (SupportMKLDNN(inputs[0])) {
   @@ -88,6 +89,7 @@ void ActivationGradComputeExCPU(const nnvm::NodeAttrs& attrs,
                                    const std::vector<NDArray>& inputs,
                                    const std::vector<OpReqType>& req,
                                    const std::vector<NDArray>& outputs) {
   +  std::cout << "ActivationGradComputeExCPU" << std::endl;
      const ActivationParam& param = nnvm::get<ActivationParam>(attrs.parsed);
      bool relu = param.act_type == activation::kReLU;
      CHECK_EQ(inputs.size(), relu ? 2U : 3U);
   diff --git a/src/operator/nn/activation.cu b/src/operator/nn/activation.cu
   index 8892cc3..5aaeb78 100644
   --- a/src/operator/nn/activation.cu
   +++ b/src/operator/nn/activation.cu
   @@ -51,6 +51,7 @@ void ActivationCompute<gpu>(const nnvm::NodeAttrs& attrs,
        const std::vector<TBlob>& inputs,
        const std::vector<OpReqType>& req,
        const std::vector<TBlob>& outputs) {
   +  std::cout << "ActivationCompute (GPU)" << std::endl;
      CHECK_EQ(inputs.size(), 1U);
      CHECK_EQ(outputs.size(), 1U);
      const ActivationParam& param = nnvm::get<ActivationParam>(attrs.parsed);
   @@ -75,6 +76,7 @@ void ActivationGradCompute<gpu>(const nnvm::NodeAttrs& attrs,
                                    const std::vector<TBlob>& inputs,
                                    const std::vector<OpReqType>& req,
                                    const std::vector<TBlob>& outputs) {
   +  std::cout << "ActivationGradCompute (GPU)" << std::endl;
      const ActivationParam& param = nnvm::get<ActivationParam>(attrs.parsed);
      bool relu = param.act_type == activation::kReLU;
      CHECK_EQ(inputs.size(), relu ? 2U : 3U);
   diff --git a/tests/cpp/operator/activation_perf.cc b/tests/cpp/operator/activation_perf.cc
   index 1bd8ca8..05863d7 100644
   --- a/tests/cpp/operator/activation_perf.cc
   +++ b/tests/cpp/operator/activation_perf.cc
   @@ -38,13 +38,21 @@ const kwargs_t basic_activation_args = { };
     * \brief Generic bidirectional sanity test
     */
    TEST(ACTIVATION_PERF, ExecuteBidirectional) {
   +  using namespace std;
      TShape shape({5, 5});
   -  kwargs_t kwargs = basic_activation_args;
   -  kwargs.push_back({"act_type", "tanh"});
   -
   -  test::op::CoreOperatorRunner<float> runner;
   -  runner.RunBidirectional(false, { shape }, test::op::CoreOpExecutor<float>::ArgsWithOpName(
   -          kwargs, "Activation", "_backward_Activation"), 1);
   +  vector<string> activations = {
   +    "relu",
   +    "sigmoid",
   +    "tanh",
   +    "softrelu",
   +    "softsign"
   +  };
   +  for (const string& activation : activations) {
   +    kwargs_t activation_args = {{"act_type", activation}};
   +    test::op::CoreOperatorRunner<float> runner;
   +    runner.RunBidirectional(false, { shape }, test::op::CoreOpExecutor<float>::ArgsWithOpName(
   +            activation_args, "Activation", "_backward_Activation"), 1);
   +  }
    }
    
    /*!
   ```

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services