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

change algorithm api

parent 9c4e08fe
Branches
Tags
No related merge requests found
......@@ -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='',
......
......@@ -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()
......@@ -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)
......
......@@ -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('_')]
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment