#pragma once #include "./core/omp_config.h" #include "./utils/vector.h" #include "./utils/matrix.h" #include "./numerics/matmax.h" #include "./numerics/matsubtract.h" #include "./numerics/matexp.h" #include "./numerics/matdiv.h" namespace neural_networks{ template struct Activation_Softmax{ utils::Matrix exp_values; utils::Matrix probabilities; utils::Matrix outputs; void forward(const utils::Matrix& inputs){ // Get unnormalized probabilities exp_values = numerics::matexp(numerics::matsubtract(inputs, numerics::matmax(inputs, "rows"), "col")); // Normalize them for each sample probabilities = numerics::matdiv(exp_values, numerics::matsum(exp_values, "col"), "col"); outputs = probabilities; } }; } // end namespace neural_networks