home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.forth      Forth programmers eat a lot of Bratwurst      117,951 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 116,961 of 117,951   
   Ahmed to All   
   Re: Neural networks from scratch in fort   
   02 Dec 24 20:16:48   
   
   [continued from previous message]   
      
   ' init_weights_1    is init_weights   
   ' init_biases_1     is init_biases   
      
   : init_net   
       init_dweights   
       init_dbiases   
       init_weights   
       init_biases   
      
      
   \ deltas   
   : calc_deltas_output_layer   
       net @ 1+ count_layer !   
       neurons_current_layer   
       get_layer_address   
       neurons_current_layer 0 do   
         outputs         i floats + f@   
         desired_outputs i floats + f@   
         f-   
         i D f!   
       loop   
       2drop   
      
      
   : calc_deltas_hidden_layers   
       0 net @ 1- do   
         i 1+ count_layer !   
         neurons_current_layer   
         get_layer_address   
         neurons_current_layer 0 do   
           i Op f@   
           count_layer @ 1+ count_layer !   
           neurons_previous_layer   
           neurons_current_layer   
           get_layer_address   
           0e   
           neurons_current_layer 0 do   
             i D f@   
             i j W f@   
             f* f+   
           loop   
           2drop drop   
           count_layer @ 1- count_layer !   
           f*   
           i D f!   
         loop   
         2drop   
         -1   
       +loop   
      
      
   : calc_deltas   
      calc_deltas_output_layer   
      calc_deltas_hidden_layers   
      
      
   \ calculate weigths and baises increments   
   fvariable eta   
   fvariable beta   
      
   : >eta  eta f! ;   
   : >beta beta f! ;   
      
   1e-4 >eta   
   9e-1 >beta   
      
   \ dweights   
   : calc_dweights   
       net @ 1+ 0 do   
         i 1+ count_layer !   
         neurons_previous_layer   
         neurons_current_layer   
         get_layer_address   
         neurons_current_layer 0 do   
           i D f@   
           neurons_previous_layer 0 do   
             -1 count_layer +!   
             neurons_current_layer   
             get_layer_address   
             i O f@   
             1 count_layer +!   
             fover f*   
             eta f@ f* fnegate   
             2drop   
             j i dW f@   
             beta f@ f*   
             f+   
             j i dW f!   
           loop   
           fdrop   
         loop   
         2drop drop   
       loop   
      
      
   \ dbiases   
   : calc_dbiases   
       net @ 1+ 0 do   
         i 1+ count_layer !   
         neurons_current_layer   
         get_layer_address   
         neurons_current_layer 0 do   
           i D f@   
           eta f@ f* fnegate   
           i dB f@   
           beta f@ f*   
           f+   
           i dB f!   
         loop   
         2drop   
       loop   
      
      
      
   \ update weights and biases   
   \ weights   
   : update_weights   
       net @ 1+ 0 do   
         i 1+ count_layer !   
         neurons_previous_layer   
         neurons_current_layer   
         get_layer_address   
         neurons_current_layer 0 do   
           neurons_previous_layer 0 do   
             j i dW f@   
             j i W f@   
             f+   
             j i W f!   
           loop   
         loop   
         2drop drop   
       loop   
      
      
   \ dbiases   
   : update_biases   
       net @ 1+ 0 do   
         i 1+ count_layer !   
         neurons_current_layer   
         get_layer_address   
         neurons_current_layer 0 do   
           i dB f@   
           i B f@   
           f+   
           i B f!   
         loop   
         2drop   
       loop   
      
      
   : one_pass   
       forward_pass   
       calc_cost   
       calc_deltas   
       calc_dweights   
       update_weights   
       calc_dbiases   
       update_biases   
      
      
   \ data   
   variable n_samples   
   variable data   
   : >n_samples n_samples ! ;   
   : >data data ! ;   
      
   \ one epoch   
   fvariable sum_cost   
   fvariable previous_sum_cost   
   1e9 previous_sum_cost f!   
      
   : one_epoch   
       0e sum_cost f!   
       n_samples @ 0 do   
         data @   
         i n_inputs @ n_outputs @ + *   
         n_inputs @ 0 do   
           2dup   
           i + floats + f@   
           inputs i floats + f!   
         loop   
         2drop   
      
         data @   
         i n_inputs @ n_outputs @ + * n_inputs @ +   
         n_outputs @ 0 do   
           2dup   
           i + floats + f@   
           desired_outputs i floats + f!   
         loop   
         2drop   
      
         one_pass   
         cost f@ sum_cost f@ f+ sum_cost f!   
       loop   
      
      
   \ learn for several epochs   
   variable n_epochs   
   fvariable tol  \ tolerance   
   fvariable rtol \ relative tolerance   
   variable display_step   
   variable adapt_eta?   
   variable init_net?   
      
   : >epochs n_epochs ! ;   
   : >tol tol f! ;   
   : >rtol rtol f! ;   
   : >display_step display_step ! ;   
   : >adapt_eta adapt_eta? ! ;   
   : >init_net  init_net? ! ;   
      
   1000 >epochs   
   1e-3 >tol   
   0e >rtol   
   1 >display_step   
   false >adapt_eta   
   true >init_net   
      
   : learn   
       cr s" Learning..." type   
       cr s" -----------" type   
       cr s" epochs| Cost" type   
       cr s" ------+ ----" type   
      
       init_net? @ if   
         init_net   
       then   
       n_epochs @ 0 do   
         one_epoch   
      
         i display_step @ mod 0= if   
           cr i . 3 spaces sum_cost f@ f. \ 2 spaces previous_sum_cost f@   
   f.   
         then   
      
         sum_cost f@ tol f@ f< if   
   	    unloop exit   
   	  then   
      
         sum_cost f@ previous_sum_cost f@ f- fabs   
         rtol f@ f< if   
           unloop exit   
         then   
      
         adapt_eta? @ if   
           sum_cost f@ previous_sum_cost f@ f> if   
             eta f@ 0.99e f* >eta   
             beta f@ 0.99e f* >beta   
             1e9 previous_sum_cost f!   
             cr ." -------------updating eta and   
   beta-----------------------"   
           then   
         then   
         sum_cost f@ previous_sum_cost f!   
       loop   
      
      
      
   : test   
       cr ." inputs | outputs (desired outputs)"   
       cr ." -------+--------------------------"   
       n_samples @ 0 do   
         cr   
         n_inputs @ 0 do   
           data @ j n_inputs @ n_outputs @ + * i + floats + f@   
           inputs i floats + f!   
         loop   
         forward_pass   
         n_inputs @ 0 do   
           inputs  i floats + f@ f.   
         loop   
         ."  |  "   
         n_outputs @ 0 do   
           outputs i floats + f@ f.   
           ."  ("   
           data @ j n_inputs @ n_outputs @ + * n_inputs @ + i + floats + f@   
   f.   
           ." )  "   
         loop   
       loop   
      
      
      
   \ for making predictions   
   : to_inputs 0 n_inputs @ 1- do inputs i floats + f! -1 +loop ;   
      
   : outputs_ident ;   
   : outputs_softmax   
       n_outputs @ 0 do   
         outputs i floats + f@   
         1e0 f* fexp   
         outputs i floats + f!   
       loop   
      
       0e   
       n_outputs @ 0 do   
         outputs i floats + f@ f+   
       loop   
      
       n_outputs @ 0 do   
         outputs i floats + f@   
         fover f/   
         outputs i floats + f!   
       loop   
       fdrop   
      
      
   : outputs_probs ( f: lambda -- )   
       0e   
       n_outputs @ 0 do   
         outputs i floats + f@ f+   
       loop   
       n_outputs @ 0 do   
         outputs i floats + f@   
         fover f/   
         outputs i floats + f!   
       loop   
       fdrop   
      
      
   defer outputs_ips      \ i stands for ident, p for probs and s for   
   softmax   
   ' outputs_probs is outputs_ips   
      
   : .outputs   
       cr ." out_n°| value"   
       cr       ." ------+------"   
       n_outputs @ 0 do   
         cr i . ."     | " outputs i floats + f@ f.   
       loop   
      
      
   : net_predict         to_inputs forward_pass                 .outputs ;   
   : net_predict_probs   to_inputs forward_pass outputs_probs   .outputs ;   
   : net_predict_softmax to_inputs forward_pass outputs_softmax .outputs ;   
   : net_predict_ips     to_inputs forward_pass outputs_ips     .outputs ;   
      
      
   \ Prediction: possible forms   
   \ net_predict   
   \ net_predict_probs   
   \ net_predict_softmax   
   \ net_predict_ips   
   \ forward_pass .outputs   
   \ forward_pass outputs_probs   .outputs   
   \ forward_pass outputs_softmax .outputs   
      
      
   -----------The code finishes here--------------------   
      
   Enjoy,   
      
   Ahmed   
      
   --   
      
   --- SoupGate-DOS v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca