[pktools] 142/375: floating point for accuracy in pkdiff.cc

Bas Couwenberg sebastic at xs4all.nl
Wed Dec 3 21:54:08 UTC 2014


This is an automated email from the git hooks/post-receive script.

sebastic-guest pushed a commit to branch upstream-master
in repository pktools.

commit d5c90b1a3b2dab6e91a2756c65e8eff02b9f9634
Author: Pieter Kempeneers <kempenep at gmail.com>
Date:   Sun Nov 24 11:07:28 2013 +0100

    floating point for accuracy in pkdiff.cc
---
 ChangeLog                   | 10 +++--
 src/apps/pkclassify_nn.cc   | 26 ++++++++++---
 src/apps/pkclassify_svm.cc  |  9 ++---
 src/apps/pkdiff.cc          | 91 ++++++++++++++++++++++++---------------------
 src/apps/pkfs_nn.cc         | 48 +++++++++++++++++++-----
 src/apps/pkfs_svm.cc        |  2 +-
 src/apps/pkregression_nn.cc | 21 +++++++++--
 7 files changed, 137 insertions(+), 70 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ae3af38..c5ac434 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -119,14 +119,16 @@ version 2.4.1
 version 2.4.2
  - general
 	removed using namespace std from header files
- - PosValue.h
-	remove using namespace std;
+ - clean up of using namespace std in header files
  - apps/Makefile.am
 	add GSL_LIBS to AM_LDFLAGS and LDADD
 	todo: remove redundancy in AM_LDFLAGS and LDADD
- - clean up of using namespace std in header files
+ - PosValue.h
+	remove using namespace std;
  - FileReaderAscii
 	corrected error for constructor with fieldseparator argument
+ - pkdiff
+	introduced short option -m for mask
  - pkinfo
 	bug fixed with -min and -max in hist (thanks to Giuseppe Amatuli for noticing)
  - pkfilter
@@ -145,10 +147,12 @@ version 2.4.2
  - pkclassify_nn.h
 	support reading ogr files with single feature (one band only: "B" or "Band")
  - pkclassify_nn.cc
+	changed create_sparse to create_spare_array due to error in FANN...
 	option -n for number of neurons
 	cross validation parameter can not be 1
  - pkfs_nn.cc
 	cross validation parameter can not be 1
+	solved some bugs
  - pkclassify_svm.cc
 	cross validation parameter can not be 1
  - pkopt_svm.cc
diff --git a/src/apps/pkclassify_nn.cc b/src/apps/pkclassify_nn.cc
index e3091f0..4946700 100644
--- a/src/apps/pkclassify_nn.cc
+++ b/src/apps/pkclassify_nn.cc
@@ -417,19 +417,35 @@ int main(int argc, char *argv[])
       for(int ilayer=0;ilayer<nneuron_opt.size();++ilayer)
         cout << nneuron_opt[ilayer] << " ";
       cout << "neurons" << endl;
-      //test
       cout << "connection_opt[0]: " << connection_opt[0] << std::endl;
       cout << "num_layers: " << num_layers << std::endl;
       cout << "nFeatures: " << nFeatures << std::endl;
       cout << "nneuron_opt[0]: " << nneuron_opt[0] << std::endl;
+      cout << "number of classes (nclass): " << nclass << std::endl;
     }
     switch(num_layers){
-    case(3):
-      net[ibag].create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nclass);
+    case(3):{
+      // net[ibag].create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nclass);//replace all create_sparse with create_sparse_array due to bug in FANN!
+      unsigned int layers[3];
+      layers[0]=nFeatures;
+      layers[1]=nneuron_opt[0];
+      layers[2]=nclass;
+      net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);
       break;
