diff options
author | Ryan OShea <ryan.oshea3@arm.com> | 2023-01-13 10:19:20 +0000 |
---|---|---|
committer | Colm Donelan <colm.donelan@arm.com> | 2023-01-27 21:03:23 +0000 |
commit | 3ad2e14333fa0ffebe373b05ce582068c4c8f5f0 (patch) | |
tree | c597684297c84ffb71871d96a2d6c778559074c0 /delegate/src/SharedFunctions.cpp | |
parent | 3811a97033be66f7a5d8fc3340b0899e0b60f737 (diff) | |
download | armnn-3ad2e14333fa0ffebe373b05ce582068c4c8f5f0.tar.gz |
IVGCVSW-7450 Fix delegate fallback when fused activation is unsupported
In layers that support fused activations, we check for activation
layer support after we already create the base layer. This breaks
the fallback as we already added the base layer to the graph.
* Creates ValidateFusedActivation shared function
* Moves Activation validation higher in the VisitFunction
Signed-off-by: Ryan OShea <ryan.oshea3@arm.com>
Change-Id: I239af360923f695fc374ddeaeefa24c062eaf9e8
Diffstat (limited to 'delegate/src/SharedFunctions.cpp')
-rw-r--r-- | delegate/src/SharedFunctions.cpp | 77 |
1 files changed, 76 insertions, 1 deletions
diff --git a/delegate/src/SharedFunctions.cpp b/delegate/src/SharedFunctions.cpp index 22f578a9d7..fef970173e 100644 --- a/delegate/src/SharedFunctions.cpp +++ b/delegate/src/SharedFunctions.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2021,2022 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2021-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -37,5 +37,80 @@ TfLiteStatus ValidateFloorOperator(DelegateData& delegateData, return isSupported ? kTfLiteOk : kTfLiteError; } +TfLiteStatus ValidateFusedActivationOperator(DelegateData& delegateData, + TfLiteContext* tfLiteContext, + const armnn::TensorInfo& inputInfo, + const armnn::TensorInfo& outputInfo, + TfLiteFusedActivation activationType) +{ + armnn::ActivationDescriptor activationDesc; + + switch (activationType) + { + case kTfLiteActNone: + { + // No Activation + return kTfLiteOk; + } + case kTfLiteActRelu: + { + activationDesc.m_Function = armnn::ActivationFunction::ReLu; + break; + } +// The name of kTfLiteActRelu1 changed after TF Lite v2.3 +#if defined(ARMNN_POST_TFLITE_2_3) + case kTfLiteActReluN1To1: +#else + case kTfLiteActRelu1: +#endif + { + activationDesc.m_Function = armnn::ActivationFunction::BoundedReLu; + activationDesc.m_A = 1.0f; + activationDesc.m_B = -1.0f; + break; + } + case kTfLiteActRelu6: + { + activationDesc.m_Function = armnn::ActivationFunction::BoundedReLu; + activationDesc.m_A = 6.0f; + activationDesc.m_B = 0.0f; + break; + } + case kTfLiteActSigmoid: + { + activationDesc.m_Function = armnn::ActivationFunction::Sigmoid; + break; + } + case kTfLiteActTanh: + { + activationDesc.m_Function = armnn::ActivationFunction::TanH; + activationDesc.m_A = 1.0f; + activationDesc.m_B = 1.0f; + break; + } + default: + return kTfLiteError; + } + + bool isSupported = false; + armnn::BackendId setBackend; + + auto validateFunc = [&](const armnn::TensorInfo& outputInfo, bool& isSupported) + { + FORWARD_LAYER_SUPPORT_FUNC("ACTIVATION", + tfLiteContext, + IsActivationSupported, + delegateData.m_Backends, + isSupported, + armnn::BackendId(), + inputInfo, + outputInfo, + activationDesc); + }; + validateFunc(outputInfo, isSupported); + return isSupported ? kTfLiteOk : kTfLiteError; +} + + } // namespace armnnDelegate |