From 4442d2af09e146ae328c39294c7e153d1ec14d26 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Traizet?= <traizetc@cesbio.cnes.fr>
Date: Wed, 24 May 2017 16:54:29 +0200
Subject: [PATCH] added new parameter tied/untied for autoencoders

---
 include/AutoencoderModel.txx                  | 12 +---
 .../ImageDimensionalityReductionFilter.txx    |  2 +-
 include/SOMModel.txx                          | 47 ++++++----------
 include/cbLearningApplicationBaseDR.h         |  4 ++
 include/cbLearningApplicationBaseDR.txx       |  2 +-
 include/cbTrainAutoencoder.txx                | 55 +++++++++++++++++--
 include/cbTrainSOM.txx                        | 18 +-----
 7 files changed, 75 insertions(+), 65 deletions(-)

diff --git a/include/AutoencoderModel.txx b/include/AutoencoderModel.txx
index 7f2b451647..dad8324514 100644
--- a/include/AutoencoderModel.txx
+++ b/include/AutoencoderModel.txx
@@ -57,7 +57,6 @@ void AutoencoderModel<TInputValue,AutoencoderType>::Train()
 		optimizer.step(error);
 		std::cout<<i<<" "<<optimizer.solution().value<<std::endl;
 	}
-	//std::cout<<optimizer.solution().value<<std::endl;
 	m_net.setParameterVector(optimizer.solution().point);
 	
 	
@@ -111,7 +110,6 @@ void AutoencoderModel<TInputValue,AutoencoderType>::Load(const std::string & fil
 	m_net.read(ia);
 	ifs.close();
 	m_NumberOfHiddenNeurons = m_net.numberOfHiddenNeurons();
-	//this->m_Size = m_NumberOfHiddenNeurons;
 }
 
 
@@ -119,6 +117,7 @@ template <class TInputValue, class AutoencoderType>
 typename AutoencoderModel<TInputValue,AutoencoderType>::TargetSampleType
 AutoencoderModel<TInputValue,AutoencoderType>::DoPredict(const InputSampleType & value) const
 {  
+	std::cout << "SINGLE PIXEL " ;
 	shark::RealVector samples(value.Size());
 	for(size_t i = 0; i < value.Size();i++)
     {
@@ -157,17 +156,10 @@ void AutoencoderModel<TInputValue,AutoencoderType>
 		
 		for(unsigned int a = 0; a < m_NumberOfHiddenNeurons; ++a){
 			target[a]=p[a];
-		
-			//target.SetElement(a,p[a]);
-			
-			
 		}
-		//std::cout << p << std::endl;
 		targets->SetMeasurementVector(id,target);
-		++id;
-		
+		++id;	
     }
-
 }
 
 
diff --git a/include/ImageDimensionalityReductionFilter.txx b/include/ImageDimensionalityReductionFilter.txx
index a072b48fce..3dbfd16bfe 100644
--- a/include/ImageDimensionalityReductionFilter.txx
+++ b/include/ImageDimensionalityReductionFilter.txx
@@ -40,7 +40,7 @@ ImageDimensionalityReductionFilter<TInputImage, TOutputImage, TMaskImage>
   this->SetNthOutput(0,TOutputImage::New());
   this->SetNthOutput(1,ConfidenceImageType::New());
   m_UseConfidenceMap = false;
-  m_BatchMode = false;
+  m_BatchMode = true;
 }
 
 template <class TInputImage, class TOutputImage, class TMaskImage>
