#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_MeanSquaredError : 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::pow(numerics::sub(y_true, y_pred), T{2})); // 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::mul(numerics::div(numerics::sub(y_true, dvalues), outputs), T{-2}); // Normalise gradient dinputs = numerics::div(dinputs, samples); } }; } // end namespace neural_networks