Mercurial > ift6266
annotate baseline/mlp/ratio_classes/mlp_nist_ratio.py @ 514:920a38715c90
merge
author | Yoshua Bengio <bengioy@iro.umontreal.ca> |
---|---|
date | Tue, 01 Jun 2010 14:05:21 -0400 |
parents | d8129a09ffb1 |
children |
rev | line source |
---|---|
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
1 # -*- coding: utf-8 -*- |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
2 """ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
3 This tutorial introduces the multilayer perceptron using Theano. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
4 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
5 A multilayer perceptron is a logistic regressor where |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
6 instead of feeding the input to the logistic regression you insert a |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
7 intermidiate layer, called the hidden layer, that has a nonlinear |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
8 activation function (usually tanh or sigmoid) . One can use many such |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
9 hidden layers making the architecture deep. The tutorial will also tackle |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
10 the problem of MNIST digit classification. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
11 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
12 .. math:: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
13 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
14 f(x) = G( b^{(2)} + W^{(2)}( s( b^{(1)} + W^{(1)} x))), |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
15 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
16 References: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
17 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
18 - textbooks: "Pattern Recognition and Machine Learning" - |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
19 Christopher M. Bishop, section 5 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
20 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
21 TODO: recommended preprocessing, lr ranges, regularization ranges (explain |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
22 to do lr first, then add regularization) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
23 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
24 """ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
25 __docformat__ = 'restructedtext en' |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
26 |
435 | 27 import setup_batches |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
28 import pdb |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
29 import numpy |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
30 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
31 import theano |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
32 import theano.tensor as T |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
33 import time |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
34 import theano.tensor.nnet |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
35 import pylearn |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
36 import theano,pylearn.version |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
37 from pylearn.io import filetensor as ft |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
38 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
39 data_path = '/data/lisa/data/nist/by_class/' |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
40 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
41 class MLP(object): |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
42 """Multi-Layer Perceptron Class |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
43 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
44 A multilayer perceptron is a feedforward artificial neural network model |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
45 that has one layer or more of hidden units and nonlinear activations. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
46 Intermidiate layers usually have as activation function thanh or the |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
47 sigmoid function while the top layer is a softamx layer. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
48 """ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
49 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
50 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
51 |
435 | 52 def __init__(self, input, n_in, n_hidden, n_out,learning_rate, test_subclass): |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
53 """Initialize the parameters for the multilayer perceptron |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
54 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
55 :param input: symbolic variable that describes the input of the |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
56 architecture (one minibatch) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
57 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
58 :param n_in: number of input units, the dimension of the space in |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
59 which the datapoints lie |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
60 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
61 :param n_hidden: number of hidden units |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
62 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
63 :param n_out: number of output units, the dimension of the space in |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
64 which the labels lie |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
65 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
66 """ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
67 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
68 # initialize the parameters theta = (W1,b1,W2,b2) ; note that this |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
69 # example contains only one hidden layer, but one can have as many |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
70 # layers as he/she wishes, making the network deeper. The only |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
71 # problem making the network deep this way is during learning, |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
72 # backpropagation being unable to move the network from the starting |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
73 # point towards; this is where pre-training helps, giving a good |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
74 # starting point for backpropagation, but more about this in the |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
75 # other tutorials |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
76 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
77 # `W1` is initialized with `W1_values` which is uniformely sampled |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
78 # from -6./sqrt(n_in+n_hidden) and 6./sqrt(n_in+n_hidden) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
79 # the output of uniform if converted using asarray to dtype |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
80 # theano.config.floatX so that the code is runable on GPU |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
81 W1_values = numpy.asarray( numpy.random.uniform( \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
82 low = -numpy.sqrt(6./(n_in+n_hidden)), \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
83 high = numpy.sqrt(6./(n_in+n_hidden)), \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
84 size = (n_in, n_hidden)), dtype = theano.config.floatX) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
85 # `W2` is initialized with `W2_values` which is uniformely sampled |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
86 # from -6./sqrt(n_hidden+n_out) and 6./sqrt(n_hidden+n_out) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
87 # the output of uniform if converted using asarray to dtype |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
88 # theano.config.floatX so that the code is runable on GPU |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
89 W2_values = numpy.asarray( numpy.random.uniform( |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
90 low = -numpy.sqrt(6./(n_hidden+n_out)), \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
91 high= numpy.sqrt(6./(n_hidden+n_out)),\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
92 size= (n_hidden, n_out)), dtype = theano.config.floatX) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
93 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
94 self.W1 = theano.shared( value = W1_values ) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
95 self.b1 = theano.shared( value = numpy.zeros((n_hidden,), |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
96 dtype= theano.config.floatX)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
97 self.W2 = theano.shared( value = W2_values ) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
98 self.b2 = theano.shared( value = numpy.zeros((n_out,), |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
99 dtype= theano.config.floatX)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
100 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
101 #include the learning rate in the classifer so |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
102 #we can modify it on the fly when we want |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
103 lr_value=learning_rate |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
104 self.lr=theano.shared(value=lr_value) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
105 # symbolic expression computing the values of the hidden layer |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
106 self.hidden = T.tanh(T.dot(input, self.W1)+ self.b1) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
107 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
108 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
109 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
110 # symbolic expression computing the values of the top layer |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
111 self.p_y_given_x= T.nnet.softmax(T.dot(self.hidden, self.W2)+self.b2) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
112 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
113 # compute prediction as class whose probability is maximal in |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
114 # symbolic form |
435 | 115 #self.y_pred = T.argmax( self.p_y_given_x, axis =1) |
116 #self.y_pred_num = T.argmax( self.p_y_given_x[0:9], axis =1) | |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
117 |
435 | 118 self.test_subclass = test_subclass |
119 | |
120 #if (self.test_subclass == "u"): | |
121 # self.y_pred = T.argmax( self.p_y_given_x[10:35], axis =1) + 10 | |
122 #elif (self.test_subclass == "l"): | |
123 # self.y_pred = T.argmax( self.p_y_given_x[35:], axis =1) + 35 | |
124 #elif (self.test_subclass == "d"): | |
125 # self.y_pred = T.argmax( self.p_y_given_x[0:9], axis =1) | |
126 #else: | |
127 self.y_pred = T.argmax( self.p_y_given_x, axis =1) | |
128 | |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
129 # L1 norm ; one regularization option is to enforce L1 norm to |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
130 # be small |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
131 self.L1 = abs(self.W1).sum() + abs(self.W2).sum() |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
132 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
133 # square of L2 norm ; one regularization option is to enforce |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
134 # square of L2 norm to be small |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
135 self.L2_sqr = (self.W1**2).sum() + (self.W2**2).sum() |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
136 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
137 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
138 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
139 def negative_log_likelihood(self, y): |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
140 """Return the mean of the negative log-likelihood of the prediction |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
141 of this model under a given target distribution. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
142 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
143 .. math:: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
144 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
145 \frac{1}{|\mathcal{D}|}\mathcal{L} (\theta=\{W,b\}, \mathcal{D}) = |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
146 \frac{1}{|\mathcal{D}|}\sum_{i=0}^{|\mathcal{D}|} \log(P(Y=y^{(i)}|x^{(i)}, W,b)) \\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
147 \ell (\theta=\{W,b\}, \mathcal{D}) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
148 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
149 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
150 :param y: corresponds to a vector that gives for each example the |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
151 :correct label |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
152 """ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
153 return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]),y]) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
154 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
155 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
156 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
157 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
158 def errors(self, y): |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
159 """Return a float representing the number of errors in the minibatch |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
160 over the total number of examples of the minibatch |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
161 """ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
162 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
163 # check if y has same dimension of y_pred |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
164 if y.ndim != self.y_pred.ndim: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
165 raise TypeError('y should have the same shape as self.y_pred', |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
166 ('y', target.type, 'y_pred', self.y_pred.type)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
167 # check if y is of the correct datatype |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
168 if y.dtype.startswith('int'): |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
169 # the T.neq operator returns a vector of 0s and 1s, where 1 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
170 # represents a mistake in prediction |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
171 return T.mean(T.neq(self.y_pred, y)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
172 else: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
173 raise NotImplementedError() |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
174 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
175 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
176 def mlp_full_nist( verbose = False,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
177 adaptive_lr = 1,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
178 train_data = 'all/all_train_data.ft',\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
179 train_labels = 'all/all_train_labels.ft',\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
180 test_data = 'all/all_test_data.ft',\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
181 test_labels = 'all/all_test_labels.ft',\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
182 learning_rate=0.5,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
183 L1_reg = 0.00,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
184 L2_reg = 0.0001,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
185 nb_max_exemples=1000000,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
186 batch_size=20,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
187 nb_hidden = 500,\ |
435 | 188 nb_targets = 26,\ |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
189 tau=1e6,\ |
435 | 190 main_class="l",\ |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
191 start_ratio=1,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
192 end_ratio=1): |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
193 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
194 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
195 configuration = [learning_rate,nb_max_exemples,nb_hidden,adaptive_lr] |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
196 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
197 #save initial learning rate if classical adaptive lr is used |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
198 initial_lr=learning_rate |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
199 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
200 total_validation_error_list = [] |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
201 total_train_error_list = [] |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
202 learning_rate_list=[] |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
203 best_training_error=float('inf'); |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
204 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
205 # set up batches |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
206 batches = setup_batches.Batches() |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
207 batches.set_batches(main_class, start_ratio,end_ratio,batch_size,verbose) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
208 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
209 train_batches = batches.get_train_batches() |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
210 test_batches = batches.get_test_batches() |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
211 validation_batches = batches.get_validation_batches() |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
212 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
213 ishape = (32,32) # this is the size of NIST images |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
214 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
215 # allocate symbolic variables for the data |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
216 x = T.fmatrix() # the data is presented as rasterized images |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
217 y = T.lvector() # the labels are presented as 1D vector of |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
218 # [long int] labels |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
219 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
220 if verbose==True: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
221 print 'finished parsing the data' |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
222 # construct the logistic regression class |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
223 classifier = MLP( input=x.reshape((batch_size,32*32)),\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
224 n_in=32*32,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
225 n_hidden=nb_hidden,\ |
435 | 226 n_out=nb_targets,\ |
227 learning_rate=learning_rate,\ | |
228 test_subclass=main_class) | |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
229 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
230 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
231 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
232 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
233 # the cost we minimize during training is the negative log likelihood of |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
234 # the model plus the regularization terms (L1 and L2); cost is expressed |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
235 # here symbolically |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
236 cost = classifier.negative_log_likelihood(y) \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
237 + L1_reg * classifier.L1 \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
238 + L2_reg * classifier.L2_sqr |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
239 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
240 # compiling a theano function that computes the mistakes that are made by |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
241 # the model on a minibatch |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
242 test_model = theano.function([x,y], classifier.errors(y)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
243 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
244 # compute the gradient of cost with respect to theta = (W1, b1, W2, b2) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
245 g_W1 = T.grad(cost, classifier.W1) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
246 g_b1 = T.grad(cost, classifier.b1) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
247 g_W2 = T.grad(cost, classifier.W2) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
248 g_b2 = T.grad(cost, classifier.b2) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
249 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
250 # specify how to update the parameters of the model as a dictionary |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
251 updates = \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
252 { classifier.W1: classifier.W1 - classifier.lr*g_W1 \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
253 , classifier.b1: classifier.b1 - classifier.lr*g_b1 \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
254 , classifier.W2: classifier.W2 - classifier.lr*g_W2 \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
255 , classifier.b2: classifier.b2 - classifier.lr*g_b2 } |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
256 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
257 # compiling a theano function `train_model` that returns the cost, but in |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
258 # the same time updates the parameter of the model based on the rules |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
259 # defined in `updates` |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
260 train_model = theano.function([x, y], cost, updates = updates ) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
261 n_minibatches = len(train_batches) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
262 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
263 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
264 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
265 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
266 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
267 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
268 #conditions for stopping the adaptation: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
269 #1) we have reached nb_max_exemples (this is rounded up to be a multiple of the train size) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
270 #2) validation error is going up twice in a row(probable overfitting) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
271 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
272 # This means we no longer stop on slow convergence as low learning rates stopped |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
273 # too fast. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
274 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
275 # no longer relevant |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
276 patience =nb_max_exemples/batch_size |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
277 patience_increase = 2 # wait this much longer when a new best is |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
278 # found |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
279 improvement_threshold = 0.995 # a relative improvement of this much is |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
280 # considered significant |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
281 validation_frequency = n_minibatches/4 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
282 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
283 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
284 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
285 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
286 best_params = None |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
287 best_validation_loss = float('inf') |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
288 best_iter = 0 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
289 test_score = 0. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
290 start_time = time.clock() |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
291 n_iter = nb_max_exemples/batch_size # nb of max times we are allowed to run through all exemples |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
292 n_iter = n_iter/n_minibatches + 1 #round up |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
293 n_iter=max(1,n_iter) # run at least once on short debug call |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
294 time_n=0 #in unit of exemples |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
295 |
435 | 296 if (main_class == "u"): |
297 class_offset = 10 | |
298 elif (main_class == "l"): | |
299 class_offset = 36 | |
300 else: | |
301 class_offset = 0 | |
302 | |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
303 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
304 if verbose == True: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
305 print 'looping at most %d times through the data set' %n_iter |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
306 for iter in xrange(n_iter* n_minibatches): |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
307 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
308 # get epoch and minibatch index |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
309 epoch = iter / n_minibatches |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
310 minibatch_index = iter % n_minibatches |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
311 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
312 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
313 if adaptive_lr==2: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
314 classifier.lr.value = tau*initial_lr/(tau+time_n) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
315 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
316 # get the minibatches corresponding to `iter` modulo |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
317 # `len(train_batches)` |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
318 x,y = train_batches[ minibatch_index ] |
435 | 319 |
320 y = y - class_offset | |
321 | |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
322 # convert to float |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
323 x_float = x/255.0 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
324 cost_ij = train_model(x_float,y) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
325 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
326 if (iter+1) % validation_frequency == 0: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
327 # compute zero-one loss on validation set |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
328 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
329 this_validation_loss = 0. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
330 for x,y in validation_batches: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
331 # sum up the errors for each minibatch |
435 | 332 y = y - class_offset |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
333 x_float = x/255.0 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
334 this_validation_loss += test_model(x_float,y) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
335 # get the average by dividing with the number of minibatches |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
336 this_validation_loss /= len(validation_batches) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
337 #save the validation loss |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
338 total_validation_error_list.append(this_validation_loss) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
339 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
340 #get the training error rate |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
341 this_train_loss=0 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
342 for x,y in train_batches: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
343 # sum up the errors for each minibatch |
435 | 344 y = y - class_offset |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
345 x_float = x/255.0 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
346 this_train_loss += test_model(x_float,y) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
347 # get the average by dividing with the number of minibatches |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
348 this_train_loss /= len(train_batches) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
349 #save the validation loss |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
350 total_train_error_list.append(this_train_loss) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
351 if(this_train_loss<best_training_error): |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
352 best_training_error=this_train_loss |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
353 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
354 if verbose == True: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
355 print('epoch %i, minibatch %i/%i, validation error %f, training error %f %%' % \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
356 (epoch, minibatch_index+1, n_minibatches, \ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
357 this_validation_loss*100.,this_train_loss*100)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
358 print 'learning rate = %f' %classifier.lr.value |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
359 print 'time = %i' %time_n |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
360 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
361 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
362 #save the learning rate |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
363 learning_rate_list.append(classifier.lr.value) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
364 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
365 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
366 # if we got the best validation score until now |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
367 if this_validation_loss < best_validation_loss: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
368 # save best validation score and iteration number |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
369 best_validation_loss = this_validation_loss |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
370 best_iter = iter |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
371 # reset patience if we are going down again |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
372 # so we continue exploring |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
373 patience=nb_max_exemples/batch_size |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
374 # test it on the test set |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
375 test_score = 0. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
376 for x,y in test_batches: |
435 | 377 y = y - class_offset |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
378 x_float=x/255.0 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
379 test_score += test_model(x_float,y) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
380 test_score /= len(test_batches) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
381 if verbose == True: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
382 print((' epoch %i, minibatch %i/%i, test error of best ' |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
383 'model %f %%') % |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
384 (epoch, minibatch_index+1, n_minibatches, |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
385 test_score*100.)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
386 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
387 # if the validation error is going up, we are overfitting (or oscillating) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
388 # stop converging but run at least to next validation |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
389 # to check overfitting or ocsillation |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
390 # the saved weights of the model will be a bit off in that case |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
391 elif this_validation_loss >= best_validation_loss: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
392 #calculate the test error at this point and exit |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
393 # test it on the test set |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
394 # however, if adaptive_lr is true, try reducing the lr to |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
395 # get us out of an oscilliation |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
396 if adaptive_lr==1: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
397 classifier.lr.value=classifier.lr.value/2.0 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
398 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
399 test_score = 0. |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
400 #cap the patience so we are allowed one more validation error |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
401 #calculation before aborting |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
402 patience = iter+validation_frequency+1 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
403 for x,y in test_batches: |
435 | 404 y = y - class_offset |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
405 x_float=x/255.0 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
406 test_score += test_model(x_float,y) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
407 test_score /= len(test_batches) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
408 if verbose == True: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
409 print ' validation error is going up, possibly stopping soon' |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
410 print((' epoch %i, minibatch %i/%i, test error of best ' |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
411 'model %f %%') % |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
412 (epoch, minibatch_index+1, n_minibatches, |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
413 test_score*100.)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
414 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
415 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
416 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
417 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
418 if iter>patience: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
419 print 'we have diverged' |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
420 break |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
421 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
422 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
423 time_n= time_n + batch_size |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
424 end_time = time.clock() |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
425 if verbose == True: |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
426 print(('Optimization complete. Best validation score of %f %% ' |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
427 'obtained at iteration %i, with test performance %f %%') % |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
428 (best_validation_loss * 100., best_iter, test_score*100.)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
429 print ('The code ran for %f minutes' % ((end_time-start_time)/60.)) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
430 print iter |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
431 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
432 #save the model and the weights |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
433 numpy.savez('model.npy', config=configuration, W1=classifier.W1.value,W2=classifier.W2.value, b1=classifier.b1.value,b2=classifier.b2.value) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
434 numpy.savez('results.npy',config=configuration,total_train_error_list=total_train_error_list,total_validation_error_list=total_validation_error_list,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
435 learning_rate_list=learning_rate_list) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
436 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
437 return (best_training_error*100.0,best_validation_loss * 100.,test_score*100.,best_iter*batch_size,(end_time-start_time)/60) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
438 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
439 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
440 if __name__ == '__main__': |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
441 mlp_full_nist(True) |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
442 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
443 def jobman_mlp_full_nist(state,channel): |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
444 (train_error,validation_error,test_error,nb_exemples,time)=mlp_full_nist(learning_rate=state.learning_rate,\ |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
445 nb_hidden=state.nb_hidden,\ |
435 | 446 main_class=state.main_class,\ |
447 start_ratio=state.ratio,\ | |
448 end_ratio=state.ratio) | |
357
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
449 state.train_error=train_error |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
450 state.validation_error=validation_error |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
451 state.test_error=test_error |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
452 state.nb_exemples=nb_exemples |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
453 state.time=time |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
454 return channel.COMPLETE |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
455 |
9a7b74927f7d
version mlp modifiée pour la selection du ratio de la classe principale
Guillaume Sicard <guitch21@gmail.com>
parents:
diff
changeset
|
456 |