diff --git a/include/AutoencoderModel.h b/include/AutoencoderModel.h index df5f03280a366d00012480856f56faa068ac8d65..cde280d83a9a99824d5c8a99bc585f5cd8b0b286 100644 --- a/include/AutoencoderModel.h +++ b/include/AutoencoderModel.h @@ -27,9 +27,9 @@ public: itkNewMacro(Self); itkTypeMacro(AutoencoderModel, DimensionalityReductionModel); - unsigned int GetDimension() {return m_NumberOfHiddenNeurons;}; // Override the Dimensionality Reduction model method, it is used in the dimensionality reduction filter to set the output image size - itkGetMacro(NumberOfHiddenNeurons,unsigned int); - itkSetMacro(NumberOfHiddenNeurons,unsigned int); + unsigned int GetDimension() {return m_NumberOfHiddenNeurons[m_net.size()-1];}; // Override the Dimensionality Reduction model method, it is used in the dimensionality reduction filter to set the output image size + itkGetMacro(NumberOfHiddenNeurons,itk::Array<unsigned int>); + itkSetMacro(NumberOfHiddenNeurons,itk::Array<unsigned int>); itkGetMacro(NumberOfIterations,unsigned int); itkSetMacro(NumberOfIterations,unsigned int); @@ -47,6 +47,7 @@ public: void Load(const std::string & filename, const std::string & name="") ITK_OVERRIDE; void Train() ITK_OVERRIDE; + void TrainOneLayer(unsigned int, shark::Data<shark::RealVector> &); protected: AutoencoderModel(); @@ -59,8 +60,9 @@ private: /** Network attributes */ std::vector<AutoencoderType> m_net; - unsigned int m_NumberOfHiddenNeurons; + + itk::Array<unsigned int> m_NumberOfHiddenNeurons; /** Training parameters */ unsigned int m_NumberOfIterations; double m_Regularization; // L2 Regularization parameter diff --git a/include/AutoencoderModel.txx b/include/AutoencoderModel.txx index d13105ef277e2018b813b5f9c4f980835da6acde..ac949029818171e74378c44de9168b58cad20175 100644 --- a/include/AutoencoderModel.txx +++ b/include/AutoencoderModel.txx @@ -31,23 +31,35 @@ AutoencoderModel<TInputValue,AutoencoderType>::~AutoencoderModel() { } - template <class TInputValue, class AutoencoderType> void AutoencoderModel<TInputValue,AutoencoderType>::Train() { - AutoencoderType net; std::vector<shark::RealVector> features; + Shark::ListSampleToSharkVector(this->GetInputListSample(), features); + shark::Data<shark::RealVector> inputSamples = shark::createDataFromRange( features ); + + for (unsigned int i = 0 ; i < m_NumberOfHiddenNeurons.Size(); ++i) + { + TrainOneLayer( m_NumberOfHiddenNeurons[i], inputSamples); + } +} + +template <class TInputValue, class AutoencoderType> +void AutoencoderModel<TInputValue,AutoencoderType>::TrainOneLayer(unsigned int nbneuron, shark::Data<shark::RealVector> &samples) +{ + AutoencoderType net; + /*std::vector<shark::RealVector> features; Shark::ListSampleToSharkVector(this->GetInputListSample(), features); shark::Data<shark::RealVector> inputSamples = shark::createDataFromRange( features ); - - std::size_t inputs = dataDimension(inputSamples); - net.setStructure(inputs, m_NumberOfHiddenNeurons); + */ //in Train() now + std::size_t inputs = dataDimension(samples); + net.setStructure(inputs, nbneuron); 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 shark::ConcatenatedModel<shark::RealVector,shark::RealVector> model = noise>> net; - shark::LabeledData<shark::RealVector,shark::RealVector> trainSet(inputSamples,inputSamples);//labels identical to inputs + shark::LabeledData<shark::RealVector,shark::RealVector> trainSet(samples,samples);//labels identical to inputs shark::SquaredLoss<shark::RealVector> loss; shark::ErrorFunction error(trainSet, &model, &loss); shark::TwoNormRegularizer regularizer(error.numberOfVariables()); @@ -63,7 +75,7 @@ void AutoencoderModel<TInputValue,AutoencoderType>::Train() } net.setParameterVector(optimizer.solution().point); m_net.push_back(net); - + samples = net.encode(samples); } @@ -108,16 +120,19 @@ void AutoencoderModel<TInputValue,AutoencoderType>::Load(const std::string & fil char autoencoder[256]; ifs.getline(autoencoder,256); std::string autoencoderstr(autoencoder); - std::cout << "oy" << std::endl; if (autoencoderstr != net.name()){ itkExceptionMacro(<< "Error opening " << filename.c_str() ); } - std::cout << "yo" << std::endl; boost::archive::polymorphic_text_iarchive ia(ifs); //m_net.read(ia); ia >> m_net; ifs.close(); - m_NumberOfHiddenNeurons = m_net[0].numberOfHiddenNeurons(); + + m_NumberOfHiddenNeurons.SetSize(m_net.size()); + for (int i=0; i<m_net.size(); i++){ + m_NumberOfHiddenNeurons[i] = m_net[i].numberOfHiddenNeurons(); + } + } @@ -135,15 +150,18 @@ AutoencoderModel<TInputValue,AutoencoderType>::DoPredict(const InputSampleType & features.push_back(samples); shark::Data<shark::RealVector> data = shark::createDataFromRange(features); - - data = m_net[0].encode(data); + + for (int i=0; i<m_net.size(); i++){ // loop over all autoencoders in m_net + data = m_net[i].encode(data); + } TargetSampleType target; - target.SetSize(m_NumberOfHiddenNeurons); + target.SetSize(m_NumberOfHiddenNeurons[m_net.size()-1]); - for(unsigned int a = 0; a < m_NumberOfHiddenNeurons; ++a){ + for(unsigned int a = 0; a < m_NumberOfHiddenNeurons[m_net.size()-1]; ++a){ target[a]=data.element(0)[a]; } return target; + } @@ -155,12 +173,16 @@ void AutoencoderModel<TInputValue,AutoencoderType> Shark::ListSampleRangeToSharkVector(input, features,startIndex,size); shark::Data<shark::RealVector> data = shark::createDataFromRange(features); TargetSampleType target; - data = m_net[0].encode(data); + + for (auto net :m_net ){ // loop over all autoencoders in m_net + data = net.encode(data); + } + unsigned int id = startIndex; - target.SetSize(m_NumberOfHiddenNeurons); - for(const auto& p : data.elements()){ - - for(unsigned int a = 0; a < m_NumberOfHiddenNeurons; ++a){ + target.SetSize(m_NumberOfHiddenNeurons[m_net.size()-1]); + for(const auto& p : data.elements()) + { + for(unsigned int a = 0; a < m_NumberOfHiddenNeurons[m_net.size()-1]; ++a){ target[a]=p[a]; } targets->SetMeasurementVector(id,target); diff --git a/include/cbTrainAutoencoder.txx b/include/cbTrainAutoencoder.txx index 7cef519d144f934f6b5319d321bc5234a4b8f4d6..62b66cf8a9ff5349dbd1f4bdd7ee6d908f4b7c16 100644 --- a/include/cbTrainAutoencoder.txx +++ b/include/cbTrainAutoencoder.txx @@ -46,12 +46,13 @@ cbLearningApplicationBaseDR<TInputValue,TOutputValue> //Number Of Hidden Neurons - AddParameter(ParameterType_Int, "model.autoencoder.nbneuron", + AddParameter(ParameterType_StringList , "model.autoencoder.nbneuron", "Size"); + /*AddParameter(ParameterType_Int, "model.autoencoder.nbneuron", "Number of neurons in the hidden layer"); - SetParameterInt("model.autoencoder.nbneuron",10, false); + SetParameterInt("model.autoencoder.nbneuron",10, false);*/ SetParameterDescription( "model.autoencoder.nbneuron", - "The number of neurons in the hidden layer."); + "The number of neurons in each hidden layer."); //Regularization AddParameter(ParameterType_Float, "model.autoencoder.regularization", "Strength of the regularization"); @@ -100,7 +101,14 @@ void cbLearningApplicationBaseDR<TInputValue,TOutputValue> ::TrainAutoencoder(typename ListSampleType::Pointer trainingListSample,std::string modelPath) { typename autoencoderchoice::Pointer dimredTrainer = autoencoderchoice::New(); - dimredTrainer->SetNumberOfHiddenNeurons(GetParameterInt("model.autoencoder.nbneuron")); + itk::Array<unsigned int> nb_neuron; + std::vector<std::basic_string<char>> s= GetParameterStringList("model.autoencoder.nbneuron"); + nb_neuron.SetSize(s.size()); + for (int i=0; i<s.size(); i++){ // This will be templated later (the 3) + nb_neuron[i]=std::stoi(s[i]); + } + std::cout << nb_neuron << std::endl; + dimredTrainer->SetNumberOfHiddenNeurons(nb_neuron); dimredTrainer->SetNumberOfIterations(GetParameterInt("model.autoencoder.nbiter")); dimredTrainer->SetRegularization(GetParameterFloat("model.autoencoder.regularization")); dimredTrainer->SetRegularization(GetParameterFloat("model.autoencoder.noise")); @@ -108,7 +116,9 @@ void cbLearningApplicationBaseDR<TInputValue,TOutputValue> std::cout << "before train" << std::endl; dimredTrainer->Train(); std::cout << "after train" << std::endl; - dimredTrainer->Save(modelPath); + dimredTrainer->Save(modelPath); + + } } //end namespace wrapper