From d24affe0abefe8f4a83c7d4487386920895fd2e7 Mon Sep 17 00:00:00 2001 From: Sang-Hoon Park Date: Tue, 8 Oct 2019 18:07:23 +0100 Subject: COMPMID-2265 add support for Log Softmax to NEON Kernel (NEON/reference), validation tests, function and fixture are updated to add support for Log Softmax Change-Id: I641dbf1552f4128c691af8875949ebf88da71ee8 Signed-off-by: Sang-Hoon Park Reviewed-on: https://review.mlplatform.org/c/2075 Comments-Addressed: Arm Jenkins Reviewed-by: Michele Di Giorgio Tested-by: Arm Jenkins --- .../core/NEON/kernels/NESoftmaxLayerKernel.h | 12 +++++- .../runtime/NEON/functions/NESoftmaxLayer.h | 44 +++++++++++++--------- 2 files changed, 36 insertions(+), 20 deletions(-) (limited to 'arm_compute') diff --git a/arm_compute/core/NEON/kernels/NESoftmaxLayerKernel.h b/arm_compute/core/NEON/kernels/NESoftmaxLayerKernel.h index 25c3196e34..fb650794fa 100644 --- a/arm_compute/core/NEON/kernels/NESoftmaxLayerKernel.h +++ b/arm_compute/core/NEON/kernels/NESoftmaxLayerKernel.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -69,12 +69,20 @@ private: }; /** Interface for softmax computation for QASYMM8 with pre-computed max. */ +template class NELogits1DSoftmaxKernel : public INEKernel { public: const char *name() const override { - return "NELogits1DSoftmaxKernel"; + if(IS_LOG) + { + return "NELogits1DSoftmaxKernel"; + } + else + { + return "NELogits1DLogSoftmaxKernel"; + } } /** Default constructor */ NELogits1DSoftmaxKernel(); diff --git a/arm_compute/runtime/NEON/functions/NESoftmaxLayer.h b/arm_compute/runtime/NEON/functions/NESoftmaxLayer.h index 4932aeff5a..9cc7088ae2 100644 --- a/arm_compute/runtime/NEON/functions/NESoftmaxLayer.h +++ b/arm_compute/runtime/NEON/functions/NESoftmaxLayer.h @@ -36,29 +36,33 @@ namespace arm_compute { class ITensor; -/** Basic function to compute a SoftmaxLayer. +/** Basic function to compute a SoftmaxLayer and a Log SoftmaxLayer. * * Softmax is calculated by : * @f[ out = \frac{e^{x - max(x)}}{\sum{e^{x - max(x)}}} @f] * + * Log Softmax is calculated by : + * @f[ out = (x - max(x)) - \sum{e^{x - max(x)}} @f] + * * This function runs the following kernels: * -# @ref NEFillBorderKernel * -# @ref NELogits1DMaxKernel * -# @ref NELogits1DSoftmaxKernel */ -class NESoftmaxLayer : public IFunction +template +class NESoftmaxLayerGeneric : public IFunction { public: /** Constructor */ - NESoftmaxLayer(std::shared_ptr memory_manager = nullptr); + NESoftmaxLayerGeneric(std::shared_ptr memory_manager = nullptr); /** Prevent instances of this class from being copied (As this class contains pointers) */ - NESoftmaxLayer(const NESoftmaxLayer &) = delete; + NESoftmaxLayerGeneric(const NESoftmaxLayerGeneric &) = delete; /** Default move constructor */ - NESoftmaxLayer(NESoftmaxLayer &&) = default; + NESoftmaxLayerGeneric(NESoftmaxLayerGeneric &&) = default; /** Prevent instances of this class from being copied (As this class contains pointers) */ - NESoftmaxLayer &operator=(const NESoftmaxLayer &) = delete; + NESoftmaxLayerGeneric &operator=(const NESoftmaxLayerGeneric &) = delete; /** Default move assignment operator */ - NESoftmaxLayer &operator=(NESoftmaxLayer &&) = default; + NESoftmaxLayerGeneric &operator=(NESoftmaxLayerGeneric &&) = default; /** Set the input and output tensors. * * @param[in,out] input Source tensor. Data types supported: QASYMM8/F16/F32. If the width is not a @@ -103,17 +107,21 @@ private: */ void configure_reshape_input_kernel(const ITensor *input, const ITensor *output, size_t axis); - MemoryGroup _memory_group; - NELogits1DMaxKernel _max_kernel; - NELogits1DSoftmaxKernel _softmax_kernel; - std::unique_ptr _flat_or_reshape_kernel_ptr; - NEFillBorderKernel _fill_border_kernel; - NEReshapeLayerKernel _reshape_kernel; - Tensor _max; - Tensor _tmp; - Tensor _input_flattened; - Tensor _output_flattened; - bool _needs_flattening; + MemoryGroup _memory_group; + NELogits1DMaxKernel _max_kernel; + NELogits1DSoftmaxKernel _softmax_kernel; + std::unique_ptr _flat_or_reshape_kernel_ptr; + NEFillBorderKernel _fill_border_kernel; + NEReshapeLayerKernel _reshape_kernel; + Tensor _max; + Tensor _tmp; + Tensor _input_flattened; + Tensor _output_flattened; + bool _needs_flattening; }; + +using NESoftmaxLayer = NESoftmaxLayerGeneric; +using NELogSoftmaxLayer = NESoftmaxLayerGeneric; + } // namespace arm_compute #endif /* __ARM_COMPUTE_NESOFTMAXLAYER_H__ */ -- cgit v1.2.1