[mlpack-git] master: Refactor convolutional network test for new network API. (1c6e9f7)

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


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

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

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

commit 1c6e9f7966c94b30c1ca8c7046aad81fa630a08e
Author: Marcus Edel <marcus.edel at fu-berlin.de>
Date:   Thu Sep 3 13:41:42 2015 +0200

    Refactor convolutional network test for new network API.


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

1c6e9f7966c94b30c1ca8c7046aad81fa630a08e
 src/mlpack/tests/convolutional_network_test.cpp | 265 ++++++++----------------
 1 file changed, 92 insertions(+), 173 deletions(-)

diff --git a/src/mlpack/tests/convolutional_network_test.cpp b/src/mlpack/tests/convolutional_network_test.cpp
index 206d8e1..4d105ab 100644
--- a/src/mlpack/tests/convolutional_network_test.cpp
+++ b/src/mlpack/tests/convolutional_network_test.cpp
@@ -7,23 +7,21 @@
 #include <mlpack/core.hpp>
 
 #include <mlpack/methods/ann/activation_functions/rectifier_function.hpp>
+#include <mlpack/methods/ann/activation_functions/logistic_function.hpp>
 
-#include <mlpack/methods/ann/connections/full_connection.hpp>
-#include <mlpack/methods/ann/connections/identity_connection.hpp>
-#include <mlpack/methods/ann/connections/bias_connection.hpp>
-#include <mlpack/methods/ann/connections/conv_connection.hpp>
-#include <mlpack/methods/ann/connections/pooling_connection.hpp>
-
-#include <mlpack/methods/ann/layer/neuron_layer.hpp>
-#include <mlpack/methods/ann/layer/dropout_layer.hpp>
+#include <mlpack/methods/ann/layer/one_hot_layer.hpp>
+#include <mlpack/methods/ann/layer/conv_layer.hpp>
+#include <mlpack/methods/ann/layer/pooling_layer.hpp>
 #include <mlpack/methods/ann/layer/softmax_layer.hpp>
 #include <mlpack/methods/ann/layer/bias_layer.hpp>
-#include <mlpack/methods/ann/layer/one_hot_layer.hpp>
+#include <mlpack/methods/ann/layer/linear_layer.hpp>
+#include <mlpack/methods/ann/layer/base_layer.hpp>
+#include <mlpack/methods/ann/layer/dropout_layer.hpp>
 
 #include <mlpack/methods/ann/cnn.hpp>
 #include <mlpack/methods/ann/trainer/trainer.hpp>
-#include <mlpack/methods/ann/performance_functions/mse_function.hpp>
 #include <mlpack/methods/ann/optimizer/ada_delta.hpp>
+#include <mlpack/methods/ann/optimizer/rmsprop.hpp>
 #include <mlpack/methods/ann/init_rules/zero_init.hpp>
 
 #include <boost/test/unit_test.hpp>
@@ -36,9 +34,12 @@ using namespace mlpack::ann;
 BOOST_AUTO_TEST_SUITE(ConvolutionalNetworkTest);
 
 /**
- * Train the vanilla network on a larger dataset.
+ * Train and evaluate a vanilla network with the specified structure.
  */
-BOOST_AUTO_TEST_CASE(VanillaNetworkTest)
+template<
+    typename PerformanceFunction
+>
+void BuildVanillaNetwork()
 {
   arma::mat X;
   X.load("mnist_first250_training_4s_and_9s.arm");
@@ -56,7 +57,7 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkTest)
   {
     if (i < nPoints / 2)
     {
-      Y.col(i)(1) = 1;
+      Y.col(i)(5) = 1;
     }
     else
     {
@@ -64,6 +65,10 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkTest)
     }
   }
 
+  arma::cube input = arma::cube(28, 28, nPoints);
+  for (size_t i = 0; i < nPoints; i++)
+    input.slice(i) = arma::mat(X.colptr(i), 28, 28);
+
   /*
    * Construct a convolutional neural network with a 28x28x1 input layer,
    * 24x24x6 convolution layer, 12x12x6 pooling layer, 8x8x12 convolution layer
@@ -82,86 +87,50 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkTest)
    * +---+        +---+        +---+        +---+        +---+    +---+
    */
 
