From 8a6709f089b72001bee41f23989205fda694a113 Mon Sep 17 00:00:00 2001 From: Manish Date: Wed, 13 Jun 2018 18:33:02 +0530 Subject: [PATCH] Added a range parameter to calculate impostors after some particular iterations --- src/mlpack/methods/lmnn/lmnn.hpp | 5 +++ src/mlpack/methods/lmnn/lmnn_function.hpp | 9 +++++ .../methods/lmnn/lmnn_function_impl.hpp | 37 +++++++++++++------ src/mlpack/methods/lmnn/lmnn_main.cpp | 7 ++++ 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/mlpack/methods/lmnn/lmnn.hpp b/src/mlpack/methods/lmnn/lmnn.hpp index 38e03f93b3..13d32fdb93 100644 --- a/src/mlpack/methods/lmnn/lmnn.hpp +++ b/src/mlpack/methods/lmnn/lmnn.hpp @@ -75,6 +75,11 @@ class LMNN //! Modify the regularization value. double& Regularization() { return objFunction.Regularization(); } + //! Access the range value. + const size_t& Range() const { return objFunction.Range(); } + //! Modify the range value. + size_t& Range() { return objFunction.Range(); } + //! Access the value of k. const size_t& K() const { return k; } diff --git a/src/mlpack/methods/lmnn/lmnn_function.hpp b/src/mlpack/methods/lmnn/lmnn_function.hpp index 22d7ff8179..f0949b418f 100644 --- a/src/mlpack/methods/lmnn/lmnn_function.hpp +++ b/src/mlpack/methods/lmnn/lmnn_function.hpp @@ -157,6 +157,11 @@ class LMNNFunction //! Modify the value of k. size_t& K() { return k; } + //! Access the value of range. + const size_t& Range() const { return range; } + //! Modify the value of k. + size_t& Range() { return range; } + private: //! data. This will be an alias until Shuffle() is called. arma::mat dataset; @@ -176,6 +181,10 @@ class LMNNFunction MetricType metric; //! Regularization value. double regularization; + //! Keep iterations count. + size_t iteration; + //! Range after which impostors need to be recalculated. + size_t range; //! Holds pre-calculated cij. arma::mat p_cij; //! False if nothing has ever been precalculated. diff --git a/src/mlpack/methods/lmnn/lmnn_function_impl.hpp b/src/mlpack/methods/lmnn/lmnn_function_impl.hpp index 38a182c0bc..0d121d6e19 100644 --- a/src/mlpack/methods/lmnn/lmnn_function_impl.hpp +++ b/src/mlpack/methods/lmnn/lmnn_function_impl.hpp @@ -32,6 +32,8 @@ LMNNFunction::LMNNFunction(const arma::mat& dataset, k(k), metric(metric), regularization(regularization), + iteration(0), + range(1), precalculated(false) { // Initialize the initial learning point. @@ -74,9 +76,12 @@ double LMNNFunction::Evaluate(const arma::mat& coordinates) // Apply metric over dataset. transformedDataset = coordinates * dataset; - // Re-calculate impostors on transformed dataset. - Constraints constraint(transformedDataset, labels, k); - constraint.Impostors(impostors); + if (iteration++ % range == 0) + { + // Re-calculate impostors on transformed dataset. + Constraints constraint(transformedDataset, labels, k); + constraint.Impostors(impostors); + } for (size_t i = 0; i < dataset.n_cols; i++) { @@ -128,8 +133,12 @@ double LMNNFunction::Evaluate(const arma::mat& coordinates, // Apply metric over dataset. transformedDataset = coordinates * dataset; - Constraints constraint(transformedDataset, labels, k); - constraint.Impostors(impostors, begin, batchSize); + if (iteration++ % range == 0) + { + // Re-calculate impostors on transformed dataset. + Constraints constraint(transformedDataset, labels, k); + constraint.Impostors(impostors, begin, batchSize); + } for (size_t i = begin; i < begin + batchSize; i++) { @@ -286,9 +295,12 @@ double LMNNFunction::EvaluateWithGradient( // Apply metric over dataset. transformedDataset = coordinates * dataset; - // Calculate impostors. - Constraints constraint(transformedDataset, labels, k); - constraint.Impostors(impostors); + if (iteration++ % range == 0) + { + // Re-calculate impostors on transformed dataset. + Constraints constraint(transformedDataset, labels, k); + constraint.Impostors(impostors); + } gradient.zeros(coordinates.n_rows, coordinates.n_cols); @@ -361,9 +373,12 @@ double LMNNFunction::EvaluateWithGradient( // Apply metric over dataset. transformedDataset = coordinates * dataset; - // Calculate impostors. - Constraints constraint(transformedDataset, labels, k); - constraint.Impostors(impostors, begin, batchSize); + if (iteration++ % range == 0) + { + // Re-calculate impostors on transformed dataset. + Constraints constraint(transformedDataset, labels, k); + constraint.Impostors(impostors, begin, batchSize); + } gradient.zeros(coordinates.n_rows, coordinates.n_cols); diff --git a/src/mlpack/methods/lmnn/lmnn_main.cpp b/src/mlpack/methods/lmnn/lmnn_main.cpp index 32531435ef..6e69f8533b 100644 --- a/src/mlpack/methods/lmnn/lmnn_main.cpp +++ b/src/mlpack/methods/lmnn/lmnn_main.cpp @@ -134,6 +134,8 @@ PARAM_DOUBLE_IN("min_step", "Minimum step of line search for L-BFGS.", "m", 1e-20); PARAM_DOUBLE_IN("max_step", "Maximum step of line search for L-BFGS.", "M", 1e20); +PARAM_INT_IN("range", "Number of iterations after which impostors needs to be " + "recalculated", "R", 1); PARAM_INT_IN("seed", "Random seed. If 0, 'std::time(NULL)' is used.", "s", 0); using namespace mlpack; @@ -234,6 +236,7 @@ static void mlpackMain() const double beta2 = CLI::GetParam("beta2"); const double epsilon = CLI::GetParam("epsilon"); const double batchDelta = CLI::GetParam("batch_delta"); + const size_t range = (size_t) CLI::GetParam("range"); // Load data. arma::mat data = std::move(CLI::GetParam("input")); @@ -283,6 +286,7 @@ static void mlpackMain() { LMNN> lmnn(data, labels, numTargets); lmnn.Regularization() = regularization; + lmnn.Range() = range; lmnn.Optimizer().StepSize() = stepSize; lmnn.Optimizer().MaxIterations() = passes * data.n_cols; lmnn.Optimizer().Beta1() = beta1; @@ -298,6 +302,7 @@ static void mlpackMain() { LMNN, BBS_BB> lmnn(data, labels, numTargets); lmnn.Regularization() = regularization; + lmnn.Range() = range; lmnn.Optimizer().StepSize() = stepSize; lmnn.Optimizer().BatchDelta() = batchDelta; lmnn.Optimizer().MaxIterations() = passes * data.n_cols; @@ -313,6 +318,7 @@ static void mlpackMain() // diverge to inf causing serious memory problems. LMNN, StandardSGD> lmnn(data, labels, numTargets); lmnn.Regularization() = regularization; + lmnn.Range() = range; lmnn.Optimizer().StepSize() = stepSize; lmnn.Optimizer().MaxIterations() = passes * data.n_cols; lmnn.Optimizer().Tolerance() = tolerance; @@ -325,6 +331,7 @@ static void mlpackMain() { LMNN, L_BFGS> lmnn(data, labels, numTargets); lmnn.Regularization() = regularization; + lmnn.Range() = range; lmnn.Optimizer().NumBasis() = numBasis; lmnn.Optimizer().MaxIterations() = maxIterations; lmnn.Optimizer().ArmijoConstant() = armijoConstant;