diff --git a/src/similarity/features/SimilarityFeaturesSearcher.cpp b/src/similarity/features/SimilarityFeaturesSearcher.cpp index a2db9e8b..b95389a5 100644 --- a/src/similarity/features/SimilarityFeaturesSearcher.cpp +++ b/src/similarity/features/SimilarityFeaturesSearcher.cpp @@ -156,7 +156,7 @@ FeaturesSearcher::FeaturesSearcher(Database::Session& session, for (auto& sample : samples) dataNormalizer.normalizeData(sample); - SOM::Coordinate size {static_cast(std::sqrt(samples.size() / 4))}; + SOM::Coordinate size {static_cast(std::sqrt(samples.size() / trainSettings.sampleCountPerNeuron))}; LMS_LOG(SIMILARITY, INFO) << "Found " << samples.size() << " tracks, constructing a " << size << "*" << size << " network"; SOM::Network network {size, size, nbDimensions}; @@ -170,7 +170,7 @@ FeaturesSearcher::FeaturesSearcher(Database::Session& session, }}; LMS_LOG(SIMILARITY, DEBUG) << "Training network..."; - network.train(samples, trainSettings.nbIterations, progressIndicator, stopRequested); + network.train(samples, trainSettings.iterationCount, progressIndicator, stopRequested); LMS_LOG(SIMILARITY, DEBUG) << "Training network DONE"; if (stopRequested && stopRequested()) diff --git a/src/similarity/features/SimilarityFeaturesSearcher.hpp b/src/similarity/features/SimilarityFeaturesSearcher.hpp index f8b9201f..0f9f6ae3 100644 --- a/src/similarity/features/SimilarityFeaturesSearcher.hpp +++ b/src/similarity/features/SimilarityFeaturesSearcher.hpp @@ -50,7 +50,8 @@ class FeaturesSearcher // Use training (may be very slow) struct TrainSettings { - std::size_t nbIterations {10}; + std::size_t iterationCount {10}; + float sampleCountPerNeuron {4}; FeatureSettingsMap featureSettingsMap; }; FeaturesSearcher(Database::Session& session, const TrainSettings& trainSettings, StopRequestedFunction stopRequested = {}); diff --git a/tools/similarity-parameters/LmsSimilarityParameters.cpp b/tools/similarity-parameters/LmsSimilarityParameters.cpp index ae37e72e..f6176d09 100644 --- a/tools/similarity-parameters/LmsSimilarityParameters.cpp +++ b/tools/similarity-parameters/LmsSimilarityParameters.cpp @@ -210,15 +210,12 @@ computeTrackScore(Database::Session& session, Database::IdType track1Id, Databas static SimilarityScore -computeSimilarityScore(Database::Session& session, const FeatureSettingsMap& featuresSettings) +computeSimilarityScore(Database::Session& session, FeaturesSearcher::TrainSettings trainSettings, const FeatureSettingsMap& featuresSettings) { std::cout << "Compute score of: "; printFeatureSettingsMap(featuresSettings); std::cout << std::endl; - FeaturesSearcher::TrainSettings trainSettings; - trainSettings.nbIterations = 10; - trainSettings.featureSettingsMap = featuresSettings; FeaturesSearcher searcher {session, trainSettings}; const std::vector trackIds = std::invoke([&]() @@ -230,16 +227,17 @@ computeSimilarityScore(Database::Session& session, const FeatureSettingsMap& fea SimilarityScore score {}; for (Database::IdType trackId : trackIds) { -// std::cout << "Processing track '" << trackToString(session, trackId) << "'" << std::endl; + constexpr std::size_t nbSimilarTracks {3}; + std::cout << "Processing track '" << trackToString(session, trackId) << "'" << std::endl; SimilarityScore factor {1}; - for (Database::IdType similarTrackId : searcher.getSimilarTracks({trackId}, 3)) + for (Database::IdType similarTrackId : searcher.getSimilarTracks({trackId}, nbSimilarTracks)) { SimilarityScore trackScore {computeTrackScore(session, trackId, similarTrackId)}; -// std::cout << "\tScore = " << trackScore << " (*" << factor << ") with track '" << trackToString(session, similarTrackId) << "'" << std::endl; + std::cout << "\tScore = " << trackScore << " (*" << factor << ") with track '" << trackToString(session, similarTrackId) << "'" << std::endl; trackScore *= factor; score += trackScore; - factor -= (SimilarityScore {1}/3); + factor -= (SimilarityScore {1}/nbSimilarTracks ); } } @@ -323,6 +321,7 @@ int main(int argc, char *argv[]) initialPopulation.emplace_back(std::move(settings)); } + GeneticAlgorithm::Params params; params.nbWorkers = nbWorkers; params.nbGenerations = 300; @@ -332,8 +331,13 @@ int main(int argc, char *argv[]) params.scoreFunction = [&](const FeatureSettingsMap& settings) { + FeaturesSearcher::TrainSettings trainSettings; + trainSettings.iterationCount = 10; + trainSettings.sampleCountPerNeuron = 1.5; + trainSettings.featureSettingsMap = settings; + Database::SessionPool::ScopedSession scopedSession {sessionPool}; - return computeSimilarityScore(scopedSession.get(), settings); + return computeSimilarityScore(scopedSession.get(), trainSettings, settings); }; GeneticAlgorithm geneticAlgorithm {params}; diff --git a/tools/similarity/LmsSimilarity.cpp b/tools/similarity/LmsSimilarity.cpp index 25ff140b..7f82a692 100644 --- a/tools/similarity/LmsSimilarity.cpp +++ b/tools/similarity/LmsSimilarity.cpp @@ -102,7 +102,6 @@ int main(int argc, char *argv[]) std::cout << "Classifying tracks..." << std::endl; // may be long... struct FeaturesSearcher::TrainSettings trainSettings; - trainSettings.nbIterations = 10; trainSettings.featureSettingsMap = featuresSettings; FeaturesSearcher searcher {session, trainSettings}; std::cout << "Classifying tracks DONE" << std::endl;