diff --git a/bob/fusion/base/algorithm/Algorithm.py b/bob/fusion/base/algorithm/Algorithm.py index 80200e6203ccd5fc7b9d0cc8563a6fc622b538cd..621f4a4ad1899b201e5c9285fce545c4af1188e6 100644 --- a/bob/fusion/base/algorithm/Algorithm.py +++ b/bob/fusion/base/algorithm/Algorithm.py @@ -15,9 +15,7 @@ class Algorithm(object): """docstring for Algorithm""" def __init__(self, - scores=None, performs_training=False, - trainer_scores=None, has_closed_form_solution=False, preprocessors=None, *args, @@ -31,36 +29,35 @@ class Algorithm(object): """ super(Algorithm, self).__init__() - self.scores = scores self.performs_training = performs_training - self.trainer_scores = trainer_scores self.has_closed_form_solution = has_closed_form_solution self.preprocessors = preprocessors self._kwargs = kwargs self._kwargs['preprocessors'] = preprocessors + def train_preprocessors(self, X): + if self.preprocessors is not None: + for preprocessor in self.preprocessors: + X = preprocessor.fit_transform(X) + def preprocess(self, scores): if self.preprocessors is not None: - for i, (preprocessor, trained) in enumerate(self.preprocessors): - if not trained: - train_scores = np.vstack(self.trainer_scores) - preprocessor.fit(train_scores) - self.preprocessors[i] = (preprocessor, True) - scores = self.preprocessor.transform(scores) + for preprocessor in self.preprocessors: + scores = preprocessor.transform(scores) return scores - def train(self): - negatives, positives = self.trainer_scores - train_scores = np.vstack(self.trainer_scores) - train_scores = self.preprocess(train_scores) + def train(self, train, devel=None): + if devel is None: + devel = train + (negatives, positives) = train + train_scores = np.vstack((negatives, positives)) neg_len = negatives.shape[0] y = np.zeros((train_scores.shape[0],), dtype='bool') y[neg_len:] = True self.fit(train_scores, y) - def __call__(self): - self.scores = self.preprocess(self.scores) - return self.decision_function(self.scores) + def fuse(self, scores): + return self.decision_function(scores) def plot_boundary_decision(self, score_labels, threshold, label_system1='', diff --git a/bob/fusion/base/algorithm/MLP.py b/bob/fusion/base/algorithm/MLP.py index 4dac5742de84080274ad41951d1c2b9b079e806b..9af9abd279653d3fbf5fd6d5d2e16140a68e74c1 100644 --- a/bob/fusion/base/algorithm/MLP.py +++ b/bob/fusion/base/algorithm/MLP.py @@ -5,7 +5,7 @@ from __future__ import absolute_import import bob.learn.mlp import bob.core.random - +import bob.io.base import numpy from .Algorithm import Algorithm @@ -25,6 +25,8 @@ class MLP(Algorithm): hidden_layers=None, trainer_devel=None, seed=None, + machine=None, + trainer=None, *args, **kwargs): # chicken and egg :D call __init__ twice. super(MLP, self).__init__(performs_training=True, *args, **kwargs) @@ -35,8 +37,11 @@ class MLP(Algorithm): self.mlp_shape = [n_systems] + hidden_layers + [1] super(MLP, self).__init__( performs_training=True, mlp_shape=self.mlp_shape, seed=seed, + machine=str(machine), trainer=str(trainer), *args, **kwargs) self.seed = seed + self.machine = machine + self.trainer = trainer self.trainer_devel = trainer_devel if trainer_devel else \ self.trainer_scores self._my_kwargs = kwargs @@ -85,3 +90,17 @@ class MLP(Algorithm): if scores.ndim == 2 and scores.shape[1] == 1: scores = scores.ravel() return scores + + def save(self, model_file): + d5 = bob.io.base.HDF5File(model_file, "w") + try: + self.machine.save(d5) + finally: + d5.close() + + def load(self, model_file): + d5 = bob.io.base.HDF5File(model_file) + try: + self.machine.load(d5) + finally: + d5.close() diff --git a/bob/fusion/base/algorithm/Weighted_Sum.py b/bob/fusion/base/algorithm/Weighted_Sum.py index 540fcc6b9e712e7c10203c78295846b353a36af0..3f1c9ae229f2c685078085de6809dfd024e85fcc 100644 --- a/bob/fusion/base/algorithm/Weighted_Sum.py +++ b/bob/fusion/base/algorithm/Weighted_Sum.py @@ -20,6 +20,9 @@ class Weighted_Sum(Algorithm): has_closed_form_solution=True, *args, **kwargs) self.weights = weights + def fit(self, X, y): + pass + def decision_function(self, scores): if self.weights is None: return numpy.mean(scores, axis=1) diff --git a/bob/fusion/base/algorithm/__init__.py b/bob/fusion/base/algorithm/__init__.py index b119df913d31c817a07e39956bb3a8d9ff884601..3823cff5480839e9887344c5120688f52c64c575 100644 --- a/bob/fusion/base/algorithm/__init__.py +++ b/bob/fusion/base/algorithm/__init__.py @@ -2,7 +2,6 @@ from .Algorithm import Algorithm from .Weighted_Sum import Weighted_Sum from .LogisticRegression import LogisticRegression from .MLP import MLP -from .MLPClassifier import MLPClassifier # gets sphinx autodoc done right - don't remove it __all__ = [_ for _ in dir() if not _.startswith('_')] diff --git a/run.sh b/run.sh index 94c50fec6da45a7ace66e632f6395a18751f0ec0..c1cbf2135eb2efefb8b619a6a2d2a4aebdab2ef1 100755 --- a/run.sh +++ b/run.sh @@ -5,5 +5,5 @@ INPUT1="-i /home/amir/idiap/remote/user/mobio-male/baselines/gmm/male/ztnorm/sc INPUT2="-I /home/amir/idiap/remote/user/mobio-male/baselines/gmm/male/ztnorm/scores-eval /home/amir/idiap/remote/user/mobio-male/baselines/gabor-graph/male/ztnorm/scores-eval /home/amir/idiap/remote/user/mobio-male/voice/gmm/male/ztnorm/scores-eval /home/amir/idiap/remote/user/mobio-male/voice/isv/male/ztnorm/scores-eval" for HIDDEN_NODES in 5 10 25 50 100 200; do - ./bin/fuse.py -vvv $INPUT1 $INPUT2 -o "/home/amir/idiap/remote/user/mobio-male/face-voice/F-gmm-gabor-graph-S-gmm-isv_MLP_${HIDDEN_NODES}/male/ztnorm/scores-dev" -O "/home/amir/idiap/remote/user/mobio-male/face-voice/F-gmm-gabor-graph-S-gmm-isv_MLP_${HIDDEN_NODES}/male/ztnorm/scores-eval" -a "bob.fusion.base.algorithm.MLP(preprocessors=[(sklearn.preprocessing.RobustScaler(), False)], n_systems=4, hidden_layers=[${HIDDEN_NODES}], seed=0)" --force --imports='sklearn.preprocessing' 'bob.fusion.base' + ./bin/fuse.py -vvv $INPUT1 $INPUT2 -o "/home/amir/idiap/remote/user/mobio-male/face-voice/F-gmm-gabor-graph-S-gmm-isv_MLP_${HIDDEN_NODES}/male/ztnorm/scores-dev" -O "/home/amir/idiap/remote/user/mobio-male/face-voice/F-gmm-gabor-graph-S-gmm-isv_MLP_${HIDDEN_NODES}/male/ztnorm/scores-eval" -a "bob.fusion.base.algorithm.MLP(preprocessors=[(sklearn.preprocessing.RobustScaler(), False)], n_systems=4, hidden_layers=[${HIDDEN_NODES}], seed=0)" --force --imports='sklearn.preprocessing','bob.fusion.base' done