Skip to content
Snippets Groups Projects
Commit 475aa543 authored by Amir MOHAMMADI's avatar Amir MOHAMMADI
Browse files

change algorithm api

parent 9c4e08fe
No related branches found
No related tags found
No related merge requests found
...@@ -15,9 +15,7 @@ class Algorithm(object): ...@@ -15,9 +15,7 @@ class Algorithm(object):
"""docstring for Algorithm""" """docstring for Algorithm"""
def __init__(self, def __init__(self,
scores=None,
performs_training=False, performs_training=False,
trainer_scores=None,
has_closed_form_solution=False, has_closed_form_solution=False,
preprocessors=None, preprocessors=None,
*args, *args,
...@@ -31,36 +29,35 @@ class Algorithm(object): ...@@ -31,36 +29,35 @@ class Algorithm(object):
""" """
super(Algorithm, self).__init__() super(Algorithm, self).__init__()
self.scores = scores
self.performs_training = performs_training self.performs_training = performs_training
self.trainer_scores = trainer_scores
self.has_closed_form_solution = has_closed_form_solution self.has_closed_form_solution = has_closed_form_solution
self.preprocessors = preprocessors self.preprocessors = preprocessors
self._kwargs = kwargs self._kwargs = kwargs
self._kwargs['preprocessors'] = preprocessors 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): def preprocess(self, scores):
if self.preprocessors is not None: if self.preprocessors is not None:
for i, (preprocessor, trained) in enumerate(self.preprocessors): for preprocessor in self.preprocessors:
if not trained: scores = preprocessor.transform(scores)
train_scores = np.vstack(self.trainer_scores)
preprocessor.fit(train_scores)
self.preprocessors[i] = (preprocessor, True)
scores = self.preprocessor.transform(scores)
return scores return scores
def train(self): def train(self, train, devel=None):
negatives, positives = self.trainer_scores if devel is None:
train_scores = np.vstack(self.trainer_scores) devel = train
train_scores = self.preprocess(train_scores) (negatives, positives) = train
train_scores = np.vstack((negatives, positives))
neg_len = negatives.shape[0] neg_len = negatives.shape[0]
y = np.zeros((train_scores.shape[0],), dtype='bool') y = np.zeros((train_scores.shape[0],), dtype='bool')
y[neg_len:] = True y[neg_len:] = True
self.fit(train_scores, y) self.fit(train_scores, y)
def __call__(self): def fuse(self, scores):
self.scores = self.preprocess(self.scores) return self.decision_function(scores)
return self.decision_function(self.scores)
def plot_boundary_decision(self, score_labels, threshold, def plot_boundary_decision(self, score_labels, threshold,
label_system1='', label_system1='',
......
...@@ -5,7 +5,7 @@ from __future__ import absolute_import ...@@ -5,7 +5,7 @@ from __future__ import absolute_import
import bob.learn.mlp import bob.learn.mlp
import bob.core.random import bob.core.random
import bob.io.base
import numpy import numpy
from .Algorithm import Algorithm from .Algorithm import Algorithm
...@@ -25,6 +25,8 @@ class MLP(Algorithm): ...@@ -25,6 +25,8 @@ class MLP(Algorithm):
hidden_layers=None, hidden_layers=None,
trainer_devel=None, trainer_devel=None,
seed=None, seed=None,
machine=None,
trainer=None,
*args, **kwargs): *args, **kwargs):
# chicken and egg :D call __init__ twice. # chicken and egg :D call __init__ twice.
super(MLP, self).__init__(performs_training=True, *args, **kwargs) super(MLP, self).__init__(performs_training=True, *args, **kwargs)
...@@ -35,8 +37,11 @@ class MLP(Algorithm): ...@@ -35,8 +37,11 @@ class MLP(Algorithm):
self.mlp_shape = [n_systems] + hidden_layers + [1] self.mlp_shape = [n_systems] + hidden_layers + [1]
super(MLP, self).__init__( super(MLP, self).__init__(
performs_training=True, mlp_shape=self.mlp_shape, seed=seed, performs_training=True, mlp_shape=self.mlp_shape, seed=seed,
machine=str(machine), trainer=str(trainer),
*args, **kwargs) *args, **kwargs)
self.seed = seed self.seed = seed
self.machine = machine
self.trainer = trainer
self.trainer_devel = trainer_devel if trainer_devel else \ self.trainer_devel = trainer_devel if trainer_devel else \
self.trainer_scores self.trainer_scores
self._my_kwargs = kwargs self._my_kwargs = kwargs
...@@ -85,3 +90,17 @@ class MLP(Algorithm): ...@@ -85,3 +90,17 @@ class MLP(Algorithm):
if scores.ndim == 2 and scores.shape[1] == 1: if scores.ndim == 2 and scores.shape[1] == 1:
scores = scores.ravel() scores = scores.ravel()
return scores 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()
...@@ -20,6 +20,9 @@ class Weighted_Sum(Algorithm): ...@@ -20,6 +20,9 @@ class Weighted_Sum(Algorithm):
has_closed_form_solution=True, *args, **kwargs) has_closed_form_solution=True, *args, **kwargs)
self.weights = weights self.weights = weights
def fit(self, X, y):
pass
def decision_function(self, scores): def decision_function(self, scores):
if self.weights is None: if self.weights is None:
return numpy.mean(scores, axis=1) return numpy.mean(scores, axis=1)
......
...@@ -2,7 +2,6 @@ from .Algorithm import Algorithm ...@@ -2,7 +2,6 @@ from .Algorithm import Algorithm
from .Weighted_Sum import Weighted_Sum from .Weighted_Sum import Weighted_Sum
from .LogisticRegression import LogisticRegression from .LogisticRegression import LogisticRegression
from .MLP import MLP from .MLP import MLP
from .MLPClassifier import MLPClassifier
# gets sphinx autodoc done right - don't remove it # gets sphinx autodoc done right - don't remove it
__all__ = [_ for _ in dir() if not _.startswith('_')] __all__ = [_ for _ in dir() if not _.startswith('_')]
...@@ -5,5 +5,5 @@ INPUT1="-i /home/amir/idiap/remote/user/mobio-male/baselines/gmm/male/ztnorm/sc ...@@ -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" 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 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 done
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment