00001 #include "BlendingNN.h"
00002
00003 extern StreamOutput cout;
00004
00008 BlendingNN::BlendingNN()
00009 {
00010 cout<<"BlendingNN"<<endl;
00011
00012
00013 m_nn = 0;
00014 m_fullPredictionsReal = 0;
00015 m_inputsTrain = 0;
00016 m_inputsProbe = 0;
00017 m_meanBlend = 0;
00018 m_stdBlend = 0;
00019 m_predictionCache = 0;
00020 m_nPredictors = 0;
00021 m_epochs = 0;
00022 m_epochsBest = 0;
00023 m_minTuninigEpochs = 0;
00024 m_maxTuninigEpochs = 0;
00025 m_nrLayer = 0;
00026 m_batchSize = 0;
00027 m_offsetOutputs = 0;
00028 m_scaleOutputs = 0;
00029 m_initWeightFactor = 0;
00030 m_learnrate = 0;
00031 m_learnrateMinimum = 0;
00032 m_learnrateSubtractionValueAfterEverySample = 0;
00033 m_learnrateSubtractionValueAfterEveryEpoch = 0;
00034 m_momentum = 0;
00035 m_weightDecay = 0;
00036 m_minUpdateErrorBound = 0;
00037 m_etaPosRPROP = 0;
00038 m_etaNegRPROP = 0;
00039 m_minUpdateRPROP = 0;
00040 m_maxUpdateRPROP = 0;
00041 m_enableRPROP = 0;
00042 m_useBLASforTraining = 0;
00043 }
00044
00048 BlendingNN::~BlendingNN()
00049 {
00050 cout<<"descructor BlendingNN"<<endl;
00051
00052 for ( int i=0;i<m_usedFiles.size();i++ )
00053 delete[] m_fullPredictionsReal[i];
00054 delete[] m_fullPredictionsReal;
00055
00056 for ( int i=0;i<m_nCross;i++ )
00057 {
00058 if ( m_inputsTrain )
00059 {
00060 if ( m_inputsTrain[i] )
00061 delete[] m_inputsTrain[i];
00062 m_inputsTrain[i] = 0;
00063 }
00064 if ( m_inputsProbe )
00065 {
00066 if ( m_inputsProbe[i] )
00067 delete[] m_inputsProbe[i];
00068 m_inputsProbe[i] = 0;
00069 }
00070 }
00071 if ( m_inputsTrain )
00072 delete[] m_inputsTrain;
00073 if ( m_inputsProbe )
00074 delete[] m_inputsProbe;
00075 if ( m_meanBlend )
00076 delete[] m_meanBlend;
00077 if ( m_stdBlend )
00078 delete[] m_stdBlend;
00079
00080 for ( int i=0;i<m_nCross+1;i++ )
00081 if ( m_nn[i] )
00082 delete m_nn[i];
00083 if ( m_nn )
00084 delete[] m_nn;
00085 if ( m_predictionCache )
00086 delete[] m_predictionCache;
00087 }
00088
00093 void BlendingNN::readSpecificMaps()
00094 {
00095 cout<<"Read specific maps"<<endl;
00096
00097
00098 m_minTuninigEpochs = m_intMap["minTuninigEpochs"];
00099 m_maxTuninigEpochs = m_intMap["maxTuninigEpochs"];
00100 m_nrLayer = m_intMap["nrLayer"];
00101 m_batchSize = m_intMap["batchSize"];
00102 m_offsetOutputs = m_doubleMap["offsetOutputs"];
00103 m_scaleOutputs = m_doubleMap["scaleOutputs"];
00104 m_initWeightFactor = m_doubleMap["initWeightFactor"];
00105 m_learnrate = m_doubleMap["learnrate"];
00106 m_learnrateMinimum = m_doubleMap["learnrateMinimum"];
00107 m_learnrateSubtractionValueAfterEverySample = m_doubleMap["learnrateSubtractionValueAfterEverySample"];
00108 m_learnrateSubtractionValueAfterEveryEpoch = m_doubleMap["learnrateSubtractionValueAfterEveryEpoch"];
00109 m_momentum = m_doubleMap["momentum"];
00110 m_weightDecay = m_doubleMap["weightDecay"];
00111 m_minUpdateErrorBound = m_doubleMap["minUpdateErrorBound"];
00112 m_etaPosRPROP = m_doubleMap["etaPosRPROP"];
00113 m_etaNegRPROP = m_doubleMap["etaNegRPROP"];
00114 m_minUpdateRPROP = m_doubleMap["minUpdateRPROP"];
00115 m_maxUpdateRPROP = m_doubleMap["maxUpdateRPROP"];
00116 m_enableRPROP = m_boolMap["enableRPROP"];
00117 m_useBLASforTraining = m_boolMap["useBLASforTraining"];
00118 m_neuronsPerLayer = m_stringMap["neuronsPerLayer"];
00119 m_weightFile = m_stringMap["weightFile"];
00120 }
00121
00125 void BlendingNN::init()
00126 {
00127 cout<<"Init BlendingNN"<<endl<<endl;
00128
00129
00130 string directory = m_datasetPath + "/" + m_fullPredPath + "/";
00131 vector<string> files = m_algorithmNameList;
00132 m_nPredictors = 0;
00133 for ( int i=0;i<files.size();i++ )
00134 {
00135 if ( files[i].at ( files[i].size()-1 ) != '.' && files[i].find ( ".dat" ) == files[i].length()-4 )
00136 {
00137
00138 m_usedFiles.push_back ( files[i] );
00139 m_nPredictors++;
00140 }
00141 }
00142
00143
00144 m_fullPredictionsReal = new REAL*[m_nPredictors];
00145
00146
00147 m_inputsTrain = new REAL*[m_nCross+1];
00148 m_inputsProbe = new REAL*[m_nCross];
00149 for ( int i=0;i<m_nCross;i++ )
00150 {
00151 m_inputsTrain[i] = new REAL[m_trainSize[i]*m_nPredictors*m_nClass*m_nDomain];
00152 m_inputsProbe[i] = new REAL[m_probeSize[i]*m_nPredictors*m_nClass*m_nDomain];
00153 }
00154
00155
00156 cout<<"Prediction files:"<<endl;
00157 for ( int i=0;i<m_usedFiles.size();i++ )
00158 {
00159
00160 m_fullPredictionsReal[i] = new REAL[m_nTrain*m_nClass*m_nDomain];
00161 fstream f ( m_usedFiles[i].c_str(), ios::in );
00162 if ( f.is_open() == false )
00163 assert ( false );
00164 f.read ( ( char* ) m_fullPredictionsReal[i], sizeof ( REAL ) *m_nTrain*m_nClass*m_nDomain );
00165 f.close();
00166
00167
00168 int* wrongLabelCnt = new int[m_nDomain];
00169 for ( int d=0;d<m_nDomain;d++ )
00170 wrongLabelCnt[d] = 0;
00171 double rmse = 0.0, err;
00172 for ( int k=0;k<m_nTrain;k++ )
00173 {
00174 for ( int j=0;j<m_nClass*m_nDomain;j++ )
00175 {
00176 err = m_fullPredictionsReal[i][k*m_nClass*m_nDomain + j] - m_trainTargetOrig[k*m_nClass*m_nDomain + j];
00177 rmse += err * err;
00178 }
00179 }
00180 if ( Framework::getDatasetType() ==true )
00181 {
00182 for ( int d=0;d<m_nDomain;d++ )
00183 {
00184 for ( int k=0;k<m_nTrain;k++ )
00185 {
00186 REAL max = -1e10;
00187 int ind = -1;
00188 for ( int j=0;j<m_nClass;j++ )
00189 if ( m_fullPredictionsReal[i][d*m_nClass+k*m_nClass*m_nDomain + j] > max )
00190 {
00191 max = m_fullPredictionsReal[i][d*m_nClass+k*m_nClass*m_nDomain + j];
00192 ind = j;
00193 }
00194
00195 if ( m_trainLabelOrig[k*m_nDomain + d] != ind )
00196 wrongLabelCnt[d]++;
00197 }
00198 }
00199
00200 int nWrong = 0;
00201 for ( int d=0;d<m_nDomain;d++ )
00202 {
00203 nWrong += wrongLabelCnt[d];
00204 if ( m_nDomain > 1 )
00205 cout<<"["<< ( double ) wrongLabelCnt[d]/ ( double ) m_nTrain<<"] ";
00206 }
00207 cout<<" (classErr:"<<100.0* ( double ) nWrong/ ( ( double ) m_nTrain* ( double ) m_nDomain ) <<"%)";
00208 }
00209 delete[] wrongLabelCnt;
00210 cout<<"File:"<<m_usedFiles[i]<<" RMSE:"<<sqrt ( rmse/ ( double ) ( m_nClass*m_nDomain*m_nTrain ) );
00211 cout<<endl;
00212 }
00213 cout<<endl;
00214
00215
00216 m_meanBlend = new REAL[m_nPredictors*m_nClass*m_nDomain];
00217 m_stdBlend = new REAL[m_nPredictors*m_nClass*m_nDomain];
00218 for ( int i=0;i<m_nPredictors*m_nClass*m_nDomain;i++ )
00219 {
00220 m_meanBlend[i] = 0.0;
00221 m_stdBlend[i] = 0.0;
00222 }
00223 for ( int i=0;i<m_nTrain;i++ )
00224 for ( int j=0;j<m_nPredictors;j++ )
00225 for ( int k=0;k<m_nClass*m_nDomain;k++ )
00226 m_meanBlend[j*m_nClass*m_nDomain+k] += m_fullPredictionsReal[j][i*m_nClass*m_nDomain+k];
00227 for ( int i=0;i<m_nPredictors*m_nClass*m_nDomain;i++ )
00228 m_meanBlend[i] /= REAL ( m_nTrain );
00229 for ( int i=0;i<m_nTrain;i++ )
00230 for ( int j=0;j<m_nPredictors;j++ )
00231 for ( int k=0;k<m_nClass*m_nDomain;k++ )
00232 {
00233 REAL v = m_fullPredictionsReal[j][i*m_nClass*m_nDomain+k] - m_meanBlend[j*m_nClass*m_nDomain+k];
00234 m_stdBlend[j*m_nClass*m_nDomain+k] += v * v;
00235 }
00236 for ( int i=0;i<m_nPredictors*m_nClass*m_nDomain;i++ )
00237 m_stdBlend[i] = sqrt ( m_stdBlend[i]/REAL ( m_nTrain ) );
00238
00239 REAL meanMin=1e10,meanMax=-1e10,stdMin=1e10,stdMax=-1e10;
00240 for ( int i=0;i<m_nPredictors*m_nClass*m_nDomain;i++ )
00241 {
00242 if ( m_meanBlend[i]<meanMin )
00243 meanMin = m_meanBlend[i];
00244 if ( m_meanBlend[i]>meanMax )
00245 meanMax = m_meanBlend[i];
00246 if ( m_stdBlend[i]<stdMin )
00247 stdMin = m_stdBlend[i];
00248 if ( m_stdBlend[i]>stdMax )
00249 stdMax = m_stdBlend[i];
00250 }
00251 cout<<"meanMin:"<<meanMin<<" meanMax:"<<meanMax<<" stdMin:"<<stdMin<<" stdMax:"<<stdMax<<endl;
00252
00253
00254 for ( int i=0;i<m_nPredictors;i++ )
00255 {
00256 for ( int j=0;j<m_nTrain;j++ )
00257 for ( int k=0;k<m_nClass*m_nDomain;k++ )
00258 m_fullPredictionsReal[i][j*m_nClass*m_nDomain+k] = ( m_fullPredictionsReal[i][j*m_nClass*m_nDomain+k]-m_meanBlend[i*m_nClass*m_nDomain+k] ) /m_stdBlend[i*m_nClass*m_nDomain+k];
00259 }
00260
00261
00262
00263
00264 for ( int i=0;i<m_nCross;i++ )
00265 {
00266
00267 int begin = m_slotBoundaries[i];
00268 int end = m_slotBoundaries[i+1];
00269
00270 int probeCnt = 0, trainCnt = 0;
00271
00272
00273 for ( int j=0;j<m_nTrain;j++ )
00274 {
00275 int index = m_mixList[j];
00276
00277
00278 if ( j>=begin && j <end )
00279 {
00280 for ( int k=0;k<m_nPredictors;k++ )
00281 for ( int l=0;l<m_nClass*m_nDomain;l++ )
00282 m_inputsProbe[i][probeCnt* ( m_nPredictors*m_nClass*m_nDomain ) +k*m_nClass*m_nDomain+l] = m_fullPredictionsReal[k][index*m_nClass*m_nDomain+l];
00283 probeCnt++;
00284 }
00285 else
00286 {
00287 for ( int k=0;k<m_nPredictors;k++ )
00288 for ( int l=0;l<m_nClass*m_nDomain;l++ )
00289 m_inputsTrain[i][trainCnt* ( m_nPredictors*m_nClass*m_nDomain ) +k*m_nClass*m_nDomain+l] = m_fullPredictionsReal[k][index*m_nClass*m_nDomain+l];
00290 trainCnt++;
00291 }
00292 }
00293 if ( probeCnt != m_probeSize[i] || trainCnt != m_trainSize[i] )
00294 assert ( false );
00295 }
00296 m_inputsTrain[m_nCross] = new REAL[m_nTrain*m_nPredictors*m_nClass*m_nDomain];
00297 for ( int i=0;i<m_nTrain;i++ )
00298 for ( int j=0;j<m_nPredictors;j++ )
00299 for ( int k=0;k<m_nClass*m_nDomain;k++ )
00300 m_inputsTrain[m_nCross][i* ( m_nPredictors*m_nClass*m_nDomain ) +j*m_nClass*m_nDomain+k] = m_fullPredictionsReal[j][i*m_nClass*m_nDomain+k];
00301
00302
00303
00304 m_nn = new NN*[m_nCross+1];
00305 for ( int i=0;i<m_nCross+1;i++ )
00306 m_nn[i] = new NN();
00307
00308
00309 for ( int i=0;i<m_nCross+1;i++ )
00310 {
00311 cout<<"Create a Neural Network ("<<i+1<<"/"<<m_nCross+1<<")"<<endl;
00312 m_nn[i] = new NN();
00313 m_nn[i]->setNrTargets ( m_nClass*m_nDomain );
00314 m_nn[i]->setNrInputs ( m_nPredictors*m_nClass*m_nDomain );
00315 m_nn[i]->setNrExamplesTrain ( i<m_nCross?m_trainSize[i]:m_nTrain );
00316 m_nn[i]->setNrExamplesProbe ( i<m_nCross?m_probeSize[i]:0 );
00317 m_nn[i]->setTrainInputs ( m_inputsTrain[i] );
00318 m_nn[i]->setTrainTargets ( i<m_nCross?m_trainTarget[i]:m_trainTargetOrig );
00319 m_nn[i]->setProbeInputs ( i<m_nCross?m_inputsProbe[i]:0 );
00320 m_nn[i]->setProbeTargets ( i<m_nCross?m_probeTarget[i]:0 );
00321
00322
00323 m_nn[i]->setInitWeightFactor ( m_initWeightFactor );
00324 m_nn[i]->setLearnrate ( m_learnrate );
00325 m_nn[i]->setLearnrateMinimum ( m_learnrateMinimum );
00326 m_nn[i]->setLearnrateSubtractionValueAfterEverySample ( m_learnrateSubtractionValueAfterEverySample );
00327 m_nn[i]->setLearnrateSubtractionValueAfterEveryEpoch ( m_learnrateSubtractionValueAfterEveryEpoch );
00328 m_nn[i]->setMomentum ( m_momentum );
00329 m_nn[i]->setWeightDecay ( m_weightDecay );
00330 m_nn[i]->setMinUpdateErrorBound ( m_minUpdateErrorBound );
00331 m_nn[i]->setBatchSize ( m_batchSize );
00332 m_nn[i]->setMaxEpochs ( m_maxTuninigEpochs );
00333
00334
00335 int nrLayer = m_nrLayer;
00336 int* neuronsPerLayer = Data::splitStringToIntegerList ( m_neuronsPerLayer, ',' );
00337 m_nn[i]->enableRPROP ( m_enableRPROP );
00338 m_nn[i]->setNNStructure ( nrLayer, neuronsPerLayer );
00339 m_nn[i]->setScaleOffset ( m_scaleOutputs, m_offsetOutputs );
00340 m_nn[i]->setRPROPPosNeg ( m_etaPosRPROP, m_etaNegRPROP );
00341 m_nn[i]->setRPROPMinMaxUpdate ( m_minUpdateRPROP, m_maxUpdateRPROP );
00342 m_nn[i]->setNormalTrainStopping ( true );
00343 m_nn[i]->useBLASforTraining ( m_useBLASforTraining );
00344 m_nn[i]->initNNWeights ( m_randSeed );
00345 delete neuronsPerLayer;
00346
00347 cout<<endl<<endl;
00348 }
00349
00350
00351 m_predictionCache = new REAL[m_nTrain*m_nClass*m_nDomain];
00352 }
00353
00359 double BlendingNN::calcRMSEonProbe()
00360 {
00361 for ( int i=0;i<m_nCross;i++ )
00362 {
00363 cout<<"."<<flush;
00364
00365
00366 m_nn[i]->trainOneEpoch();
00367
00368
00369 for ( int j=0;j<m_probeSize[i];j++ )
00370 m_nn[i]->predictSingleInput ( m_inputsProbe[i] + j*m_nPredictors*m_nClass*m_nDomain, m_predictionCache + m_probeIndex[i][j]*m_nClass*m_nDomain );
00371 }
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 int* wrongLabelCnt = new int[m_nDomain];
00384 for ( int d=0;d<m_nDomain;d++ )
00385 wrongLabelCnt[d] = 0;
00386 double rmse = 0.0, err;
00387 for ( int i=0;i<m_nTrain;i++ )
00388 {
00389 for ( int j=0;j<m_nClass*m_nDomain;j++ )
00390 {
00391 REAL v = m_predictionCache[i*m_nClass*m_nDomain+j];
00392 if ( m_enablePostBlendClipping )
00393 v = NumericalTools::clipValue ( m_predictionCache[i*m_nClass*m_nDomain+j], m_negativeTarget, m_positiveTarget );
00394 err = v - m_trainTargetOrig[i*m_nClass*m_nDomain+j];
00395 err = m_predictionCache[i*m_nClass*m_nDomain+j] - m_trainTargetOrig[i*m_nClass*m_nDomain+j];
00396 rmse += err * err;
00397 }
00398 }
00399 if ( Framework::getDatasetType() ==true )
00400 {
00401 for ( int d=0;d<m_nDomain;d++ )
00402 {
00403 for ( int i=0;i<m_nTrain;i++ )
00404 {
00405 REAL max = -1e10;
00406 int ind = -1;
00407 for ( int j=0;j<m_nClass;j++ )
00408 if ( m_predictionCache[d*m_nClass+i*m_nDomain*m_nClass+j] > max )
00409 {
00410 max = m_predictionCache[d*m_nClass+i*m_nDomain*m_nClass+j];
00411 ind = j;
00412 }
00413 if ( ind != m_trainLabelOrig[d + i*m_nDomain] )
00414 wrongLabelCnt[d]++;
00415 }
00416 }
00417 int nWrong = 0;
00418 for ( int d=0;d<m_nDomain;d++ )
00419 {
00420 nWrong += wrongLabelCnt[d];
00421 if ( m_nDomain > 1 )
00422 cout<<"["<< ( double ) wrongLabelCnt[d]/ ( double ) m_nTrain<<"] ";
00423 }
00424 cout<<" (classError:"<<100.0* ( double ) nWrong/ ( ( double ) m_nTrain* ( double ) m_nDomain ) <<"%)";
00425 }
00426 delete[] wrongLabelCnt;
00427 rmse = sqrt ( rmse/ ( double ) ( m_nTrain*m_nClass*m_nDomain ) );
00428
00429 return rmse;
00430 }
00431
00438 double BlendingNN::calcRMSEonBlend()
00439 {
00440 return 0.0;
00441 }
00442
00447 void BlendingNN::saveBestPrediction()
00448 {
00449 m_epochsBest = m_epochs;
00450 cout<<"!";
00451 }
00452
00457 void BlendingNN::train()
00458 {
00459 cout<<"Start train blending NN"<<endl;
00460
00461 m_epochs = 0;
00462 addEpochParameter ( &m_epochs, "epoch" );
00463
00464 cout<<"(min|max. epochs: "<<m_minTuninigEpochs<<"|"<<m_maxTuninigEpochs<<")"<<endl;
00465 expSearcher ( m_minTuninigEpochs, m_maxTuninigEpochs, 3, 1, 0.8, true, false );
00466
00467
00468 m_nn[m_nCross]->setNormalTrainStopping ( false );
00469 m_nn[m_nCross]->setMaxEpochs ( m_epochsBest );
00470 int epochs = m_nn[m_nCross]->trainNN();
00471
00472
00473 string name = m_datasetPath + "/" + m_tempPath + "/" + m_weightFile;
00474 cout<<"Save:"<<name<<endl;
00475 int n = m_nn[m_nCross]->getNrWeights();
00476 cout<<"#weights:"<<n<<endl;
00477 REAL* w = m_nn[m_nCross]->getWeightPtr();
00478
00479 fstream f ( name.c_str(), ios::out );
00480 f.write ( ( char* ) &m_nPredictors, sizeof ( int ) );
00481 f.write ( ( char* ) &m_nClass, sizeof ( int ) );
00482 f.write ( ( char* ) &m_nDomain, sizeof ( int ) );
00483 f.write ( ( char* ) &n, sizeof ( int ) );
00484 f.write ( ( char* ) w, sizeof ( REAL ) *n );
00485 f.write ( ( char* ) m_meanBlend, sizeof ( REAL ) *m_nPredictors*m_nClass*m_nDomain );
00486 f.write ( ( char* ) m_stdBlend, sizeof ( REAL ) *m_nPredictors*m_nClass*m_nDomain );
00487 f.close();
00488 }
00489
00493 void BlendingNN::loadWeights()
00494 {
00495 cout<<"Load weights"<<endl;
00496
00497
00498 string name = m_datasetPath + "/" + m_tempPath + "/" + m_weightFile;
00499 cout<<"Load:"<<name<<endl;
00500 int n = 0;
00501
00502
00503 fstream f ( name.c_str(), ios::in );
00504 if ( f.is_open() == false )
00505 assert ( false );
00506
00507
00508 f.read ( ( char* ) &m_nPredictors, sizeof ( int ) );
00509
00510
00511 f.read ( ( char* ) &m_nClass, sizeof ( int ) );
00512
00513
00514 f.read ( ( char* ) &m_nDomain, sizeof ( int ) );
00515
00516
00517 m_nn = new NN*[m_nCross+1];
00518 for ( int i=0;i<m_nCross+1;i++ )
00519 m_nn[i] = 0;
00520 m_nn[m_nCross] = new NN();
00521 m_nn[m_nCross]->setNrTargets ( m_nClass*m_nDomain );
00522 m_nn[m_nCross]->setNrInputs ( m_nPredictors*m_nClass*m_nDomain );
00523 m_nn[m_nCross]->setNrExamplesTrain ( 0 );
00524 m_nn[m_nCross]->setNrExamplesProbe ( 0 );
00525 m_nn[m_nCross]->setTrainInputs ( 0 );
00526 m_nn[m_nCross]->setTrainTargets ( 0 );
00527 m_nn[m_nCross]->setProbeInputs ( 0 );
00528 m_nn[m_nCross]->setProbeTargets ( 0 );
00529
00530
00531 m_nn[m_nCross]->setInitWeightFactor ( m_initWeightFactor );
00532 m_nn[m_nCross]->setLearnrate ( m_learnrate );
00533 m_nn[m_nCross]->setLearnrateMinimum ( m_learnrateMinimum );
00534 m_nn[m_nCross]->setLearnrateSubtractionValueAfterEverySample ( m_learnrateSubtractionValueAfterEverySample );
00535 m_nn[m_nCross]->setLearnrateSubtractionValueAfterEveryEpoch ( m_learnrateSubtractionValueAfterEveryEpoch );
00536 m_nn[m_nCross]->setMomentum ( m_momentum );
00537 m_nn[m_nCross]->setWeightDecay ( m_weightDecay );
00538 m_nn[m_nCross]->setMinUpdateErrorBound ( m_minUpdateErrorBound );
00539 m_nn[m_nCross]->setBatchSize ( m_batchSize );
00540 m_nn[m_nCross]->setMaxEpochs ( m_maxTuninigEpochs );
00541
00542
00543 int nrLayer = m_nrLayer;
00544 int* neuronsPerLayer = Data::splitStringToIntegerList ( m_neuronsPerLayer, ',' );
00545 m_nn[m_nCross]->setNNStructure ( nrLayer, neuronsPerLayer );
00546
00547 m_nn[m_nCross]->setRPROPPosNeg ( m_etaPosRPROP, m_etaNegRPROP );
00548 m_nn[m_nCross]->setRPROPMinMaxUpdate ( m_minUpdateRPROP, m_maxUpdateRPROP );
00549 m_nn[m_nCross]->setScaleOffset ( m_scaleOutputs, m_offsetOutputs );
00550 m_nn[m_nCross]->setNormalTrainStopping ( true );
00551 m_nn[m_nCross]->enableRPROP ( m_enableRPROP );
00552 m_nn[m_nCross]->useBLASforTraining ( m_useBLASforTraining );
00553 m_nn[m_nCross]->initNNWeights ( m_randSeed );
00554 delete[] neuronsPerLayer;
00555
00556
00557 f.read ( ( char* ) &n, sizeof ( int ) );
00558
00559 REAL* w = new REAL[n];
00560
00561
00562 f.read ( ( char* ) w, sizeof ( REAL ) *n );
00563
00564
00565 m_meanBlend = new REAL[m_nPredictors*m_nClass*m_nDomain];
00566 m_stdBlend = new REAL[m_nPredictors*m_nClass*m_nDomain];
00567 f.read ( ( char* ) m_meanBlend, sizeof ( REAL ) *m_nPredictors*m_nClass*m_nDomain );
00568 f.read ( ( char* ) m_stdBlend, sizeof ( REAL ) *m_nPredictors*m_nClass*m_nDomain );
00569
00570 f.close();
00571
00572
00573 m_nn[m_nCross]->setWeights ( w );
00574
00575 if ( w )
00576 delete[] w;
00577 w = 0;
00578 }
00579
00586 void BlendingNN::predictEnsembleOutput ( REAL** predictions, REAL* output )
00587 {
00588 REAL* tmp = new REAL[m_nPredictors*m_nClass*m_nDomain];
00589 for ( int i=0;i<m_nPredictors;i++ )
00590 for ( int j=0;j<m_nClass*m_nDomain;j++ )
00591 tmp[i*m_nClass*m_nDomain+j] = ( predictions[i+1][j] - m_meanBlend[i*m_nClass*m_nDomain+j] ) / m_stdBlend[i*m_nClass*m_nDomain+j];
00592 m_nn[m_nCross]->predictSingleInput ( tmp, output );
00593 if ( m_enablePostBlendClipping )
00594 for ( int i=0;i<m_nClass*m_nDomain;i++ )
00595 output[i] = NumericalTools::clipValue ( output[i], m_negativeTarget, m_positiveTarget );
00596 if ( tmp )
00597 delete[] tmp;
00598 tmp = 0;
00599 }