00001 #include "NeuralNetworkRBMauto.h"
00002
00003 extern StreamOutput cout;
00004
00008 NeuralNetworkRBMauto::NeuralNetworkRBMauto()
00009 {
00010 cout<<"NeuralNetworkRBMauto"<<endl;
00011
00012 m_inputs = 0;
00013 m_nn = 0;
00014 m_epoch = 0;
00015 m_nrLayerAuto = 0;
00016 m_nrLayerNetHidden = 0;
00017 m_batchSize = 0;
00018 m_offsetOutputs = 0;
00019 m_scaleOutputs = 0;
00020 m_initWeightFactor = 0;
00021 m_learnrate = 0;
00022 m_learnrateMinimum = 0;
00023 m_learnrateSubtractionValueAfterEverySample = 0;
00024 m_learnrateSubtractionValueAfterEveryEpoch = 0;
00025 m_momentum = 0;
00026 m_weightDecay = 0;
00027 m_minUpdateErrorBound = 0;
00028 m_etaPosRPROP = 0;
00029 m_etaNegRPROP = 0;
00030 m_minUpdateRPROP = 0;
00031 m_maxUpdateRPROP = 0;
00032 m_enableRPROP = 0;
00033 m_useBLASforTraining = 0;
00034 m_enableL1Regularization = 0;
00035 m_enableErrorFunctionMAE = 0;
00036 m_isFirstEpoch = 0;
00037 m_tuningEpochsRBMFinetuning = 0;
00038 m_tuningEpochsOutputNet = 0;
00039 m_learnrateAutoencoderFinetuning = 0;
00040 }
00041
00045 NeuralNetworkRBMauto::~NeuralNetworkRBMauto()
00046 {
00047 cout<<"descructor NeuralNetworkRBMauto"<<endl;
00048
00049 for ( int i=0;i<m_nCross+1;i++ )
00050 {
00051 if ( m_nn[i] )
00052 delete m_nn[i];
00053 m_nn[i] = 0;
00054 }
00055 delete[] m_nn;
00056
00057 if ( m_isFirstEpoch )
00058 delete[] m_isFirstEpoch;
00059 m_isFirstEpoch = 0;
00060 }
00061
00066 void NeuralNetworkRBMauto::readSpecificMaps()
00067 {
00068 cout<<"Read specific maps"<<endl;
00069
00070
00071 m_nrLayerAuto = m_intMap["nrLayerAuto"];
00072 m_nrLayerNetHidden = m_intMap["nrLayerNetHidden"];
00073
00074 m_batchSize = m_intMap["batchSize"];
00075 m_tuningEpochsRBMFinetuning = m_intMap["tuningEpochsRBMFinetuning"];
00076 m_tuningEpochsOutputNet = m_intMap["tuningEpochsOutputNet"];
00077 m_offsetOutputs = m_doubleMap["offsetOutputs"];
00078 m_scaleOutputs = m_doubleMap["scaleOutputs"];
00079 m_initWeightFactor = m_doubleMap["initWeightFactor"];
00080 m_learnrate = m_doubleMap["learnrate"];
00081 m_learnrateAutoencoderFinetuning = m_doubleMap["learnrateAutoencoderFinetuning"];
00082 m_learnrateMinimum = m_doubleMap["learnrateMinimum"];
00083 m_learnrateSubtractionValueAfterEverySample = m_doubleMap["learnrateSubtractionValueAfterEverySample"];
00084 m_learnrateSubtractionValueAfterEveryEpoch = m_doubleMap["learnrateSubtractionValueAfterEveryEpoch"];
00085 m_momentum = m_doubleMap["momentum"];
00086 m_weightDecay = m_doubleMap["weightDecay"];
00087 m_minUpdateErrorBound = m_doubleMap["minUpdateErrorBound"];
00088 m_etaPosRPROP = m_doubleMap["etaPosRPROP"];
00089 m_etaNegRPROP = m_doubleMap["etaNegRPROP"];
00090 m_minUpdateRPROP = m_doubleMap["minUpdateRPROP"];
00091 m_maxUpdateRPROP = m_doubleMap["maxUpdateRPROP"];
00092 m_enableL1Regularization = m_boolMap["enableL1Regularization"];
00093 m_enableErrorFunctionMAE = m_boolMap["enableErrorFunctionMAE"];
00094 m_enableRPROP = m_boolMap["enableRPROP"];
00095 m_useBLASforTraining = m_boolMap["useBLASforTraining"];
00096 m_neuronsPerLayerAuto = m_stringMap["neuronsPerLayerAuto"];
00097 m_neuronsPerLayerNetHidden = m_stringMap["neuronsPerLayerNetHidden"];
00098 }
00099
00104 void NeuralNetworkRBMauto::modelInit()
00105 {
00106
00107 m_epoch = 0;
00108 paramEpochValues.push_back ( &m_epoch );
00109 paramEpochNames.push_back ( "epoch" );
00110
00111
00112
00113 if ( m_nn == 0 )
00114 {
00115 m_nn = new NNRBM*[m_nCross+1];
00116 for ( int i=0;i<m_nCross+1;i++ )
00117 m_nn[i] = 0;
00118 }
00119 for ( int i=0;i<m_nCross+1;i++ )
00120 {
00121 cout<<"Create a Neural Network ("<<i+1<<"/"<<m_nCross+1<<")"<<endl;
00122 if ( m_nn[i] == 0 )
00123 m_nn[i] = new NNRBM();
00124 m_nn[i]->setNrTargets ( m_nClass*m_nDomain );
00125 m_nn[i]->setNrInputs ( m_nFeatures );
00126 m_nn[i]->setNrExamplesTrain ( 0 );
00127 m_nn[i]->setNrExamplesProbe ( 0 );
00128 m_nn[i]->setTrainInputs ( 0 );
00129 m_nn[i]->setTrainTargets ( 0 );
00130 m_nn[i]->setProbeInputs ( 0 );
00131 m_nn[i]->setProbeTargets ( 0 );
00132 m_nn[i]->setGlobalEpochs ( 0 );
00133
00134
00135 m_nn[i]->setInitWeightFactor ( m_initWeightFactor );
00136 m_nn[i]->setLearnrate ( m_learnrate );
00137 m_nn[i]->setLearnrateMinimum ( m_learnrateMinimum );
00138 m_nn[i]->setLearnrateSubtractionValueAfterEverySample ( m_learnrateSubtractionValueAfterEverySample );
00139 m_nn[i]->setLearnrateSubtractionValueAfterEveryEpoch ( m_learnrateSubtractionValueAfterEveryEpoch );
00140 m_nn[i]->setMomentum ( m_momentum );
00141 m_nn[i]->setWeightDecay ( m_weightDecay );
00142 m_nn[i]->setMinUpdateErrorBound ( m_minUpdateErrorBound );
00143 m_nn[i]->setBatchSize ( m_batchSize );
00144 m_nn[i]->setMaxEpochs ( m_maxTuninigEpochs );
00145 m_nn[i]->setL1Regularization ( m_enableL1Regularization );
00146 m_nn[i]->enableErrorFunctionMAE ( m_enableErrorFunctionMAE );
00147
00148 m_nn[i]->setRBMLearnParams ( m_doubleMap["rbmLearnrateWeights"], m_doubleMap["rbmLearnrateBiasVis"], m_doubleMap["rbmLearnrateBiasHid"], m_doubleMap["rbmWeightDecay"], m_doubleMap["rbmMaxEpochs"] );
00149
00150
00151 int nrLayer = m_nrLayerAuto + m_nrLayerNetHidden;
00152 int* neuronsPerLayerAuto = Data::splitStringToIntegerList ( m_neuronsPerLayerAuto, ',' );
00153 int* neuronsPerLayerNetHidden = Data::splitStringToIntegerList ( m_neuronsPerLayerNetHidden, ',' );
00154 int* neurPerLayer = new int[nrLayer+1];
00155 int* layerType = new int[nrLayer+2];
00156 for ( int j=0;j<m_nrLayerAuto;j++ )
00157 {
00158 neurPerLayer[j] = neuronsPerLayerAuto[j];
00159 layerType[j] = 0;
00160 }
00161 layerType[m_nrLayerAuto] = 1;
00162 for ( int j=0;j<m_nrLayerNetHidden;j++ )
00163 {
00164 neurPerLayer[j+m_nrLayerAuto] = neuronsPerLayerNetHidden[j];
00165 layerType[j+m_nrLayerAuto+1] = 2;
00166 }
00167 layerType[m_nrLayerNetHidden+m_nrLayerAuto+1] = 2;
00168
00169 m_nn[i]->enableRPROP ( m_enableRPROP );
00170 m_nn[i]->setNNStructure ( nrLayer+1, neurPerLayer, false, layerType );
00171
00172 m_nn[i]->setScaleOffset ( m_scaleOutputs, m_offsetOutputs );
00173 m_nn[i]->setRPROPPosNeg ( m_etaPosRPROP, m_etaNegRPROP );
00174 m_nn[i]->setRPROPMinMaxUpdate ( m_minUpdateRPROP, m_maxUpdateRPROP );
00175 m_nn[i]->setNormalTrainStopping ( true );
00176 m_nn[i]->useBLASforTraining ( m_useBLASforTraining );
00177 m_nn[i]->initNNWeights ( m_randSeed );
00178
00179 delete[] neuronsPerLayerAuto;
00180 delete[] neuronsPerLayerNetHidden;
00181 delete[] neurPerLayer;
00182
00183 cout<<endl<<endl;
00184 }
00185
00186 if ( m_isFirstEpoch == 0 )
00187 m_isFirstEpoch = new bool[m_nCross+1];
00188 for ( int i=0;i<m_nCross+1;i++ )
00189 m_isFirstEpoch[i] = false;
00190 }
00191
00200 void NeuralNetworkRBMauto::predictAllOutputs ( REAL* rawInputs, REAL* outputs, uint nSamples, uint crossRun )
00201 {
00202
00203 for ( int i=0;i<nSamples;i++ )
00204 m_nn[crossRun]->predictSingleInput ( rawInputs + i*m_nFeatures, outputs + i*m_nClass*m_nDomain );
00205 }
00206
00216 void NeuralNetworkRBMauto::modelUpdate ( REAL* input, REAL* target, uint nSamples, uint crossRun )
00217 {
00218 m_nn[crossRun]->setTrainInputs ( input );
00219 m_nn[crossRun]->setTrainTargets ( target );
00220 m_nn[crossRun]->setNrExamplesTrain ( nSamples );
00221
00222 if ( crossRun < m_nCross )
00223 {
00224 if ( m_isFirstEpoch[crossRun] == false )
00225 {
00226 m_isFirstEpoch[crossRun] = true;
00227
00228 m_nn[crossRun]->rbmPretraining ( input, target, nSamples, m_nDomain*m_nClass, m_nrLayerAuto+1, crossRun, m_tuningEpochsRBMFinetuning, m_learnrateAutoencoderFinetuning );
00229 }
00230 else
00231 {
00232
00233 if ( m_epoch < m_tuningEpochsOutputNet )
00234
00235
00236 {
00237 bool* updateLayer = new bool[m_nrLayerAuto + m_nrLayerNetHidden + 3];
00238 for ( int i=0;i<m_nrLayerAuto;i++ )
00239 updateLayer[i] = false;
00240 updateLayer[m_nrLayerAuto] = false;
00241 for ( int i=0;i<m_nrLayerNetHidden;i++ )
00242 updateLayer[m_nrLayerAuto+1+i] = true;
00243 updateLayer[m_nrLayerAuto+m_nrLayerNetHidden+1] = true;
00244
00245 cout<<"[OutNet]";
00246 m_nn[crossRun]->trainOneEpoch ( updateLayer );
00247 delete[] updateLayer;
00248 }
00249 else
00250 {
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 m_nn[crossRun]->trainOneEpoch ( 0 );
00265 }
00266
00267 if ( crossRun == m_nCross - 1 )
00268 m_nn[crossRun]->printLearnrate();
00269 }
00270 }
00271 else
00272 {
00273 cout<<endl<<"Tune: Training of full trainset "<<endl;
00274
00275 if ( m_isFirstEpoch[crossRun] == false )
00276 {
00277 m_isFirstEpoch[crossRun] = true;
00278
00279 m_nn[crossRun]->rbmPretraining ( input, target, nSamples, m_nDomain*m_nClass, m_nrLayerAuto+1, crossRun, m_tuningEpochsRBMFinetuning, m_learnrateAutoencoderFinetuning );
00280 }
00281
00282
00283 m_nn[crossRun]->setNormalTrainStopping ( false );
00284 int maxEpochs = m_epochParamBest[0];
00285 if ( maxEpochs == 0 )
00286 maxEpochs = 1;
00287 cout<<"Best #epochs (on cross validation): "<<maxEpochs<<endl;
00288 m_nn[crossRun]->setMaxEpochs ( maxEpochs );
00289
00290
00291 int epochs = m_nn[crossRun]->trainNN();
00292 cout<<endl;
00293 }
00294 }
00295
00300 void NeuralNetworkRBMauto::saveWeights ( int cross )
00301 {
00302 char buf[1024];
00303 sprintf ( buf,"%02d",cross );
00304 string name = m_datasetPath + "/" + m_tempPath + "/" + m_weightFile + "." + buf;
00305 if ( m_inRetraining )
00306 cout<<"Save:"<<name<<endl;
00307 int n = m_nn[cross]->getNrWeights();
00308 REAL* w = m_nn[cross]->getWeightPtr();
00309
00310 fstream f ( name.c_str(), ios::out );
00311 f.write ( ( char* ) &m_nTrain, sizeof ( int ) );
00312 f.write ( ( char* ) &m_nFeatures, sizeof ( int ) );
00313 f.write ( ( char* ) &m_nClass, sizeof ( int ) );
00314 f.write ( ( char* ) &m_nDomain, sizeof ( int ) );
00315 f.write ( ( char* ) &n, sizeof ( int ) );
00316 f.write ( ( char* ) w, sizeof ( REAL ) *n );
00317 f.write ( ( char* ) &m_maxSwing, sizeof ( double ) );
00318 f.close();
00319 }
00320
00325 void NeuralNetworkRBMauto::loadWeights ( int cross )
00326 {
00327
00328 char buf[1024];
00329 sprintf ( buf,"%02d",cross );
00330 string name = m_datasetPath + "/" + m_tempPath + "/" + m_weightFile + "." + buf;
00331 cout<<"Load:"<<name<<endl;
00332 fstream f ( name.c_str(), ios::in );
00333 if ( f.is_open() == false )
00334 assert ( false );
00335 f.read ( ( char* ) &m_nTrain, sizeof ( int ) );
00336 f.read ( ( char* ) &m_nFeatures, sizeof ( int ) );
00337 f.read ( ( char* ) &m_nClass, sizeof ( int ) );
00338 f.read ( ( char* ) &m_nDomain, sizeof ( int ) );
00339
00340
00341 m_nn = new NNRBM*[m_nCross+1];
00342 for ( int i=0;i<m_nCross+1;i++ )
00343 m_nn[i] = 0;
00344 m_nn[cross] = new NNRBM();
00345 m_nn[cross]->setNrTargets ( m_nClass*m_nDomain );
00346 m_nn[cross]->setNrInputs ( m_nFeatures );
00347 m_nn[cross]->setNrExamplesTrain ( 0 );
00348 m_nn[cross]->setNrExamplesProbe ( 0 );
00349 m_nn[cross]->setTrainInputs ( 0 );
00350 m_nn[cross]->setTrainTargets ( 0 );
00351 m_nn[cross]->setProbeInputs ( 0 );
00352 m_nn[cross]->setProbeTargets ( 0 );
00353
00354
00355 m_nn[cross]->setInitWeightFactor ( m_initWeightFactor );
00356 m_nn[cross]->setLearnrate ( m_learnrate );
00357 m_nn[cross]->setLearnrateMinimum ( m_learnrateMinimum );
00358 m_nn[cross]->setLearnrateSubtractionValueAfterEverySample ( m_learnrateSubtractionValueAfterEverySample );
00359 m_nn[cross]->setLearnrateSubtractionValueAfterEveryEpoch ( m_learnrateSubtractionValueAfterEveryEpoch );
00360 m_nn[cross]->setMomentum ( m_momentum );
00361 m_nn[cross]->setWeightDecay ( m_weightDecay );
00362 m_nn[cross]->setMinUpdateErrorBound ( m_minUpdateErrorBound );
00363 m_nn[cross]->setBatchSize ( m_batchSize );
00364 m_nn[cross]->setMaxEpochs ( m_maxTuninigEpochs );
00365 m_nn[cross]->setL1Regularization ( m_enableL1Regularization );
00366 m_nn[cross]->enableErrorFunctionMAE ( m_enableErrorFunctionMAE );
00367
00368
00369
00370 int nrLayer = m_nrLayerAuto + m_nrLayerNetHidden;
00371 int* neuronsPerLayerAuto = Data::splitStringToIntegerList ( m_neuronsPerLayerAuto, ',' );
00372 int* neuronsPerLayerNetHidden = Data::splitStringToIntegerList ( m_neuronsPerLayerNetHidden, ',' );
00373 int* neurPerLayer = new int[nrLayer];
00374 int* layerType = new int[nrLayer+1];
00375 for ( int j=0;j<m_nrLayerAuto;j++ )
00376 {
00377 neurPerLayer[j] = neuronsPerLayerAuto[j];
00378 layerType[j] = 0;
00379 }
00380 layerType[m_nrLayerAuto] = 0;
00381 for ( int j=0;j<m_nrLayerNetHidden;j++ )
00382 {
00383 neurPerLayer[j+m_nrLayerAuto] = neuronsPerLayerNetHidden[j];
00384 layerType[j+m_nrLayerAuto+1] = 2;
00385 }
00386 layerType[m_nrLayerNetHidden+m_nrLayerAuto+1] = 2;
00387
00388 m_nn[cross]->enableRPROP ( m_enableRPROP );
00389 m_nn[cross]->setNNStructure ( nrLayer+1, neurPerLayer, false, layerType );
00390
00391
00392 m_nn[cross]->setRPROPPosNeg ( m_etaPosRPROP, m_etaNegRPROP );
00393 m_nn[cross]->setRPROPMinMaxUpdate ( m_minUpdateRPROP, m_maxUpdateRPROP );
00394 m_nn[cross]->setScaleOffset ( m_scaleOutputs, m_offsetOutputs );
00395 m_nn[cross]->setNormalTrainStopping ( true );
00396 m_nn[cross]->enableRPROP ( m_enableRPROP );
00397 m_nn[cross]->useBLASforTraining ( m_useBLASforTraining );
00398 m_nn[cross]->initNNWeights ( m_randSeed );
00399
00400 delete[] neuronsPerLayerAuto;
00401 delete[] neuronsPerLayerNetHidden;
00402 delete[] neurPerLayer;
00403 delete[] layerType;
00404
00405 int n = 0;
00406 f.read ( ( char* ) &n, sizeof ( int ) );
00407
00408 REAL* w = new REAL[n];
00409
00410 f.read ( ( char* ) w, sizeof ( REAL ) *n );
00411 f.read ( ( char* ) &m_maxSwing, sizeof ( double ) );
00412 f.close();
00413
00414
00415 m_nn[cross]->setWeights ( w );
00416
00417 if ( w )
00418 delete[] w;
00419 w = 0;
00420 }
00421
00425 void NeuralNetworkRBMauto::loadMetaWeights ( int cross )
00426 {
00427
00428 }
00429
00435 string NeuralNetworkRBMauto::templateGenerator ( int id, string preEffect, int nameID, bool blendStop )
00436 {
00437 stringstream s;
00438 s<<"ALGORITHM=NeuralNetworkRBMauto"<<endl;
00439 s<<"ID="<<id<<endl;
00440 s<<"TRAIN_ON_FULLPREDICTOR="<<preEffect<<endl;
00441 s<<"DISABLE=0"<<endl;
00442 s<<endl;
00443 s<<"[int]"<<endl;
00444 s<<"nrLayer=3"<<endl;
00445 s<<"batchSize=1"<<endl;
00446 s<<"minTuninigEpochs=30"<<endl;
00447 s<<"maxTuninigEpochs=100"<<endl;
00448 s<<endl;
00449 s<<"[double]"<<endl;
00450 s<<"initMaxSwing=1.0"<<endl;
00451 s<<endl;
00452 s<<"offsetOutputs=0.0"<<endl;
00453 s<<"scaleOutputs=1.2"<<endl;
00454 s<<endl;
00455 s<<"etaPosRPROP=1.005"<<endl;
00456 s<<"etaNegRPROP=0.99"<<endl;
00457 s<<"minUpdateRPROP=1e-8"<<endl;
00458 s<<"maxUpdateRPROP=1e-2"<<endl;
00459 s<<endl;
00460 s<<"initWeightFactor=1.0"<<endl;
00461 s<<"learnrate=1e-3"<<endl;
00462 s<<"learnrateMinimum=1e-5"<<endl;
00463 s<<"learnrateSubtractionValueAfterEverySample=0.0"<<endl;
00464 s<<"learnrateSubtractionValueAfterEveryEpoch=0.0"<<endl;
00465 s<<"momentum=0.0"<<endl;
00466 s<<"weightDecay=0.0"<<endl;
00467 s<<"minUpdateErrorBound=1e-6"<<endl;
00468 s<<endl;
00469 s<<"[bool]"<<endl;
00470 s<<"enableErrorFunctionMAE=0"<<endl;
00471 s<<"enableL1Regularization=0"<<endl;
00472 s<<"enableClipping=1"<<endl;
00473 s<<"enableTuneSwing=0"<<endl;
00474 s<<"useBLASforTraining=1"<<endl;
00475 s<<"enableRPROP=0"<<endl;
00476 s<<endl;
00477 s<<"minimzeProbe="<< ( !blendStop ) <<endl;
00478 s<<"minimzeProbeClassificationError=0"<<endl;
00479 s<<"minimzeBlend="<<blendStop<<endl;
00480 s<<"minimzeBlendClassificationError=0"<<endl;
00481 s<<endl;
00482 s<<"[string]"<<endl;
00483 s<<"neuronsPerLayer=30,20,40,30,100,-1"<<endl;
00484 s<<"weightFile=NeuralNetworkRBMauto_"<<nameID<<"_weights.dat"<<endl;
00485 s<<"fullPrediction=NeuralNetworkRBMauto_"<<nameID<<".dat"<<endl;
00486
00487 return s.str();
00488 }