comparison src/scheme/models.scm @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:bf79fb79ee13
1 (import "samer.models.*")
2
3 (define vec VVector.)
4
5 ; prior-spec: (name constructor mk-trainer batch flush-tasks)
6 (define (iid-spec logprior) `("iid" ,(lambda (n) (IIDPrior. n logprior))))
7 (define genexp-spec `("genexp" ,samer.models.GeneralisedExponential. ,.getTrainer 128))
8 (define cauchy-spec `("cauchy" ,(lambda (n) (IIDPrior. n (LogCauchy.)))))
9 (define gauss-spec `("gauss" ,(lambda (n) (IIDPrior. n (HalfSquare.)))))
10 (define laplace-spec `("laplace" ,(lambda (n) (IIDPrior. n (Abs.)))))
11 (define ica-spec `("ica" ,ICA. .getTrainer 512))
12 (define a-gauss-spec `("gauss" ,(lambda (n) (AlignedGaussian. n))))
13
14
15 ;;; macro for extracting things from a model-spec
16 (define-macro (let-model name const train spec . body)
17 `(let ((,name (car ,spec)) (,const (cadr ,spec)) (,train (cddr ,spec)))
18 . ,body))
19
20
21 ;; what about flush tasks?
22 (define (maybe-train model train)
23 (if (not (null? train))
24 (let ((trainer (BatchedTrainer. ((car train) model) (cadr train)))
25 (post-flush (caddr train)))
26 (addtask trainer)
27 (if (not (null? post-flush))
28 (.setPostFlush trainer post-flush)))))
29
30 ;;; this is a sort of model combinator
31
32 (define (chain-2 x spec-1 spec-2)
33 (let-model name-1 cons-1 train-1 spec-1
34 (let-model name-2 cons-2 train-2 spec-2
35 (node name-1
36 (let* ((model-1 (cons-1 x))
37 (model-2 (node name-2 (cons-2 (.output model-1)))))
38 (.setOutputModel model-1 model-2)
39 (addtasks model-1 model-2)
40 (node name-2 (maybe-train model-2 train-2))
41 (maybe-train model-1 train-1)
42 (list model-1 model-2))))))
43
44 (define (scaler-spec . training-spec)
45 (append `("scaler" ,Scaler.) training-spec))
46
47 (define (mk-scaler x prior . trainer)
48 (node (.getNode x)
49 (let ((models (chain-2 x (apply scaler-spec trainer) prior)))
50 (.output (car models)))))
51
52
53 (define (mk-diffscaler x prior . trainer)
54 (node (.getNode x)
55 (chain-2 x (append `("diffScaler" ,DiffScaler.) trainer) prior)))
56
57
58 ;;; these are the old methods defined in terms of the above
59 (define (norm in) (mk-scaler in laplace-spec .getTrainer 8))
60 (define (offset in) (mk-scaler in laplace-spec .getOffsetTrainer 8))
61 (define (nonorm in) (mk-scaler in laplace-spec))
62 (define (diffnorm x prior) (.output (car (mk-diffscaler x prior .getTrainer 16))))
63 (define (diffscale x prior) (.output (car (mk-diffscaler x prior .getScaleTrainer 16))))
64 (define (diffoffset x prior) (.output (car (mk-diffscaler x prior .getOffsetTrainer 16))))
65 (define (smoothscale x prior) (.output (car (mk-diffscaler x prior .getTensionedTrainer 16))))
66
67
68 ;;;; ........... ICA ............
69
70 ; trainers: .getTrainer
71 ; trainers: .getDecayWhenActiveTrainer
72 (define (ica-spec . training-spec)
73 (let ((ica-cons
74 (lambda (x)
75 (let ((ica (ICA. (cur-node) (.size x))))
76 (.setInput ica x)
77 (Shell.registerViewable ica)
78 ica))))
79 `("ica" ,ica-cons . ,training-spec)))
80
81
82 (define (mk-ica x prior . trainer)
83 (node (.getNode x)
84 (if (null? trainer)
85 (car (chain-2 x (ica-spec) prior))
86 (car (chain-2 x (ica-spec (car trainer) (.size x)) prior)))))
87
88
89 ; auto: load weights, basis rowcolumn viewer
90 ; (matexec (.getWeightMatrix ica) "load")
91 ; (matexec (.getBasisMatrix ica) "rowcolumn")
92
93 ; flush tasks:
94 ; (exec ica "basis")
95 ; (exec ica "logdet")
96 ; (exec basis "save")
97 ; (ICAScalerSync.) (for 3 model version)
98
99
100 ; trainers: .getScaleTrainer
101 ; trainers: .getDiffTrainer
102 ; (define (mk-ica-scaler x prior trainer)
103 ; (node (.getNode x)
104 ; (let ((models (chain-2 x `("ica" ,ICAWithScaler. ,trainer ,(.size x)) prior)))
105 ; (Shell.registerViewable (car models))
106 ; (.output (car models)))))
107
108 ; (.diffFlush trainer) ; (more frequent)
109
110
111
112 (define (histogram vec bins)
113 (define hist (node (.getNode vec) (Histogram. vec bins)))
114 ;(addtask hist)
115 hist)
116
117
118 (define (chain-3 x spec-1 spec-2 spec-3)
119 (let-model name-1 cons-1 train-1 spec-1
120 (let-model name-2 cons-2 train-2 spec-2
121 (let-model name-3 cons-3 train-3 spec-3
122 (node name-1
123 (let* ((model-1 (cons-1 x))
124 (model-2 (node name-2 (cons-2 (.output model-1))))
125 (model-3 (node name-2 (node name-3 (cons-3 (.output model-2))))))
126 (.setOutputModel model-1 model-2)
127 (.setOutputModel model-2 model-3)
128 (addtasks (task
129 (.infer model-1)
130 (.infer model-2)
131 ; (.infer model-3)
132 ; this is wrong - only need to compute if training
133 (.compute model-3)
134 (.compute model-2)))
135 ; no need to compute model 1 if there is no model 0
136 (maybe-train model-1 train-1)
137 (node name-2 (maybe-train model-2 train-2))
138 (node name-2 (node name-3 (maybe-train model-3 train-3)))
139 (list model-1 model-2 model-3)))))))
140
141 ;; flush tasks for model 1/2 trainers?
142 '(sub 32 (seq
143 (ICAScalerSync. ica scaler)
144 (task (exec ica "basis"))))
145
146 ;;;; Mixture models
147
148 (define (mix-2 x spec-1 spec-2)
149 (let-model name-1 cons-1 train-1 spec-1
150 (let-model name-2 cons-2 train-2 spec-2
151 (let* ((model-1 (node name-1 (cons-1 x)))
152 (model-2 (node name-2 (cons-2 x)))
153 (mixture (Mixture. x 2))
154 (trainer (.getTrainer mixture)))
155 (.setModel M 0 model-1)
156 (.setModel M 1 model-2)
157 (.setTrainer trainer 0 (.getTrainer model-1))
158 (.setTrainer trainer 0 (.getTrainer model-2))
159 (addtasks
160 (task
161 (.infer model-1) (.compute model-1)
162 (.infer model-2) (.compute model-2)
163 (.infer mixture))
164 (BatchedTrainer. trainer 4))))))
165
166
167
168
169 ;;;; Noisy ICA
170
171 (import "samer.maths.opt.*")
172
173 (define (std-opt s opt)
174 (put "optimiser" opt)
175 (expose (.getViewer opt) "optimiser")
176 (seq (GenerateVector. s (Zero.)) opt))
177
178
179 (define (uqn-optimiser s fn) (std-opt s (UnconstrainedMinimiser. s fn)))
180 (define (ucg-optimiser s fn) (std-opt s (UnconstrainedConjGrad. s fn)))
181 (define (pos-optimiser s fn) (std-opt s (ConstrainedMinimiser. s fn Positivity.class)))
182 (define (zc-optimiser s fn)
183 (Shell.put "ZeroCrossingSparsity.jump" (VDouble. "logprior.jump" 1.0))
184 (std-opt s (ConstrainedMinimiser. s fn ZeroCrossingSparsity.class)))
185
186
187 (define (ica-cons m) (lambda (x)
188 (let ((ica (NoisyICA. (cur-node) (.size x) m)))
189 (.setInput ica x)
190 ica)))
191
192 (define (noisyica input num-outs e-spec s-spec mk-optimiser)
193 (mk-noisyica input
194 `("noisyica" ,(ica-cons num-outs) ,.learnDecayWhenActive ,(.size input))
195 e-spec s-spec mk-optimiser))
196
197 (define (noisyica-notrain input num-outs e-spec s-spec mk-optimiser)
198 (mk-noisyica input
199 `("noisyica" ,(ica-cons num-outs) )
200 e-spec s-spec mk-optimiser))
201
202 (define (mk-noisyica input ica-spec e-spec s-spec mk-optimiser)
203 ; x: input vector
204 (let-model ica-name ica-cons ica-train ica-spec
205 (let-model e-name e-cons e-train e-spec
206 (let-model s-name s-cons s-train s-spec
207 (node ica-name
208 (letrec ( (ica (ica-cons input))
209 (s-model (node "s"(s-cons (.output ica))))
210 (e-model (node "e" (e-cons (.error ica)))))
211
212 (.setSourceModel ica s-model)
213 (.setNoiseModel ica e-model)
214 (.setInferenceTask ica (mk-optimiser (.output ica) (.posterior ica)))
215 ; (on-change (.basisMatrix ica)
216 ; (.setHessian (get "optimiser")
217 ; (.inverse (.times (.transpose A) A))))
218
219 (addtasks ica e-model s-model)
220 (maybe-train ica ica-train)
221 (node "e" (node e-name (maybe-train e-model e-train)))
222 (node "s" (node s-name (maybe-train s-model s-train)))
223
224 (list ica e-model s-model)))))))
225