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:
|