[mlpack-git] master: Gradient calculation speedup by iterating over the output maps. (d5dd528)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Sun Jul 5 08:53:30 EDT 2015


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

On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/d9e984e1c608679171ad52e8522916703c7b331f...267bf1f0ace881bea4a38bf1156cc9f503930f09

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

commit d5dd528e30e09ad3fcad29600bb6d49ac67dfcf5
Author: Marcus Edel <marcus.edel at fu-berlin.de>
Date:   Fri Jul 3 21:47:21 2015 +0200

    Gradient calculation speedup by iterating over the output maps.


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

d5dd528e30e09ad3fcad29600bb6d49ac67dfcf5
 .../methods/ann/connections/conv_connection.hpp    | 38 +++++++---------------
 1 file changed, 11 insertions(+), 27 deletions(-)

diff --git a/src/mlpack/methods/ann/connections/conv_connection.hpp b/src/mlpack/methods/ann/connections/conv_connection.hpp
index 26ebd10..2d22189 100644
--- a/src/mlpack/methods/ann/connections/conv_connection.hpp
+++ b/src/mlpack/methods/ann/connections/conv_connection.hpp
@@ -11,10 +11,9 @@
 
 #include <mlpack/core.hpp>
 #include <mlpack/methods/ann/init_rules/nguyen_widrow_init.hpp>
-#include <mlpack/methods/ann/optimizer/steepest_descent.hpp>
+#include <mlpack/methods/ann/optimizer/rmsprop.hpp>
 #include <mlpack/methods/ann/convolution_rules/border_modes.hpp>
 #include <mlpack/methods/ann/convolution_rules/naive_convolution.hpp>
-#include <mlpack/methods/ann/convolution_rules/fft_convolution.hpp>
 
 namespace mlpack{
 namespace ann  /** Artificial Neural Network. */{
@@ -135,19 +134,19 @@ class ConvConnection
    *
    * @param input The input activation.
    */
-  template<typename InputType>
-  void FeedForward(const InputType& input)
+  template<typename eT>
+  void FeedForward(const arma::Cube<eT>& input)
   {
     for (size_t outputmap = 0; outputmap < outputLayer.OutputMaps(); outputmap++)
     {
       for (size_t inputmap = 0; inputmap < inputLayer.OutputMaps(); inputmap++)
       {
-        InputType inputSlices = input.slices(
+        arma::Cube<eT> inputSlices = input.slices(
             inputmap * inputLayer.LayerSlices(),
             (inputmap * inputLayer.LayerSlices()) +
             inputLayer.LayerSlices() - 1);
 
-        InputType output;
+        arma::Cube<eT> output;
         ForwardConvolutionRule::Convolution(inputSlices,
             weights.slice(inputmap * outputLayer.OutputMaps() +
             outputmap), output);
@@ -169,9 +168,9 @@ class ConvConnection
   template<typename eT>
   void FeedBackward(const arma::Cube<eT>& error)
   {
-    delta = arma::zeros<arma::Cube<eT>>(inputLayer.InputActivation().n_rows,
-                                        inputLayer.InputActivation().n_cols,
-                                        inputLayer.InputActivation().n_slices);
+    delta = arma::zeros<arma::Cube<eT> >(inputLayer.InputActivation().n_rows,
+                                         inputLayer.InputActivation().n_cols,
+                                         inputLayer.InputActivation().n_slices);
 
     for (size_t outputmap = 0; outputmap < inputLayer.OutputMaps(); outputmap++)
     {
@@ -206,9 +205,10 @@ class ConvConnection
     gradient = arma::zeros<arma::Cube<eT> >(weights.n_rows, weights.n_cols,
         weights.n_slices);
 
-    for (size_t outputmap = 0, s = 0; outputmap < outputLayer.OutputMaps(); outputmap++)
+    for (size_t outputmap = 0; outputmap < outputLayer.OutputMaps(); outputmap++)
     {
-      for (size_t inputmap = 0; inputmap < inputLayer.OutputMaps(); inputmap++, s++)
+      for (size_t inputmap = 0, s = outputmap; inputmap < inputLayer.OutputMaps();
+        inputmap++, s += OutputLayer().OutputMaps())
       {
         arma::Cube<eT> inputSlices = inputLayer.InputActivation().slices(
             inputmap * inputLayer.LayerSlices(), (inputmap + 1) *
@@ -227,22 +227,6 @@ class ConvConnection
         gradient.slice(s) /= inputLayer.LayerSlices();
       }
     }
-
-    if (InputLayer().OutputMaps() != 1)
-    {
-      arma::Cube<eT> temp = arma::zeros<arma::Cube<eT> >(weights.n_rows, weights.n_cols,
-        weights.n_slices);
-
-      for (size_t i = 0, g = 0; i < OutputLayer().OutputMaps(); i++)
-      {
-        for (size_t j = i; j < weights.n_slices; j+= OutputLayer().OutputMaps(), g++)
-        {
-          temp.slice(j) = gradient.slice(g);
-        }
-      }
-
-      gradient = temp;
-    }
   }
 
   //! Get the convolution kernel.



More information about the mlpack-git mailing list