From c6055dcb86b6753649b9ee9b2e61dfbe8b73afa0 Mon Sep 17 00:00:00 2001 From: tonaerospace Date: Thu, 11 May 2023 10:32:49 +0700 Subject: [PATCH] add todo --- src/Ironpen.jl | 7 ++++--- src/forward.jl | 2 ++ src/learn.jl | 50 +++++++++++++++++++++++++++++++++++------------- src/snn_utils.jl | 4 ++-- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/Ironpen.jl b/src/Ironpen.jl index a5b9945..a7f73cc 100644 --- a/src/Ironpen.jl +++ b/src/Ironpen.jl @@ -35,9 +35,10 @@ using .interface """ Todo: [*3] no "start learning" use reset learning and "inference", "learning" mode instead - [4] add time-based learning method. Also implement "thinking period" - [5] verify that model can complete learning cycle with no error - [6] neuroplasticity() with synaptic connection strength concept + [6] add time-based learning method. Also implement "thinking period" + [7] verify that model can complete learning cycle with no error + [4] synaptic connection strength concept + [5] neuroplasticity() i.e. change connection [] using RL to control learning signal [] consider using Dates.now() instead of timestamp because time_stamp may overflow [] training should include adjusting α, neuron membrane potential decay factor diff --git a/src/forward.jl b/src/forward.jl index c527bc3..43a3450 100644 --- a/src/forward.jl +++ b/src/forward.jl @@ -126,6 +126,7 @@ function (n::lif_neuron)(kfn::knowledgeFn) n.alpha_v_t = n.alpha * n.v_t n.v_t1 = n.alpha_v_t + n.recurrent_signal + n.v_t1 = no_negative!.(n.v_t1) if n.v_t1 > n.v_th n.z_t1 = true @@ -169,6 +170,7 @@ function (n::alif_neuron)(kfn::knowledgeFn) n.recurrent_signal = sum(n.w_rec .* n.z_i_t) # signal from other neuron that this neuron subscribed n.alpha_v_t = n.alpha * n.v_t n.v_t1 = n.alpha_v_t + n.recurrent_signal + n.v_t1 = no_negative!.(n.v_t1) if n.v_t1 > n.av_th n.z_t1 = true n.refractory_counter = n.refractory_duration diff --git a/src/learn.jl b/src/learn.jl index b177f5b..8ab4e48 100644 --- a/src/learn.jl +++ b/src/learn.jl @@ -12,14 +12,38 @@ export learn! function learn!(m::model, model_respond, correct_answer) if m.learning_stage == "learning" + #WORKING compute error + if m.time_stamp < m.model_params[:perfect_timing] + too_early = m.model_params[:perfect_timing] - m.time_stamp + model_error = (model_respond .- correct_answer) * too_early + + + + + + + + + + + + model_error = Flux.logitcrossentropy(model_respond, correct_answer) output_elements_error = model_respond - correct_answer learn!(m.knowledgeFn[:I], model_error, output_elements_error) - #WORKING compute error - # if m.time_stamp < m.m - model_error = model_respond .- correct_answer + + + + + + + + + + + @@ -34,18 +58,18 @@ function learn!(m::model, model_respond, correct_answer) end -function learn!(m::model, raw_model_respond, correct_answer=nothing) - if m.learning_stage != "doing_inference" - model_error = Flux.logitcrossentropy(raw_model_respond, correct_answer) - output_elements_error = raw_model_respond - correct_answer +# function learn!(m::model, raw_model_respond, correct_answer=nothing) +# if m.learning_stage != "doing_inference" +# model_error = Flux.logitcrossentropy(raw_model_respond, correct_answer) +# output_elements_error = raw_model_respond - correct_answer - learn!(m.knowledgeFn[:I], model_error, output_elements_error) - else - model_error = nothing - end +# learn!(m.knowledgeFn[:I], model_error, output_elements_error) +# else +# model_error = nothing +# end - return model_error -end +# return model_error +# end diff --git a/src/snn_utils.jl b/src/snn_utils.jl index bd35889..e5fb725 100644 --- a/src/snn_utils.jl +++ b/src/snn_utils.jl @@ -1,7 +1,7 @@ module snn_utils using Flux.Optimise: apply! -export calculate_α, calculate_ρ, calculate_k, timestep_forward!, init_neuron, no_negative, +export calculate_α, calculate_ρ, calculate_k, timestep_forward!, init_neuron, no_negative!, precision, calculate_w_change!, store_knowledgefn_error!, interneurons_adjustment!, reset_z_t!, reset_learning_params!, reset_learning_history_params!, cal_v_reg!, calculate_w_change_end!, @@ -28,7 +28,7 @@ function timestep_forward!(x::linear_neuron) x.out_t = x.out_t1 end -no_negative(n) = n < 0.0 ? 0.0 : x +no_negative!(x) = x < 0.0 ? 0.0 : x precision(x::Array{<:Array}) = ( std(mean.(x)) / mean(mean.(x)) ) * 100 # reset functions for LIF/ALIF neuron