#pragma once #include "core/omp_config.h" #include "utils/vector.h" #include "utils/matrix.h" #include "utils/matcast.h" #include "numerics/clip.h" #include "numerics/log.h" #include "numerics/sub.h" #include "Loss.h" namespace neural_networks{ template struct Loss_MeanAbsoluteError : Loss { utils::Matrix dinputs; utils::Matrix y_true; utils::Vector sample_losses; utils::Vector forward(const utils::Matrix& y_pred, const utils::Matrix& y_true) override{ // Calculate loss sample_losses = numerics::mean_rowwise(numerics::abs(numerics::sub(y_true, y_pred))); // Return losses return sample_losses; } void backward(const utils::Matrix& dvalues, const utils::Matrix& y_true) override{ // Number of samples const T samples = static_cast (dvalues.rows()); // Number of outputs in every sample const T outputs = static_cast (dvalues.cols()); // Gradient values dinputs = numerics::div(numerics::sign(numerics::sub(y_true, dvalues)), outputs); // Normalise gradient dinputs = numerics::div(dinputs, samples); } }; } // end namespace neural_networks