diff --git a/src/gaussian_yolo_layer.c b/src/gaussian_yolo_layer.c index 7e9efb21b34..101005ee427 100644 --- a/src/gaussian_yolo_layer.c +++ b/src/gaussian_yolo_layer.c @@ -371,13 +371,25 @@ void delta_gaussian_yolo_class(float *output, float *delta, int index, int class { int n; if (delta[index]){ - delta[index + stride*class_id] = (1 - label_smooth_eps) - output[index + stride*class_id]; + if (label_smooth_eps > 0) { + float out_val = output[index + stride*class_id] * (1 - label_smooth_eps) + 0.5*label_smooth_eps; + delta[index + stride*class_id] = 1 - out_val; + } + else { + delta[index + stride*class_id] = 1 - output[index + stride*class_id]; + } if (classes_multipliers) delta[index + stride*class_id] *= classes_multipliers[class_id]; if(avg_cat) *avg_cat += output[index + stride*class_id]; return; } for(n = 0; n < classes; ++n){ - delta[index + stride*n] = ((n == class_id) ? (1 - label_smooth_eps) : (0 + label_smooth_eps/classes)) - output[index + stride*n]; + if (label_smooth_eps > 0) { + float out_val = output[index + stride*class_id] * (1 - label_smooth_eps) + 0.5*label_smooth_eps; + delta[index + stride*n] = ((n == class_id) ? 1 : 0) - out_val; + } + else { + delta[index + stride*n] = ((n == class_id) ? 1 : 0) - output[index + stride*n]; + } if (classes_multipliers && n == class_id) delta[index + stride*class_id] *= classes_multipliers[class_id]; if(n == class_id && avg_cat) *avg_cat += output[index + stride*n]; } diff --git a/src/yolo_layer.c b/src/yolo_layer.c index 86a78895b52..d80dcc1dd44 100644 --- a/src/yolo_layer.c +++ b/src/yolo_layer.c @@ -257,7 +257,13 @@ void delta_yolo_class(float *output, float *delta, int index, int class_id, int { int n; if (delta[index + stride*class_id]){ - delta[index + stride*class_id] = (1 - label_smooth_eps) - output[index + stride*class_id]; + if (label_smooth_eps > 0) { + float out_val = output[index + stride*class_id] * (1 - label_smooth_eps) + 0.5*label_smooth_eps; + delta[index + stride*class_id] = 1 - out_val; + } + else { + delta[index + stride*class_id] = 1 - output[index + stride*class_id]; + } if (classes_multipliers) delta[index + stride*class_id] *= classes_multipliers[class_id]; if(avg_cat) *avg_cat += output[index + stride*class_id]; return; @@ -285,7 +291,13 @@ void delta_yolo_class(float *output, float *delta, int index, int class_id, int else { // default for (n = 0; n < classes; ++n) { - delta[index + stride*n] = ((n == class_id) ? (1 - label_smooth_eps) : (0 + label_smooth_eps/classes)) - output[index + stride*n]; + if (label_smooth_eps > 0) { + float out_val = output[index + stride*class_id] * (1 - label_smooth_eps) + 0.5*label_smooth_eps; + delta[index + stride*n] = ((n == class_id) ? 1 : 0) - out_val; + } + else { + delta[index + stride*n] = ((n == class_id) ? 1 : 0) - output[index + stride*n]; + } if (classes_multipliers && n == class_id) delta[index + stride*class_id] *= classes_multipliers[class_id]; if (n == class_id && avg_cat) *avg_cat += output[index + stride*n]; }