From 06fadd374fc545bfa51d99125cbf3c6b8d2d5990 Mon Sep 17 00:00:00 2001 From: nihui Date: Thu, 14 Apr 2022 18:56:54 +0800 Subject: [PATCH] fix pnnx hardtanh ncnn conversion --- tools/pnnx/src/pass_ncnn/F_hardtanh.cpp | 31 ++++++++++++++++++++++- tools/pnnx/src/pass_ncnn/F_leaky_relu.cpp | 18 ++++++++++++- tools/pnnx/src/pass_ncnn/nn_LeakyReLU.cpp | 13 +++++++++- 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/tools/pnnx/src/pass_ncnn/F_hardtanh.cpp b/tools/pnnx/src/pass_ncnn/F_hardtanh.cpp index 585b2e7ed..29904730a 100644 --- a/tools/pnnx/src/pass_ncnn/F_hardtanh.cpp +++ b/tools/pnnx/src/pass_ncnn/F_hardtanh.cpp @@ -14,6 +14,8 @@ #include "pass_ncnn.h" +#include + namespace pnnx { namespace ncnn { @@ -26,7 +28,7 @@ public: return R"PNNXIR(7767517 3 2 pnnx.Input input 0 1 input -F.hardtanh op_0 1 1 input out min_val=%0 max_val=%1 +F.hardtanh op_0 1 1 input out min_val=%min_val max_val=%max_val pnnx.Output output 1 0 out )PNNXIR"; } @@ -40,6 +42,33 @@ pnnx.Output output 1 0 out { return "htanh"; } + + void write(Operator* op, const std::map& captured_params) const + { + float min = -FLT_MAX; + float max = FLT_MAX; + + if (captured_params.at("min_val").type == 2) + { + min = captured_params.at("min_val").i; + } + if (captured_params.at("min_val").type == 3) + { + min = captured_params.at("min_val").f; + } + + if (captured_params.at("max_val").type == 2) + { + max = captured_params.at("max_val").i; + } + if (captured_params.at("max_val").type == 3) + { + max = captured_params.at("max_val").f; + } + + op->params["0"] = min; + op->params["1"] = max; + } }; REGISTER_GLOBAL_PNNX_NCNN_GRAPH_REWRITER_PASS(F_hardtanh, 20) diff --git a/tools/pnnx/src/pass_ncnn/F_leaky_relu.cpp b/tools/pnnx/src/pass_ncnn/F_leaky_relu.cpp index f18a246ee..3f45afc9d 100644 --- a/tools/pnnx/src/pass_ncnn/F_leaky_relu.cpp +++ b/tools/pnnx/src/pass_ncnn/F_leaky_relu.cpp @@ -26,7 +26,7 @@ public: return R"PNNXIR(7767517 3 2 pnnx.Input input 0 1 input -F.leaky_relu op_0 1 1 input out negative_slope=%0 +F.leaky_relu op_0 1 1 input out negative_slope=%negative_slope pnnx.Output output 1 0 out )PNNXIR"; } @@ -40,6 +40,22 @@ pnnx.Output output 1 0 out { return "leakyrelu"; } + + void write(Operator* op, const std::map& captured_params) const + { + float negative_slope = 0.f; + + if (captured_params.at("negative_slope").type == 2) + { + negative_slope = captured_params.at("negative_slope").i; + } + if (captured_params.at("negative_slope").type == 3) + { + negative_slope = captured_params.at("negative_slope").f; + } + + op->params["0"] = negative_slope; + } }; REGISTER_GLOBAL_PNNX_NCNN_GRAPH_REWRITER_PASS(F_leaky_relu, 20) diff --git a/tools/pnnx/src/pass_ncnn/nn_LeakyReLU.cpp b/tools/pnnx/src/pass_ncnn/nn_LeakyReLU.cpp index 2251a3242..fdb83da2e 100644 --- a/tools/pnnx/src/pass_ncnn/nn_LeakyReLU.cpp +++ b/tools/pnnx/src/pass_ncnn/nn_LeakyReLU.cpp @@ -43,7 +43,18 @@ pnnx.Output output 1 0 out void write(Operator* op, const std::map& captured_params) const { - op->params["0"] = captured_params.at("negative_slope"); + float negative_slope = 0.f; + + if (captured_params.at("negative_slope").type == 2) + { + negative_slope = captured_params.at("negative_slope").i; + } + if (captured_params.at("negative_slope").type == 3) + { + negative_slope = captured_params.at("negative_slope").f; + } + + op->params["0"] = negative_slope; } };