annotate src/scheme/models.scm @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
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