mirror of
https://github.com/opencv/opencv.git
synced 2024-11-28 21:20:18 +08:00
Added parallel implementation of compute_gradient method.
This commit is contained in:
parent
1e1dc1429f
commit
ee92a36123
@ -362,6 +362,42 @@ double LogisticRegressionImpl::compute_cost(const Mat& _data, const Mat& _labels
|
||||
return cost;
|
||||
}
|
||||
|
||||
struct LogisticRegressionImpl_ComputeDradient_Impl : ParallelLoopBody
|
||||
{
|
||||
const Mat* data;
|
||||
const Mat* theta;
|
||||
const Mat* pcal_a;
|
||||
Mat* gradient;
|
||||
double lambda;
|
||||
|
||||
LogisticRegressionImpl_ComputeDradient_Impl(const Mat& _data, const Mat &_theta, const Mat& _pcal_a, const double _lambda, Mat & _gradient)
|
||||
: data(&_data)
|
||||
, theta(&_theta)
|
||||
, pcal_a(&_pcal_a)
|
||||
, gradient(&_gradient)
|
||||
, lambda(_lambda)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void operator()(const cv::Range& r) const
|
||||
{
|
||||
const Mat& _data = *data;
|
||||
const Mat &_theta = *theta;
|
||||
Mat & _gradient = *gradient;
|
||||
const Mat & _pcal_a = *pcal_a;
|
||||
const int m = _data.rows;
|
||||
Mat pcal_ab;
|
||||
|
||||
for (int ii = r.start; ii<r.end; ii++)
|
||||
{
|
||||
Mat pcal_b = _data(Range::all(), Range(ii,ii+1));
|
||||
multiply(_pcal_a, pcal_b, pcal_ab, 1);
|
||||
|
||||
_gradient.row(ii) = (1.0/m)*sum(pcal_ab)[0] + (lambda/m) * _theta.row(ii);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void LogisticRegressionImpl::compute_gradient(const Mat& _data, const Mat& _labels, const Mat &_theta, const double _lambda, Mat & _gradient )
|
||||
{
|
||||
@ -379,13 +415,8 @@ void LogisticRegressionImpl::compute_gradient(const Mat& _data, const Mat& _labe
|
||||
_gradient.row(0) = ((float)1/m) * sum(pcal_ab)[0];
|
||||
|
||||
//cout<<"for each training data entry"<<endl;
|
||||
for(int ii = 1;ii<_gradient.rows;ii++)
|
||||
{
|
||||
pcal_b = _data(Range::all(), Range(ii,ii+1));
|
||||
multiply(pcal_a, pcal_b, pcal_ab, 1);
|
||||
|
||||
_gradient.row(ii) = (1.0/m)*sum(pcal_ab)[0] + (_lambda/m) * _theta.row(ii);
|
||||
}
|
||||
LogisticRegressionImpl_ComputeDradient_Impl invoker(_data, _theta, pcal_a, _lambda, _gradient);
|
||||
cv::parallel_for_(cv::Range(1, _gradient.rows), invoker);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user