-    case(4):
-      net[ibag].create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nneuron_opt[1], nclass);
+    }
+    case(4):{
+      unsigned int layers[4];
+      layers[0]=nFeatures;
+      layers[1]=nneuron_opt[0];
+      layers[2]=nneuron_opt[1];
+      layers[3]=nclass;
+      // layers.push_back(nFeatures);
+      // for(int ihidden=0;ihidden<nneuron_opt.size();++ihidden)
+      // 	layers.push_back(nneuron_opt[ihidden]);
+      // layers.push_back(nclass);
+      net[ibag].create_sparse_array(connection_opt[0],num_layers,layers);
       break;
+    }
     default:
       cerr << "Only 1 or 2 hidden layers are supported!" << endl;
       exit(1);
diff --git a/src/apps/pkclassify_svm.cc b/src/apps/pkclassify_svm.cc
index ea68208..2205a2b 100644
--- a/src/apps/pkclassify_svm.cc
+++ b/src/apps/pkclassify_svm.cc
@@ -541,8 +541,8 @@ int main(int argc, char *argv[])
       cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;
     }
     std::cout << "Kappa: " << cm.kappa() << std::endl;
-    doa=cm.oa_pct(&se95_oa);
-    std::cout << "Overall Accuracy: " << doa << " (" << se95_oa << ")"  << std::endl;
+    doa=cm.oa(&se95_oa);
+    std::cout << "Overall Accuracy: " << 100*doa << " (" << 100*se95_oa << ")"  << std::endl;
   }
 
   //--------------------------------- end of training -----------------------------------
@@ -732,7 +732,6 @@ int main(int argc, char *argv[])
           exit(3);
         }
       }
-    
       //process per pixel
       for(int icol=0;icol<ncol;++icol){
         assert(hpixel[icol].size()==nband);
@@ -1119,8 +1118,8 @@ int main(int argc, char *argv[])
 	cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;
       }
       std::cout << "Kappa: " << cm.kappa() << std::endl;
-      doa=cm.oa_pct(&se95_oa);
-      std::cout << "Overall Accuracy: " << doa << " (" << se95_oa << ")"  << std::endl;
+      doa=cm.oa(&se95_oa);
+      std::cout << "Overall Accuracy: " << 100*doa << " (" << 100*se95_oa << ")"  << std::endl;
     }
   }
   try{
diff --git a/src/apps/pkdiff.cc b/src/apps/pkdiff.cc
index 7a123d8..e8c7036 100644
--- a/src/apps/pkdiff.cc
+++ b/src/apps/pkdiff.cc
@@ -27,16 +27,17 @@ along with pktools.  If not, see <http://www.gnu.org/licenses/>.
 
 int main(int argc, char *argv[])
 {
-  Optionpk<string> input_opt("i", "input", "Input image file.", "");
-  Optionpk<string> reference_opt("r", "reference", "Reference image file", "");
-  Optionpk<string> output_opt("o", "output", "Output image file. Default is empty: no output image, only report difference or identical.", "");
-  Optionpk<string> mask_opt("\0", "mask", "Mask image file. A single mask is supported only, but several mask values can be used. See also mflag option. (default is empty)", "");
-  Optionpk<string> colorTable_opt("\0", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)", "");
+  Optionpk<string> input_opt("i", "input", "Input image file.");
+  Optionpk<string> reference_opt("r", "reference", "Reference image file");
+  Optionpk<string> output_opt("o", "output", "Output image file. Default is empty: no output image, only report difference or identical.");
+  Optionpk<string> mask_opt("m", "mask", "Mask image file. A single mask is supported only, but several mask values can be used. See also mflag option. (default is empty)");
+  Optionpk<string> colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)", "");
   Optionpk<short> valueE_opt("\0", "correct", "Value for correct pixels (0)", 0);
   Optionpk<short> valueO_opt("\0", "omission", "Value for omission errors: input label > reference label (default value is 1)", 1);
   Optionpk<short> valueC_opt("\0", "commission", "Value for commission errors: input label < reference label (default value is 2)", 2);
   Optionpk<short> flag_opt("f", "flag", "No value flag(s)", 0);
-  Optionpk<short> mflag_opt("m", "mflag", "Mask value(s) for invalid data (positive value), or for valid data (negative value). Default is 0", 0);
+  Optionpk<int> invalid_opt("t", "invalid", "Mask value(s) where image is invalid. Use negative value for valid data (example: use -t -1: if only -1 is valid value)", 0);
+  //  Optionpk<short> mflag_opt("t", "mflag", "Mask value(s) for invalid data (positive value), or for valid data (negative value). Default is 0", 0);
   Optionpk<short> band_opt("b", "band", "Band to extract (0)", 0);
   Optionpk<bool> confusion_opt("cm", "confusion", "create confusion matrix (to std out) (default value is 0)", false);
   Optionpk<short> lzw_opt("\0", "lzw", "compression (default value is 1)", 1);
@@ -63,7 +64,7 @@ int main(int argc, char *argv[])
     valueO_opt.retrieveOption(argc,argv);
     valueC_opt.retrieveOption(argc,argv);
     flag_opt.retrieveOption(argc,argv);
-    mflag_opt.retrieveOption(argc,argv);
+    invalid_opt.retrieveOption(argc,argv);
     band_opt.retrieveOption(argc,argv);
     confusion_opt.retrieveOption(argc,argv);
     lzw_opt.retrieveOption(argc,argv);
@@ -95,8 +96,12 @@ int main(int argc, char *argv[])
       cout << " " << flag_opt[iflag];
     cout << endl;
   }
