Mercurial > ift6266
annotate deep/stacked_dae/v_sylvain/stacked_dae.py @ 266:1e4e60ddadb1
Merge. Ah, et dans le dernier commit, j'avais oublié de mentionner que j'ai ajouté du code pour gérer l'isolation de différents clones pour rouler des expériences et modifier le code en même temps.
author | fsavard |
---|---|
date | Fri, 19 Mar 2010 10:56:16 -0400 |
parents | 02b141a466b4 |
children | c77ffb11f91d |
rev | line source |
---|---|
230
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
1 #!/usr/bin/python |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
2 # coding: utf-8 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
3 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
4 import numpy |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
5 import theano |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
6 import time |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
7 import theano.tensor as T |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
8 from theano.tensor.shared_randomstreams import RandomStreams |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
9 import copy |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
10 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
11 from utils import update_locals |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
12 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
13 # taken from LeDeepNet/daa.py |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
14 # has a special case when taking log(0) (defined =0) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
15 # modified to not take the mean anymore |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
16 from theano.tensor.xlogx import xlogx, xlogy0 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
17 # it's target*log(output) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
18 def binary_cross_entropy(target, output, sum_axis=1): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
19 XE = xlogy0(target, output) + xlogy0((1 - target), (1 - output)) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
20 return -T.sum(XE, axis=sum_axis) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
21 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
22 class LogisticRegression(object): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
23 def __init__(self, input, n_in, n_out): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
24 # initialize with 0 the weights W as a matrix of shape (n_in, n_out) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
25 self.W = theano.shared( value=numpy.zeros((n_in,n_out), |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
26 dtype = theano.config.floatX) ) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
27 # initialize the baises b as a vector of n_out 0s |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
28 self.b = theano.shared( value=numpy.zeros((n_out,), |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
29 dtype = theano.config.floatX) ) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
30 # compute vector of class-membership probabilities in symbolic form |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
31 self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W)+self.b) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
32 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
33 # compute prediction as class whose probability is maximal in |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
34 # symbolic form |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
35 self.y_pred=T.argmax(self.p_y_given_x, axis=1) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
36 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
37 # list of parameters for this layer |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
38 self.params = [self.W, self.b] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
39 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
40 def negative_log_likelihood(self, y): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
41 return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]),y]) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
42 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
43 def errors(self, y): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
44 # check if y has same dimension of y_pred |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
45 if y.ndim != self.y_pred.ndim: |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
46 raise TypeError('y should have the same shape as self.y_pred', |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
47 ('y', target.type, 'y_pred', self.y_pred.type)) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
48 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
49 # check if y is of the correct datatype |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
50 if y.dtype.startswith('int'): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
51 # the T.neq operator returns a vector of 0s and 1s, where 1 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
52 # represents a mistake in prediction |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
53 return T.mean(T.neq(self.y_pred, y)) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
54 else: |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
55 raise NotImplementedError() |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
56 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
57 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
58 class SigmoidalLayer(object): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
59 def __init__(self, rng, input, n_in, n_out): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
60 self.input = input |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
61 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
62 W_values = numpy.asarray( rng.uniform( \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
63 low = -numpy.sqrt(6./(n_in+n_out)), \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
64 high = numpy.sqrt(6./(n_in+n_out)), \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
65 size = (n_in, n_out)), dtype = theano.config.floatX) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
66 self.W = theano.shared(value = W_values) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
67 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
68 b_values = numpy.zeros((n_out,), dtype= theano.config.floatX) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
69 self.b = theano.shared(value= b_values) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
70 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
71 self.output = T.nnet.sigmoid(T.dot(input, self.W) + self.b) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
72 self.params = [self.W, self.b] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
73 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
74 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
75 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
76 class dA(object): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
77 def __init__(self, n_visible= 784, n_hidden= 500, corruption_level = 0.1,\ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
78 input = None, shared_W = None, shared_b = None): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
79 self.n_visible = n_visible |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
80 self.n_hidden = n_hidden |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
81 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
82 # create a Theano random generator that gives symbolic random values |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
83 theano_rng = RandomStreams() |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
84 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
85 if shared_W != None and shared_b != None : |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
86 self.W = shared_W |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
87 self.b = shared_b |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
88 else: |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
89 # initial values for weights and biases |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
90 # note : W' was written as `W_prime` and b' as `b_prime` |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
91 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
92 # W is initialized with `initial_W` which is uniformely sampled |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
93 # from -6./sqrt(n_visible+n_hidden) and 6./sqrt(n_hidden+n_visible) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
94 # the output of uniform if converted using asarray to dtype |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
95 # theano.config.floatX so that the code is runable on GPU |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
96 initial_W = numpy.asarray( numpy.random.uniform( \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
97 low = -numpy.sqrt(6./(n_hidden+n_visible)), \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
98 high = numpy.sqrt(6./(n_hidden+n_visible)), \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
99 size = (n_visible, n_hidden)), dtype = theano.config.floatX) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
100 initial_b = numpy.zeros(n_hidden, dtype = theano.config.floatX) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
101 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
102 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
103 # theano shared variables for weights and biases |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
104 self.W = theano.shared(value = initial_W, name = "W") |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
105 self.b = theano.shared(value = initial_b, name = "b") |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
106 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
107 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
108 initial_b_prime= numpy.zeros(n_visible) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
109 # tied weights, therefore W_prime is W transpose |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
110 self.W_prime = self.W.T |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
111 self.b_prime = theano.shared(value = initial_b_prime, name = "b'") |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
112 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
113 # if no input is given, generate a variable representing the input |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
114 if input == None : |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
115 # we use a matrix because we expect a minibatch of several examples, |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
116 # each example being a row |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
117 self.x = T.dmatrix(name = 'input') |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
118 else: |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
119 self.x = input |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
120 # Equation (1) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
121 # keep 90% of the inputs the same and zero-out randomly selected subset of 10% of the inputs |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
122 # note : first argument of theano.rng.binomial is the shape(size) of |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
123 # random numbers that it should produce |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
124 # second argument is the number of trials |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
125 # third argument is the probability of success of any trial |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
126 # |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
127 # this will produce an array of 0s and 1s where 1 has a |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
128 # probability of 1 - ``corruption_level`` and 0 with |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
129 # ``corruption_level`` |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
130 self.tilde_x = theano_rng.binomial( self.x.shape, 1, 1 - corruption_level, dtype=theano.config.floatX) * self.x |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
131 # Equation (2) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
132 # note : y is stored as an attribute of the class so that it can be |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
133 # used later when stacking dAs. |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
134 self.y = T.nnet.sigmoid(T.dot(self.tilde_x, self.W ) + self.b) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
135 # Equation (3) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
136 #self.z = T.nnet.sigmoid(T.dot(self.y, self.W_prime) + self.b_prime) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
137 # Equation (4) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
138 # note : we sum over the size of a datapoint; if we are using minibatches, |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
139 # L will be a vector, with one entry per example in minibatch |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
140 #self.L = - T.sum( self.x*T.log(self.z) + (1-self.x)*T.log(1-self.z), axis=1 ) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
141 #self.L = binary_cross_entropy(target=self.x, output=self.z, sum_axis=1) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
142 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
143 # bypassing z to avoid running to log(0) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
144 z_a = T.dot(self.y, self.W_prime) + self.b_prime |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
145 log_sigmoid = T.log(1.) - T.log(1.+T.exp(-z_a)) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
146 # log(1-sigmoid(z_a)) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
147 log_1_sigmoid = -z_a - T.log(1.+T.exp(-z_a)) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
148 self.L = -T.sum( self.x * (log_sigmoid) \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
149 + (1.0-self.x) * (log_1_sigmoid), axis=1 ) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
150 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
151 # I added this epsilon to avoid getting log(0) and 1/0 in grad |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
152 # This means conceptually that there'd be no probability of 0, but that |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
153 # doesn't seem to me as important (maybe I'm wrong?). |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
154 #eps = 0.00000001 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
155 #eps_1 = 1-eps |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
156 #self.L = - T.sum( self.x * T.log(eps + eps_1*self.z) \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
157 # + (1-self.x)*T.log(eps + eps_1*(1-self.z)), axis=1 ) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
158 # note : L is now a vector, where each element is the cross-entropy cost |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
159 # of the reconstruction of the corresponding example of the |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
160 # minibatch. We need to compute the average of all these to get |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
161 # the cost of the minibatch |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
162 self.cost = T.mean(self.L) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
163 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
164 self.params = [ self.W, self.b, self.b_prime ] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
165 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
166 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
167 class SdA(object): |
251
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
168 def __init__(self, batch_size, n_ins, |
230
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
169 hidden_layers_sizes, n_outs, |
251
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
170 corruption_levels, rng, pretrain_lr, finetune_lr): |
230
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
171 # Just to make sure those are not modified somewhere else afterwards |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
172 hidden_layers_sizes = copy.deepcopy(hidden_layers_sizes) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
173 corruption_levels = copy.deepcopy(corruption_levels) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
174 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
175 update_locals(self, locals()) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
176 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
177 self.layers = [] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
178 self.pretrain_functions = [] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
179 self.params = [] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
180 # MODIF: added this so we also get the b_primes |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
181 # (not used for finetuning... still using ".params") |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
182 self.all_params = [] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
183 self.n_layers = len(hidden_layers_sizes) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
184 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
185 print "Creating SdA with params:" |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
186 print "batch_size", batch_size |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
187 print "hidden_layers_sizes", hidden_layers_sizes |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
188 print "corruption_levels", corruption_levels |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
189 print "n_ins", n_ins |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
190 print "n_outs", n_outs |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
191 print "pretrain_lr", pretrain_lr |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
192 print "finetune_lr", finetune_lr |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
193 print "----" |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
194 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
195 if len(hidden_layers_sizes) < 1 : |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
196 raiseException (' You must have at least one hidden layer ') |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
197 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
198 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
199 # allocate symbolic variables for the data |
251
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
200 #index = T.lscalar() # index to a [mini]batch |
230
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
201 self.x = T.matrix('x') # the data is presented as rasterized images |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
202 self.y = T.ivector('y') # the labels are presented as 1D vector of |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
203 # [int] labels |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
204 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
205 for i in xrange( self.n_layers ): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
206 # construct the sigmoidal layer |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
207 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
208 # the size of the input is either the number of hidden units of |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
209 # the layer below or the input size if we are on the first layer |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
210 if i == 0 : |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
211 input_size = n_ins |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
212 else: |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
213 input_size = hidden_layers_sizes[i-1] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
214 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
215 # the input to this layer is either the activation of the hidden |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
216 # layer below or the input of the SdA if you are on the first |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
217 # layer |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
218 if i == 0 : |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
219 layer_input = self.x |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
220 else: |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
221 layer_input = self.layers[-1].output |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
222 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
223 layer = SigmoidalLayer(rng, layer_input, input_size, |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
224 hidden_layers_sizes[i] ) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
225 # add the layer to the |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
226 self.layers += [layer] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
227 self.params += layer.params |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
228 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
229 # Construct a denoising autoencoder that shared weights with this |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
230 # layer |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
231 dA_layer = dA(input_size, hidden_layers_sizes[i], \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
232 corruption_level = corruption_levels[0],\ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
233 input = layer_input, \ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
234 shared_W = layer.W, shared_b = layer.b) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
235 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
236 self.all_params += dA_layer.params |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
237 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
238 # Construct a function that trains this dA |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
239 # compute gradients of layer parameters |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
240 gparams = T.grad(dA_layer.cost, dA_layer.params) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
241 # compute the list of updates |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
242 updates = {} |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
243 for param, gparam in zip(dA_layer.params, gparams): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
244 updates[param] = param - gparam * pretrain_lr |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
245 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
246 # create a function that trains the dA |
251
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
247 update_fn = theano.function([self.x], dA_layer.cost, \ |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
248 updates = updates)#, |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
249 # givens = { |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
250 # self.x : ensemble}) |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
251 # collect this function into a list |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
252 #update_fn = theano.function([index], dA_layer.cost, \ |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
253 # updates = updates, |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
254 # givens = { |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
255 # self.x : train_set_x[index*batch_size:(index+1)*batch_size] / self.shared_divider}) |
230
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
256 # collect this function into a list |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
257 self.pretrain_functions += [update_fn] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
258 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
259 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
260 # We now need to add a logistic layer on top of the MLP |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
261 self.logLayer = LogisticRegression(\ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
262 input = self.layers[-1].output,\ |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
263 n_in = hidden_layers_sizes[-1], n_out = n_outs) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
264 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
265 self.params += self.logLayer.params |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
266 self.all_params += self.logLayer.params |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
267 # construct a function that implements one step of finetunining |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
268 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
269 # compute the cost, defined as the negative log likelihood |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
270 cost = self.logLayer.negative_log_likelihood(self.y) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
271 # compute the gradients with respect to the model parameters |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
272 gparams = T.grad(cost, self.params) |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
273 # compute list of updates |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
274 updates = {} |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
275 for param,gparam in zip(self.params, gparams): |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
276 updates[param] = param - gparam*finetune_lr |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
277 |
251
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
278 self.finetune = theano.function([self.x,self.y], cost, |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
279 updates = updates)#, |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
280 # givens = { |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
281 # self.x : train_set_x[index*batch_size:(index+1)*batch_size]/self.shared_divider, |
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
282 # self.y : train_set_y[index*batch_size:(index+1)*batch_size]} ) |
230
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
283 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
284 # symbolic variable that points to the number of errors made on the |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
285 # minibatch given by self.x and self.y |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
286 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
287 self.errors = self.logLayer.errors(self.y) |
251
02b141a466b4
ajout de fonctionnalite pour different finetune dataset
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
235
diff
changeset
|
288 |
230
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
289 |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
290 if __name__ == '__main__': |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
291 import sys |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
292 args = sys.argv[1:] |
8a94a5c808cd
Repertoire pour faire les tests avec les differents ensembles pour le finetuning
SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
parents:
diff
changeset
|
293 |