Mercurial > pylearn
annotate pylearn/algorithms/sparse_coding.py @ 1496:93b8373c6735
Prefix loggers with 'pylearn.' to ensure there is no conflict when using Pylearn code within another library
author | Olivier Delalleau <delallea@iro> |
---|---|
date | Mon, 22 Aug 2011 11:28:48 -0400 |
parents | e88d7b7d53ed |
children |
rev | line source |
---|---|
966
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
1 import sys, logging, os |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
2 import numpy, PIL.Image, scipy.optimize |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
3 import theano |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
4 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
5 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
6 from theano import shared, function |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
7 import theano.tensor as TT |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
8 from theano.tensor import matrix, vector, scalar, dot, grad, switch, clip |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
9 floatX = theano.config.floatX |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
10 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
11 from pylearn.io.image_tiling import tile_raster_images |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
12 from pylearn.datasets import image_patches |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
13 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
14 def sample_codebook_prior(shape, rng, dtype=floatX): |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
15 rval = numpy.asarray(rng.randn(*shape), dtype=dtype) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
16 for i, img in enumerate(rval): |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
17 rval[i] = img / numpy.sqrt( (img**2).sum()) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
18 print >> sys.stderr, "TODO: pick a codebook prior" |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
19 return rval |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
20 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
21 def numpy_project_onto_ball(X): |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
22 """Return a copy of X with rows scaled to unit length |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
23 """ |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
24 norms = numpy.sqrt((X**2).sum(axis=1)) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
25 norms.shape = (X.shape[0], 1) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
26 return X / norms |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
27 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
28 def reproduce_olshausen(): |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
29 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
30 rng = numpy.random.RandomState(89234) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
31 ## |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
32 # load the data into X |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
33 ## |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
34 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
35 #TODO: Make sure this new way of loading the data still gives the |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
36 # right results (check mean and variance!) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
37 X = numpy.asarray(image_patches.load_patches().train.x, dtype=floatX) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
38 img_shape = (20,20) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
39 PIL.Image.fromarray( |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
40 tile_raster_images(X[:100], (20,20), (10,10), (1,1)), |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
41 'L').save('X100.png') |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
42 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
43 X -= numpy.mean(X, axis=0) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
44 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
45 # Constants below are set up for a variance of .01 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
46 X /= 10*numpy.std(X, axis=0)+1e-8 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
47 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
48 batchsize=100 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
49 tile_dims=(24,24) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
50 nZ=tile_dims[0]*tile_dims[1] |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
51 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
52 #C = numpy.asarray((X.shape[0], nZ), dtype=floatX) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
53 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
54 ## |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
55 # symbolic stuff |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
56 ## |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
57 sX = matrix() |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
58 flat_C = vector() |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
59 sC = flat_C.reshape((batchsize, nZ)) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
60 sZ = matrix() |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
61 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
62 sXpred = dot(sC, sZ) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
63 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
64 cost_X = ((sX - sXpred)**2).sum() |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
65 cost_C = TT.log(1+(sC/.116)**2).sum() |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
66 cost = 100.0 * cost_X + 2.2 * cost_C |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
67 gC, gZ = grad(cost, [sC, sZ]) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
68 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
69 cost_fn = function([sX, flat_C, sZ], cost) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
70 debug_fn = function([sX, flat_C, sZ], [cost, cost_X, cost_C]) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
71 gC_fn = function([sX, flat_C, sZ], gC.flatten()) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
72 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
73 gC_gZ_fn = function([sX, sC, sZ], [cost, gC,gZ]) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
74 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
75 # sample some imgs from the dictionary prior |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
76 Z = sample_codebook_prior((nZ, X.shape[1]), rng) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
77 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
78 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
79 # loop over the data by 100 examples at a time |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
80 for j in xrange(1000): |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
81 for i in xrange(10): |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
82 offset = ((j*10+i)*batchsize) % len(X) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
83 Xi = X[offset:offset+batchsize] |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
84 if len(Xi) != batchsize: |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
85 continue |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
86 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
87 #Ci = C[offset:offset+batchsize] |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
88 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
89 # get the optimal C given X and Z by cg |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
90 Ci = scipy.optimize.fmin_cg( |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
91 f=lambda c:cost_fn(Xi, c, Z), |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
92 x0=numpy.dot(Xi, Z.T).flatten(), |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
93 fprime=lambda c: gC_fn(Xi, c, Z), |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
94 maxiter=20, |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
95 gtol=1e-2, |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
96 ) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
97 Ci.shape = (batchsize, nZ) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
98 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
99 print "j", j, |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
100 print "i", i, |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
101 print "Ci**2", (Ci**2).sum(), |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
102 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
103 if 1: # use published algo |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
104 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
105 Xi_residual = Xi - numpy.dot(Ci, Z) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
106 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
107 dZ = numpy.dot(Ci.T, Xi_residual) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
108 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
109 #print "solution", debug_fn(Xi, Ci.flatten(), Z) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
110 print "dXi**2", (Xi_residual**2).sum(), |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
111 print "dZ**2", (dZ**2).sum() |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
112 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
113 eta = 3e-1 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
114 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
115 Z += eta * dZ |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
116 Z = numpy_project_onto_ball(Z) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
117 if 0: |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
118 # use joint optimization of Z and C |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
119 # This is a little faster, but not much. |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
120 # |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
121 # It is important not to change Z too much for any C |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
122 # because small changes in Z can trigger large changes in the corresponding |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
123 # optimal C for a given X. That's a natural consequence of the active |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
124 # sparsification. |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
125 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
126 eta = 1e-3 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
127 for k in xrange(3): |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
128 l, dC,dZ = gC_gZ_fn(Xi, Ci, Z) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
129 print "k", k, |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
130 print "l", l, |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
131 print "dCi**2", (dC**2).sum(), |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
132 print "dZ**2", (dZ**2).sum() |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
133 #Ci -= eta * dC |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
134 Z -= eta * dZ |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
135 Z = numpy_project_onto_ball(Z) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
136 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
137 hist,edges = numpy.histogram(abs(Ci)) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
138 print "Hist" |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
139 for h, e in zip(hist, edges): |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
140 print '%.3f \t %.3f' % (e, h) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
141 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
142 if j < 100: |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
143 PIL.Image.fromarray( |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
144 tile_raster_images(Z, (20,20), tile_dims, (1,1)), |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
145 'L').save('Z_j=%i.png'%j) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
146 else: |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
147 if (j % 10) == 0: |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
148 PIL.Image.fromarray( |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
149 tile_raster_images(Z, (20,20), tile_dims, (1,1)), |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
150 'L').save('Z_j=%i.png'%j) |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
151 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
152 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
153 if __name__ == '__main__': |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
154 logging.basicConfig(stream=sys.stderr) |
1496
93b8373c6735
Prefix loggers with 'pylearn.' to ensure there is no conflict when using Pylearn code within another library
Olivier Delalleau <delallea@iro>
parents:
966
diff
changeset
|
155 logging.getLogger('pylearn.algorithms.sparse_coding.main').setLevel(logging.INFO) |
93b8373c6735
Prefix loggers with 'pylearn.' to ensure there is no conflict when using Pylearn code within another library
Olivier Delalleau <delallea@iro>
parents:
966
diff
changeset
|
156 logging.getLogger('pylearn.algorithms.sparse_coding.main').info('hello') |
966
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
157 |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
158 # load olshausen images |
e88d7b7d53ed
adding algorithms/sparse_coding
James Bergstra <bergstrj@iro.umontreal.ca>
parents:
diff
changeset
|
159 reproduce_olshausen() |