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