Mercurial > pylearn
comparison mlp_factory_approach.py @ 264:a1793a5e9523
we can now load and save in a file, see test class in the file for an example, but basically it's model1.save(filename) or learn_algo(filename) to load
author | Thierry Bertin-Mahieux <bertinmt@iro.umontreal.ca> |
---|---|
date | Wed, 04 Jun 2008 17:00:44 -0400 |
parents | 3156a9976183 |
children | ae0a8345869b |
comparison
equal
deleted
inserted
replaced
263:5614b186c5f4 | 264:a1793a5e9523 |
---|---|
1 import copy, sys | 1 import copy, sys, os |
2 import numpy | 2 import numpy |
3 | 3 |
4 import theano | 4 import theano |
5 from theano import tensor as T | 5 from theano import tensor as T |
6 | 6 |
7 from pylearn import dataset, nnet_ops, stopper, LookupList | 7 from pylearn import dataset, nnet_ops, stopper, LookupList, filetensor |
8 | |
8 | 9 |
9 class AbstractFunction (Exception): pass | 10 class AbstractFunction (Exception): pass |
10 | 11 |
11 class AutoName(object): | 12 class AutoName(object): |
12 """ | 13 """ |
33 | 34 |
34 def __copy__(self): | 35 def __copy__(self): |
35 raise Exception('why not called?') | 36 raise Exception('why not called?') |
36 return GraphLearner.Model(self.algo, [copy.copy(p) for p in params]) | 37 return GraphLearner.Model(self.algo, [copy.copy(p) for p in params]) |
37 | 38 |
39 def __eq__(self,other,tolerance=0.) : | |
40 """ Only compares weights of matrices and bias vector. """ | |
41 if not isinstance(other,GraphLearner.Model) : | |
42 return False | |
43 for p in range(4) : | |
44 if self.params[p].shape != other.params[p].shape : | |
45 return False | |
46 if not numpy.all( numpy.abs(self.params[p] - other.params[p]) <= tolerance ) : | |
47 return False | |
48 return True | |
49 | |
38 def _cache(self, key, valfn): | 50 def _cache(self, key, valfn): |
39 d = self._fn_cache | 51 d = self._fn_cache |
40 if key not in d: | 52 if key not in d: |
41 d[key] = valfn() | 53 d[key] = valfn() |
42 return d[key] | 54 return d[key] |
43 | 55 |
44 def update_minibatch(self, minibatch): | 56 def update_minibatch(self, minibatch): |
45 assert isinstance(minibatch, LookupList) | 57 #assert isinstance(minibatch, LookupList) # why false??? |
46 self.update_fn(minibatch['input'], minibatch['target'], *self.params) | 58 self.update_fn(minibatch['input'], minibatch['target'], *self.params) |
47 | 59 |
48 def update(self, dataset, | 60 def update(self, dataset, |
49 default_minibatch_size=32): | 61 default_minibatch_size=32): |
50 """Update this model from more training data.""" | 62 """Update this model from more training data.""" |
51 params = self.params | 63 params = self.params |
52 minibatch_size = min(default_minibatch_size, len(dataset)) | 64 minibatch_size = min(default_minibatch_size, len(dataset)) |
53 for mb in dataset.minibatches(['input', 'target'], minibatch_size=minibatch_size): | 65 for mb in dataset.minibatches(['input', 'target'], minibatch_size=minibatch_size): |
54 self.update_minibatch(mb) | 66 self.update_minibatch(mb) |
67 | |
68 def save(self, f): | |
69 self.algo.graph.save(f, self) | |
55 | 70 |
56 def __call__(self, testset, fieldnames=['output_class']): | 71 def __call__(self, testset, fieldnames=['output_class']): |
57 """Apply this model (as a function) to new data. | 72 """Apply this model (as a function) to new data. |
58 | 73 |
59 @param testset: DataSet, whose fields feed Result terms in self.algo.g | 74 @param testset: DataSet, whose fields feed Result terms in self.algo.g |
109 | 124 |
110 def train_iter(self, trainset): | 125 def train_iter(self, trainset): |
111 raise AbstractFunction | 126 raise AbstractFunction |
112 optimizer = Opt() | 127 optimizer = Opt() |
113 | 128 |
129 def load(self,f) : | |
130 raise AbstractFunction | |
131 | |
132 def save(self,f,model) : | |
133 raise AbstractFunction | |
134 | |
135 | |
114 def __init__(self, graph): | 136 def __init__(self, graph): |
115 self.graph = graph | 137 self.graph = graph |
116 | 138 |
117 def _fn(self, inputs, outputs): | 139 def _fn(self, inputs, outputs): |
118 # Caching here would hamper multi-threaded apps | 140 # Caching here would hamper multi-threaded apps |
143 | 165 |
144 @return: model | 166 @return: model |
145 @rtype: GraphLearner.Model instance | 167 @rtype: GraphLearner.Model instance |
146 | 168 |
147 """ | 169 """ |
170 | |
148 iparams = self.graph.iparams() if iparams is None else iparams | 171 iparams = self.graph.iparams() if iparams is None else iparams |
172 | |
173 # if we load, type(trainset) == 'str' | |
174 if isinstance(trainset,str) or isinstance(trainset,file): | |
175 #loadmodel = GraphLearner.Model(self, iparams) | |
176 loadmodel = self.graph.load(self,trainset) | |
177 return loadmodel | |
178 | |
149 curmodel = GraphLearner.Model(self, iparams) | 179 curmodel = GraphLearner.Model(self, iparams) |
150 best = curmodel | 180 best = curmodel |
151 | 181 |
152 if trainset is not None: | 182 if trainset is not None: |
153 #do some training by calling Model.update_minibatch() | 183 #do some training by calling Model.update_minibatch() |
164 stp.next() | 194 stp.next() |
165 if validset: | 195 if validset: |
166 curmodel = best | 196 curmodel = best |
167 return curmodel | 197 return curmodel |
168 | 198 |
199 | |
169 def graphMLP(ninputs, nhid, nclass, lr_val, l2coef_val=0.0): | 200 def graphMLP(ninputs, nhid, nclass, lr_val, l2coef_val=0.0): |
201 | |
202 | |
170 def wrapper(i, node, thunk): | 203 def wrapper(i, node, thunk): |
171 if 0: | 204 if 0: |
172 print i, node | 205 print i, node |
173 print thunk.inputs | 206 print thunk.inputs |
174 print thunk.outputs | 207 print thunk.outputs |
197 loss_01 = T.neq(output_class, target) | 230 loss_01 = T.neq(output_class, target) |
198 #g_params = T.grad(nll + regularization, params) | 231 #g_params = T.grad(nll + regularization, params) |
199 g_params = T.grad(nll, params) | 232 g_params = T.grad(nll, params) |
200 new_params = [T.sub_inplace(p, lr * gp) for p,gp in zip(params, g_params)] | 233 new_params = [T.sub_inplace(p, lr * gp) for p,gp in zip(params, g_params)] |
201 | 234 |
235 | |
236 def __eq__(self,other) : | |
237 print 'G.__eq__ from graphMLP(), not implemented yet' | |
238 return NotImplemented | |
239 | |
240 | |
241 def load(self, algo, f): | |
242 """ Load from file the 2 matrices and bias vectors """ | |
243 cloase_at_end = False | |
244 if isinstance(f,str) : | |
245 f = open(f,'r') | |
246 close_at_end = True | |
247 params = [] | |
248 for i in xrange(4): | |
249 params.append(filetensor.read(f)) | |
250 if close_at_end : | |
251 f.close() | |
252 return GraphLearner.Model(algo, params) | |
253 | |
254 def save(self, f, model): | |
255 """ Save params to file, so 2 matrices and 2 bias vectors. Same order as iparams. """ | |
256 cloase_at_end = False | |
257 if isinstance(f,str) : | |
258 f = open(f,'w') | |
259 close_at_end = True | |
260 for p in model.params: | |
261 filetensor.write(f,p) | |
262 if close_at_end : | |
263 f.close() | |
264 | |
265 | |
202 def iparams(self): | 266 def iparams(self): |
267 """ init params. """ | |
203 def randsmall(*shape): | 268 def randsmall(*shape): |
204 return (numpy.random.rand(*shape) -0.5) * 0.001 | 269 return (numpy.random.rand(*shape) -0.5) * 0.001 |
205 return [randsmall(ninputs, nhid) | 270 return [randsmall(ninputs, nhid) |
206 , randsmall(nhid) | 271 , randsmall(nhid) |
207 , randsmall(nhid, nclass) | 272 , randsmall(nhid, nclass) |
248 n_match = sum(omatch) | 313 n_match = sum(omatch) |
249 | 314 |
250 self.failUnless(n_match == (numpy.sum(training_set1.fields()['target'] == | 315 self.failUnless(n_match == (numpy.sum(training_set1.fields()['target'] == |
251 training_set2.fields()['target'])), omatch) | 316 training_set2.fields()['target'])), omatch) |
252 | 317 |
318 model1.save('/tmp/model1') | |
319 | |
320 denoising_aa = GraphLearner(denoising_g) | |
321 model1 = denoising_aa(trainset) | |
322 hidset = model(trainset, fieldnames=['hidden']) | |
323 model2 = denoising_aa(hidset) | |
324 | |
325 f = open('blah', 'w') | |
326 for m in model: | |
327 m.save(f) | |
328 filetensor.write(f, initial_classification_weights) | |
329 f.flush() | |
330 | |
331 deep_sigmoid_net = GraphLearner(deepnetwork_g) | |
332 deep_model = deep_sigmoid_net.load('blah') | |
333 deep_model.update(trainset) #do some fine tuning | |
334 | |
335 model1_dup = learn_algo('/tmp/model1') | |
336 | |
337 | |
253 def equiv(self, g0, g1): | 338 def equiv(self, g0, g1): |
254 training_set1 = dataset.ArrayDataSet(numpy.array([[0, 0, 0], | 339 training_set1 = dataset.ArrayDataSet(numpy.array([[0, 0, 0], |
255 [0, 1, 1], | 340 [0, 1, 1], |
256 [1, 0, 1], | 341 [1, 0, 1], |
257 [1, 1, 1]]), | 342 [1, 1, 1]]), |