Skip to content
Snippets Groups Projects
otbDimensionalityReductionTrainAutoencoder.txx 7.06 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
     *
     * This file is part of Orfeo Toolbox
     *
     *     https://www.orfeo-toolbox.org/
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    #ifndef otbDimensionalityReductionTrainAutoencoder_txx
    #define otbDimensionalityReductionTrainAutoencoder_txx
    
    #include "otbTrainDimensionalityReductionApplicationBase.h"
    
    #include "otbAutoencoderModel.h"
    
    
    namespace otb
    {
    namespace Wrapper
    {
    
    template <class TInputValue, class TOutputValue>
    void
    
    TrainDimensionalityReductionApplicationBase<TInputValue,TOutputValue>
    
      AddChoice("algorithm.autoencoder", "Shark Autoencoder");
      SetParameterDescription("algorithm.autoencoder",
    
                              "This group of parameters allows setting Shark autoencoder parameters. "
                              );
    
      AddParameter(ParameterType_Int, "algorithm.autoencoder.nbiter",
    
                   "Maximum number of iterations during training");
    
      SetParameterInt("algorithm.autoencoder.nbiter",100, false);
    
        "algorithm.autoencoder.nbiter",
    
        "The maximum number of iterations used during training.");
    
      AddParameter(ParameterType_Int, "algorithm.autoencoder.nbiterfinetuning",
    
                   "Maximum number of iterations during training");
    
      SetParameterInt("algorithm.autoencoder.nbiterfinetuning",0, false);
    
      SetParameterDescription(
    
        "algorithm.autoencoder.nbiterfinetuning",
    
        "The maximum number of iterations used during fine tuning of the whole network.");
    
      AddParameter(ParameterType_Float, "algorithm.autoencoder.epsilon",
    
                   "Epsilon");
    
      SetParameterFloat("algorithm.autoencoder.epsilon",0, false);
    
        "algorithm.autoencoder.epsilon",
    
      AddParameter(ParameterType_Float, "algorithm.autoencoder.initfactor",
    
                   "Weight initialization factor");
    
      SetParameterFloat("algorithm.autoencoder.initfactor",1, false);
    
        "algorithm.autoencoder.initfactor", "Parameter that control the weight initialization of the autoencoder");
    
    
      AddParameter(ParameterType_StringList, "algorithm.autoencoder.nbneuron", "Size");
    
        "algorithm.autoencoder.nbneuron",
    
        "The number of neurons in each hidden layer.");
    
      AddParameter(ParameterType_StringList, "algorithm.autoencoder.regularization", "Strength of the regularization");
      SetParameterDescription("algorithm.autoencoder.regularization", 
                              "Strength of the L2 regularization used during training");
    
      AddParameter(ParameterType_StringList, "algorithm.autoencoder.noise", "Strength of the noise");
      SetParameterDescription("algorithm.autoencoder.noise", 
                              "Strength of the noise");
    
      AddParameter(ParameterType_StringList, "algorithm.autoencoder.rho", "Sparsity parameter");
      SetParameterDescription("algorithm.autoencoder.rho", 
                              "Sparsity parameter");
    
      AddParameter(ParameterType_StringList, "algorithm.autoencoder.beta", "Sparsity regularization strength");
      SetParameterDescription("algorithm.autoencoder.beta", 
                              "Sparsity regularization strength");
    
      AddParameter(ParameterType_OutputFilename, "algorithm.autoencoder.learningcurve", "Learning curve");
      SetParameterDescription("algorithm.autoencoder.learningcurve", "Learning error values");
      MandatoryOff("algorithm.autoencoder.learningcurve");
    
    }
    
    template <class TInputValue, class TOutputValue>
    void
    
    TrainDimensionalityReductionApplicationBase<TInputValue,TOutputValue>
    
    ::BeforeTrainAutoencoder(typename ListSampleType::Pointer trainingListSample,
    
    {
      typedef shark::LogisticNeuron NeuronType;
      typedef otb::AutoencoderModel<InputValueType, NeuronType> AutoencoderModelType;
    
      TrainAutoencoder<AutoencoderModelType>(trainingListSample,modelPath);
    
    Cédric Traizet's avatar
    Cédric Traizet committed
    template <typename autoencoderchoice>
    
    void TrainDimensionalityReductionApplicationBase<TInputValue,TOutputValue>::TrainAutoencoder(typename ListSampleType::Pointer trainingListSample,std::string modelPath)
    
        typename autoencoderchoice::Pointer dimredTrainer = autoencoderchoice::New();
        itk::Array<unsigned int> nb_neuron;
        itk::Array<float> noise;
        itk::Array<float> regularization;
        itk::Array<float> rho;
        itk::Array<float> beta;
        std::vector<std::basic_string<char>> s_nbneuron= GetParameterStringList("algorithm.autoencoder.nbneuron");
        std::vector<std::basic_string<char>> s_noise= GetParameterStringList("algorithm.autoencoder.noise");
        std::vector<std::basic_string<char>> s_regularization= GetParameterStringList("algorithm.autoencoder.regularization");
        std::vector<std::basic_string<char>> s_rho= GetParameterStringList("algorithm.autoencoder.rho");
        std::vector<std::basic_string<char>> s_beta= GetParameterStringList("algorithm.autoencoder.beta");
        nb_neuron.SetSize(s_nbneuron.size());
        noise.SetSize(s_nbneuron.size());
        regularization.SetSize(s_nbneuron.size());
        rho.SetSize(s_nbneuron.size());
        beta.SetSize(s_nbneuron.size());
        for (unsigned int i=0; i<s_nbneuron.size(); i++)
          {
          nb_neuron[i]=std::stoi(s_nbneuron[i]);
          noise[i]=std::stof(s_noise[i]);
          regularization[i]=std::stof(s_regularization[i]);
          rho[i]=std::stof(s_rho[i]);
          beta[i]=std::stof(s_beta[i]);
          }
        dimredTrainer->SetNumberOfHiddenNeurons(nb_neuron);
        dimredTrainer->SetNumberOfIterations(GetParameterInt("algorithm.autoencoder.nbiter"));
        dimredTrainer->SetNumberOfIterationsFineTuning(GetParameterInt("algorithm.autoencoder.nbiterfinetuning"));
        dimredTrainer->SetEpsilon(GetParameterFloat("algorithm.autoencoder.epsilon"));
        dimredTrainer->SetInitFactor(GetParameterFloat("algorithm.autoencoder.initfactor"));
        dimredTrainer->SetRegularization(regularization);
        dimredTrainer->SetNoise(noise);
        dimredTrainer->SetRho(rho);
        dimredTrainer->SetBeta(beta);
        dimredTrainer->SetWriteWeights(true);
        if (HasValue("algorithm.autoencoder.learningcurve") &&
            IsParameterEnabled("algorithm.autoencoder.learningcurve"))
          {
          dimredTrainer->SetWriteLearningCurve(true);
          dimredTrainer->SetLearningCurveFileName(GetParameterString("algorithm.autoencoder.learningcurve"));
          }
    
        dimredTrainer->SetInputListSample(trainingListSample);
        dimredTrainer->Train();
        dimredTrainer->Save(modelPath);