Mercurial > pylearn
annotate learner.py @ 167:4803cb76e26b
Updated documentation
author | Joseph Turian <turian@gmail.com> |
---|---|
date | Mon, 12 May 2008 18:51:42 -0400 |
parents | ceae4de18981 |
children | fb4837eed1a6 |
rev | line source |
---|---|
1
2cd82666b9a7
Added statscollector and started writing dataset and learner.
bengioy@esprit.iro.umontreal.ca
parents:
0
diff
changeset
|
1 |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
2 from dataset import AttributesHolder,AbstractFunction,ApplyFunctionDataSet,DataSet,CachedDataSet |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
3 import theano |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
4 from theano import compile |
129
4c2280edcaf5
Fixed typos in learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
128
diff
changeset
|
5 from theano import tensor as t |
1
2cd82666b9a7
Added statscollector and started writing dataset and learner.
bengioy@esprit.iro.umontreal.ca
parents:
0
diff
changeset
|
6 |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
7 class Learner(AttributesHolder): |
132
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
8 """ |
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
9 Base class for learning algorithms, provides an interface |
1
2cd82666b9a7
Added statscollector and started writing dataset and learner.
bengioy@esprit.iro.umontreal.ca
parents:
0
diff
changeset
|
10 that allows various algorithms to be applicable to generic learning |
2cd82666b9a7
Added statscollector and started writing dataset and learner.
bengioy@esprit.iro.umontreal.ca
parents:
0
diff
changeset
|
11 algorithms. |
2cd82666b9a7
Added statscollector and started writing dataset and learner.
bengioy@esprit.iro.umontreal.ca
parents:
0
diff
changeset
|
12 |
132
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
13 A L{Learner} can be seen as a learning algorithm, a function that when |
135
0d8e721cc63c
Fixed bugs in dataset to make test_mlp.py work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
134
diff
changeset
|
14 applied to training data returns a learned function (which is an object that |
0d8e721cc63c
Fixed bugs in dataset to make test_mlp.py work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
134
diff
changeset
|
15 can be applied to other data and return some output data). |
1
2cd82666b9a7
Added statscollector and started writing dataset and learner.
bengioy@esprit.iro.umontreal.ca
parents:
0
diff
changeset
|
16 """ |
2cd82666b9a7
Added statscollector and started writing dataset and learner.
bengioy@esprit.iro.umontreal.ca
parents:
0
diff
changeset
|
17 |
10
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
18 def __init__(self): |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
19 pass |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
20 |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
21 def forget(self): |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
22 """ |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
23 Reset the state of the learner to a blank slate, before seeing |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
24 training data. The operation may be non-deterministic if the |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
25 learner has a random number generator that is set to use a |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
26 different seed each time it forget() is called. |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
27 """ |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
28 raise NotImplementedError |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
29 |
14 | 30 def update(self,training_set,train_stats_collector=None): |
10
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
31 """ |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
32 Continue training a learner, with the evidence provided by the given training set. |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
33 Hence update can be called multiple times. This is particularly useful in the |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
34 on-line setting or the sequential (Bayesian or not) settings. |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
35 The result is a function that can be applied on data, with the same |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
36 semantics of the Learner.use method. |
75
90e4c0784d6e
Added draft of LinearRegression learner
bengioy@bengiomac.local
parents:
20
diff
changeset
|
37 |
132
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
38 The user may optionally provide a training L{StatsCollector} that is used to record |
75
90e4c0784d6e
Added draft of LinearRegression learner
bengioy@bengiomac.local
parents:
20
diff
changeset
|
39 some statistics of the outputs computed during training. It is update(d) during |
90e4c0784d6e
Added draft of LinearRegression learner
bengioy@bengiomac.local
parents:
20
diff
changeset
|
40 training. |
10
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
41 """ |
13
633453635d51
Starting to work on gradient_based_learner.py
bengioy@bengiomac.local
parents:
10
diff
changeset
|
42 return self.use # default behavior is 'non-adaptive', i.e. update does not do anything |
10
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
43 |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
44 |
20
266c68cb6136
Minor editions, plus adding untested ApplyFunctionDataset for GradientLearner in the works.
bengioy@bengiomac.local
parents:
14
diff
changeset
|
45 def __call__(self,training_set,train_stats_collector=None): |
10
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
46 """ |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
47 Train a learner from scratch using the provided training set, |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
48 and return the learned function. |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
49 """ |
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
50 self.forget() |
133 | 51 return self.update(training_set,train_stats_collector) |
1
2cd82666b9a7
Added statscollector and started writing dataset and learner.
bengioy@esprit.iro.umontreal.ca
parents:
0
diff
changeset
|
52 |
128 | 53 def use(self,input_dataset,output_fieldnames=None, |
135
0d8e721cc63c
Fixed bugs in dataset to make test_mlp.py work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
134
diff
changeset
|
54 test_stats_collector=None,copy_inputs=False, |
128 | 55 put_stats_in_output_dataset=True, |
56 output_attributes=[]): | |
57 """ | |
132
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
58 Once a L{Learner} has been trained by one or more call to 'update', it can |
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
59 be used with one or more calls to 'use'. The argument is an input L{DataSet} (possibly |
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
60 containing a single example) and the result is an output L{DataSet} of the same length. |
128 | 61 If output_fieldnames is specified, it may be use to indicate which fields should |
132
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
62 be constructed in the output L{DataSet} (for example ['output','classification_error']). |
128 | 63 Otherwise, self.defaultOutputFields is called to choose the output fields. |
20
266c68cb6136
Minor editions, plus adding untested ApplyFunctionDataset for GradientLearner in the works.
bengioy@bengiomac.local
parents:
14
diff
changeset
|
64 Optionally, if copy_inputs, the input fields (of the input_dataset) can be made |
132
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
65 visible in the output L{DataSet} returned by this method. |
128 | 66 Optionally, attributes of the learner can be copied in the output dataset, |
67 and statistics computed by the stats collector also put in the output dataset. | |
68 Note the distinction between fields (which are example-wise quantities, e.g. 'input') | |
69 and attributes (which are not, e.g. 'regularization_term'). | |
70 | |
71 We provide here a default implementation that does all this using | |
72 a sub-class defined method: minibatchwiseUseFunction. | |
73 | |
74 @todo check if some of the learner attributes are actually SPECIFIED | |
75 as attributes of the input_dataset, and if so use their values instead | |
76 of the ones in the learner. | |
77 | |
78 The learner tries to compute in the output dataset the output fields specified. | |
79 If None is specified then self.defaultOutputFields(input_dataset.fieldNames()) | |
80 is called to determine the output fields. | |
81 | |
82 Attributes of the learner can also optionally be copied into the output dataset. | |
83 If output_attributes is None then all of the attributes in self.AttributeNames() | |
84 are copied in the output dataset, but if it is [] (the default), then none are copied. | |
85 If a test_stats_collector is provided, then its attributes (test_stats_collector.AttributeNames()) | |
86 are also copied into the output dataset attributes. | |
10
80bf5492e571
Rewrote learner.py according to the specs in the wiki for learners.
bengioy@esprit.iro.umontreal.ca
parents:
1
diff
changeset
|
87 """ |
135
0d8e721cc63c
Fixed bugs in dataset to make test_mlp.py work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
134
diff
changeset
|
88 input_fieldnames = input_dataset.fieldNames() |
0d8e721cc63c
Fixed bugs in dataset to make test_mlp.py work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
134
diff
changeset
|
89 if not output_fieldnames: |
0d8e721cc63c
Fixed bugs in dataset to make test_mlp.py work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
134
diff
changeset
|
90 output_fieldnames = self.defaultOutputFields(input_fieldnames) |
0d8e721cc63c
Fixed bugs in dataset to make test_mlp.py work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
134
diff
changeset
|
91 |
0d8e721cc63c
Fixed bugs in dataset to make test_mlp.py work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
134
diff
changeset
|
92 minibatchwise_use_function = self.minibatchwiseUseFunction(input_fieldnames, |
128 | 93 output_fieldnames, |
94 test_stats_collector) | |
95 virtual_output_dataset = ApplyFunctionDataSet(input_dataset, | |
96 minibatchwise_use_function, | |
135
0d8e721cc63c
Fixed bugs in dataset to make test_mlp.py work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
134
diff
changeset
|
97 output_fieldnames, |
128 | 98 True,DataSet.numpy_vstack, |
99 DataSet.numpy_hstack) | |
100 # actually force the computation | |
101 output_dataset = CachedDataSet(virtual_output_dataset,True) | |
102 if copy_inputs: | |
103 output_dataset = input_dataset | output_dataset | |
104 # copy the wanted attributes in the dataset | |
105 if output_attributes is None: | |
106 output_attributes = self.attributeNames() | |
107 if output_attributes: | |
108 assert set(attribute_names) <= set(self.attributeNames()) | |
109 output_dataset.setAttributes(output_attributes, | |
110 self.names2attributes(output_attributes,return_copy=True)) | |
111 if test_stats_collector: | |
112 test_stats_collector.update(output_dataset) | |
113 if put_stats_in_output_dataset: | |
114 output_dataset.setAttributes(test_stats_collector.attributeNames(), | |
115 test_stats_collector.attributes()) | |
116 return output_dataset | |
77
1e2bb5bad636
toying with different ways to implement learners
bengioy@bengiomac.local
parents:
75
diff
changeset
|
117 |
128 | 118 def minibatchwiseUseFunction(self, input_fields, output_fields, stats_collector): |
119 """ | |
120 Returns a function that can map the given input fields to the given output fields | |
121 and to the attributes that the stats collector needs for its computation. | |
122 That function is expected to operate on minibatches. | |
123 The function returned makes use of the self.useInputAttributes() and | |
124 sets the attributes specified by self.useOutputAttributes(). | |
125 """ | |
143
b7ca3545186b
added missing raise
Frederic Bastien <bastienf@iro.umontreal.ca>
parents:
134
diff
changeset
|
126 raise AbstractFunction() |
b7ca3545186b
added missing raise
Frederic Bastien <bastienf@iro.umontreal.ca>
parents:
134
diff
changeset
|
127 |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
128 def attributeNames(self): |
78 | 129 """ |
130 A Learner may have attributes that it wishes to export to other objects. To automate | |
131 such export, sub-classes should define here the names (list of strings) of these attributes. | |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
132 |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
133 @todo By default, attributeNames looks for all dictionary entries whose name does not start with _. |
78 | 134 """ |
135 return [] | |
77
1e2bb5bad636
toying with different ways to implement learners
bengioy@bengiomac.local
parents:
75
diff
changeset
|
136 |
128 | 137 def attributes(self,return_copy=False): |
138 """ | |
139 Return a list with the values of the learner's attributes (or optionally, a deep copy). | |
140 """ | |
141 return self.names2attributes(self.attributeNames(),return_copy) | |
142 | |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
143 def names2attributes(self,names): |
128 | 144 """ |
145 Private helper function that maps a list of attribute names to a list | |
146 of (optionally copies) values of attributes. | |
147 """ | |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
148 res=[] |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
149 for name in names: |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
150 assert name in names |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
151 res.append(self.__getattribute__(name)) |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
152 return res |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
153 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
154 def useInputAttributes(self): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
155 """ |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
156 A subset of self.attributeNames() which are the names of attributes needed by use() in order |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
157 to do its work. |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
158 """ |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
159 raise AbstractFunction() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
160 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
161 def useOutputAttributes(self): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
162 """ |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
163 A subset of self.attributeNames() which are the names of attributes modified/created by use() in order |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
164 to do its work. |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
165 """ |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
166 raise AbstractFunction() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
167 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
168 |
78 | 169 class TLearner(Learner): |
170 """ | |
167 | 171 TLearner is a virtual class of L{Learner}s that attempts to factor |
172 out of the definition of a learner the steps that are common to | |
173 many implementations of learning algorithms, so as to leave only | |
174 'the equations' to define in particular sub-classes, using Theano. | |
78 | 175 |
167 | 176 In the default implementations of use and update, it is assumed |
177 that the 'use' and 'update' methods visit examples in the input | |
178 dataset sequentially. In the 'use' method only one pass through the | |
179 dataset is done, whereas the sub-learner may wish to iterate over | |
180 the examples multiple times. Subclasses where this basic model is | |
181 not appropriate can simply redefine update or use. | |
182 | |
78 | 183 Sub-classes must provide the following functions and functionalities: |
167 | 184 - attributeNames(): defines all the names of attributes which can |
185 be used as fields or | |
186 attributes in input/output datasets or in | |
187 stats collectors. All these attributes | |
188 are expected to be theano.Result objects | |
189 (with a .data property and recognized by | |
190 theano.Function for compilation). The sub-class | |
191 constructor defines the relations between the | |
192 Theano variables that may be used by 'use' | |
193 and 'update' or by a stats collector. | |
194 - defaultOutputFields(input_fields): return a list of default | |
195 dataset output fields when | |
78 | 196 None are provided by the caller of use. |
167 | 197 The following naming convention is assumed and important. Attributes |
198 whose names are listed in attributeNames() can be of any type, | |
199 but those that can be referenced as input/output dataset fields or | |
200 as output attributes in 'use' or as input attributes in the stats | |
201 collector should be associated with a Theano Result variable. If the | |
202 exported attribute name is <name>, the corresponding Result name | |
203 (an internal attribute of the TLearner, created in the sub-class | |
204 constructor) should be _<name>. Typically <name> will be numpy | |
205 ndarray and _<name> will be the corresponding Theano Tensor (for | |
206 symbolic manipulation). | |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
207 |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
208 @todo pousser dans Learner toute la poutine qui peut l'etre sans etre |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
209 dependant de Theano |
78 | 210 """ |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
211 |
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
212 def __init__(self): |
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
213 Learner.__init__(self) |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
214 self.use_functions_dictionary={} |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
215 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
216 def defaultOutputFields(self, input_fields): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
217 """ |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
218 Return a default list of output field names (to put in the output dataset). |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
219 This will be used when None are provided (as output_fields) by the caller of the 'use' method. |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
220 This may involve looking at the input_fields (names) available in the |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
221 input_dataset. |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
222 """ |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
223 raise AbstractFunction() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
224 |
128 | 225 def minibatchwiseUseFunction(self, input_fields, output_fields, stats_collector): |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
226 """ |
128 | 227 Implement minibatchwiseUseFunction by exploiting Theano compilation |
228 and the expression graph defined by a sub-class constructor. | |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
229 """ |
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
230 if stats_collector: |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
231 stats_collector_inputs = stats_collector.input2UpdateAttributes() |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
232 for attribute in stats_collector_inputs: |
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
233 if attribute not in input_fields: |
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
234 output_fields.append(attribute) |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
235 key = (tuple(input_fields),tuple(output_fields)) |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
236 if key not in self.use_functions_dictionary: |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
237 use_input_attributes = self.useInputAttributes() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
238 use_output_attributes = self.useOutputAttributes() |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
239 complete_f = compile.function(self.names2OpResults(input_fields+use_input_attributes), |
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
240 self.names2OpResults(output_fields+use_output_attributes)) |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
241 def f(*input_field_values): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
242 input_attribute_values = self.names2attributes(use_input_attributes) |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
243 results = complete_f(*(list(input_field_values) + input_attribute_values)) |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
244 output_field_values = results[0:len(output_fields)] |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
245 output_attribute_values = results[len(output_fields):len(results)] |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
246 if use_output_attributes: |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
247 self.setAttributes(use_output_attributes,output_attribute_values) |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
248 return output_field_values |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
249 self.use_functions_dictionary[key]=f |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
250 return self.use_functions_dictionary[key] |
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
251 |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
252 def names2OpResults(self,names): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
253 """ |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
254 Private helper function that maps a list of attribute names to a list |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
255 of corresponding Op Results (with the same name but with a '_' prefix). |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
256 """ |
133 | 257 return [self.__getattribute__('_'+name) for name in names] |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
258 |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
259 |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
260 class MinibatchUpdatesTLearner(TLearner): |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
261 """ |
167 | 262 This adds the following functions to a L{TLearner}: |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
263 - updateStart(), updateEnd(), updateMinibatch(minibatch), isLastEpoch(): |
167 | 264 functions executed at the beginning, the end, in the middle (for |
265 each minibatch) of the update method, and at the end of each | |
266 epoch. This model only works for 'online' or one-shot learning | |
267 that requires going only once through the training data. For more | |
268 complicated models, more specialized subclasses of TLearner should | |
269 be used or a learning-algorithm specific update method should | |
270 be defined. | |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
271 |
167 | 272 - a 'parameters' attribute which is a list of parameters |
273 (whose names are specified by the user's subclass with the | |
274 parameterAttributes() method) | |
275 | |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
276 """ |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
277 |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
278 def __init__(self): |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
279 TLearner.__init__(self) |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
280 self.update_minibatch_function = compile.function(self.names2OpResults(self.updateMinibatchOutputAttributes()+ |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
281 self.updateMinibatchInputFields()), |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
282 self.names2OpResults(self.updateMinibatchOutputAttributes())) |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
283 self.update_end_function = compile.function(self.names2OpResults(self.updateEndInputAttributes()), |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
284 self.names2OpResults(self.updateEndOutputAttributes())) |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
285 |
128 | 286 def allocate(self, minibatch): |
287 """ | |
132
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
288 This function is called at the beginning of each L{updateMinibatch} |
128 | 289 and should be used to check that all required attributes have been |
290 allocated and initialized (usually this function calls forget() | |
291 when it has to do an initialization). | |
292 """ | |
293 raise AbstractFunction() | |
294 | |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
295 def updateMinibatchInputFields(self): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
296 raise AbstractFunction() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
297 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
298 def updateMinibatchInputAttributes(self): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
299 raise AbstractFunction() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
300 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
301 def updateMinibatchOutputAttributes(self): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
302 raise AbstractFunction() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
303 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
304 def updateEndInputAttributes(self): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
305 raise AbstractFunction() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
306 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
307 def updateEndOutputAttributes(self): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
308 raise AbstractFunction() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
309 |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
310 def parameterAttributes(self): |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
311 raise AbstractFunction() |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
312 |
133 | 313 def updateStart(self,training_set): |
314 pass | |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
315 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
316 def updateEnd(self): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
317 self.setAttributes(self.updateEndOutputAttributes(), |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
318 self.update_end_function(*self.names2attributes(self.updateEndInputAttributes()))) |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
319 self.parameters = self.names2attributes(self.parameterAttributes()) |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
320 |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
321 def updateMinibatch(self,minibatch): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
322 # make sure all required fields are allocated and initialized |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
323 self.allocate(minibatch) |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
324 input_attributes = self.names2attributes(self.updateMinibatchInputAttributes()) |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
325 input_fields = minibatch(*self.updateMinibatchInputFields()) |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
326 self.setAttributes(self.updateMinibatchOutputAttributes(), |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
327 # concatenate the attribute values and field values and then apply update fn |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
328 self.update_minibatch_function(*(input_attributes+input_fields))) |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
329 |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
330 def isLastEpoch(self): |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
331 """ |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
332 This method is called at the end of each epoch (cycling over the training set). |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
333 It returns a boolean to indicate if this is the last epoch. |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
334 By default just do one epoch. |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
335 """ |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
336 return True |
78 | 337 |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
338 def update(self,training_set,train_stats_collector=None): |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
339 """ |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
340 @todo check if some of the learner attributes are actually SPECIFIED |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
341 in as attributes of the training_set. |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
342 """ |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
343 self.updateStart(training_set) |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
344 stop=False |
133 | 345 if hasattr(self,'_minibatch_size') and self._minibatch_size: |
346 minibatch_size=self._minibatch_size | |
347 else: | |
348 minibatch_size=min(100,len(training_set)) | |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
349 while not stop: |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
350 if train_stats_collector: |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
351 train_stats_collector.forget() # restart stats collectin at the beginning of each epoch |
133 | 352 for minibatch in training_set.minibatches(minibatch_size=minibatch_size): |
353 self.updateMinibatch(minibatch) | |
107
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
354 if train_stats_collector: |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
355 minibatch_set = minibatch.examples() |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
356 minibatch_set.setAttributes(self.attributeNames(),self.attributes()) |
c4916445e025
Comments from Pascal V.
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
92
diff
changeset
|
357 train_stats_collector.update(minibatch_set) |
110
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
358 stop = self.isLastEpoch() |
8fa1ef2411a0
Worked on OneShotTLearner and implementation of LinearRegression
bengioy@bengiomac.local
parents:
109
diff
changeset
|
359 self.updateEnd() |
92
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
360 return self.use |
c4726e19b8ec
Finished first draft of TLearner
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
78
diff
changeset
|
361 |
129
4c2280edcaf5
Fixed typos in learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
128
diff
changeset
|
362 class OnlineGradientTLearner(MinibatchUpdatesTLearner): |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
363 """ |
132
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
364 Specialization of L{MinibatchUpdatesTLearner} in which the minibatch updates |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
365 are obtained by performing an online (minibatch-based) gradient step. |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
366 |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
367 Sub-classes must define the following: |
132
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
368 - self._learning_rate (may be changed by the sub-class between epochs or minibatches) |
f6505ec32dc3
Updated documentation slightly
Joseph Turian <turian@gmail.com>
parents:
131
diff
changeset
|
369 - self.lossAttribute() = name of the loss field |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
370 """ |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
371 def __init__(self,truly_online=False): |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
372 """ |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
373 If truly_online then only one pass is made through the training set passed to update(). |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
374 |
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
375 SUBCLASSES SHOULD CALL THIS CONSTRUCTOR ONLY AFTER HAVING DEFINED ALL THEIR THEANO FORMULAS |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
376 """ |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
377 self.truly_online=truly_online |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
378 |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
379 # create the formulas for the gradient update |
129
4c2280edcaf5
Fixed typos in learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
128
diff
changeset
|
380 old_params = [self.__getattribute__("_"+name) for name in self.parameterAttributes()] |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
381 new_params_names = ["_new_"+name for name in self.parameterAttributes()] |
129
4c2280edcaf5
Fixed typos in learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
128
diff
changeset
|
382 loss = self.__getattribute__("_"+self.lossAttribute()) |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
383 self.setAttributes(new_params_names, |
129
4c2280edcaf5
Fixed typos in learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
128
diff
changeset
|
384 [t.add_inplace(param,self._learning_rate*t.grad(loss,param)) |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
385 for param in old_params]) |
129
4c2280edcaf5
Fixed typos in learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
128
diff
changeset
|
386 MinibatchUpdatesTLearner.__init__(self) |
4c2280edcaf5
Fixed typos in learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
128
diff
changeset
|
387 |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
388 |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
389 def namesOfAttributesToComputeOutputs(self,output_names): |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
390 """ |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
391 The output_names are attribute names (not the corresponding Result names, which have leading _). |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
392 Return the corresponding input names |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
393 """ |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
394 all_inputs = t.gof.graph.inputs(self.names2OpResults(output_names)) |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
395 # remove constants and leading '_' in name |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
396 |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
397 return [r.name for r in all_inputs if isinstance(r,theano.Result) and \ |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
398 not isinstance(r,theano.Constant) and not isinstance(r,theano.Value)] |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
399 #inputs = [] |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
400 #for r in all_inputs: |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
401 # if isinstance(r,theano.Result) and \ |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
402 # not isinstance(r,theano.Constant) and not isinstance(r,theano.Value): |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
403 # inputs.append(r.name) |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
404 #return inputs |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
405 |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
406 def isLastEpoch(self): |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
407 return self.truly_online |
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
408 |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
409 def updateMinibatchInputAttributes(self): |
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
410 return self.parameterAttributes() |
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
411 |
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
412 def updateMinibatchOutputAttributes(self): |
133 | 413 return ["new_"+name for name in self.parameterAttributes()] |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
414 |
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
415 def updateEndInputAttributes(self): |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
416 return self.namesOfAttributesToComputeOutputs(self.updateEndOutputAttributes()) |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
417 |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
418 def useInputAttributes(self): |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
419 return self.parameterAttributes() |
111
88257dfedf8c
Added another work in progress, for mlp's
bengioy@bengiomac.local
parents:
110
diff
changeset
|
420 |
134
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
421 def useOutputAttributes(self): |
3f4e5c9bdc5e
Fixes to ApplyFunctionDataSet and other things to make learner and mlp work
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
133
diff
changeset
|
422 return [] |
118
d0a1bd0378c6
Finished draft of OneHiddenLayerNNetClassifier to debut learner.py
Yoshua Bengio <bengioy@iro.umontreal.ca>
parents:
111
diff
changeset
|
423 |