AutoEncoderTutorial.cpp
Go to the documentation of this file.
1 
2 #include <shark/Data/Pgm.h> //for exporting the learned filters
3 #include <shark/Data/SparseData.h>//for reading in the images as sparseData/Libsvm format
4 #include <shark/Models/Autoencoder.h>//normal autoencoder model
5 #include <shark/Models/TiedAutoencoder.h>//autoencoder with tied weights
7 #include <shark/Algorithms/GradientDescent/Rprop.h>// the RProp optimization algorithm
8 #include <shark/ObjectiveFunctions/Loss/SquaredLoss.h> // squared loss used for regression
9 #include <shark/ObjectiveFunctions/Regularizer.h> //L2 regulariziation
10 
11 using namespace std;
12 using namespace shark;
13 
14 //training of an auto encoder with one hidden layer
15 template<class AutoencoderModel>
17  UnlabeledData<RealVector> const& data,//the data to train with
18  std::size_t numHidden,//number of features in the autoencoder
19  std::size_t iterations, //number of iterations to optimize
20  double regularisation//strength of the regularisation
21 ){
22  //create the model
23  std::size_t inputs = dataDimension(data);
24  AutoencoderModel model;
25  model.setStructure(inputs, numHidden);
26  initRandomUniform(model,-0.1*std::sqrt(1.0/inputs),0.1*std::sqrt(1.0/inputs));
27  //create the objective function
28  LabeledData<RealVector,RealVector> trainSet(data,data);//labels identical to inputs
30  ErrorFunction error(trainSet, &model, &loss);
31  TwoNormRegularizer regularizer(error.numberOfVariables());
32  error.setRegularizer(regularisation,&regularizer);
33  //set up optimizer
34  IRpropPlusFull optimizer;
35  optimizer.init(error);
36  std::cout<<"Optimizing model: "+model.name()<<std::endl;
37  for(std::size_t i = 0; i != iterations; ++i){
38  optimizer.step(error);
39  std::cout<<i<<" "<<optimizer.solution().value<<std::endl;
40  }
41  model.setParameterVector(optimizer.solution().point);
42  return model;
43 
44 }
45 int main(int argc, char **argv)
46 {
47  if(argc < 2) {
48  cerr << "usage: " << argv[0] << " path/to/mnist_subset.libsvm" << endl;
49  return 1;
50  }
51  std::size_t numHidden = 200;
52  std::size_t iterations = 200;
53  double regularisation = 0.01;
54 
56  importSparseData( train, argv[1] );
57 
58  std::size_t numElems = train.numberOfElements();
59  for(std::size_t i = 0; i != numElems; ++i){
60  for(std::size_t j = 0; j != 784; ++j){
61  if(train.element(i).input(j) > 0.5){
62  train.element(i).input(j) = 1;
63  }else{
64  train.element(i).input(j) = 0;
65  }
66  }
67  }
68 
73 
74  Autoencoder1 net1 = trainAutoencoderModel<Autoencoder1>(train.inputs(),numHidden,iterations,regularisation);
75  Autoencoder2 net2 = trainAutoencoderModel<Autoencoder2>(train.inputs(),numHidden,iterations,regularisation);
76  Autoencoder3 net3 = trainAutoencoderModel<Autoencoder3>(train.inputs(),numHidden,iterations,regularisation);
77  Autoencoder4 net4 = trainAutoencoderModel<Autoencoder4>(train.inputs(),numHidden,iterations,regularisation);
78 
79  exportFiltersToPGMGrid("features1",net1.encoderMatrix(),28,28);
80  exportFiltersToPGMGrid("features2",net2.encoderMatrix(),28,28);
81  exportFiltersToPGMGrid("features3",net3.encoderMatrix(),28,28);
82  exportFiltersToPGMGrid("features4",net4.encoderMatrix(),28,28);
83 }