Made the number of samples per neuron configurable
This commit is contained in:
@@ -156,7 +156,7 @@ FeaturesSearcher::FeaturesSearcher(Database::Session& session,
|
|||||||
for (auto& sample : samples)
|
for (auto& sample : samples)
|
||||||
dataNormalizer.normalizeData(sample);
|
dataNormalizer.normalizeData(sample);
|
||||||
|
|
||||||
SOM::Coordinate size {static_cast<SOM::Coordinate>(std::sqrt(samples.size() / 4))};
|
SOM::Coordinate size {static_cast<SOM::Coordinate>(std::sqrt(samples.size() / trainSettings.sampleCountPerNeuron))};
|
||||||
LMS_LOG(SIMILARITY, INFO) << "Found " << samples.size() << " tracks, constructing a " << size << "*" << size << " network";
|
LMS_LOG(SIMILARITY, INFO) << "Found " << samples.size() << " tracks, constructing a " << size << "*" << size << " network";
|
||||||
|
|
||||||
SOM::Network network {size, size, nbDimensions};
|
SOM::Network network {size, size, nbDimensions};
|
||||||
@@ -170,7 +170,7 @@ FeaturesSearcher::FeaturesSearcher(Database::Session& session,
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
LMS_LOG(SIMILARITY, DEBUG) << "Training network...";
|
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";
|
LMS_LOG(SIMILARITY, DEBUG) << "Training network DONE";
|
||||||
|
|
||||||
if (stopRequested && stopRequested())
|
if (stopRequested && stopRequested())
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ class FeaturesSearcher
|
|||||||
// Use training (may be very slow)
|
// Use training (may be very slow)
|
||||||
struct TrainSettings
|
struct TrainSettings
|
||||||
{
|
{
|
||||||
std::size_t nbIterations {10};
|
std::size_t iterationCount {10};
|
||||||
|
float sampleCountPerNeuron {4};
|
||||||
FeatureSettingsMap featureSettingsMap;
|
FeatureSettingsMap featureSettingsMap;
|
||||||
};
|
};
|
||||||
FeaturesSearcher(Database::Session& session, const TrainSettings& trainSettings, StopRequestedFunction stopRequested = {});
|
FeaturesSearcher(Database::Session& session, const TrainSettings& trainSettings, StopRequestedFunction stopRequested = {});
|
||||||
|
|||||||
@@ -210,15 +210,12 @@ computeTrackScore(Database::Session& session, Database::IdType track1Id, Databas
|
|||||||
|
|
||||||
static
|
static
|
||||||
SimilarityScore
|
SimilarityScore
|
||||||
computeSimilarityScore(Database::Session& session, const FeatureSettingsMap& featuresSettings)
|
computeSimilarityScore(Database::Session& session, FeaturesSearcher::TrainSettings trainSettings, const FeatureSettingsMap& featuresSettings)
|
||||||
{
|
{
|
||||||
std::cout << "Compute score of: ";
|
std::cout << "Compute score of: ";
|
||||||
printFeatureSettingsMap(featuresSettings);
|
printFeatureSettingsMap(featuresSettings);
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
|
|
||||||
FeaturesSearcher::TrainSettings trainSettings;
|
|
||||||
trainSettings.nbIterations = 10;
|
|
||||||
trainSettings.featureSettingsMap = featuresSettings;
|
|
||||||
FeaturesSearcher searcher {session, trainSettings};
|
FeaturesSearcher searcher {session, trainSettings};
|
||||||
|
|
||||||
const std::vector<Database::IdType> trackIds = std::invoke([&]()
|
const std::vector<Database::IdType> trackIds = std::invoke([&]()
|
||||||
@@ -230,16 +227,17 @@ computeSimilarityScore(Database::Session& session, const FeatureSettingsMap& fea
|
|||||||
SimilarityScore score {};
|
SimilarityScore score {};
|
||||||
for (Database::IdType trackId : trackIds)
|
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};
|
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)};
|
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;
|
trackScore *= factor;
|
||||||
score += trackScore;
|
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));
|
initialPopulation.emplace_back(std::move(settings));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GeneticAlgorithm<FeatureSettingsMap>::Params params;
|
GeneticAlgorithm<FeatureSettingsMap>::Params params;
|
||||||
params.nbWorkers = nbWorkers;
|
params.nbWorkers = nbWorkers;
|
||||||
params.nbGenerations = 300;
|
params.nbGenerations = 300;
|
||||||
@@ -332,8 +331,13 @@ int main(int argc, char *argv[])
|
|||||||
params.scoreFunction =
|
params.scoreFunction =
|
||||||
[&](const FeatureSettingsMap& settings)
|
[&](const FeatureSettingsMap& settings)
|
||||||
{
|
{
|
||||||
|
FeaturesSearcher::TrainSettings trainSettings;
|
||||||
|
trainSettings.iterationCount = 10;
|
||||||
|
trainSettings.sampleCountPerNeuron = 1.5;
|
||||||
|
trainSettings.featureSettingsMap = settings;
|
||||||
|
|
||||||
Database::SessionPool::ScopedSession scopedSession {sessionPool};
|
Database::SessionPool::ScopedSession scopedSession {sessionPool};
|
||||||
return computeSimilarityScore(scopedSession.get(), settings);
|
return computeSimilarityScore(scopedSession.get(), trainSettings, settings);
|
||||||
};
|
};
|
||||||
|
|
||||||
GeneticAlgorithm<FeatureSettingsMap> geneticAlgorithm {params};
|
GeneticAlgorithm<FeatureSettingsMap> geneticAlgorithm {params};
|
||||||
|
|||||||
@@ -102,7 +102,6 @@ int main(int argc, char *argv[])
|
|||||||
std::cout << "Classifying tracks..." << std::endl;
|
std::cout << "Classifying tracks..." << std::endl;
|
||||||
// may be long...
|
// may be long...
|
||||||
struct FeaturesSearcher::TrainSettings trainSettings;
|
struct FeaturesSearcher::TrainSettings trainSettings;
|
||||||
trainSettings.nbIterations = 10;
|
|
||||||
trainSettings.featureSettingsMap = featuresSettings;
|
trainSettings.featureSettingsMap = featuresSettings;
|
||||||
FeaturesSearcher searcher {session, trainSettings};
|
FeaturesSearcher searcher {session, trainSettings};
|
||||||
std::cout << "Classifying tracks DONE" << std::endl;
|
std::cout << "Classifying tracks DONE" << std::endl;
|
||||||
|
|||||||
Reference in New Issue
Block a user