1 // 2 // TFClip.cpp 3 // MNNConverter 4 // 5 // Created by MNN on 2020/07/09. 6 // Copyright © 2018, Alibaba Group Holding Limited 7 // 8 9 #include "MNN_generated.h" 10 #include "TFExtraManager.hpp" 11 12 namespace MNN { 13 namespace Express { 14 class ClipTransform : public TFExtraManager::Transform { 15 public: onExecute(EXPRP expr) const16 virtual EXPRP onExecute(EXPRP expr) const override { 17 auto inputs = expr->inputs(); 18 if (inputs.size() != 3) { 19 MNN_ERROR("ClipByValue should has 3 inputs\n"); 20 return nullptr; 21 } 22 float minValue = 0.0f; 23 float maxValue = 0.0f; 24 { 25 auto minInfo = inputs[1]->getInfo(); 26 auto maxInfo = inputs[2]->getInfo(); 27 auto minP = inputs[1]->readMap<float>(); 28 auto maxP = inputs[2]->readMap<float>(); 29 if (nullptr == minP || nullptr == maxP || 1 != minInfo->size || 1 != maxInfo->size) { 30 // Not const clip op, use max(min) instead 31 auto sameVar = _Minimum(_Maximum(inputs[0], inputs[1]), inputs[2]); 32 sameVar->setName(expr->name()); 33 return sameVar->expr().first; 34 } 35 minValue = *minP; 36 maxValue = *maxP; 37 } 38 std::vector<VARP> subInputs = {inputs[0]}; 39 std::unique_ptr<MNN::OpT> clipOp(new OpT); 40 clipOp->type = OpType_ReLU6; 41 clipOp->main.type = OpParameter_Relu6; 42 clipOp->main.value = new Relu6T; 43 auto param = clipOp->main.AsRelu6(); 44 { 45 param->maxValue = maxValue; 46 param->minValue = minValue; 47 } 48 auto newExpr = Expr::create(clipOp.get(), subInputs, 1); 49 newExpr->setName(expr->name()); 50 return newExpr; 51 } 52 }; __anonc63f682a0102() 53static auto gRegister = []() { 54 TFExtraManager::get()->insert("ClipByValue", std::shared_ptr<TFExtraManager::Transform>(new ClipTransform)); 55 return true; 56 }(); 57 } // namespace Express 58 } // namespace MNN 59