Skip to content
Snippets Groups Projects
AutoencoderModel.txx 4.91 KiB
Newer Older
  • Learn to ignore specific revisions
  • #ifndef AutoencoderModel_txx
    #define AutoencoderModel_txx
    
    
    #include "otbSharkUtils.h"
    //include train function
    #include <shark/ObjectiveFunctions/ErrorFunction.h>
    #include <shark/Algorithms/GradientDescent/Rprop.h>// the RProp optimization algorithm
    #include <shark/ObjectiveFunctions/Loss/SquaredLoss.h> // squared loss used for regression
    #include <shark/ObjectiveFunctions/Regularizer.h> //L2 regulariziation
    
    Cédric Traizet's avatar
    Cédric Traizet committed
    
    template <class TInputValue, class AutoencoderType>
    AutoencoderModel<TInputValue,AutoencoderType>::AutoencoderModel()
    {
    
    Cédric Traizet's avatar
    Cédric Traizet committed
    	this->m_IsDoPredictBatchMultiThreaded = true;
    
    template <class TInputValue, class AutoencoderType>
    AutoencoderModel<TInputValue,AutoencoderType>::~AutoencoderModel()
    {
    }
    
    
    template <class TInputValue, class AutoencoderType>
    void AutoencoderModel<TInputValue,AutoencoderType>::Train()
    {
    
    	
    	std::vector<shark::RealVector> features;
    	
    	Shark::ListSampleToSharkVector(this->GetInputListSample(), features);
    	
    	shark::Data<shark::RealVector> inputSamples = shark::createDataFromRange( features );
    		
    	std::size_t inputs = dataDimension(inputSamples);
    	m_net.setStructure(inputs, m_NumberOfHiddenNeurons);
    	initRandomUniform(m_net,-0.1*std::sqrt(1.0/inputs),0.1*std::sqrt(1.0/inputs));
    	
    	shark::LabeledData<shark::RealVector,shark::RealVector> trainSet(inputSamples,inputSamples);//labels identical to inputs
    	shark::SquaredLoss<shark::RealVector> loss;
    	shark::ErrorFunction error(trainSet, &m_net, &loss);
    	shark::TwoNormRegularizer regularizer(error.numberOfVariables());
    	error.setRegularizer(m_Regularization,&regularizer);
    
    	shark::IRpropPlusFull optimizer;
    	error.init();
    	optimizer.init(error);
    	std::cout<<"Optimizing model: "+m_net.name()<<std::endl;
    	for(std::size_t i = 0; i != m_NumberOfIterations; ++i){
    		optimizer.step(error);
    		std::cout<<i<<" "<<optimizer.solution().value<<std::endl;
    	}
    	//std::cout<<optimizer.solution().value<<std::endl;
    	m_net.setParameterVector(optimizer.solution().point);
    
    }
    
    
    template <class TInputValue, class AutoencoderType>
    bool AutoencoderModel<TInputValue,AutoencoderType>::CanReadFile(const std::string & filename)
    {
    	try
    	{
    		this->Load(filename);
    		m_net.name();
    	}
    	catch(...)
    	{
    	return false;
    	}
    	return true;
    }
    
    
    template <class TInputValue, class AutoencoderType>
    bool AutoencoderModel<TInputValue,AutoencoderType>::CanWriteFile(const std::string & filename)
    {
    	return true;
    
    template <class TInputValue, class AutoencoderType>
    void AutoencoderModel<TInputValue,AutoencoderType>::Save(const std::string & filename, const std::string & name)
    {
    	std::ofstream ofs(filename);
    
    	ofs << m_net.name() << std::endl; //first line
    
    	boost::archive::polymorphic_text_oarchive oa(ofs);
    	m_net.write(oa);
    	ofs.close();
    }
    
    template <class TInputValue, class AutoencoderType>
    void AutoencoderModel<TInputValue,AutoencoderType>::Load(const std::string & filename, const std::string & name)
    {
    	std::ifstream ifs(filename);
    
    	char autoencoder[256];
    	ifs.getline(autoencoder,256); 
    	std::string autoencoderstr(autoencoder);
    	
    	if (autoencoderstr != m_net.name()){
    		itkExceptionMacro(<< "Error opening " << filename.c_str() );
        }
    
    	boost::archive::polymorphic_text_iarchive ia(ifs);
    	m_net.read(ia);
    	ifs.close();
    	m_NumberOfHiddenNeurons = m_net.numberOfHiddenNeurons();
    
    Cédric Traizet's avatar
    Cédric Traizet committed
    	//this->m_Size = m_NumberOfHiddenNeurons;
    
    template <class TInputValue, class AutoencoderType>
    typename AutoencoderModel<TInputValue,AutoencoderType>::TargetSampleType
    
    Cédric Traizet's avatar
    Cédric Traizet committed
    AutoencoderModel<TInputValue,AutoencoderType>::DoPredict(const InputSampleType & value) const
    
    {  
    	shark::RealVector samples(value.Size());
    	for(size_t i = 0; i < value.Size();i++)
        {
    
        std::vector<shark::RealVector> features;
        features.push_back(samples);
       
        shark::Data<shark::RealVector> data = shark::createDataFromRange(features);
         
        data = m_net.encode(data);
    
    	for(unsigned int a = 0; a < m_NumberOfHiddenNeurons; ++a){
    
    	}
    	return target;
    }
    
    
    template <class TInputValue, class AutoencoderType>
    void AutoencoderModel<TInputValue,AutoencoderType>
    
    Cédric Traizet's avatar
    Cédric Traizet committed
    ::DoPredictBatch(const InputListSampleType *input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets) const
    
    	std::vector<shark::RealVector> features;
    	Shark::ListSampleRangeToSharkVector(input, features,startIndex,size);
    	shark::Data<shark::RealVector> data = shark::createDataFromRange(features);
    
    	data = m_net.encode(data);
    	unsigned int id = startIndex;
    
    	for(const auto& p : data.elements()){
    		
    		for(unsigned int a = 0; a < m_NumberOfHiddenNeurons; ++a){
    
    		targets->SetMeasurementVector(id,target);
    		++id;