diff --git a/bob/learn/misc/MAP_gmm_trainer.cpp b/bob/learn/misc/MAP_gmm_trainer.cpp index 30cf72901db174808439c4cb90aa7a25546537e8..e9b0fde0b2a70f0a9c3d4ac347930b72a73cafaf 100644 --- a/bob/learn/misc/MAP_gmm_trainer.cpp +++ b/bob/learn/misc/MAP_gmm_trainer.cpp @@ -27,7 +27,8 @@ static auto MAP_GMMTrainer_doc = bob::extension::ClassDoc( ) - .add_prototype("gmm_base_trainer,prior_gmm,[reynolds_adaptation],[relevance_factor],[alpha]","") + //.add_prototype("gmm_base_trainer,prior_gmm,[reynolds_adaptation],[relevance_factor],[alpha]","") + .add_prototype("gmm_base_trainer, prior_gmm, reynolds_adaptation, [relevance_factor], [alpha]","") .add_prototype("other","") .add_prototype("","") @@ -56,21 +57,24 @@ static int PyBobLearnMiscMAPGMMTrainer_init_copy(PyBobLearnMiscMAPGMMTrainerObje static int PyBobLearnMiscMAPGMMTrainer_init_base_trainer(PyBobLearnMiscMAPGMMTrainerObject* self, PyObject* args, PyObject* kwargs) { - char** kwlist = MAP_GMMTrainer_doc.kwlist(1); + char** kwlist = MAP_GMMTrainer_doc.kwlist(0); + PyBobLearnMiscGMMBaseTrainerObject* gmm_base_trainer; PyBobLearnMiscGMMMachineObject* gmm_machine; PyObject* reynolds_adaptation = 0; double alpha = 0.5; double relevance_factor = 4.0; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!0!|O!dd", kwlist, &PyBobLearnMiscGMMBaseTrainer_Type, &gmm_base_trainer, + + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!|O!dd", kwlist, &PyBobLearnMiscGMMBaseTrainer_Type, &gmm_base_trainer, &PyBobLearnMiscGMMMachine_Type, &gmm_machine, - &PyBool_Type, reynolds_adaptation, + &PyBool_Type, &reynolds_adaptation, &relevance_factor, &alpha )){ + MAP_GMMTrainer_doc.print_usage(); return -1; } - + self->cxx.reset(new bob::learn::misc::MAP_GMMTrainer(gmm_base_trainer->cxx, gmm_machine->cxx, f(reynolds_adaptation),relevance_factor, alpha)); return 0; } @@ -83,10 +87,11 @@ static int PyBobLearnMiscMAPGMMTrainer_init(PyBobLearnMiscMAPGMMTrainerObject* s // If the constructor input is GMMBaseTrainer object if(PyBobLearnMiscMAPGMMTrainer_Check(args)) return PyBobLearnMiscMAPGMMTrainer_init_copy(self, args, kwargs); - else + else{ return PyBobLearnMiscMAPGMMTrainer_init_base_trainer(self, args, kwargs); + } - BOB_CATCH_MEMBER("cannot create GMMMAPTrainer", 0) + BOB_CATCH_MEMBER("cannot create MAP_GMMTrainer", 0) return 0; } diff --git a/bob/learn/misc/__MAP_gmm_trainer__.py b/bob/learn/misc/__MAP_gmm_trainer__.py index e20128df88ca8a7cd2aaea8da360e5a098e5975c..d20efb52311623425d4ff408444b2acfbf744c29 100644 --- a/bob/learn/misc/__MAP_gmm_trainer__.py +++ b/bob/learn/misc/__MAP_gmm_trainer__.py @@ -11,7 +11,7 @@ import numpy # define the class class MAP_GMMTrainer(_MAP_GMMTrainer): - def __init__(self, gmm_base_trainer, prior_gmm, convergence_threshold=0.001, max_iterations=10, converge_by_likelihood=True, reynolds_adaptation=False, relevance_factor=4, alpha=0.5): + def __init__(self, gmm_base_trainer, prior_gmm, convergence_threshold=0.001, max_iterations=10, converge_by_likelihood=True, reynolds_adaptation=False, relevance_factor=4., alpha=0.5): """ :py:class:bob.learn.misc.MAP_GMMTrainer constructor @@ -35,7 +35,9 @@ class MAP_GMMTrainer(_MAP_GMMTrainer): """ - _MAP_GMMTrainer.__init__(self, gmm_base_trainer, prior_gmm, reynolds_adaptation=reynolds_adaptation, relevance_factor=relevance_factor, alpha=alpha) + #_MAP_GMMTrainer.__init__(self, gmm_base_trainer, prior_gmm, reynolds_adaptation=reynolds_adaptation, relevance_factor=relevance_factor, alpha=alpha) + _MAP_GMMTrainer.__init__(self, gmm_base_trainer, prior_gmm, reynolds_adaptation, relevance_factor=relevance_factor, alpha=alpha) + self.convergence_threshold = convergence_threshold self.max_iterations = max_iterations self.converge_by_likelihood = converge_by_likelihood diff --git a/bob/learn/misc/test_em.py b/bob/learn/misc/test_em.py index 12bc22379382fe2555de80faeea2146c8733acdd..31e510e887ddb14930e04d768b7d31a8bcf9302c 100644 --- a/bob/learn/misc/test_em.py +++ b/bob/learn/misc/test_em.py @@ -14,7 +14,7 @@ import bob.io.base from bob.io.base.test_utils import datafile from . import KMeansMachine, GMMMachine, KMeansTrainer, \ - GMMBaseTrainer, ML_GMMTrainer + GMMBaseTrainer, ML_GMMTrainer, MAP_GMMTrainer #, MAP_GMMTrainer @@ -60,13 +60,6 @@ def test_gmm_ML_1(): gmm_ref_32bit_debug = GMMMachine(bob.io.base.HDF5File(datafile('gmm_ML_32bit_debug.hdf5', __name__))) gmm_ref_32bit_release = GMMMachine(bob.io.base.HDF5File(datafile('gmm_ML_32bit_release.hdf5', __name__))) - - print gmm.variance_thresholds - print gmm_ref.variance_thresholds - print gmm_ref_32bit_release.variance_thresholds - print gmm_ref_32bit_release.variance_thresholds - - assert (gmm == gmm_ref) or (gmm == gmm_ref_32bit_release) or (gmm == gmm_ref_32bit_release) @@ -112,7 +105,7 @@ def test_gmm_ML_2(): assert equals(gmm.weights, weightsML_ref, 1e-4) -""" + def test_gmm_MAP_1(): # Train a GMMMachine with MAP_GMMTrainer @@ -122,23 +115,22 @@ def test_gmm_MAP_1(): gmm = GMMMachine(bob.io.base.HDF5File(datafile("gmm_ML.hdf5", __name__))) gmmprior = GMMMachine(bob.io.base.HDF5File(datafile("gmm_ML.hdf5", __name__))) - map_gmmtrainer = MAP_GMMTrainer(16) - map_gmmtrainer.set_prior_gmm(gmmprior) + map_gmmtrainer = MAP_GMMTrainer(GMMBaseTrainer(True, False, False),gmmprior, reynolds_adaptation=False, relevance_factor=16) + #map_gmmtrainer.set_prior_gmm(gmmprior) map_gmmtrainer.train(gmm, ar) #config = bob.io.base.HDF5File(datafile('gmm_MAP.hdf5", 'w', __name__)) #gmm.save(config) gmm_ref = GMMMachine(bob.io.base.HDF5File(datafile('gmm_MAP.hdf5', __name__))) - #gmm_ref_32bit_release = GMMMachine(bob.io.base.HDF5File(datafile('gmm_MAP_32bit_release.hdf5', __name__))) assert (equals(gmm.means,gmm_ref.means,1e-3) and equals(gmm.variances,gmm_ref.variances,1e-3) and equals(gmm.weights,gmm_ref.weights,1e-3)) + def test_gmm_MAP_2(): # Train a GMMMachine with MAP_GMMTrainer and compare with matlab reference - map_adapt = MAP_GMMTrainer(4., True, False, False, 0.) data = bob.io.base.load(datafile('data.hdf5', __name__)) data = data.reshape((1, data.shape[0])) # make a 2D array out of it means = bob.io.base.load(datafile('means.hdf5', __name__)) @@ -150,7 +142,8 @@ def test_gmm_MAP_2(): gmm.variances = variances gmm.weights = weights - map_adapt.set_prior_gmm(gmm) + map_adapt = MAP_GMMTrainer(GMMBaseTrainer(True, False, False, mean_var_update_responsibilities_threshold=0.),gmm, alpha=4., relevance_factor=4., reynolds_adaptation=True) + #map_adapt.set_prior_gmm(gmm) gmm_adapted = GMMMachine(2,50) gmm_adapted.means = means @@ -162,10 +155,14 @@ def test_gmm_MAP_2(): new_means = bob.io.base.load(datafile('new_adapted_mean.hdf5', __name__)) + # print new_means[0,:] + # print gmm_adapted.means[:,0] + # Compare to matlab reference assert equals(new_means[0,:], gmm_adapted.means[:,0], 1e-4) assert equals(new_means[1,:], gmm_adapted.means[:,1], 1e-4) + def test_gmm_MAP_3(): # Train a GMMMachine with MAP_GMMTrainer; compares to old reference @@ -189,11 +186,9 @@ def test_gmm_MAP_3(): max_iter_gmm = 1 accuracy = 0.00001 map_factor = 0.5 - map_gmmtrainer = MAP_GMMTrainer(relevance_factor, True, False, False, prior) + map_gmmtrainer = MAP_GMMTrainer(GMMBaseTrainer(True, False, False, prior), prior_gmm, alpha=map_factor, reynolds_adaptation=False) map_gmmtrainer.max_iterations = max_iter_gmm map_gmmtrainer.convergence_threshold = accuracy - map_gmmtrainer.set_prior_gmm(prior_gmm) - map_gmmtrainer.set_t3_map(map_factor); gmm = GMMMachine(n_gaussians, n_inputs) gmm.set_variance_thresholds(threshold) @@ -215,6 +210,7 @@ def test_gmm_MAP_3(): assert equals(gmm.variances, variancesMAP_ref, 1e-4) assert equals(gmm.weights, weightsMAP_ref, 1e-4) + def test_gmm_test(): # Tests a GMMMachine by computing scores against a model and compare to @@ -236,12 +232,12 @@ def test_gmm_test(): # Test against the model score_mean_ref = -1.50379e+06 score = 0. - for v in ar: score += gmm.forward(v) + for v in ar: score += gmm(v) score /= len(ar) # Compare current results to torch3vision assert abs(score-score_mean_ref)/score_mean_ref<1e-4 -""" + def test_custom_trainer():