-  NeuronLayer<RectifierFunction, arma::cube> inputLayer(28, 28, 1);
-
-  ConvLayer<RectifierFunction> convLayer0(24, 24, inputLayer.LayerSlices(), 6);
-  ConvConnection<decltype(inputLayer),
-                 decltype(convLayer0),
-                 mlpack::ann::AdaDelta>
-      con1(inputLayer, convLayer0, 5);
-
-  BiasLayer<> biasLayer0(6);
-  BiasConnection<decltype(biasLayer0),
-                 decltype(convLayer0),
-                 mlpack::ann::AdaDelta,
-                 mlpack::ann::ZeroInitialization>
-  con1Bias(biasLayer0, convLayer0);
-
-  PoolingLayer<> poolingLayer0(12, 12, inputLayer.LayerSlices(), 6);
-  PoolingConnection<decltype(convLayer0),
-                    decltype(poolingLayer0)>
-      con2(convLayer0, poolingLayer0);
-
-  ConvLayer<RectifierFunction> convLayer1(8, 8, inputLayer.LayerSlices(), 12);
-  ConvConnection<decltype(poolingLayer0),
-                 decltype(convLayer1),
-                 mlpack::ann::AdaDelta>
-      con3(poolingLayer0, convLayer1, 5);
-
-  BiasLayer<> biasLayer3(12);
-  BiasConnection<decltype(biasLayer3),
-                 decltype(convLayer1),
-                 mlpack::ann::AdaDelta,
-                 mlpack::ann::ZeroInitialization>
-  con3Bias(biasLayer3, convLayer1);
-
-  PoolingLayer<> poolingLayer1(4, 4, inputLayer.LayerSlices(), 12);
-  PoolingConnection<decltype(convLayer1),
-                    decltype(poolingLayer1)>
-      con4(convLayer1, poolingLayer1);
-
-  SoftmaxLayer<arma::mat> outputLayer(10,
-    inputLayer.LayerSlices());
-
-  FullConnection<decltype(poolingLayer1),
-                 decltype(outputLayer),
-                 mlpack::ann::AdaDelta>
-    con5(poolingLayer1, outputLayer);
-
-  BiasLayer<> biasLayer1(1);
-  FullConnection<decltype(biasLayer1),
-                 decltype(outputLayer),
-                 mlpack::ann::AdaDelta,
-                 mlpack::ann::ZeroInitialization>
-    con5Bias(biasLayer1, outputLayer);
-
-  OneHotLayer finalOutputLayer;
-
-  auto module0 = std::tie(con1, con1Bias);
-  auto module1 = std::tie(con2);
-  auto module2 = std::tie(con3, con3Bias);
-  auto module3 = std::tie(con4);
-  auto module4 = std::tie(con5, con5Bias);
-  auto modules = std::tie(module0, module1, module2, module3, module4);
-
-  CNN<decltype(modules), decltype(finalOutputLayer)>
-      net(modules, finalOutputLayer);
-
-  Trainer<decltype(net)> trainer(net, 50, 1, 0.03);
+  ConvLayer<AdaDelta> convLayer0(1, 8, 5, 5);
+  BiasLayer2D<AdaDelta, ZeroInitialization> biasLayer0(8);
+  BaseLayer2D<PerformanceFunction> baseLayer0;
+  PoolingLayer<> poolingLayer0(2);
 
-  arma::cube input = arma::cube(28, 28, nPoints);
-  for (size_t i = 0; i < nPoints; i++)
-    input.slice(i) = arma::mat(X.colptr(i), 28, 28);
+  ConvLayer<AdaDelta> convLayer1(8, 12, 5, 5);
+  BiasLayer2D<AdaDelta, ZeroInitialization> biasLayer1(12);
+  BaseLayer2D<PerformanceFunction> baseLayer1;
+  PoolingLayer<> poolingLayer1(2);
+
+  LinearMappingLayer<AdaDelta> linearLayer0(192, 10);
+  BiasLayer<AdaDelta> biasLayer2(10);
+  SoftmaxLayer<> softmaxLayer0;
+
+  OneHotLayer outputLayer;
+
+  auto modules = std::tie(convLayer0, biasLayer0, baseLayer0, poolingLayer0,
+                          convLayer1, biasLayer1, baseLayer1, poolingLayer1,
+                          linearLayer0, biasLayer2, softmaxLayer0);
 
+  CNN<decltype(modules), decltype(outputLayer)>
+      net(modules, outputLayer);
+
+  Trainer<decltype(net)> trainer(net, 100, 1, 0.3);
   trainer.Train(input, Y, input, Y);
 
-  BOOST_REQUIRE_LE(trainer.ValidationError(), 0.03);
+  BOOST_REQUIRE_LE(trainer.ValidationError(), 0.3);
 }
 
 /**
- * Train the network on a larger dataset.
+ * Train the vanilla network on a larger dataset.
  */
-BOOST_AUTO_TEST_CASE(VanillaNetworkDropoutTest)
+BOOST_AUTO_TEST_CASE(VanillaNetworkTest)
+{
+  BuildVanillaNetwork<RectifierFunction>();
+}
+
+/**
+ * Train and evaluate a vanilla network with the specified structure.
+ */
+template<
+    typename PerformanceFunction
+>
+void BuildVanillaDropoutNetwork()
 {
   arma::mat X;
   X.load("mnist_first250_training_4s_and_9s.arm");
@@ -179,7 +148,7 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkDropoutTest)
   {
     if (i < nPoints / 2)
     {
-      Y.col(i)(1) = 1;
+      Y.col(i)(5) = 1;
     }
     else
     {
@@ -187,6 +156,10 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkDropoutTest)
     }
   }
 
+  arma::cube input = arma::cube(28, 28, nPoints);
+  for (size_t i = 0; i < nPoints; i++)
+    input.slice(i) = arma::mat(X.colptr(i), 28, 28);
+
   /*
    * Construct a convolutional neural network with a 28x28x1 input layer,
    * 24x24x6 convolution layer, 12x12x6 pooling layer, 8x8x12 convolution layer,
@@ -205,97 +178,43 @@ BOOST_AUTO_TEST_CASE(VanillaNetworkDropoutTest)
    * +---+        +---+        +---+        +---+                    +---+
    */
 
-  NeuronLayer<RectifierFunction, arma::cube> inputLayer(28, 28, 1);
-
-  ConvLayer<RectifierFunction> convLayer0(24, 24, inputLayer.LayerSlices(), 6);
-  ConvConnection<decltype(inputLayer),
-                 decltype(convLayer0),
-                 mlpack::ann::AdaDelta>
-      con1(inputLayer, convLayer0, 5);
-
-  BiasLayer<> biasLayer0(6);
-  BiasConnection<decltype(biasLayer0),
-                 decltype(convLayer0),
-                 mlpack::ann::AdaDelta,
-                 mlpack::ann::ZeroInitialization>
-      con1Bias(biasLayer0, convLayer0);
-
-  DropoutLayer<arma::cube> dropoutLayer0(24, 24, inputLayer.LayerSlices(), 6);
-  IdentityConnection<decltype(convLayer0),
-                     decltype(dropoutLayer0),
-                     mlpack::ann::AdaDelta,
-                     arma::cube>
-      con1Dropout(convLayer0, dropoutLayer0);
-
-  PoolingLayer<> poolingLayer0(12, 12, inputLayer.LayerSlices(), 6);
-  PoolingConnection<decltype(dropoutLayer0),
-                  decltype(poolingLayer0)>
-      con2(dropoutLayer0, poolingLayer0);
-
-  ConvLayer<RectifierFunction> convLayer1(8, 8, inputLayer.LayerSlices(), 12);
-  ConvConnection<decltype(poolingLayer0),
-                 decltype(convLayer1),
-                 mlpack::ann::AdaDelta>
-      con3(poolingLayer0, convLayer1, 5);
-
-  BiasLayer<> biasLayer3(12);
-  BiasConnection<decltype(biasLayer3),
-                 decltype(convLayer1),
-                 mlpack::ann::AdaDelta,
-                 mlpack::ann::ZeroInitialization>
-      con3Bias(biasLayer3, convLayer1);
-
-  DropoutLayer<arma::cube> dropoutLayer3(8, 8, inputLayer.LayerSlices(), 12);
-  IdentityConnection<decltype(convLayer1),
-                     decltype(dropoutLayer3),
-                     mlpack::ann::AdaDelta,
-                     arma::cube>
-      con3Dropout(convLayer1, dropoutLayer3);
-
-  PoolingLayer<> poolingLayer1(4, 4, inputLayer.LayerSlices(), 12);
-  PoolingConnection<decltype(dropoutLayer3),
-                    decltype(poolingLayer1)>
-      con4(dropoutLayer3, poolingLayer1);
-
-  SoftmaxLayer<arma::mat> outputLayer(10,
-    inputLayer.LayerSlices());
-
-  FullConnection<decltype(poolingLayer1),
-                 decltype(outputLayer),
-                 mlpack::ann::AdaDelta>
-      con5(poolingLayer1, outputLayer);
-
-  BiasLayer<> biasLayer1(1);
-  FullConnection<decltype(biasLayer1),
-                 decltype(outputLayer),
-                 mlpack::ann::AdaDelta,
-                 mlpack::ann::ZeroInitialization>
-      con5Bias(biasLayer1, outputLayer);
-
-  OneHotLayer finalOutputLayer;
-
-  auto module0 = std::tie(con1, con1Bias);
-  auto module0Dropout = std::tie(con1Dropout);
-  auto module1 = std::tie(con2);
-  auto module2 = std::tie(con3, con3Bias);
-  auto module2Dropout = std::tie(con3Dropout);
-  auto module3 = std::tie(con4);
-  auto module4 = std::tie(con5, con5Bias);
-  auto modules = std::tie(module0, module0Dropout, module1, module2,
-      module2Dropout, module3, module4);
-
-  CNN<decltype(modules), decltype(finalOutputLayer)>
-      net(modules, finalOutputLayer);
-
-  Trainer<decltype(net)> trainer(net, 50, 1, 0.03);
+  ConvLayer<AdaDelta> convLayer0(1, 4, 5, 5);
+  BiasLayer2D<AdaDelta, ZeroInitialization> biasLayer0(4);
+  DropoutLayer2D<> dropoutLayer0;
+  BaseLayer2D<PerformanceFunction> baseLayer0;
+  PoolingLayer<> poolingLayer0(2);
 
-  arma::cube input = arma::cube(28, 28, nPoints);
-  for (size_t i = 0; i < nPoints; i++)
-    input.slice(i) = arma::mat(X.colptr(i), 28, 28);
+  ConvLayer<AdaDelta> convLayer1(4, 8, 5, 5);
+  BiasLayer2D<AdaDelta, ZeroInitialization> biasLayer1(8);
+  BaseLayer2D<PerformanceFunction> baseLayer1;
+  PoolingLayer<> poolingLayer1(2);
 
+  LinearMappingLayer<AdaDelta> linearLayer0(128, 10);
+  BiasLayer<AdaDelta> biasLayer2(10);
+  SoftmaxLayer<> softmaxLayer0;
+
+  OneHotLayer outputLayer;
+
+  auto modules = std::tie(convLayer0, biasLayer0, dropoutLayer0, baseLayer0,
+                          poolingLayer0, convLayer1, biasLayer1, baseLayer1,
+                          poolingLayer1, linearLayer0, biasLayer2,
+                          softmaxLayer0);
+
+  CNN<decltype(modules), decltype(outputLayer)>
+      net(modules, outputLayer);
+
+  Trainer<decltype(net)> trainer(net, 100, 1, 0.3);
   trainer.Train(input, Y, input, Y);
 
-  BOOST_REQUIRE_LE(trainer.ValidationError(), 0.03);
+  BOOST_REQUIRE_LE(trainer.ValidationError(), 0.3);
+}
+
+/**
+ * Train the network on a larger dataset using dropout.
+ */
+BOOST_AUTO_TEST_CASE(VanillaNetworkDropoutTest)
+{
+  BuildVanillaDropoutNetwork<RectifierFunction>();
 }
 
 BOOST_AUTO_TEST_SUITE_END();



More information about the mlpack-git mailing list