Newer
Older
Cédric Traizet
committed
Cédric Traizet
committed
#ifndef AutoencoderModel_txx
#define AutoencoderModel_txx
Cédric Traizet
committed
#include <fstream>
#include <shark/Data/Dataset.h>
Cédric Traizet
committed
#include "itkMacro.h"
Cédric Traizet
committed
#include "otbSharkUtils.h"
Cédric Traizet
committed
//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
#include <shark/Models/ImpulseNoiseModel.h> //noise source to corrupt the inputs
Cédric Traizet
committed
#include <shark/Models/ConcatenatedModel.h>//to concatenate the noise with the model
Cédric Traizet
committed
namespace otb
{
template <class TInputValue, class AutoencoderType>
AutoencoderModel<TInputValue,AutoencoderType>::AutoencoderModel()
{
Cédric Traizet
committed
template <class TInputValue, class AutoencoderType>
AutoencoderModel<TInputValue,AutoencoderType>::~AutoencoderModel()
{
}
Cédric Traizet
committed
template <class TInputValue, class AutoencoderType>
void AutoencoderModel<TInputValue,AutoencoderType>::Train()
{
Cédric Traizet
committed
AutoencoderType net;
Cédric Traizet
committed
std::vector<shark::RealVector> features;
Shark::ListSampleToSharkVector(this->GetInputListSample(), features);
shark::Data<shark::RealVector> inputSamples = shark::createDataFromRange( features );
std::size_t inputs = dataDimension(inputSamples);
Cédric Traizet
committed
net.setStructure(inputs, m_NumberOfHiddenNeurons);
initRandomUniform(net,-0.1*std::sqrt(1.0/inputs),0.1*std::sqrt(1.0/inputs));
shark::ImpulseNoiseModel noise(m_Noise,0.0); //set an input pixel with probability m_Noise to 0
Cédric Traizet
committed
shark::ConcatenatedModel<shark::RealVector,shark::RealVector> model = noise>> net;
Cédric Traizet
committed
shark::LabeledData<shark::RealVector,shark::RealVector> trainSet(inputSamples,inputSamples);//labels identical to inputs
shark::SquaredLoss<shark::RealVector> loss;
Cédric Traizet
committed
shark::ErrorFunction error(trainSet, &model, &loss);
Cédric Traizet
committed
shark::TwoNormRegularizer regularizer(error.numberOfVariables());
error.setRegularizer(m_Regularization,®ularizer);
shark::IRpropPlusFull optimizer;
error.init();
optimizer.init(error);
Cédric Traizet
committed
std::cout<<"Optimizing model: "+net.name()<<std::endl;
Cédric Traizet
committed
for(std::size_t i = 0; i != m_NumberOfIterations; ++i){
optimizer.step(error);
std::cout<<i<<" "<<optimizer.solution().value<<std::endl;
}
Cédric Traizet
committed
net.setParameterVector(optimizer.solution().point);
m_net.push_back(net);
Cédric Traizet
committed
Cédric Traizet
committed
}
template <class TInputValue, class AutoencoderType>
bool AutoencoderModel<TInputValue,AutoencoderType>::CanReadFile(const std::string & filename)
{
try
{
this->Load(filename);
Cédric Traizet
committed
m_net[0].name();
Cédric Traizet
committed
}
catch(...)
{
return false;
}
return true;
}
Cédric Traizet
committed
Cédric Traizet
committed
template <class TInputValue, class AutoencoderType>
bool AutoencoderModel<TInputValue,AutoencoderType>::CanWriteFile(const std::string & filename)
{
return true;
Cédric Traizet
committed
}
Cédric Traizet
committed
template <class TInputValue, class AutoencoderType>
void AutoencoderModel<TInputValue,AutoencoderType>::Save(const std::string & filename, const std::string & name)
{
std::ofstream ofs(filename);
Cédric Traizet
committed
ofs << m_net[0].name() << std::endl; // the first line of the model file contains a key
Cédric Traizet
committed
boost::archive::polymorphic_text_oarchive oa(ofs);
Cédric Traizet
committed
//m_net.write(oa);
oa << m_net;
Cédric Traizet
committed
ofs.close();
}
Cédric Traizet
committed
Cédric Traizet
committed
template <class TInputValue, class AutoencoderType>
void AutoencoderModel<TInputValue,AutoencoderType>::Load(const std::string & filename, const std::string & name)
{
Cédric Traizet
committed
AutoencoderType net;
Cédric Traizet
committed
std::ifstream ifs(filename);
Cédric Traizet
committed
char autoencoder[256];
ifs.getline(autoencoder,256);
std::string autoencoderstr(autoencoder);
Cédric Traizet
committed
std::cout << "oy" << std::endl;
if (autoencoderstr != net.name()){
Cédric Traizet
committed
itkExceptionMacro(<< "Error opening " << filename.c_str() );
}
Cédric Traizet
committed
std::cout << "yo" << std::endl;
Cédric Traizet
committed
boost::archive::polymorphic_text_iarchive ia(ifs);
Cédric Traizet
committed
//m_net.read(ia);
ia >> m_net;
Cédric Traizet
committed
ifs.close();
Cédric Traizet
committed
m_NumberOfHiddenNeurons = m_net[0].numberOfHiddenNeurons();
Cédric Traizet
committed
}
Cédric Traizet
committed
Cédric Traizet
committed
template <class TInputValue, class AutoencoderType>
typename AutoencoderModel<TInputValue,AutoencoderType>::TargetSampleType
AutoencoderModel<TInputValue,AutoencoderType>::DoPredict(const InputSampleType & value) const
Cédric Traizet
committed
{
shark::RealVector samples(value.Size());
for(size_t i = 0; i < value.Size();i++)
{
Cédric Traizet
committed
samples[i]=value[i];
Cédric Traizet
committed
}
Cédric Traizet
committed
std::vector<shark::RealVector> features;
features.push_back(samples);
shark::Data<shark::RealVector> data = shark::createDataFromRange(features);
Cédric Traizet
committed
data = m_net[0].encode(data);
Cédric Traizet
committed
TargetSampleType target;
Cédric Traizet
committed
target.SetSize(m_NumberOfHiddenNeurons);
Cédric Traizet
committed
for(unsigned int a = 0; a < m_NumberOfHiddenNeurons; ++a){
Cédric Traizet
committed
target[a]=data.element(0)[a];
Cédric Traizet
committed
}
return target;
}
template <class TInputValue, class AutoencoderType>
void AutoencoderModel<TInputValue,AutoencoderType>
::DoPredictBatch(const InputListSampleType *input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets) const
Cédric Traizet
committed
{
Cédric Traizet
committed
std::vector<shark::RealVector> features;
Shark::ListSampleRangeToSharkVector(input, features,startIndex,size);
shark::Data<shark::RealVector> data = shark::createDataFromRange(features);
Cédric Traizet
committed
TargetSampleType target;
Cédric Traizet
committed
data = m_net[0].encode(data);
Cédric Traizet
committed
unsigned int id = startIndex;
Cédric Traizet
committed
target.SetSize(m_NumberOfHiddenNeurons);
Cédric Traizet
committed
for(const auto& p : data.elements()){
for(unsigned int a = 0; a < m_NumberOfHiddenNeurons; ++a){
Cédric Traizet
committed
target[a]=p[a];
Cédric Traizet
committed
}
targets->SetMeasurementVector(id,target);
Cédric Traizet
committed
}
Cédric Traizet
committed
}
Cédric Traizet
committed
} // namespace otb
#endif