NeuralNetworkRBMauto.cpp

00001 #include "NeuralNetworkRBMauto.h"
00002 
00003 extern StreamOutput cout;
00004 
00008 NeuralNetworkRBMauto::NeuralNetworkRBMauto()
00009 {
00010     cout<<"NeuralNetworkRBMauto"<<endl;
00011     // init member vars
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     // read dsc vars
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     // add tunable parameters
00107     m_epoch = 0;
00108     paramEpochValues.push_back ( &m_epoch );
00109     paramEpochNames.push_back ( "epoch" );
00110 
00111     // set up NNs
00112     // nCross + 1 (for retraining)
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         // learn parameters
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         // set net inner stucture
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;  // sig:0, linear:1, tanh:2, softmax:3
00160         }
00161         layerType[m_nrLayerAuto] = 1;  // sig:0, linear:1, tanh:2, softmax:3
00162         for ( int j=0;j<m_nrLayerNetHidden;j++ )
00163         {
00164             neurPerLayer[j+m_nrLayerAuto] = neuronsPerLayerNetHidden[j];
00165             layerType[j+m_nrLayerAuto+1] = 2;  // sig:0, linear:1, tanh:2, softmax:3
00166         }
00167         layerType[m_nrLayerNetHidden+m_nrLayerAuto+1] = 2;  // sig:0, linear:1, tanh:2, softmax:3
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     // predict all samples
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             // Autoencoder: RBM pretraining + finetuning
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             // one gradient descent step (one epoch)
00233             if ( m_epoch < m_tuningEpochsOutputNet )
00234                 //if(m_epoch > m_tuningEpochsOutputNet)
00235                 //if(m_epoch%10 == 0)
00236             {
00237                 bool* updateLayer = new bool[m_nrLayerAuto + m_nrLayerNetHidden + 3];
00238                 for ( int i=0;i<m_nrLayerAuto;i++ )
00239                     updateLayer[i] = false;  // sigmoid
00240                 updateLayer[m_nrLayerAuto] = false;  // linear
00241                 for ( int i=0;i<m_nrLayerNetHidden;i++ )
00242                     updateLayer[m_nrLayerAuto+1+i] = true;  // tanh
00243                 updateLayer[m_nrLayerAuto+m_nrLayerNetHidden+1] = true;  // tanh
00244 
00245                 cout<<"[OutNet]";
00246                 m_nn[crossRun]->trainOneEpoch ( updateLayer );
00247                 delete[] updateLayer;
00248             }
00249             else
00250             {
00251                 /*bool* updateLayer = new bool[m_nrLayerAuto + m_nrLayerNetHidden + 3];
00252                 for(int i=0;i<m_nrLayerAuto;i++)
00253                     updateLayer[i] = true;  // sigmoid
00254                 updateLayer[m_nrLayerAuto] = true;  // linear
00255                 for(int i=0;i<m_nrLayerNetHidden;i++)
00256                     updateLayer[m_nrLayerAuto+1+i] = false;  // tanh
00257                 updateLayer[m_nrLayerAuto+m_nrLayerNetHidden+1] = false;  // tanh
00258 
00259                 cout<<"[In-Net]";
00260                 m_nn[crossRun]->trainOneEpoch(updateLayer);
00261 
00262                 delete[] updateLayer;
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             // Autoencoder: RBM pretraining + finetuning
00279             m_nn[crossRun]->rbmPretraining ( input, target, nSamples, m_nDomain*m_nClass, m_nrLayerAuto+1, crossRun, m_tuningEpochsRBMFinetuning, m_learnrateAutoencoderFinetuning );
00280         }
00281 
00282         // retraining with fix number of epochs
00283         m_nn[crossRun]->setNormalTrainStopping ( false );
00284         int maxEpochs = m_epochParamBest[0];
00285         if ( maxEpochs == 0 )
00286             maxEpochs = 1;  // train at least one epoch
00287         cout<<"Best #epochs (on cross validation): "<<maxEpochs<<endl;
00288         m_nn[crossRun]->setMaxEpochs ( maxEpochs );
00289 
00290         // train the net
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     // load weights
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     // set up NNs (only the last one is used)
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     // learn parameters
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     // set net inner stucture
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;  // sig
00379     }
00380     layerType[m_nrLayerAuto] = 0;  // linear
00381     for ( int j=0;j<m_nrLayerNetHidden;j++ )
00382     {
00383         neurPerLayer[j+m_nrLayerAuto] = neuronsPerLayerNetHidden[j];
00384         layerType[j+m_nrLayerAuto+1] = 2;  // tanh
00385     }
00386     layerType[m_nrLayerNetHidden+m_nrLayerAuto+1] = 2;  // tanh
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     // init the NN weights
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     // nothing to do in a gradient-descent based algorithm
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 }

Generated on Tue Jan 26 09:20:59 2010 for ELF by  doxygen 1.5.8