diff --git a/include/SOMModel.txx b/include/SOMModel.txx
index d6c9f02c45..13765ccbfb 100644
--- a/include/SOMModel.txx
+++ b/include/SOMModel.txx
@@ -96,45 +96,32 @@ std::istream & binary_read(std::istream& stream, T& value){
 template <class TInputValue, unsigned int MapDimension>
 void SOMModel<TInputValue, MapDimension>::Save(const std::string & filename, const std::string & name)
 {
-
-//Ecriture
-  auto kwl = m_SOMMap->GetImageKeywordlist();
-  kwl.AddKey("MachineLearningModelType", "SOM"+std::to_string(MapDimension));
-  m_SOMMap->SetImageKeywordList(kwl);
-  auto writer = otb::ImageFileWriter<MapType>::New();
-  writer->SetInput(m_SOMMap);
-  writer->SetFileName(filename);
-  writer->Update();
-
-
- // test text
-  itk::ImageRegionConstIterator<MapType> inputIterator(m_SOMMap,m_SOMMap->GetLargestPossibleRegion());
-  inputIterator.GoToBegin();
-  std::ofstream ofs(filename+"2", std::ios::binary);
-  binary_write_string(ofs,"som"); 
-  binary_write(ofs,static_cast<int>(MapDimension));
-  SizeType size = m_SOMMap->GetLargestPossibleRegion().GetSize() ;
-  for (size_t i=0;i<MapDimension;i++){
+	itk::ImageRegionConstIterator<MapType> inputIterator(m_SOMMap,m_SOMMap->GetLargestPossibleRegion());
+	inputIterator.GoToBegin();
+	std::ofstream ofs(filename, std::ios::binary);
+	binary_write_string(ofs,"som"); 
+	binary_write(ofs,static_cast<int>(MapDimension));
+	SizeType size = m_SOMMap->GetLargestPossibleRegion().GetSize() ;
+	for (size_t i=0;i<MapDimension;i++){
 		binary_write(ofs,size[i]);
-  }
-  
-  binary_write(ofs,inputIterator.Get().GetNumberOfElements());
-  while(!inputIterator.IsAtEnd()){
-	InputSampleType vect = inputIterator.Get();
-	for (size_t i=0;i<vect.GetNumberOfElements();i++){
-		binary_write(ofs,vect[i]);
 	}
+	  
+	binary_write(ofs,inputIterator.Get().GetNumberOfElements());
+	while(!inputIterator.IsAtEnd()){
+		InputSampleType vect = inputIterator.Get();
+		for (size_t i=0;i<vect.GetNumberOfElements();i++){
+			binary_write(ofs,vect[i]);
+		}	
 	++inputIterator;
-  }
-  ofs.close();
-
+	}
+	ofs.close();
 }
 
 template <class TInputValue, unsigned int MapDimension>
 void SOMModel<TInputValue, MapDimension>::Load(const std::string & filename, const std::string & name)
 {
 	
-	std::ifstream ifs(filename+"2", std::ios::binary);
+	std::ifstream ifs(filename, std::ios::binary);
 	
 	/**  Read the model key (should be som) */
 	char s[]="   ";
diff --git a/include/cbLearningApplicationBaseDR.h b/include/cbLearningApplicationBaseDR.h
index 328373b24f..a45024aa47 100644
--- a/include/cbLearningApplicationBaseDR.h
+++ b/include/cbLearningApplicationBaseDR.h
@@ -136,9 +136,13 @@ private:
   void InitAutoencoderParams();
   void InitPCAParams();
   void InitSOMParams();
+  
+  void BeforeTrainAutoencoder(typename ListSampleType::Pointer trainingListSample, std::string modelPath);
   template <class autoencoderchoice>
   void TrainAutoencoder(typename ListSampleType::Pointer trainingListSample, std::string modelPath);
+  
   void TrainPCA(typename ListSampleType::Pointer trainingListSample, std::string modelPath);
+  
   template <class somchoice>
   void TrainSOM(typename ListSampleType::Pointer trainingListSample, std::string modelPath);
   void BeforeTrainSOM(typename ListSampleType::Pointer trainingListSample, std::string modelPath);
diff --git a/include/cbLearningApplicationBaseDR.txx b/include/cbLearningApplicationBaseDR.txx
index 916d7d6f82..5603cca4f6 100644
--- a/include/cbLearningApplicationBaseDR.txx
+++ b/include/cbLearningApplicationBaseDR.txx
@@ -83,7 +83,7 @@ cbLearningApplicationBaseDR<TInputValue,TOutputValue>
  if(modelName == "autoencoder")
     {
     #ifdef OTB_USE_SHARK
-    TrainAutoencoder<AutoencoderModelType>(trainingListSample,modelPath);
+    BeforeTrainAutoencoder(trainingListSample,modelPath);
     #else
     otbAppLogFATAL("Module SharkLearning is not installed. You should consider turning OTB_USE_SHARK on during cmake configuration.");
     #endif
diff --git a/include/cbTrainAutoencoder.txx b/include/cbTrainAutoencoder.txx
index feed6cf75e..82e21d17b6 100644
--- a/include/cbTrainAutoencoder.txx
+++ b/include/cbTrainAutoencoder.txx
@@ -21,6 +21,21 @@ cbLearningApplicationBaseDR<TInputValue,TOutputValue>
   SetParameterDescription("model.autoencoder",
                           "This group of parameters allows setting Shark autoencoder parameters. "
                           );
+                          
+  
+  //Tied Autoencoder
+  AddParameter(ParameterType_Choice, "model.autoencoder.istied",
+               "tied weighth <tied/untied>");
+  SetParameterDescription(
+    "model.autoencoder.istied",
+    "Parameter that determine if the weights are tied or not <tied/untied>");
+                          
+        
+  AddChoice("model.autoencoder.istied.yes","Tied weigths");
+  AddChoice("model.autoencoder.istied.no","Untied weights");
+                  
+                          
+                          
   //Number Of Iterations
   AddParameter(ParameterType_Int, "model.autoencoder.nbiter",
                "Maximum number of iterations during training");
@@ -38,13 +53,41 @@ cbLearningApplicationBaseDR<TInputValue,TOutputValue>
     "model.autoencoder.nbneuron",
     "The number of neurons in the hidden layer.");
   
-  //normalization
-  AddParameter(ParameterType_Float, "model.autoencoder.normalizer", "Strength of the normalization");
-  SetParameterFloat("model.autoencoder.normalizer",0, false);
-  SetParameterDescription("model.autoencoder.normalizer", 
-                         "Strength of the L2 normalization used during training");
+  //Regularization
+  AddParameter(ParameterType_Float, "model.autoencoder.regularization", "Strength of the regularization");
+  SetParameterFloat("model.autoencoder.regularization",0, false);
+  SetParameterDescription("model.autoencoder.regularization", 
+                         "Strength of the L2 regularization used during training");
+}
+
+
+template <class TInputValue, class TOutputValue>
+void
+cbLearningApplicationBaseDR<TInputValue,TOutputValue>
+::BeforeTrainAutoencoder(typename ListSampleType::Pointer trainingListSample,
+        std::string modelPath)
+{		
+	std::string TiedWeigth = GetParameterString("model.autoencoder.istied");
+	std::cout << TiedWeigth << std::endl;
+		
+	if(TiedWeigth == "no")
+		{
+		TrainAutoencoder<AutoencoderModelType>(trainingListSample,modelPath);
+		}
+		
+	if(TiedWeigth == "yes")
+		{
+		TrainAutoencoder<TiedAutoencoderModelType>(trainingListSample,modelPath);
+		}
+	 
+	if(TiedWeigth != "yes" && TiedWeigth != "no")
+		{
+			std::cerr << "istied : invalid choice <yes/no>" << std::endl;
+		}
 }
 
+
+
 template <class TInputValue, class TOutputValue>
 template <typename autoencoderchoice>
 void cbLearningApplicationBaseDR<TInputValue,TOutputValue>
@@ -53,7 +96,7 @@ void cbLearningApplicationBaseDR<TInputValue,TOutputValue>
 		typename autoencoderchoice::Pointer dimredTrainer = autoencoderchoice::New();
 		dimredTrainer->SetNumberOfHiddenNeurons(GetParameterInt("model.autoencoder.nbneuron"));
 		dimredTrainer->SetNumberOfIterations(GetParameterInt("model.autoencoder.nbiter"));
-		dimredTrainer->SetRegularization(GetParameterFloat("model.autoencoder.normalizer"));
+		dimredTrainer->SetRegularization(GetParameterFloat("model.autoencoder.regularization"));
 		dimredTrainer->SetInputListSample(trainingListSample);
 		dimredTrainer->Train();
 		dimredTrainer->Save(modelPath);
diff --git a/include/cbTrainSOM.txx b/include/cbTrainSOM.txx
index 539504b92b..9ac28dd906 100644
--- a/include/cbTrainSOM.txx
+++ b/include/cbTrainSOM.txx
@@ -18,22 +18,6 @@ cbLearningApplicationBaseDR<TInputValue,TOutputValue>
   SetParameterDescription("model.som",
                           "This group of parameters allows setting SOM parameters. "
                           );
-  
-  AddChoice("model.som3d", "OTB SOM");
-  SetParameterDescription("model.som3d",
-                          "This group of parameters allows setting SOM parameters. "
-                          );
-  
-  AddChoice("model.som4d", "OTB SOM");
-  SetParameterDescription("model.som4d",
-                          "This group of parameters allows setting SOM parameters. "
-                          );
-  
-  AddChoice("model.som5d", "OTB SOM");
-  SetParameterDescription("model.som5d",
-                          "This group of parameters allows setting SOM parameters. "
-                          );
-  
 
 	AddParameter(ParameterType_Int, "model.som.dim","Dimension of the map");
 	SetParameterDescription("model.som.dim","Dimension of the SOM map.");
@@ -120,7 +104,7 @@ cbLearningApplicationBaseDR<TInputValue,TOutputValue>
 		}   
 	if(SomDim > 5 || SomDim < 2)
 		{
-			std::cerr << "invalid dimension" << std::endl;
+			std::cerr << "k : invalid dimension" << std::endl;
 		}
 }
 
-- 
GitLab