| // |
| // Copyright © 2017 Arm Ltd. All rights reserved. |
| // SPDX-License-Identifier: MIT |
| // |
| |
| #include "Softmax.hpp" |
| |
| #include <cmath> |
| #include <vector> |
| |
| namespace armnn |
| { |
| |
| /// Computes the softmax function on some inputs, into outputs, with a shape given by tensorInfo. |
| void Softmax(Decoder<float>& in, Encoder<float>& out, const TensorInfo& inputTensorInfo, float beta) |
| { |
| unsigned int numChannels = inputTensorInfo.GetShape()[1]; |
| |
| for (unsigned int n = 0; n < inputTensorInfo.GetShape()[0]; n++) |
| { |
| // Find maximum channel. |
| in[n * numChannels]; |
| float max = in.Get(); |
| for (unsigned int c = 1; c < numChannels; c++) |
| { |
| in[n * numChannels + c]; |
| float val = in.Get(); |
| if (val > max) |
| { |
| max = val; |
| } |
| } |
| |
| // Exponentiate all values and sum. |
| std::vector<float> exponentials(numChannels); |
| float sum = 0.0f; |
| for (unsigned int c = 0; c < numChannels; c++) |
| { |
| in[n * numChannels + c]; |
| float val = in.Get(); |
| exponentials[c] = expf((val - max) * beta); |
| sum += exponentials[c]; |
| } |
| |
| // Divide exponentials by sum to give outputs. |
| for (unsigned int c = 0; c < numChannels; c++) |
| { |
| out[n * numChannels + c]; |
| out.Set(exponentials[c] / sum); |
| } |
| } |
| } |
| |
| } //namespace armnn |