annotate doc/v2_planning/plugin_PL.py @ 1276:822c7691a759

pca - added pca_whiten_inverse function
author James Bergstra <bergstrj@iro.umontreal.ca>
date Tue, 14 Sep 2010 22:35:51 -0400
parents 826d78f0135f
children
rev   line source
1253
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
1 class RBM(Model):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
2 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
3 Restricted Boltzmann Machine.
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
4 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
5 def __init__(self, n_visible, n_hidden, visible = None, name = None):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
6
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
7 if name is None:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
8 self.__name__ = self.__class__.__name__
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
9 else:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
10 self.__name__ = name
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
11 self.n_visible = n_visible
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
12 self.n_hidden = n_hidden
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
13
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
14 if self.visible is None:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
15 self.visible = theano.tensor.matrix([name='.'.join(self.__name__, 'visible']))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
16 else:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
17 self.visible = visible
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
18
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
19 self.W = theano.shared(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
20 numpy.zeros((n_visible, n_hidden), dtype=theano.config.floatX),
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
21 name=self.__name__ + '.W')
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
22 self.b_hid = theano.shared(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
23 numpy.zeros((n_hidden,), dtype=theano.config.floatX),
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
24 name=self.__name__ + '.b_hid')
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
25 self.b_vis = theano.shared(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
26 numpy.zeros((n_hidden,), dtype=theano.config.floatX),
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
27 name=self.__name__ + '.b_vis')
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
28
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
29 self.inputs = [self.visible]
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
30 self.targets = []
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
31 self.parameters = [self.W, self.b_hid, self.b_vis]
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
32 self.outputs = ...
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
33 self.cost = None
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
34 self.gradients = [...]
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
35
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
36 class LogisticRegression(Model):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
37 pass
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
38
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
39 class GradientBasedLearner(Learner):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
40 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
41 Learner that uses a gradient-base Optimizer to train a Model.
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
42 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
43 def __init__(self, model, optimizer, name = None):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
44 self.model = model
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
45 self.optimizer = optimizer
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
46 ...
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
47
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
48 self.updates = optimizer.iterative_optimizer(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
49 parameters = model.parameters,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
50 cost = model.cost)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
51
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
52 # TODO: not sure of how to interface data set with the function
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
53 self.train_fn = theano.function(model.inputs+model.targets,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
54 model.cost, updates=self.updates)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
55
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
56 def use_dataset(self, dataset):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
57 self.train_set = dataset
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
58
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
59 # The decorator indicates that this function will declare some hooks.
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
60 # More hooks could be automatically declared, for instance
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
61 # 'begin_function' and 'end_function'
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
62 @declare_hooks(['begin_train_iter', 'end_train_iter'])
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
63 def adapt(self, n_steps=1):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
64 for i in xrange(n_steps):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
65 self.adapt.hooks.execute(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
66 'begin_train_iter',
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
67 context = dict(iter=i, total=n_steps, locals=locals()))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
68
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
69 data = self.train_set.next()
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
70 self.train_fn(data)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
71
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
72 self.adapt.hooks.execute(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
73 'end_train_iter',
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
74 context = dict(iter = i, locals=locals()))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
75
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
76
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
77 class SGD(Optimizer):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
78 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
79 Stochastic gradient descent with fixed learning rate.
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
80 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
81 def __init__(self, step_size):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
82 self.step_size = step_size
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
83
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
84 def iterative_optimizer(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
85 parameters,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
86 cost=None,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
87 gradients=None,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
88 stop=None,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
89 updates=None,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
90 ):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
91
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
92 if updates is not None:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
93 ret = updates
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
94 else:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
95 ret = {}
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
96
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
97 if gradients is None:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
98 if cost is None:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
99 raise SomeError('SGD needs to be provided either a cost or a gradients list')
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
100 gradients = theano.tensor.grad(cost, parameters)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
101
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
102 for p, g in izip(parameters, gradients):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
103 if p in updates:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
104 raise KeyError('Parameter %s already has an update value (%s)' % (p, g))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
105 ret[p] = p - self.step_size * g
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
106
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
107 # never stop
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
108 if stop is not None:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
109 ret[stop] = False
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
110
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
111 return ret
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
112
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
113
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
114
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
115 class DBN(Learner):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
116 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
117 Deep Belief Network.
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
118 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
119 def __init__(self, n_layers, layer_config, n_ft_steps, ft_step_size):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
120 # Layers are GradientBasedLearners, with DBN as Model
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
121 self.layers = []
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
122 # Pretraining cumulative schedule
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
123 self.pt_cumul_schedule = [0]
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
124 # Build the layers and the fully-connected model
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
125 self.input = theano.tensor.matrix(name='.'.join([self.__name__, 'input']))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
126 self.output = self.input
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
127 self.ft_params = []
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
128 for i,lconf in enumerate(layer_config):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
129 rbm = RBM(visible = self.output, ...)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
130 self.output = rbm.hidden_expectation
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
131 layer = GradientBasedLearner(...)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
132 self.layers.append(layer)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
133
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
134 self.pt_cumul_schedule.append(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
135 self.pt_cumul_schedule[-1]+lc.n_pretrain_steps)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
136
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
137 self.ft_params.extend([rbm.W, rbm.b_hid])
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
138
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
139 # Build the fine-tunable model
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
140 self.target = theano.tensor.ivector(name='.'.join([self.__name__, 'target']))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
141 logreg = LogisticRegression(...)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
142 self.output = logreg.output
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
143 self.cost = logreg.nll
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
144 self.ft_params.extend([logreg.W, logreg.b])
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
145
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
146 ft_optimizer = SGD(ft_step_size)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
147 self.ft_updates = ft_optimizer.iterative_optimizer(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
148 parameters = self.ft_params,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
149 cost = self.cost)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
150 self.ft_fn = theano.function(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
151 [self.input, self.target],
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
152 self.cost,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
153 updates = self.ft_updates,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
154 name='.'.join([self.__name__, 'ft_fn']))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
155
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
156 self.stage = 0
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
157
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
158 @declare_hooks([
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
159 'begin_pretrain_layer','end_pretrain_layer',
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
160 'begin_finetune_iter', 'end_finetune_iter'])
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
161
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
162 def adapt(self, n_steps=1):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
163 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
164 Each "step" is accomplished by the corresponding Learner (either an RBM,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
165 or the global NNet).
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
166 '''
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
167 train_x, train_y = self.dataset
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
168 n_remaining_steps = n_steps
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
169 # Unsupervised pre-training
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
170 for i, layer in ienumerate(self.layers):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
171 if (self.pt_cumul_schedule[i] <= self.stage
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
172 and self.stage < self.pt_cumul_schedule[i+1]):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
173
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
174 self.adapt.hooks.execute(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
175 'begin_pretrain_layer',
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
176 context = dict(iter=i, total=len(self.layers), locals=locals()))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
177
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
178 n_pt_steps = min(n_remaining_steps, self.pt_cumul_schedule[i+1] - self.stage)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
179 layer.use_dataset(train_x)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
180 layer.adapt(n_steps = n_pt_steps)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
181 self.stage += self.n_pt_steps
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
182 n_remaining_steps -= n_pt_steps
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
183
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
184 self.adapt.hooks.execute(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
185 'end_pretrain_layer',
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
186 context = dict(iter=i, total=len(self.layers), locals=locals()))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
187
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
188 # For the next layer, the data needs to be preprocessed
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
189 train_x = layer.compute_Eh_given_v(train_x) # or just compute_output?
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
190
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
191 # Supervised fine-tuning
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
192 if n_remaining_steps > 0:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
193 sup_data = train_x, train_y
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
194 for i in xrange(n_remaining_steps):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
195 self.adapt.hooks.execute(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
196 'begin_train_iter',
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
197 context = dict(iter=i, total=n_steps, locals=locals()))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
198
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
199 data = self.train_set.next()
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
200 self.ft_fn(data)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
201
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
202 self.adapt.hooks.execute(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
203 'end_train_iter',
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
204 context = dict(iter = i, locals=locals()))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
205
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
206
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
207 ## TODO: implement k-fold cross-validation
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
208
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
209 class Hooks:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
210 def __init__(self):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
211 # The DB consists in a dictionary,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
212 # the keys are the hooks' names (as strings),
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
213 # the values are lists of (function, exec_condition) pairs of functions
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
214 self.db = {}
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
215
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
216 def declare(self, name):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
217 if name in self.db:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
218 raise KeyError('Hook "%s" is already declared' % name)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
219 self.db[name] = []
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
220
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
221 def execute(self, name, context):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
222 if name not in self.db:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
223 raise KeyError('Hook "%s" does not exist', % name)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
224 #TODO: add contextual information to context, like current time, time of last call,...
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
225 for fn, cond in self.db[name]:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
226 if cond(**context):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
227 fn(**context)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
228
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
229 def register(self, name, function, exec_condition):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
230 if name not in self.db:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
231 raise KeyError('Hook "%s" does not exist', % name)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
232 self.db[name].append((function, exec_condition))
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
233
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
234 #TODO: add __getattr__ to have more intuitive access to the hooks
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
235
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
236 # Hook declaration mechanism
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
237 def declare_hooks(hooks_list):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
238 def deco(f):
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
239 f.hooks = Hooks()
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
240 for hook_name in hooks_list:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
241 f.hooks.declare(hook_name)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
242
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
243 return deco
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
244
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
245 # Conditions
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
246 def always():
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
247 return lambda *args, **kwargs: True
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
248
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
249
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
250 def main():
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
251 train_data = MNIST.gettrain()
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
252 test_data = MNIST.gettest()
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
253
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
254 train_x, train_y = train_data
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
255
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
256 preprocessor = PCA(ndim = 80)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
257 preprocessor.train(train_x)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
258
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
259 preprocessed_x = preprocessor.compute_output(train_x)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
260 ## for more robustess, we can have something like:
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
261 # peprocessed_x = ProcessDataSet(orig_data = train_x, function = preprocessor.compute_output)
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
262
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
263
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
264 x = matrix()
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
265 dbn = DBN(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
266 input = x,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
267 n_layers = 3,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
268 layer_config = [dict(n_hidden = 500, n_unsup_steps=1000)] * 3
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
269 )
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
270
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
271 dbn.layers[0].adapt.hooks.register(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
272 'begin_train_iter',
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
273 function = ...,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
274 exec_cond = always()
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
275 )
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
276
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
277 dbn.layers[0].adapt.hooks.register(
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
278 'end_train_iter',
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
279 function = ...,
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
280 exec_cond = lambda iter, **kwargs: iter%20==0
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
281 )
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
282
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
283
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
284 if __name__ == '__main__':
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
285 main()
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
286
826d78f0135f Prototype for "hooks" simpler than full control-flow rewrite.
Pascal Lamblin <lamblinp@iro.umontreal.ca>
parents:
diff changeset
287