[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