IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 16, 2018, 4:06:05 PM (8 years ago)
Author:
eugene
Message:

fix up the nnet code to match behavior of the python version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.data/test/nnet.sh

    r40335 r40371  
    11
    2 macro test
    3 
    4   nnet create t0 5 10 15 3
    5   nnet list
    6 
    7   nnet create t1 6 4 5
    8   nnet list
    9 
    10   nnet create t1 5 8
    11   nnet list
    12 
    13   # vlist v0 1 2 3 4 5
    14   vlist v1 1 2 3 4 5 6 7 8
    15 
    16   mcreate m1 5 8
    17  
    18   # generate a weight vector of length v1[]
    19   vlist my 9 8 7 6 5 4 3 2
    20 
    21   for i 0 5
    22     mset m1 my -y $i
    23     set my = my + $i
    24   end
    25  
    26   # set weights and biases
    27   nnet set t1 m1 v1
    28 
    29   # get weights and biases
    30   nnet get t1 M1 V1
    31 
    32   # compare
    33   set dv = v1 - V1
    34   vstat dv
    35 
    36   set dm = m1 - M1
    37   stat dm
    38  
    39 end
    40 
    41 macro test2
    42 
    43   nnet create t1 2 2
    44   nnet list
    45 
    46   # output = sigmoid (sum(weight[i][j] * input[i]) + bias[j])
    47 
    48   # biases of
    49   vlist v1 0.8 0.2
    50 
    51   mcreate m1 2 2
    52   m1[0][0] =  0.5
    53   m1[1][0] =  0.1
    54   m1[0][1] = -0.2
    55   m1[1][1] =  0.8
    56 
    57   # set weights and biases
    58   nnet set t1 m1 v1
    59 
    60   vlist vin0 1 2
    61   vlist vin1 2 1
    62 
    63   # get weights and biases
    64   nnet apply t1 vin0 vin1 vout0 vout1
    65  
    66   vlist z0 {m1[0][0]*vin0[0] + m1[1][0]*vin1[0] + v1[0]} {m1[0][0]*vin0[1] + m1[1][0]*vin1[1] + v1[0]}
    67   vlist z1 {m1[0][1]*vin0[0] + m1[1][1]*vin1[0] + v1[1]} {m1[0][1]*vin0[1] + m1[1][1]*vin1[1] + v1[1]}
    68   set t0 = 1 / (1 + exp(-1*z0))
    69   set t1 = 1 / (1 + exp(-1*z1))
    70 
    71   # compare
    72   set dt0 = t0 - vout0
    73   vstat dt0
    74 
    75   set dt1 = t1 - vout1
    76   vstat dt1
    77 end
    78 
    79 macro test3
    80 
    81   memory all
    82 
    83   nnet create t0 5 10 15 3
    84   nnet list
    85 
    86   nnet create t1 5 8
    87   nnet list
    88 
    89   # vlist v0 1 2 3 4 5
    90   vlist v1 1 2 3 4 5 6 7 8
    91 
    92   mcreate m1 5 8
    93  
    94   # generate a weight vector of length v1[]
    95   vlist my 9 8 7 6 5 4 3 2
    96 
    97   for i 0 5
    98     mset m1 my -y $i
    99     set my = my + $i
    100   end
    101  
    102   # set weights and biases
    103   nnet set t1 m1 v1
    104 
    105   # get weights and biases
    106   nnet get t1 M1 V1
    107 
    108   # compare
    109   set dv = v1 - V1
    110   vstat dv
    111 
    112   set dm = m1 - M1
    113   stat dm
    114  
    115   nnet delete t0
    116   nnet delete t1
    117 
    118   delete m1 M1 dm
    119   delete v1 V1 dv my
    120 
    121   vectors
    122   buffers
    123 
    124   memory all
    125 end
    126 
    127 macro test.simple
     2macro test.python
    1283  if ($0 != 4)
    129     echo "USAGE: test.simple (Nmini) (Nepoch) (eta)"
     4    echo "USAGE: test.python (Nmini) (Nepoch) (eta)"
    1305    break
    1316  end
     7
     8  # test I/O
     9
     10  create x 0 100
     11  set y = dsin(x/10)
     12  write test.dat x y
     13  break
    13214
    13315  local Nmini Nepoch eta
     
    18769end
    18870
     71macro test
     72
     73  nnet create t0 5 10 15 3
     74  nnet list
     75
     76  nnet create t1 6 4 5
     77  nnet list
     78
     79  nnet create t1 5 8
     80  nnet list
     81
     82  # vlist v0 1 2 3 4 5
     83  vlist v1 1 2 3 4 5 6 7 8
     84
     85  mcreate m1 5 8
     86 
     87  # generate a weight vector of length v1[]
     88  vlist my 9 8 7 6 5 4 3 2
     89
     90  for i 0 5
     91    mset m1 my -y $i
     92    set my = my + $i
     93  end
     94 
     95  # set weights and biases
     96  nnet set t1 m1 v1
     97
     98  # get weights and biases
     99  nnet get t1 M1 V1
     100
     101  # compare
     102  set dv = v1 - V1
     103  vstat dv
     104
     105  set dm = m1 - M1
     106  stat dm
     107 
     108end
     109
     110macro test2
     111
     112  nnet create t1 2 2
     113  nnet list
     114
     115  # output = sigmoid (sum(weight[i][j] * input[i]) + bias[j])
     116
     117  # biases of
     118  vlist v1 0.8 0.2
     119
     120  mcreate m1 2 2
     121  m1[0][0] =  0.5
     122  m1[1][0] =  0.1
     123  m1[0][1] = -0.2
     124  m1[1][1] =  0.8
     125
     126  # set weights and biases
     127  nnet set t1 m1 v1
     128
     129  vlist vin0 1 2
     130  vlist vin1 2 1
     131
     132  # get weights and biases
     133  nnet apply t1 vin0 vin1 vout0 vout1
     134 
     135  vlist z0 {m1[0][0]*vin0[0] + m1[1][0]*vin1[0] + v1[0]} {m1[0][0]*vin0[1] + m1[1][0]*vin1[1] + v1[0]}
     136  vlist z1 {m1[0][1]*vin0[0] + m1[1][1]*vin1[0] + v1[1]} {m1[0][1]*vin0[1] + m1[1][1]*vin1[1] + v1[1]}
     137  set t0 = 1 / (1 + exp(-1*z0))
     138  set t1 = 1 / (1 + exp(-1*z1))
     139
     140  # compare
     141  set dt0 = t0 - vout0
     142  vstat dt0
     143
     144  set dt1 = t1 - vout1
     145  vstat dt1
     146end
     147
     148macro test3
     149
     150  memory all
     151
     152  nnet create t0 5 10 15 3
     153  nnet list
     154
     155  nnet create t1 5 8
     156  nnet list
     157
     158  # vlist v0 1 2 3 4 5
     159  vlist v1 1 2 3 4 5 6 7 8
     160
     161  mcreate m1 5 8
     162 
     163  # generate a weight vector of length v1[]
     164  vlist my 9 8 7 6 5 4 3 2
     165
     166  for i 0 5
     167    mset m1 my -y $i
     168    set my = my + $i
     169  end
     170 
     171  # set weights and biases
     172  nnet set t1 m1 v1
     173
     174  # get weights and biases
     175  nnet get t1 M1 V1
     176
     177  # compare
     178  set dv = v1 - V1
     179  vstat dv
     180
     181  set dm = m1 - M1
     182  stat dm
     183 
     184  nnet delete t0
     185  nnet delete t1
     186
     187  delete m1 M1 dm
     188  delete v1 V1 dv my
     189
     190  vectors
     191  buffers
     192
     193  memory all
     194end
     195
     196macro test.simple
     197  if ($0 != 4)
     198    echo "USAGE: test.simple (Nmini) (Nepoch) (eta)"
     199    break
     200  end
     201
     202  local Nmini Nepoch eta
     203  $Nmini  = $1
     204  $Nepoch = $2
     205  $eta    = $3
     206
     207  # create a nnet with just 2 inputs and 2 outputs
     208  nnet create t1 2 2
     209
     210  # biases:
     211  vlist v1 0.5 0.0
     212
     213  # weights
     214  mcreate m1 2 2
     215  m1[0][0] =  0.5
     216  m1[1][0] = -0.2
     217  m1[0][1] = -0.5
     218  m1[1][1] =  0.2
     219
     220  # set weights and biases
     221  nnet set t1 m1 v1
     222
     223  # generate an input set spanning the range -5 to +5
     224
     225  create n 0 1000
     226  set x0 = 10*rnd(n) - 5.0
     227  set x1 = 10*rnd(n) - 5.0
     228
     229  # get output vectors the these input vectors
     230  nnet apply t1 x0 x1 y0 y1
     231
     232# -large-weight-initializer : revert to original implementation
     233# nnet create tn 2 2
     234  nnet create tn 2 2 -large-weight-initializer
     235
     236# -quadratic-cost : revert to original implementation
     237  nnet train tn x0 x1 y0 y1 -Nmini $Nmini -Nepoch $Nepoch -eta $eta -lambda 0.0 -quadratic-cost -resid resid -result result
     238# nnet train tn x0 x1 y0 y1 -Nmini $Nmini -Nepoch $Nepoch -eta $eta -lambda 0.0
     239# nnet train tn x0 x1 y0 y1 -Nmini $Nmini -Nepoch $Nepoch -eta $eta -lambda 2.0
     240
     241  nnet apply tn x0 x1 Y0 Y1
     242
     243  set dy0 = y0 - Y0
     244  set dy1 = y1 - Y1
     245
     246  vstat dy0
     247  $yp = $MAX
     248  $ym = $MIN
     249
     250  vstat dy1
     251  $yp = max ($MAX , $yp)
     252  $ym = min ($MIN , $ym)
     253  $yp = 0.02; $ym = -0.02
     254
     255  style -pt circle -sz 2; lim x0 $ym $yp; clear; box; plot -c blue x0 dy0; plot -c red x0 dy1
     256end
     257
    189258macro test.bilevel
    190259  if ($0 != 4)
     
    284353end
    285354
     355macro test.bilevel.small
     356  if ($0 != 4)
     357    echo "USAGE: test.bilevel (Nmini) (Nepoch) (eta)"
     358    break
     359  end
     360
     361  local Nmini Nepoch eta
     362  $Nmini  = $1
     363  $Nepoch = $2
     364  $eta    = $3
     365
     366  # create a nnet with just 2 inputs and 2 outputs
     367  nnet create t1 2 3 2
     368
     369  # biases:
     370  vlist v1 -0.2 0.0 0.2
     371  vlist v2 -0.3 0.3
     372
     373  # weights
     374  mcreate m1 2 3
     375  m1[0][0] =  0.2
     376  m1[1][0] = -0.2
     377  m1[0][1] = -0.6
     378  m1[1][1] =  0.5
     379  m1[0][2] = -0.2
     380  m1[1][2] =  0.2
     381
     382  mcreate m2 3 2
     383  m2[0][0] = -0.6
     384  m2[1][0] = -0.4
     385  m2[2][0] = -0.5
     386
     387  m2[0][1] = -0.2
     388  m2[1][1] = -0.5
     389  m2[2][1] =  0.1
     390
     391  # set weights and biases
     392  nnet set t1 m1 v1 m2 v2
     393
     394  # generate an input set spanning the range -5 to +5
     395
     396  create n 0 1000
     397  set x0 = 10*rnd(n) - 5.0
     398  set x1 = 10*rnd(n) - 5.0
     399
     400  # get output vectors the these input vectors
     401  nnet apply t1 x0 x1 y0 y1
     402
     403# nnet create tn 3 4 3 -large-weight-initializer
     404  nnet create tn 2 3 2
     405
     406# make the starting point close to the solution
     407  m2[0][0] = -0.58
     408# v2[1] = 0.25
     409  nnet set tn m1 v1 m2 v2
     410
     411# nnet train tn x0 x1 x2 y0 y1 y2 -Nmini $Nmini -Nepoch $Nepoch -eta $eta -lambda 0.1
     412# nnet train tn x0 x1 y0 y1 -Nmini $Nmini -Nepoch $Nepoch -eta $eta -lambda 0.0 -quadratic-cost -resid dS -result result
     413  nnet train tn x0 x1 y0 y1 -Nmini $Nmini -Nepoch $Nepoch -eta $eta -lambda 0.0 -resid dS -result result
     414
     415  nnet apply tn x0 x1 Y0 Y1
     416
     417  set dy0 = y0 - Y0
     418  set dy1 = y1 - Y1
     419
     420  vstat dy0
     421  $yp = $MAX
     422  $ym = $MIN
     423
     424  vstat dy1
     425  $yp = max ($MAX , $yp)
     426  $ym = min ($MIN , $ym)
     427
     428  dev -n 0
     429  style -pt circle -sz 2;
     430  lim x0 $ym $yp; clear; box;
     431  plot -c blue  x0 dy0;
     432  plot -c red   x0 dy1
     433
     434  set n = ramp(dS)
     435  lim -n 1 n dS; clear; box; plot n dS
     436end
     437
     438macro test.bilevel.grid.wt
     439  if ($0 != 4)
     440    echo "USAGE: test.bilevel.grid.wt (level) (x) (y)"
     441    break
     442  end
     443
     444  local Level ix iy
     445  $Level  = $1
     446  $ix     = $2
     447  $iy     = $3
     448
     449  # create a nnet with just 2 inputs and 2 outputs
     450  nnet create t1 2 3 2
     451
     452  # biases:
     453  vlist v1 -0.2 0.0 0.2
     454  vlist v2 -0.3 0.3
     455
     456  # weights
     457  mcreate m1 2 3
     458  m1[0][0] =  0.2
     459  m1[1][0] = -0.2
     460  m1[0][1] = -0.6
     461  m1[1][1] =  0.5
     462  m1[0][2] = -0.2
     463  m1[1][2] =  0.2
     464
     465  mcreate m2 3 2
     466  m2[0][0] = -0.6
     467  m2[1][0] = -0.4
     468  m2[2][0] = -0.5
     469
     470  m2[0][1] = -0.2
     471  m2[1][1] = -0.5
     472  m2[2][1] =  0.1
     473
     474  # set weights and biases
     475  nnet set t1 m1 v1 m2 v2
     476
     477  # generate an input set spanning the range -5 to +5
     478
     479  create n 0 1000
     480  set x0 = 10*rnd(n) - 5.0
     481  set x1 = 10*rnd(n) - 5.0
     482
     483  # get output vectors from these input vectors
     484  nnet apply t1 x0 x1 y0 y1
     485
     486  # create a test nnet
     487  nnet create tn 2 3 2
     488
     489  # 1D chi-square grid about truth
     490 
     491  set M1 = m1
     492  set M2 = m2
     493  set V1 = v1
     494  set V2 = v2
     495
     496  # disturb one element to see cross terms
     497  M2[0][0] = -0.58
     498
     499  $To = M$Level[$ix][$iy]
     500
     501  delete -q value svec0 svec1 sigvec
     502  for frac 0.90 1.10 0.005
     503    M$Level[$ix][$iy] = $frac * $To
     504
     505    nnet set tn M1 V1 M2 V2
     506    nnet apply tn x0 x1 Y0 Y1
     507
     508    set dy0 = y0 - Y0
     509    set dy1 = y1 - Y1
     510
     511    vstat -q dy0
     512    $S0 = $SIGMA 
     513
     514    vstat -q dy1
     515    $S1 = $SIGMA
     516
     517    concat {$frac * $To} value
     518    concat $S0 svec0
     519    concat $S1 svec1
     520
     521    concat {sqrt($S0^2 + $S1^2)} sigvec
     522  end
     523
     524  vstat -q sigvec
     525
     526  lim -n 1 value -0.0001 $MAX; clear; box;
     527  plot -c black value sigvec;
     528  plot -c blue value svec0 -pt ocir -sz 2 ;
     529  plot -c red value svec1 -pt ocir -sz 2
     530end
     531
     532macro test.bilevel.grid.wt.2d
     533  if ($0 != 7)
     534    echo "USAGE: test.bilevel.grid.wt.2d (level) (x) (y) (level) (x) (y)"
     535    break
     536  end
     537
     538  local LevelA ixA iyA LevelB ixB iyB
     539  $LevelA  = $1
     540  $ixA     = $2
     541  $iyA     = $3
     542  $LevelB  = $4
     543  $ixB     = $5
     544  $iyB     = $6
     545
     546  # create a nnet with just 2 inputs and 2 outputs
     547  nnet create t1 2 3 2
     548
     549  # biases:
     550  vlist v1 -0.2 0.0 0.2
     551  vlist v2 -0.3 0.3
     552
     553  # weights
     554  mcreate m1 2 3
     555  m1[0][0] =  0.2
     556  m1[1][0] = -0.2
     557  m1[0][1] = -0.6
     558  m1[1][1] =  0.5
     559  m1[0][2] = -0.2
     560  m1[1][2] =  0.2
     561
     562  mcreate m2 3 2
     563  m2[0][0] = -0.6
     564  m2[1][0] = -0.4
     565  m2[2][0] = -0.5
     566
     567  m2[0][1] = -0.2
     568  m2[1][1] = -0.5
     569  m2[2][1] =  0.1
     570
     571  # set weights and biases
     572  nnet set t1 m1 v1 m2 v2
     573
     574  # generate an input set spanning the range -5 to +5
     575
     576  create n 0 1000
     577  set x0 = 10*rnd(n) - 5.0
     578  set x1 = 10*rnd(n) - 5.0
     579
     580  # get output vectors from these input vectors
     581  nnet apply t1 x0 x1 y0 y1
     582
     583  # create a test nnet
     584  nnet create tn 2 3 2
     585
     586  # 1D chi-square grid about truth
     587 
     588  set M1 = m1
     589  set M2 = m2
     590  set V1 = v1
     591  set V2 = v2
     592
     593  # disturb one element to see cross terms
     594  M2[0][0] = -0.58
     595
     596  $ToA = M$LevelA[$ixA][$iyA]
     597  $ToB = M$LevelB[$ixB][$iyB]
     598
     599  delete -q valueA valueB sigvec
     600
     601  mcreate sigbuf 41 41
     602
     603  $ix = 0
     604  for fracA 0.90 1.10 0.005
     605    M$LevelA[$ixA][$iyA] = $fracA * $ToA
     606
     607    $iy = 0   
     608    for fracB 0.90 1.10 0.005
     609   
     610      M$LevelB[$ixB][$iyB] = $fracB * $ToB
     611
     612      nnet set tn M1 V1 M2 V2
     613      nnet apply tn x0 x1 Y0 Y1
     614     
     615      set dy0 = y0 - Y0
     616      set dy1 = y1 - Y1
     617     
     618      vstat -q dy0
     619      $S0 = $SIGMA 
     620     
     621      vstat -q dy1
     622      $S1 = $SIGMA
     623     
     624      $sigval = sqrt($S0^2 + $S1^2)
     625      concat {$fracA * $ToA} valueA
     626      concat {$fracB * $ToB} valueB
     627      concat $sigval sigvec
     628
     629      sigbuf[$ix][$iy] = $sigval
     630      $iy ++
     631    end
     632    $ix ++
     633  end
     634
     635  stat -q sigbuf
     636  tv -n tv sigbuf $MIN {$MAX - $MIN}
     637end
Note: See TracChangeset for help on using the changeset viewer.