|
|
@ -135,7 +135,7 @@ public: |
|
|
|
|
|
|
|
|
|
|
|
void setActivationFunction(int _activ_func, double _f_param1, double _f_param2 ) |
|
|
|
void setActivationFunction(int _activ_func, double _f_param1, double _f_param2 ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if( _activ_func < 0 || _activ_func > GAUSSIAN ) |
|
|
|
if( _activ_func < 0 || _activ_func > LEAKYRELU) |
|
|
|
CV_Error( CV_StsOutOfRange, "Unknown activation function" ); |
|
|
|
CV_Error( CV_StsOutOfRange, "Unknown activation function" ); |
|
|
|
|
|
|
|
|
|
|
|
activ_func = _activ_func; |
|
|
|
activ_func = _activ_func; |
|
|
@ -158,6 +158,18 @@ public: |
|
|
|
if (fabs(_f_param2) < FLT_EPSILON) |
|
|
|
if (fabs(_f_param2) < FLT_EPSILON) |
|
|
|
_f_param2 = 1.; |
|
|
|
_f_param2 = 1.; |
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
case RELU: |
|
|
|
|
|
|
|
if (fabs(_f_param1) < FLT_EPSILON) |
|
|
|
|
|
|
|
_f_param1 = 1; |
|
|
|
|
|
|
|
min_val = max_val = min_val1 = max_val1 = 0.; |
|
|
|
|
|
|
|
_f_param2 = 0.; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case LEAKYRELU: |
|
|
|
|
|
|
|
if (fabs(_f_param1) < FLT_EPSILON) |
|
|
|
|
|
|
|
_f_param1 = 0.01; |
|
|
|
|
|
|
|
min_val = max_val = min_val1 = max_val1 = 0.; |
|
|
|
|
|
|
|
_f_param2 = 0.; |
|
|
|
|
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
min_val = max_val = min_val1 = max_val1 = 0.; |
|
|
|
min_val = max_val = min_val1 = max_val1 = 0.; |
|
|
|
_f_param1 = 1.; |
|
|
|
_f_param1 = 1.; |
|
|
@ -385,6 +397,12 @@ public: |
|
|
|
case GAUSSIAN: |
|
|
|
case GAUSSIAN: |
|
|
|
scale = -f_param1*f_param1; |
|
|
|
scale = -f_param1*f_param1; |
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
case RELU: |
|
|
|
|
|
|
|
scale = 1; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case LEAKYRELU: |
|
|
|
|
|
|
|
scale = 1; |
|
|
|
|
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
; |
|
|
|
; |
|
|
|
} |
|
|
|
} |
|
|
@ -397,10 +415,18 @@ public: |
|
|
|
{ |
|
|
|
{ |
|
|
|
double* data = sums.ptr<double>(i); |
|
|
|
double* data = sums.ptr<double>(i); |
|
|
|
for (j = 0; j < cols; j++) |
|
|
|
for (j = 0; j < cols; j++) |
|
|
|
|
|
|
|
{ |
|
|
|
data[j] = (data[j] + bias[j])*scale; |
|
|
|
data[j] = (data[j] + bias[j])*scale; |
|
|
|
|
|
|
|
if (activ_func == RELU) |
|
|
|
|
|
|
|
if (data[j] < 0) |
|
|
|
|
|
|
|
data[j] = 0; |
|
|
|
|
|
|
|
if (activ_func == LEAKYRELU) |
|
|
|
|
|
|
|
if (data[j] < 0) |
|
|
|
|
|
|
|
data[j] *= f_param1; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if( activ_func == IDENTITY ) |
|
|
|
if (activ_func == IDENTITY || activ_func == RELU || activ_func == LEAKYRELU) |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
@ -478,6 +504,46 @@ public: |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else if (activ_func == RELU) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
for (i = 0; i < n; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
double* xf = _xf.ptr<double>(i); |
|
|
|
|
|
|
|
double* df = _df.ptr<double>(i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < cols; j++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
xf[j] += bias[j]; |
|
|
|
|
|
|
|
if (xf[j] < 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
xf[j] = 0; |
|
|
|
|
|
|
|
df[j] = 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
df[j] = 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (activ_func == LEAKYRELU) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
for (i = 0; i < n; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
double* xf = _xf.ptr<double>(i); |
|
|
|
|
|
|
|
double* df = _df.ptr<double>(i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < cols; j++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
xf[j] += bias[j]; |
|
|
|
|
|
|
|
if (xf[j] < 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
xf[j] = f_param1*xf[j]; |
|
|
|
|
|
|
|
df[j] = f_param1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
df[j] = 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
else if (activ_func == GAUSSIAN) |
|
|
|
else if (activ_func == GAUSSIAN) |
|
|
|
{ |
|
|
|
{ |
|
|
|
double scale = -f_param1*f_param1; |
|
|
|
double scale = -f_param1*f_param1; |
|
|
@ -1110,7 +1176,9 @@ public: |
|
|
|
{ |
|
|
|
{ |
|
|
|
const char* activ_func_name = activ_func == IDENTITY ? "IDENTITY" : |
|
|
|
const char* activ_func_name = activ_func == IDENTITY ? "IDENTITY" : |
|
|
|
activ_func == SIGMOID_SYM ? "SIGMOID_SYM" : |
|
|
|
activ_func == SIGMOID_SYM ? "SIGMOID_SYM" : |
|
|
|
activ_func == GAUSSIAN ? "GAUSSIAN" : 0; |
|
|
|
activ_func == GAUSSIAN ? "GAUSSIAN" : |
|
|
|
|
|
|
|
activ_func == RELU ? "RELU" : |
|
|
|
|
|
|
|
activ_func == LEAKYRELU ? "LEAKYRELU" : 0; |
|
|
|
|
|
|
|
|
|
|
|
if( activ_func_name ) |
|
|
|
if( activ_func_name ) |
|
|
|
fs << "activation_function" << activ_func_name; |
|
|
|
fs << "activation_function" << activ_func_name; |
|
|
@ -1191,6 +1259,8 @@ public: |
|
|
|
{ |
|
|
|
{ |
|
|
|
activ_func = activ_func_name == "SIGMOID_SYM" ? SIGMOID_SYM : |
|
|
|
activ_func = activ_func_name == "SIGMOID_SYM" ? SIGMOID_SYM : |
|
|
|
activ_func_name == "IDENTITY" ? IDENTITY : |
|
|
|
activ_func_name == "IDENTITY" ? IDENTITY : |
|
|
|
|
|
|
|
activ_func_name == "RELU" ? RELU : |
|
|
|
|
|
|
|
activ_func_name == "LEAKYRELU" ? LEAKYRELU : |
|
|
|
activ_func_name == "GAUSSIAN" ? GAUSSIAN : -1; |
|
|
|
activ_func_name == "GAUSSIAN" ? GAUSSIAN : -1; |
|
|
|
CV_Assert( activ_func >= 0 ); |
|
|
|
CV_Assert( activ_func >= 0 ); |
|
|
|
} |
|
|
|
} |
|
|
|