Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

void Impala::Core::Training::Fisher::CNormC (  )  [inline]

Definition at line 317 of file Fisher.h.

References Impala::Core::Array::AddVal(), ApplyMapping(), Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::CH(), Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::CW(), Impala::Core::Array::E, Impala::Core::Array::EqualsVal(), Impala::Core::Matrix::MatMul(), max, min, mMapped, mOffset, mRotation, mTrainFeatures, mTrainLabels, Impala::Core::Array::MulVal(), Impala::Core::Array::PixStat(), Impala::Core::Array::PixSum(), Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::SetValue(), SigmoidMap(), Impala::Core::Array::Array2dTem< StorT, elemSize, ArithT >::Value(), and Impala::Core::Array::W.

Referenced by Train().

00318     {
00319         int W=mTrainFeatures->CW();
00320         int H=mTrainFeatures->CH();
00321 
00322         ApplyMapping(mTrainFeatures);
00323 
00324         Impala::Real64 scale = 1E-10;
00325         Impala::Real64 reg = 1E-7;
00326         Impala::Real64 epsilon = 1E-6;
00327         Impala::Real64 likelihood= - std::numeric_limits<double>::infinity();
00328         Impala::Real64 likelihood_new= std::numeric_limits<double>::min() ;
00329         Impala::Real64 rmin= std::numeric_limits<double>::min() ;
00330 
00331         Impala::Real64 p;
00332         Array::Array2dScalarReal64* Positive = 0;
00333         Array::EqualsVal(Positive,mTrainLabels,1);
00334         p = Array::PixSum(Positive)/H;
00335         delete Positive;
00336 
00337         Matrix::Mat* pax;
00338         Matrix::Mat* pbx;
00339         Matrix::Mat* PosMapped = Matrix::MatCreate<Array::Array2dScalarReal64>(H,1);
00340         for(int i=0;i<H;i++)
00341             PosMapped->SetValue(mMapped->Value(mTrainLabels->Value(i,0)==1?1:0,i),0,i);
00342 
00343         Matrix::Mat* Probs = Matrix::MatCreate<Array::Array2dScalarReal64>(H,1);
00344         for(int i=0;i<H;i++)
00345             Probs->SetValue( ( mTrainLabels->Value(i,0)==1 ? p : 1-p ),0,i);
00346 
00347         while(abs(likelihood_new - likelihood) > epsilon)
00348         {
00349             Matrix::Mat* Mapped = 0;
00350             Array::MulVal(Mapped,PosMapped,scale);
00351 
00352             likelihood = likelihood_new;
00353 
00354             pax = SigmoidMap(Mapped,1);
00355             pbx = Matrix::MatCreate<Array::Array2dScalarReal64>(H,1);
00356             Array::MulVal(pbx,pax,-1);
00357             Array::AddVal(pbx,pbx,1);
00358 
00360             //Calculate new likelihood
00361             //
00362             Matrix::Mat* tmp = Matrix::MatCreate<Array::Array2dScalarReal64>(H,1);
00363             for(int i=0;i<H;i++)
00364                 tmp->SetValue(Probs->Value(0,i)*log(pax->Value(0,i)+rmin),0,i);
00365             Impala::Real64 mean = PixSum(tmp)/H;
00366 
00367             likelihood_new = mean - reg*log(scale+1);
00368 
00370             //Calculate the new scale
00371             //
00372             for(int i=0;i<H;i++)
00373                 tmp->SetValue(Probs->Value(0,i)*pbx->Value(0,i),0,i);
00374             
00375             Matrix::Mat* tmp2 = Matrix::MatCreate<Array::Array2dScalarReal64>(1,H);
00376             for(int i=0;i<H;i++)
00377                 tmp2->SetValue(tmp->Value(0,i),i,0);
00378 
00379             Matrix::Mat* tmp3=Matrix::MatMul(tmp2,PosMapped);
00380 
00382             Matrix::Mat* tmp4 = Matrix::MatCreate<Array::Array2dScalarReal64>(1,H);
00383             Matrix::Mat* tmp5 = Matrix::MatCreate<Array::Array2dScalarReal64>(H,1);
00384 
00385             for(int i=0;i<H;i++)
00386                 tmp4->SetValue(Probs->Value(0,i)*PosMapped->Value(0,i)*pax->Value(0,i),i,0);
00387 
00388             for(int i=0;i<H;i++)
00389                 tmp5->SetValue(PosMapped->Value(0,i)*pbx->Value(0,i),0,i);
00390 
00391             Matrix::Mat* tmp6 = Matrix::MatMul(tmp4,tmp5);
00392 
00394             Impala::Real64 a = tmp3->Value(0,0);
00395             Impala::Real64 b = reg*H/(scale+1);
00396             Impala::Real64 c = tmp6->Value(0,0) - H* reg/((scale+1)*(scale+1)) + rmin;
00397 
00398             scale = scale + (a - b) / c;
00400 
00401             delete Mapped;
00402             delete pax;
00403             delete pbx;
00404             delete tmp;
00405             delete tmp2;
00406             delete tmp3;
00407             delete tmp4;
00408             delete tmp5;
00409             delete tmp6;
00410             pax=0;
00411             pbx=0;
00412         }
00413 
00414         Impala::Real64 var;
00415         Impala::Real64* o=0;
00416         
00417         Array::PixStat(PosMapped,o,o,o,&var);
00418         
00419         // Dirty trick to avoid 0 and inf.
00420         scale = std::min(std::max(scale,0.1/(sqrt(var)+1e-16)),1e16);
00421 
00422         Array::MulVal(mRotation,mRotation,scale);
00423         Array::MulVal(mOffset,mOffset,scale);
00424 
00425         delete Probs;
00426         delete PosMapped;
00427     }

Here is the call graph for this function:


Generated on Fri Mar 19 11:23:36 2010 for ImpalaSrc by  doxygen 1.5.1