global { iter 0 areas 3 mult 1 d "/tmp/coco" } all { /**default area size**/ d_a 15 d_b 1 } area 0 { d_a 15 d_b 1 } area 1 { d_a 15 d_b 1 } /**This creates Fig.6a) of: "A Self-Organizing Map of Sigma-Pi Units", C. Weber and S. Wermter, S., Neurocomputing, 2006/7 (in press). R_0 and R_1 are the network inputs; e.g. R_0 is visually perceived object position, R_1 is the viewing direction of the eyes. Each are at two different times, time 0, 1. These are differernt "viewing angles" belonging to one body-centered position. S_2 is the map activation (after winner finding); only needed for one of the data instances ("viewing angle"), e.g. time 0. w_2_0 are the sigma-pi weights: for each neuron (square), vertical is area 0 input, horizontal is area 1 input. **/ set rlen 2 /**2**/ set timescale 1 /**inverse of (rlen-1) (if total_fit_gauss used 1ce**/ set import 0 /**0 if initial learning**/ set trainiter 300000 /**50000**/ set export 1 /**occurs only in train; weights and thresholds**/ set itercut 325000 set sigmas 8.0+3.5+0.00001 /**neighbourhood interaction widths**/ set stones 33000+200000 /**the times at which the 2nd and 3rd neighbourhood interaction width values are reached**/ series (1) { if ($import = 0) sw (0; 1; alltime) { 2(n) {N,w; weight_sigpi_alloc_full ;0,1; , ; -0.1+0.1} /*only extra-area multiplicative interactions*/ } if ($import) sw (0; 1; alltime) { 2(n) {N,w+d; weight_sigpi_alloc_import; 0,1; , ; } } } /**instead of winner-finding based on max response, use this to find winner based on min distance to data** 2(o) {P,w; weight_sigpi_euclid; 0, 1 ; R, R ; } 2(t) {S ; total_neigh_winner; ; Q ; -1, $sigmas, $stones, 0.2} **/ /**TRAIN**/ series ($trainiter) { /**presentation of the data; supplies two instances of data, one at time 0 and one at time 1**/ sw (0; $rlen; alltime) { 0(n) {T ; data_gauss_3areas_2D; ; ; 1, 0, 0.5, 1.0, 2, 0.5} 1(n) {T ; data_gauss_3areas_2D; ; ; 0, 1, 0.5, 1.0} 2(n) {T ; data_gauss_3areas_2D; ; ; 0, 2, 0.5, 1.0} } /*new area sigma height mode stretch*/ sw (0; $rlen; order) { 0(t) {R ; total_normalize ; ; T ; 1.0} 1(t) {R ; total_normalize ; ; T ; 1.0} } sw (0; 1; order) { 2(o) {P,w; weight_sigpi_feed ; 0, 1 ; R, R ; } /**map activation needed only at time (data instance) 0**/ 2(t) {R ; total_winner ; ; P ; 1 } /**for observe**/ } sw (1; 2; order) { /**only for observe: test how other data instance activates map**/ 2(o) {O,w; weight_sigpi_feed ; 0, 1 ; R, R ; } /**only for observe: if Q_2=R_2, then same winner for both views**/ 2(t) {Q ; total_winner ; ; O ; 1 } /**only for observe: (i.e. well learnt)**/ } sw (1; $rlen; order) { 2(o) {P ; single_copy ; ; ; -1 } /**map activation for postsynaptic learning value S is from time 0**/ 2(t) {S ; total_fit_gauss ; ; P ; $sigmas, $sigmas, $stones, $timescale, 1, 15.1} /**find soft winner**/ 2(t) {S ; total_normalize ; ; ; 1.0} 2(o) {N,w; weight_sigpi_kohonen; 2, 0, 1; S, R, R; 0.01} /**the presynaptic values (R) are from time 1**/ } if (iter > $itercut) sw (0; 1; order) { if (iter % 1000) 2(o) {N,w ; weight_sigpi_cutsmall; 0,1; , ; 0, 1+0.1} } /**write to files**/ if (iter % 1000) sw (0; $rlen; alltime) { 0(n) {T,d; observe_phase; ; ; } /**data**/ 0(n) {R,d; observe_phase; ; ; } /**data**/ 1(n) {T,d; observe_phase; ; ; } /**data**/ 1(n) {R,d; observe_phase; ; ; } /**data**/ 2(n) {T,d; observe_phase; ; ; } /**data, not used (could be used for supervised learning)**/ 2(n) {S,d; observe_phase; ; ; } /**"majority vote" (Gaussian) used for learning**/ 2(n) {P,d; observe_phase; ; ; } /**map input before taking soft-winner**/ 2(n) {Q,d; observe_phase; ; ; } /**the map activation (hard winner) from view at time 1**/ 2(n) {R,d; observe_phase; ; ; } /** " " " 0**/ } if (iter % 1000) sw (0; 1; alltime) { 2(n) {N,w ; weight_sigpi_histogram; 0, 1; , ; 10} if ($export) 2(n) {N,w+d; weight_sigpi_export; 0, 1; , ; 6 } } }