-  if(mask_opt[0]!="")
-    assert(mask_opt.size()==input_opt.size());
+
+  assert(input_opt.size());
+  assert(reference_opt.size());
+  if(mask_opt.size())
+    while(mask_opt.size()<input_opt.size())
+      mask_opt.push_back(mask_opt[0]);
   vector<short> inputRange;
   vector<short> referenceRange;
   ConfusionMatrix cm;
@@ -185,7 +190,7 @@ int main(int argc, char *argv[])
     pfnProgress(progress,pszMessage,pProgressArg);
   if(reference_opt[0].find(".shp")!=string::npos){
     for(int iinput=0;iinput<input_opt.size();++iinput){
-      if(output_opt[0]!="")
+      if(output_opt.size())
         assert(reference_opt.size()==output_opt.size());
       for(int iref=0;iref<reference_opt.size();++iref){
         if(verbose_opt[0])
@@ -194,7 +199,7 @@ int main(int argc, char *argv[])
         ImgReaderOgr referenceReader;
         try{
           inputReader.open(input_opt[iinput]);//,imagicX_opt[0],imagicY_opt[0]);
-          if(mask_opt[0]!=""){
+          if(mask_opt.size()){
             maskReader.open(mask_opt[iinput]);
             assert(inputReader.nrOfCol()==maskReader.nrOfCol());
             assert(inputReader.nrOfRow()==maskReader.nrOfRow());
@@ -210,7 +215,7 @@ int main(int argc, char *argv[])
 
         ImgWriterOgr ogrWriter;
         OGRLayer *writeLayer;
-        if(output_opt[0]!=""){
+        if(output_opt.size()){
           if(verbose_opt[0])
             cout << "creating output vector file " << output_opt[0] << endl;
           assert(output_opt[0].find(".shp")!=string::npos);
@@ -322,7 +327,7 @@ int main(int argc, char *argv[])
           if(static_cast<int>(i_centre)<0||static_cast<int>(i_centre)>=inputReader.nrOfCol())
             continue;
           OGRFeature *writeFeature;
-          if(output_opt[0]!=""){
+          if(output_opt.size()){
             writeFeature = OGRFeature::CreateFeature(writeLayer->GetLayerDefn());
             if(verbose_opt[0])
               cout << "copying fields from " << reference_opt[0] << endl;
@@ -359,18 +364,18 @@ int main(int argc, char *argv[])
                   break;
                 }
               }
-              maskFlagged=false;//(mflag_opt[ivalue]>=0)?false:true;
-              if(mask_opt[0]!=""){
+              maskFlagged=false;//(invalid_opt[ivalue]>=0)?false:true;
+              if(mask_opt.size()){
                 maskReader.readData(maskValue,GDT_Int16,i,j,band_opt[0]);
-                for(int ivalue=0;ivalue<mflag_opt.size();++ivalue){
-                  if(mflag_opt[ivalue]>=0){//values set in mflag_opt are invalid
-                    if(maskValue==mflag_opt[ivalue]){
+                for(int ivalue=0;ivalue<invalid_opt.size();++ivalue){
+                  if(invalid_opt[ivalue]>=0){//values set in invalid_opt are invalid
+                    if(maskValue==invalid_opt[ivalue]){
                       maskFlagged=true;
                       break;
                     }
                   }
-                  else{//only values set in mflag_opt are valid
-                    if(maskValue!=-mflag_opt[ivalue])
+                  else{//only values set in invalid_opt are valid
+                    if(maskValue!=-invalid_opt[ivalue])
                       maskFlagged=true;
                     else{
                       maskFlagged=false;
@@ -393,7 +398,7 @@ int main(int argc, char *argv[])
             //flag if not all pixels are homogeneous or if at least one pixel flagged
           
             if(!windowHasFlag&&isHomogeneous){
-              if(output_opt[0]!="")
+              if(output_opt.size())
                 writeFeature->SetField(labelclass_opt[0].c_str(),static_cast<int>(inputValue));
               if(confusion_opt[0]){
                 ++ntotalValidation;
@@ -445,7 +450,7 @@ int main(int argc, char *argv[])
                     fs << labelclass_opt[0] << "_" << windowJ << "_" << windowI;
                   else
                     fs << labelclass_opt[0];
-                  if(output_opt[0]!="")
+                  if(output_opt.size())
                     writeFeature->SetField(fs.str().c_str(),static_cast<int>(inputValue));
                   if(!windowJ&&!windowI){//centre pixel
                     if(confusion_opt[0]){
@@ -486,7 +491,7 @@ int main(int argc, char *argv[])
               }
             }
           }
-          if(output_opt[0]!=""){
+          if(output_opt.size()){
             if(!windowAllFlagged){
               if(verbose_opt[0])
                 cout << "creating feature" << endl;
@@ -498,11 +503,11 @@ int main(int argc, char *argv[])
             OGRFeature::DestroyFeature( writeFeature );
           }
         }
-        if(output_opt[0]!="")
+        if(output_opt.size())
           ogrWriter.close();
         referenceReader.close();
         inputReader.close();
-        if(mask_opt[0]!="")
+        if(mask_opt.size())
           maskReader.close();
       }
     }
@@ -511,9 +516,9 @@ int main(int argc, char *argv[])
     ImgWriterGdal imgWriter;
     try{
       inputReader.open(input_opt[0]);//,imagicX_opt[0],imagicY_opt[0]);
-      if(mask_opt[0]!="")
+      if(mask_opt.size())
         maskReader.open(mask_opt[0]);
-      if(output_opt[0]!=""){
+      if(output_opt.size()){
         if(verbose_opt[0])
           cout << "opening output image " << output_opt[0] << endl;
         string compression=(lzw_opt[0])? "LZW":"NONE";
@@ -547,7 +552,7 @@ int main(int argc, char *argv[])
     vector<short> lineInput(inputReader.nrOfCol());
     vector<short> lineMask(maskReader.nrOfCol());
     vector<short> lineOutput;
-    if(output_opt[0]!="")
+    if(output_opt.size())
       lineOutput.resize(inputReader.nrOfCol());
 
     int irow=0;
@@ -581,7 +586,7 @@ int main(int argc, char *argv[])
           cout << referenceRange[rc] << endl;
       }
       if(referenceRange.size()!=inputRange.size()){
-        if(confusion_opt[0]||output_opt[0]!=""){
+        if(confusion_opt[0]||output_opt.size()){
           cout << "reference range is not equal to input range!" << endl;
           cout << "Kappa: " << 0 << endl;    
           cout << "total weighted: " << 0 << endl;
@@ -595,8 +600,8 @@ int main(int argc, char *argv[])
     for(irow=0;irow<inputReader.nrOfRow()&&!isDifferent;++irow){
       //read line in lineInput, lineReference and lineMask
       inputReader.readData(lineInput,GDT_Int16,irow,band_opt[0]);
-      if(mask_opt[0]!="")
-        maskReader.readData(lineMask,GDT_Int16,irow,band_opt[0]);
+      if(mask_opt.size())
+        maskReader.readData(lineMask,GDT_Int16,irow);
       double x,y;//geo coordinates
       double ireference,jreference;//image coordinates in reference image
       for(icol=0;icol<inputReader.nrOfCol();++icol){
@@ -624,15 +629,15 @@ int main(int argc, char *argv[])
         bool flagged=false;
         for(int iflag=0;iflag<flag_opt.size();++iflag){
           if((lineInput[icol]==flag_opt[iflag])||(lineReference[ireference]==flag_opt[iflag])){
-            if(output_opt[0]!="")
+            if(output_opt.size())
               lineOutput[icol]=flag_opt[iflag];
             flagged=true;
             break;
           }
         }
-        if(mask_opt[0]!=""){
-          for(int ivalue=0;ivalue<mflag_opt.size();++ivalue){
-            if(lineMask[icol]==mflag_opt[ivalue]){
+        if(mask_opt.size()){
+          for(int ivalue=0;ivalue<invalid_opt.size();++ivalue){
+            if(lineMask[icol]==invalid_opt[ivalue]){
               flagged=true;
               break;
             }
@@ -652,7 +657,7 @@ int main(int argc, char *argv[])
             cm.incrementResult(cm.getClass(rc),cm.getClass(ic),1);
           }
           if(lineInput[icol]==lineReference[ireference]){//correct
-            if(output_opt[0]!=""){
+            if(output_opt.size()){
               if(valueE_opt[0]!=flag_opt[0])
                 lineOutput[icol]=valueE_opt[0];
               else
@@ -664,7 +669,7 @@ int main(int argc, char *argv[])
               isDifferent=true;
               break;
             }
-            if(output_opt[0]!=""){
+            if(output_opt.size()){
               if(lineInput[icol]<20){//forest
                 if(lineReference[icol]>=20)//gain
                   lineOutput[icol]=lineInput[icol]*10+1;//GAIN is 111,121,131
@@ -685,11 +690,11 @@ int main(int argc, char *argv[])
         }
         else{
           ++nflagged;
-          if(output_opt[0]!="")
+          if(output_opt.size())
             lineOutput[icol]=flag_opt[0];
         }
       }
-      if(output_opt[0]!=""){
+      if(output_opt.size()){
         try{
           imgWriter.writeData(lineOutput,GDT_Int16,irow);
         }
@@ -709,7 +714,7 @@ int main(int argc, char *argv[])
       if(!verbose_opt[0])
         pfnProgress(progress,pszMessage,pProgressArg);
     }
-    if(output_opt[0]!="")
+    if(output_opt.size())
       imgWriter.close();
     else if(!confusion_opt[0]){
       if(isDifferent)
@@ -719,7 +724,7 @@ int main(int argc, char *argv[])
     }
     referenceReader.close();
     inputReader.close();
-    if(mask_opt[0]!="")
+    if(mask_opt.size())
       maskReader.close();
   }
 
@@ -796,8 +801,8 @@ int main(int argc, char *argv[])
       dpa=cm.pa_pct(classNames[iclass],&se95_pa);
       cout << cm.getClass(iclass) << " " << cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " " << dpa << " (" << se95_pa << ")" << endl;
     }
-    doa=cm.oa_pct(&se95_oa);
+    doa=cm.oa(&se95_oa);
     cout << "Kappa: " << cm.kappa() << endl;
-    cout << "Overall Accuracy: " << doa << " (" << se95_oa << ")"  << endl;
+    cout << "Overall Accuracy: " << 100*doa << " (" << 100*se95_oa << ")"  << endl;
   }
 }
diff --git a/src/apps/pkfs_nn.cc b/src/apps/pkfs_nn.cc
index 2fbca98..53928ff 100644
--- a/src/apps/pkfs_nn.cc
+++ b/src/apps/pkfs_nn.cc
@@ -82,12 +82,25 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures)
     cout << "neurons" << endl;
   }
   switch(num_layers){
-  case(3):
-    net.create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nclass);
+  case(3):{
+    unsigned int layers[3];
+    layers[0]=nFeatures;
+    layers[1]=nneuron_opt[0];
+    layers[2]=nclass;
+    net.create_sparse_array(connection_opt[0],num_layers,layers);
+    // net.create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nclass);
     break;
-  case(4):
-    net.create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nneuron_opt[1], nclass);
+  }
+  case(4):{
+    unsigned int layers[4];
+    layers[0]=nFeatures;
+    layers[1]=nneuron_opt[0];
+    layers[2]=nneuron_opt[1];
+    layers[3]=nclass;
+    net.create_sparse_array(connection_opt[0],num_layers,layers);
+    // net.create_sparse(connection_opt[0],num_layers, nFeatures, nneuron_opt[0], nneuron_opt[1], nclass);
     break;
+  }
   default:
     cerr << "Only 1 or 2 hidden layers are supported!" << endl;
     exit(1);
@@ -95,7 +108,6 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures)
   }
 
   net.set_learning_rate(learning_opt[0]);
-
   //   net.set_activation_steepness_hidden(1.0);
   //   net.set_activation_steepness_output(1.0);
     
@@ -116,8 +128,9 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures)
     else if(cm.getClassIndex(type2string<short>(classValueMap[nameVector[iname]]))<0)
       cm.pushBackClassName(type2string<short>(classValueMap[nameVector[iname]]));
   }
-  vector<Vector2d<float> > tmpFeatures;
+  vector<Vector2d<float> > tmpFeatures(nclass);
   for(int iclass=0;iclass<nclass;++iclass){
+    tmpFeatures[iclass].resize(trainingFeatures[iclass].size(),nFeatures);
     for(unsigned int isample=0;isample<nctraining[iclass];++isample){
 	for(int ifeature=0;ifeature<nFeatures;++ifeature){
           tmpFeatures[iclass][isample][ifeature]=trainingFeatures[iclass][isample][ifeature];
@@ -142,8 +155,14 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures)
 	cm.incrementResult(cm.getClass(referenceVector[isample]),cm.getClass(outputVector[isample]),1.0);
     }
   }
-  else{
+  else{//not working yet. please repair...
+    assert(cv_opt[0]>0);
     bool initWeights=true;
+    //test
+    cout << "tempFeatures.size(): " << tmpFeatures.size() << endl;
+    cout << "ntraining: " << ntraining << endl;
+    cout << "initWeights: " << initWeights << endl;
+    cout << "maxit_opt.size(): " << maxit_opt.size() << endl;
     net.train_on_data(tmpFeatures,ntraining,initWeights, maxit_opt[0],
                       iterations_between_reports, desired_error);
     vector<Vector2d<float> > testFeatures(nclass);
@@ -155,6 +174,8 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures)
 	for(int ifeature=0;ifeature<nFeatures;++ifeature){
           testFeatures[iclass][isample][ifeature]=trainingFeatures[iclass][nctraining[iclass]+isample][ifeature];
         }
+	//test
+	cout << "isample:" << isample<< endl;
         result=net.run(testFeatures[iclass][isample]);
         string refClassName=nameVector[iclass];
         float maxP=-1;
@@ -165,13 +186,19 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures)
             maxClass=ic;
           }
         }
+	//test
+	cout << "maxClass:" << maxClass << "(" << nameVector.size() << ")" << endl;
         string className=nameVector[maxClass];
+	//test
+	cout << "className:" << nameVector[maxClass] << endl;
         if(classValueMap.size())
           cm.incrementResult(type2string<short>(classValueMap[refClassName]),type2string<short>(classValueMap[className]),1.0);
         else
           cm.incrementResult(cm.getClass(referenceVector[isample]),cm.getClass(outputVector[isample]),1.0);
       }
     }
+    //test
+    cout << "debug12" << endl;
   }
   assert(cm.nReference());
   return(cm.kappa());
@@ -241,7 +268,9 @@ int main(int argc, char *argv[])
   selMap["sbs"]=SBS;
   selMap["bfs"]=BFS;
 
-  assert(training_opt[0].size());
+  assert(training_opt.size());
+  if(input_opt.size())
+    cv_opt[0]=0;
   if(verbose_opt[0]>=1)
     std::cout << "training shape file: " << training_opt[0] << std::endl;
 
@@ -348,6 +377,7 @@ int main(int argc, char *argv[])
       std::cout << mapit->first << ": " << (mapit->second).size() << " samples" << std::endl;
     ++mapit;
   }
+  nclass=trainingPixels.size();
   if(classname_opt.size())
     assert(nclass==classname_opt.size());
   nband=trainingPixels[0][0].size()-2;//X and Y//trainingPixels[0][0].size();
@@ -511,7 +541,7 @@ int main(int argc, char *argv[])
       cost=getCost(trainingFeatures);
     }
     else{
-      while(cost-previousCost>epsilon_cost_opt[0]){
+      while(fabs(cost-previousCost)>epsilon_cost_opt[0]){
         previousCost=cost;
         switch(selMap[selector_opt[0]]){
         case(SFFS):
diff --git a/src/apps/pkfs_svm.cc b/src/apps/pkfs_svm.cc
index b8b69de..1b12dd0 100644
--- a/src/apps/pkfs_svm.cc
+++ b/src/apps/pkfs_svm.cc
@@ -563,7 +563,7 @@ int main(int argc, char *argv[])
       cost=getCost(trainingFeatures);
     }
     else{
-      while(cost-previousCost>epsilon_cost_opt[0]){
+      while(fabs(cost-previousCost)>epsilon_cost_opt[0]){
         previousCost=cost;
         switch(selMap[selector_opt[0]]){
         case(SFFS):
diff --git a/src/apps/pkregression_nn.cc b/src/apps/pkregression_nn.cc
index 4f3192c..88155e0 100644
--- a/src/apps/pkregression_nn.cc
+++ b/src/apps/pkregression_nn.cc
@@ -191,12 +191,25 @@ int main(int argc, char *argv[])
   }
 
   switch(num_layers){
-  case(3):
-    net.create_sparse(connection_opt[0],num_layers, ninput, nneuron_opt[0], noutput);
+  case(3):{
+      unsigned int layers[3];
+      layers[0]=ninput;
+      layers[1]=nneuron_opt[0];
+      layers[2]=noutput;
+      net.create_sparse_array(connection_opt[0],num_layers,layers);
+    // net.create_sparse(connection_opt[0],num_layers, ninput, nneuron_opt[0], noutput);
     break;
-  case(4):
-    net.create_sparse(connection_opt[0],num_layers, ninput, nneuron_opt[0], nneuron_opt[1], noutput);
+  }
+  case(4):{
+      unsigned int layers[3];
+      layers[0]=ninput;
+      layers[1]=nneuron_opt[0];
+      layers[2]=nneuron_opt[1];
+      layers[3]=noutput;
+      net.create_sparse_array(connection_opt[0],num_layers,layers);
+    // net.create_sparse(connection_opt[0],num_layers, ninput, nneuron_opt[0], nneuron_opt[1], noutput);
     break;
+  }
   default:
     cerr << "Only 1 or 2 hidden layers are supported!" << endl;
     exit(1);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pktools.git



More information about the Pkg-grass-devel mailing list