12 #include <boost/assert.hpp> 13 #include <boost/core/ignore_unused.hpp> 14 #include <boost/numeric/conversion/cast.hpp> 19 inline bool ValidateAxis(
int axis,
unsigned int numDimensions)
21 const int sNumDimensions = boost::numeric_cast<
int>(numDimensions);
22 return axis < sNumDimensions && axis >= -sNumDimensions;
37 bool axisIsValid = ValidateAxis(descriptor.
m_Axis, numDimensions);
38 BOOST_ASSERT_MSG(axisIsValid,
39 "Axis index is not in range [-numDimensions, numDimensions).");
40 boost::ignore_unused(axisIsValid);
42 unsigned int uAxis = descriptor.
m_Axis < 0 ?
43 numDimensions - boost::numeric_cast<
unsigned int>(std::abs(descriptor.
m_Axis)) :
44 boost::numeric_cast<unsigned int>(descriptor.
m_Axis);
48 const unsigned int axisSize = inputShape[uAxis];
53 for (
unsigned int outer = 0; outer < outerSize; ++outer)
55 for (
unsigned int inner = 0; inner < innerSize; ++inner)
58 input[outer * axisSize * innerSize + inner];
59 float maxValue = input.
Get();
60 for (
unsigned int i = 1u; i < axisSize; ++i)
62 input[(outer * axisSize + i) * innerSize + inner];
63 maxValue = std::max(maxValue, input.
Get());
68 for (
unsigned int i = 0u; i < axisSize; ++i)
70 input[(outer * axisSize + i) * innerSize + inner];
71 sum += std::exp((input.
Get() - maxValue) * descriptor.
m_Beta);
75 const float logSum = std::log(sum);
78 for (
unsigned int i = 0u; i < axisSize; ++i)
80 const unsigned int index = (outer * axisSize + i) * innerSize + inner;
85 output.
Set((input.
Get() - maxValue) * descriptor.
m_Beta - logSum);
unsigned int GetNumDimensions() const
unsigned int GetNumDimensions() const
float m_Beta
Exponentiation value.
A SoftmaxDescriptor for the SoftmaxLayer.
virtual IType Get() const =0
unsigned int GetNumElementsBetween(const armnn::TensorShape &shape, unsigned int firstAxisInclusive, unsigned int lastAxisExclusive)
int m_Axis
Scalar, defaulted to the last index (-1), specifying the dimension the activation will be performed o...
const TensorShape & GetShape() const
virtual void Set(IType right)=0
void LogSoftmax(Decoder< float > &input, Encoder< float > &output, const TensorInfo &inputInfo, const LogSoftmaxDescriptor &descriptor)