[mlpack-git] master: Use the filter matrix for the convolution function instead of the 3rd-order tensor. (7dcf30a)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Thu Sep 3 08:35:43 EDT 2015


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

On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/91ae1062772a0f2bbca9a072769629c2d775ae64...42d61dfdbc9b0cbce59398e67ea58544b0fa1919

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

commit 7dcf30a3257fda370521210247215d05e2d6e267
Author: Marcus Edel <marcus.edel at fu-berlin.de>
Date:   Thu Sep 3 14:32:17 2015 +0200

    Use the filter matrix for the convolution function instead of the 3rd-order tensor.


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

7dcf30a3257fda370521210247215d05e2d6e267
 src/mlpack/methods/ann/layer/conv_layer.hpp | 29 ++++++++++++-----------------
 1 file changed, 12 insertions(+), 17 deletions(-)

diff --git a/src/mlpack/methods/ann/layer/conv_layer.hpp b/src/mlpack/methods/ann/layer/conv_layer.hpp
index a6498c4..5d6f7a1 100644
--- a/src/mlpack/methods/ann/layer/conv_layer.hpp
+++ b/src/mlpack/methods/ann/layer/conv_layer.hpp
@@ -110,19 +110,16 @@ class ConvLayer
     const size_t wConv = ConvOutSize(input.n_rows, wfilter, xStride, wPad);
     const size_t hConv = ConvOutSize(input.n_cols, hfilter, yStride, hPad);
 
-    output = arma::Cube<eT>(wConv, hConv, outMaps);
+    output = arma::zeros<arma::Cube<eT> >(wConv, hConv, outMaps);
     for (size_t outMap = 0, outMapIdx = 0; outMap < outMaps; outMap++)
     {
       for (size_t inMap = 0; inMap < inMaps; inMap++, outMapIdx++)
       {
-        arma::Cube<eT> inputSlices = input.slices(inMap, inMap);
+        arma::Mat<eT> convOutput;
+        ForwardConvolutionRule::Convolution(input.slice(inMap),
+            weights.slice(outMap), convOutput);
 
-        arma::Cube<eT> convOutput;
-        ForwardConvolutionRule::Convolution(inputSlices,
-            weights.slice(inMap * outMaps +
-            outMap), convOutput);
-
-        output.slices(outMap, outMap) += convOutput;
+        output.slice(outMap) += convOutput;
       }
     }
   }
@@ -137,28 +134,26 @@ class ConvLayer
    * @param g The calculated gradient.
    */
   template<typename eT>
-  void Backward(const arma::Cube<eT>& input,
+  void Backward(const arma::Cube<eT>& /* unused */,
                 const arma::Cube<eT>& gy,
                 arma::Cube<eT>& g)
   {
-    g = arma::zeros<arma::Cube<eT> >(input.n_rows,
-                                     input.n_cols,
-                                     input.n_slices);
+    g = arma::zeros<arma::Cube<eT> >(inputParameter.n_rows,
+                                     inputParameter.n_cols,
+                                     inputParameter.n_slices);
 
     for (size_t outMap = 0, outMapIdx = 0; outMap < inMaps; outMap++)
     {
       for (size_t inMap = 0; inMap < outMaps; inMap++, outMapIdx++)
       {
-        arma::Cube<eT> errorSlices = gy.slices(inMap, inMap);
-
         arma::Mat<eT> rotatedFilter;
         Rotate180(weights.slice(outMap * outMaps + inMap), rotatedFilter);
 
-        arma::Cube<eT> output;
-        BackwardConvolutionRule::Convolution(errorSlices, rotatedFilter,
+        arma::Mat<eT> output;
+        BackwardConvolutionRule::Convolution(gy.slice(inMap), rotatedFilter,
             output);
 
-        g.slices(outMap, outMap) += output;
+        g.slice(outMap) += output;
       }
     }
   }



More information about the mlpack-git mailing list