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