-int CvANN_MLP::train_rprop( CvVectors x0, CvVectors u, const double* sw )
-{
- const int max_buf_size = 1 << 16;
- CvMat* dw = 0;
- CvMat* dEdw = 0;
- CvMat* prev_dEdw_sign = 0;
- CvMat* buf = 0;
- double **x = 0, **df = 0;
- int iter = -1, count = x0.count;
-
- CV_FUNCNAME( "CvANN_MLP::train" );
-
- __BEGIN__;
-
- int i, ivcount, ovcount, l_count, total = 0, max_iter, buf_sz, dcount0;
- double *buf_ptr;
- double prev_E = DBL_MAX*0.5, epsilon;
- double dw_plus, dw_minus, dw_min, dw_max;
- double inv_count;
-
- max_iter = params.term_crit.max_iter;
- epsilon = params.term_crit.epsilon;
- dw_plus = params.rp_dw_plus;
- dw_minus = params.rp_dw_minus;
- dw_min = params.rp_dw_min;
- dw_max = params.rp_dw_max;
-
- l_count = layer_sizes->cols;
- ivcount = layer_sizes->data.i[0];
- ovcount = layer_sizes->data.i[l_count-1];
-
- // allocate buffers
- for( i = 0; i < l_count; i++ )
- total += layer_sizes->data.i[i];
-
- CV_CALL( dw = cvCreateMat( wbuf->rows, wbuf->cols, wbuf->type ));
- cvSet( dw, cvScalarAll(params.rp_dw0) );
- CV_CALL( dEdw = cvCreateMat( wbuf->rows, wbuf->cols, wbuf->type ));
- cvZero( dEdw );
- CV_CALL( prev_dEdw_sign = cvCreateMat( wbuf->rows, wbuf->cols, CV_8SC1 ));
- cvZero( prev_dEdw_sign );
-
- inv_count = 1./count;
- dcount0 = max_buf_size/(2*total);
- dcount0 = MAX( dcount0, 1 );
- dcount0 = MIN( dcount0, count );
- buf_sz = dcount0*(total + max_count)*2;
-
- CV_CALL( buf = cvCreateMat( 1, buf_sz, CV_64F ));
-
- CV_CALL( x = (double**)cvAlloc( total*2*sizeof(x[0]) ));
- df = x + total;
- buf_ptr = buf->data.db;
-
- for( i = 0; i < l_count; i++ )
- {
- x[i] = buf_ptr;
- df[i] = x[i] + layer_sizes->data.i[i]*dcount0;
- buf_ptr += (df[i] - x[i])*2;
- }
-
- // run rprop loop
- /*
- y_i(t) = w_i(t)*x_{i-1}(t)
- x_i(t) = f(y_i(t))
- E = sum_over_all_samples(1/2*||u - x_N||^2)
- grad_N = (x_N - u)*f'(y_i)