Mercurial > hg > jslab
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 |