[mlpack-git] master: 1 : change ColumnsToBlocks from function to class(place in core/math) 2 : make NormalizeColByMax as public function(old name is MaximizeHiddenInputs) (662d770)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Mon Nov 30 10:40:30 EST 2015


Repository : https://github.com/mlpack/mlpack

On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/5aaf0e441dd64a5de9a0210aa7a837eecf162d12...e4519fc42a2a340cf0387ab082bf49b9715c871b

>---------------------------------------------------------------

commit 662d77029dae2f47c9c68dbc81f8d92d65b6e76f
Author: stereomatchingkiss <stereomatchingkiss at gmail.com>
Date:   Thu Nov 12 15:53:05 2015 +0800

    1 : change ColumnsToBlocks from function to class(place in core/math)
    2 : make NormalizeColByMax as public function(old name is MaximizeHiddenInputs)


>---------------------------------------------------------------

662d77029dae2f47c9c68dbc81f8d92d65b6e76f
 .../methods/sparse_autoencoder/maximal_inputs.cpp  | 96 +++-------------------
 .../methods/sparse_autoencoder/maximal_inputs.hpp  | 44 +++-------
 2 files changed, 23 insertions(+), 117 deletions(-)

diff --git a/src/mlpack/methods/sparse_autoencoder/maximal_inputs.cpp b/src/mlpack/methods/sparse_autoencoder/maximal_inputs.cpp
index 624d834..0d12309 100644
--- a/src/mlpack/methods/sparse_autoencoder/maximal_inputs.cpp
+++ b/src/mlpack/methods/sparse_autoencoder/maximal_inputs.cpp
@@ -3,37 +3,21 @@
 namespace mlpack {
 namespace nn {
 
-namespace {
-
-std::pair<arma::uword, arma::uword> GetSize(arma::mat const &input)
+void MaximalInputs(const arma::mat &parameters, arma::mat &output)
 {
-  arma::uword rows = 0, cols = 0;
-  if(std::pow(std::floor(std::sqrt(input.n_cols)), 2) != input.n_cols)
-  {
-    cols = static_cast<arma::uword>(std::ceil(std::sqrt(input.n_cols)));
-    while(input.n_cols % cols != 0 && cols < 1.2*std::sqrt(input.n_cols))
-    {
-      ++cols;
-    }
-    rows = static_cast<arma::uword>
-           (std::ceil(input.n_cols/static_cast<double>(cols)));
-  }
-  else
-  {
-    cols = static_cast<arma::uword>(std::sqrt(input.n_cols));
-    rows = cols;
-  }
+  arma::mat paramTemp(parameters.submat(0, 0, (parameters.n_rows-1)/2 - 1,
+                                        parameters.n_cols - 2).t());
+  double const mean = arma::mean(arma::mean(paramTemp));
+  paramTemp -= mean;
 
-  return {rows, cols};
+  NormalizeColByMax(paramTemp, output);
 }
 
-void MaximizeHiddenUnit(arma::uword rows, arma::uword cols,
-                        const arma::mat &input,
-                        arma::mat &output)
+void NormalizeColByMax(const arma::mat &input,
+                       arma::mat &output)
 {
-  const arma::uword size = rows * cols;
-  output.set_size(input.n_rows, size);
-  for(arma::uword i = 0; i != size; ++i)
+  output.set_size(input.n_rows, input.n_cols);
+  for(arma::uword i = 0; i != input.n_cols; ++i)
   {
     const double max  = arma::max(arma::abs(input.col(i)));
     if (max != 0.0)
@@ -47,65 +31,5 @@ void MaximizeHiddenUnit(arma::uword rows, arma::uword cols,
   }
 }
 
-}
-
-
-
-std::pair<arma::uword, arma::uword> MaximalInputs(const arma::mat &parameters, arma::mat &output)
-{
-  arma::mat paramTemp(parameters.submat(0, 0, (parameters.n_rows-1)/2 - 1,
-                                        parameters.n_cols - 2).t());
-  double const mean = arma::mean(arma::mean(paramTemp));
-  paramTemp -= mean;
-
-  const auto Size = GetSize(paramTemp);
-  MaximizeHiddenUnit(Size.first, Size.second, paramTemp, output);
-
-  return Size;
-}
-
-void ColumnsToBlocks(const arma::mat &maximalInputs,
-                     arma::mat &outputs, arma::uword rows, arma::uword cols,
-                     bool scale, double minRange,
-                     double maxRange)
-{
-  if(rows * cols != maximalInputs.n_cols)
-  {
-    throw std::range_error("rows * cols != maximalInputs.n_cols");
-  }
-
-  arma::uword const squareRows = static_cast<arma::uword>(std::sqrt(maximalInputs.n_rows));
-  arma::uword const buf = 1;
-
-  arma::uword const offset = squareRows+buf;
-  outputs.ones(buf+rows*(offset),
-               buf+cols*(offset));
-  outputs *= -1;
-
-  arma::uword k = 0;
-  for(arma::uword i = 0; i != rows; ++i) {
-    for(arma::uword j = 0; j != cols; ++j) {
-      // Now, copy the elements of the row to the output submatrix.
-      const arma::uword minRow = buf + i * offset;
-      const arma::uword minCol = buf + j * offset;
-      const arma::uword maxRow = i * offset + squareRows;
-      const arma::uword maxCol = j * offset + squareRows;
-
-      outputs.submat(minRow, minCol, maxRow, maxCol) =
-        arma::reshape(maximalInputs.col(k++), squareRows, squareRows);
-    }
-  }
-
-  if(scale)
-  {
-    const double max = outputs.max();
-    const double min = outputs.min();
-    if((max - min) != 0)
-    {
-      outputs = (outputs - min) / (max - min) * (maxRange - minRange) + minRange;
-    }
-  }
-}
-
 } // namespace nn
 } // namespace mlpack
diff --git a/src/mlpack/methods/sparse_autoencoder/maximal_inputs.hpp b/src/mlpack/methods/sparse_autoencoder/maximal_inputs.hpp
index 0a6bc94..bbc1a96 100644
--- a/src/mlpack/methods/sparse_autoencoder/maximal_inputs.hpp
+++ b/src/mlpack/methods/sparse_autoencoder/maximal_inputs.hpp
@@ -13,7 +13,6 @@ namespace nn {
  * http://deeplearning.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder
  * @param params The parameters want to maximize
  * @param output Parameters after maximize
- * @return Suggestion rows and cols for the function "ColumnsToBlocks"
  * @pre 1 : The layout of the parameters should be same as following
  * //          vSize   1
  * //       |        |  |
@@ -40,45 +39,28 @@ namespace nn {
  * SparseAutoencoder<L_BFGS> encoder2(optimizer);
  *
  * arma::mat maximalInput; //store the features learned by sparse autoencoder
- * const auto Size = mlpack::nn::MaximalInputs(encoder2.Parameters(), maximalInput);
+ * mlpack::nn::MaximalInputs(encoder2.Parameters(), maximalInput);
  *
  * arma::mat outputs;
  * const bool scale = true;
- * //put the maximalInput of each col into rows * cols(Size.first * Size.second) blocks,
- * //rows * cols must same as maximalInput.n_cols.If you are training a bunch of images,
- * //this function could help you visualize your trained results
- * mlpack::nn::ColumnsToBlocks(maximalInput, outputs, Size.first, Size.second, scale);
+ *
+ * ColumnsToBlocks ctb(5,5);
+ * arma::mat output;
+ * ctb.Transform(maximalInput, output);
+ * //you can save the output as a pgm, this may help you visualize the training results
+ * output.save(fileName, arma::pgm_binary);
  *
  * @endcode
  */
-std::pair<arma::uword, arma::uword> MaximalInputs(const arma::mat &parameters, arma::mat &output);
+void MaximalInputs(const arma::mat &parameters, arma::mat &output);
 
 /**
- * Transform the output of "MaximalInputs" to blocks, if your training samples are images,
- * this function could help you visualize your training results
- * @param maximalInputs Parameters after maximize by "MaximalInputs", each col assiociate to one sample
- * @param output Maximal inputs regrouped to blocks
- * @param rows number of blocks per cols
- * @param cols number of blocks per rows
- * @param scale False, the output will not be scaled and vice versa
- * @param minRange minimum range of the output
- * @param maxRange maximum range of the output
- * @code
- * arma::mat maximalInput; //store the features learned by sparse autoencoder
- * const auto Size = mlpack::nn::MaximalInputs(encoder2.Parameters(), maximalInput);
- *
- * arma::mat outputs;
- * const bool scale = true;
- * //put the maximalInput of each col into rows * cols(Size.first * Size.second) blocks,
- * //rows * cols must same as maximalInput.n_cols.If you are training a bunch of images,
- * //this function could help you visualize your trained results
- * mlpack::nn::ColumnsToBlocks(maximalInput, outputs, Size.first, Size.second, scale);
- * @endcode
+ * Normalize the cols with its maximum value if it is not zero
+ * @param input the input data want to normalize
+ * @param output inputs after normalize
  */
-void ColumnsToBlocks(const arma::mat &maximalInputs,
-                     arma::mat &outputs, arma::uword rows, arma::uword cols,
-                     bool scale = false,
-                     double minRange = 0, double maxRange = 255);
+void NormalizeColByMax(const arma::mat &input,
+                       arma::mat &output);
 
 } // namespace nn
 } // namespace mlpack



More information about the mlpack-git mailing list