35 #ifndef SHARK_OBJECTIVEFUNCTIONS_LOSS_CROSS_ENTROPY_INDEPENDENT_H 36 #define SHARK_OBJECTIVEFUNCTIONS_LOSS_CROSS_ENTROPY_INDEPENDENT_H 80 double evalError(
unsigned int target,
double exponential,
double value)
const {
81 double label = 2 *
static_cast<double>(target) - 1;
82 if(value*label < -100 ){
85 return - value * label;
88 exponential = 1/exponential;
90 return std::log(1+exponential);
103 {
return "CrossEntropyIndependent"; }
108 double eval(
unsigned int const& target, RealVector
const& prediction)
const 111 for (std::size_t c = 0; c != prediction.size(); c++){
112 double exponential = exp ( -prediction ( c ) );
113 error += evalError(target,exponential,prediction ( c ));
119 double evalDerivative(
unsigned int const& target, RealVector
const& prediction, RealVector& gradient)
const 121 gradient.resize(target.size());
124 for (std::size_t c = 0; c < output.nelem(); c++){
125 double exponential = exp ( -prediction ( c ) );
126 double sigmoid = 1/ ( 1+ exponential);
127 gradient ( c ) = ( sigmoid - target );
128 error += evalError(target, exponential, prediction ( c ));
134 unsigned int const& target,
135 RealVector
const& prediction,
136 RealVector& gradient,
139 gradient.resize(target.size());
144 for (std::size_t c = 0; c < output.nelem(); c++){
145 double exponential = exp ( -prediction ( c ) );
146 double sigmoid = 1/ ( 1+ exponential);
147 gradient ( c ) = ( sigmoid - target );
148 hessian ( c,c ) =
std::max(0.0, sigmoid * ( 1-sigmoid ));
149 error += evalError(target, exponential, prediction ( c ));