+
+
+
12 static double cmpLoss(
const Eigen::MatrixXd &o,
const Eigen::MatrixXd &y) {
+
13 constexpr double threshold = 1.0e-5;
+
14 Eigen::MatrixXd oTrim = trim(o, threshold);
+
15 Eigen::MatrixXd yTrim = trim(y, threshold);
-
17 static Eigen::MatrixXd cmpLossGrad(
const Eigen::MatrixXd &yHat,
-
18 const Eigen::MatrixXd &y) {
-
19 return (yHat.array() - y.array()) / (yHat.array() * (1.0 - y.array()));
-
-
+
17 Eigen::MatrixXd loss =
+
18 -(yTrim.array() * oTrim.array().log() +
+
19 (1.0 - yTrim.array()) * (1.0 - oTrim.array()).log());
+
+
21 if (loss.array().isNaN().any())
+
22 throw std::runtime_error(
+
23 "NaN value encountered. Inputs might be too big");
+
+
+
+
+
28 static Eigen::MatrixXd cmpLossGrad(
const Eigen::MatrixXd &yHat,
+
29 const Eigen::MatrixXd &y) {
+
30 constexpr double epsilon = 1.0e-9;
+
31 return (yHat.array() - y.array()) /
+
32 ((yHat.array() * (1.0 - yHat.array())) + epsilon);
+
+