This commit is contained in:
2023-05-17 17:21:32 +07:00
parent a114935b2d
commit 6857c249da
4 changed files with 23 additions and 23 deletions

View File

@@ -128,7 +128,7 @@ function (n::lifNeuron)(kfn::knowledgeFn)
# decay of v_t1 # decay of v_t1
n.v_t1 = n.alpha * n.v_t n.v_t1 = n.alpha * n.v_t
else else
n.recSignal = sum(n.wRec .* n.z_i_t .* n.subExInType) # signal from other neuron that this neuron subscribed n.recSignal = sum(n.wRec .* n.z_i_t) # signal from other neuron that this neuron subscribed
n.alpha_v_t = n.alpha * n.v_t n.alpha_v_t = n.alpha * n.v_t
n.v_t1 = n.alpha_v_t + n.recSignal n.v_t1 = n.alpha_v_t + n.recSignal
@@ -174,7 +174,7 @@ function (n::alifNeuron)(kfn::knowledgeFn)
n.z_t = isnothing(n.z_t) ? false : n.z_t n.z_t = isnothing(n.z_t) ? false : n.z_t
n.a = (n.rho * n.a) + ((1 - n.rho) * n.z_t) n.a = (n.rho * n.a) + ((1 - n.rho) * n.z_t)
n.av_th = n.v_th + (n.beta * n.a) n.av_th = n.v_th + (n.beta * n.a)
n.recSignal = sum(n.wRec .* n.z_i_t .* n.subExInType) # signal from other neuron that this neuron subscribed n.recSignal = sum(n.wRec .* n.z_i_t) # signal from other neuron that this neuron subscribed
n.alpha_v_t = n.alpha * n.v_t n.alpha_v_t = n.alpha * n.v_t
n.v_t1 = n.alpha_v_t + n.recSignal n.v_t1 = n.alpha_v_t + n.recSignal
n.v_t1 = no_negative!(n.v_t1) n.v_t1 = no_negative!(n.v_t1)
@@ -218,7 +218,7 @@ function (n::linearNeuron)(kfn::T) where T<:knowledgeFn
# decay of v_t1 # decay of v_t1
n.v_t1 = n.alpha * n.v_t n.v_t1 = n.alpha * n.v_t
else else
n.recSignal = sum(n.wRec .* n.z_i_t .* n.subExInType) # signal from other neuron that this neuron subscribed n.recSignal = sum(n.wRec .* n.z_i_t) # signal from other neuron that this neuron subscribed
n.alpha_v_t = n.alpha * n.v_t n.alpha_v_t = n.alpha * n.v_t
n.v_t1 = n.alpha_v_t + n.recSignal n.v_t1 = n.alpha_v_t + n.recSignal

View File

@@ -42,14 +42,14 @@ function learn!(kfn::kfn_1, correctAnswer::AbstractVector)
# wrap up learning session # wrap up learning session
if kfn.learningStage == "end_learning" if kfn.learningStage == "end_learning"
# Threads.@threads for n in kfn.neuronsArray # Threads.@threads for n in kfn.neuronsArray
for n in kfn.neuronsArray for n in kfn.neuronsArray
wSign_0 = sign.(n.wRec) # original sign
n.wRec += n.wRecChange # merge wRecChange into wRec n.wRec += n.wRecChange # merge wRecChange into wRec
wSign = sign.(n.wRec) # check for fliped sign, 1 indicates non-fliped sign wSign_1 = sign.(n.wRec) # check for fliped sign, 1 indicates non-fliped sign
nonFlipedSign = isequal.(n.subExInType, wSign) # 1 not fliped, 0 fliped nonFlipedSign = isequal.(wSign_0, wSign_1) # 1 not fliped, 0 fliped
LinearAlgebra.normalize!(n.wRec, 1)
n.wRec .*= nonFlipedSign # set weight that fliped sign to 0 for random new connection
# normalize wRec peak to prevent input signal overwhelming neuron # normalize wRec peak to prevent input signal overwhelming neuron
normalizePeak!(n.wRec, 2) normalizePeak!(n.wRec, 2)
n.wRec .*= nonFlipedSign # set weight that fliped sign to 0 for random new connection
synapticConnStrength!(n) synapticConnStrength!(n)
@@ -58,12 +58,12 @@ function learn!(kfn::kfn_1, correctAnswer::AbstractVector)
end end
for n in kfn.outputNeuronsArray # merge wRecChange into wRec for n in kfn.outputNeuronsArray # merge wRecChange into wRec
wSign_0 = sign.(n.wRec) # original sign
n.wRec += n.wRecChange n.wRec += n.wRecChange
wSign = sign.(n.wRec) # check for fliped sign, 1 indicates non-fliped sign wSign_1 = sign.(n.wRec) # check for fliped sign, 1 indicates non-fliped sign
nonFlipedSign = isequal.(n.subExInType, wSign) # 1 not fliped, 0 fliped nonFlipedSign = isequal.(wSign_0, wSign_1) # 1 not fliped, 0 fliped
LinearAlgebra.normalize!(n.wRec, 1)
n.wRec .*= nonFlipedSign # set weight that fliped sign to 0 for random new connection
normalizePeak!(n.wRec, 2) normalizePeak!(n.wRec, 2)
n.wRec .*= nonFlipedSign # set weight that fliped sign to 0 for random new connection
synapticConnStrength!(n) synapticConnStrength!(n)
#TODO neuroplasticity #TODO neuroplasticity
@@ -91,7 +91,6 @@ end
""" """
function learn!(n::lifNeuron, error::Number) function learn!(n::lifNeuron, error::Number)
n.eRec = n.phi * n.epsilonRec n.eRec = n.phi * n.epsilonRec
ΔwRecChange = n.eta * error * n.eRec ΔwRecChange = n.eta * error * n.eRec
n.wRecChange .+= ΔwRecChange n.wRecChange .+= ΔwRecChange
reset_epsilonRec!(n) reset_epsilonRec!(n)
@@ -103,7 +102,6 @@ function learn!(n::alifNeuron, error::Number)
n.eRec_v = n.phi * n.epsilonRec n.eRec_v = n.phi * n.epsilonRec
n.eRec_a = -n.phi * n.beta * n.epsilonRecA n.eRec_a = -n.phi * n.beta * n.epsilonRecA
n.eRec = n.eRec_v + n.eRec_a n.eRec = n.eRec_v + n.eRec_a
ΔwRecChange = n.eta * error * n.eRec ΔwRecChange = n.eta * error * n.eRec
n.wRecChange .+= ΔwRecChange n.wRecChange .+= ΔwRecChange
reset_epsilonRec!(n) reset_epsilonRec!(n)
@@ -114,7 +112,7 @@ end
""" """
function learn!(n::linearNeuron, error::Number) function learn!(n::linearNeuron, error::Number)
n.eRec = n.phi * n.epsilonRec n.eRec = n.phi * n.epsilonRec
ΔwRecChange = n.eta * error * n.eRec ΔwRecChange = n.eta * error * n.eRec
n.wRecChange .+= ΔwRecChange n.wRecChange .+= ΔwRecChange
reset_epsilonRec!(n) reset_epsilonRec!(n)

View File

@@ -321,7 +321,7 @@ end
within its radius. radius must be odd number within its radius. radius must be odd number
""" """
function normalizePeak!(v::Vector, radius::Integer=2) function normalizePeak!(v::Vector, radius::Integer=2)
peak = findall(isequal.(n.wRec, maximum(n.wRec)))[1] peak = findall(isequal.(v, maximum(abs.(v))))[1]
upindex = peak - radius upindex = peak - radius
upindex = upindex < 1 ? 1 : upindex upindex = upindex < 1 ? 1 : upindex
downindex = peak + radius downindex = peak + radius

View File

@@ -244,9 +244,10 @@ function kfn_1(kfnParams::Dict)
# add ExInType into each computeNeuron subExInType # add ExInType into each computeNeuron subExInType
for n in reverse(kfn.neuronsArray) for n in reverse(kfn.neuronsArray)
try # input neuron doest have n.subscriptionList try # input neuron doest have n.subscriptionList
for sub_id in n.subscriptionList for (i, sub_id) in enumerate(n.subscriptionList)
n_ExInType = kfn.neuronsArray[sub_id].ExInType n_ExInType = kfn.neuronsArray[sub_id].ExInType
push!(n.subExInType, n_ExInType) # push!(n.subExInType, n_ExInType)
n.wRec[i] *= n_ExInType
end end
catch catch
end end
@@ -255,9 +256,10 @@ function kfn_1(kfnParams::Dict)
# add ExInType into each output neuron subExInType # add ExInType into each output neuron subExInType
for n in kfn.outputNeuronsArray for n in kfn.outputNeuronsArray
try # input neuron doest have n.subscriptionList try # input neuron doest have n.subscriptionList
for sub_id in n.subscriptionList for (i, sub_id) in enumerate(n.subscriptionList)
n_ExInType = kfn.neuronsArray[sub_id].ExInType n_ExInType = kfn.neuronsArray[sub_id].ExInType
push!(n.subExInType, n_ExInType) # push!(n.subExInType, n_ExInType)
n.wRec[i] *= n_ExInType
end end
catch catch
end end
@@ -306,7 +308,7 @@ Base.@kwdef mutable struct lifNeuron <: computeNeuron
ExInType::Integer = 1 # 1 excitatory, -1 inhabitory ExInType::Integer = 1 # 1 excitatory, -1 inhabitory
knowledgeFnName::Union{String,Nothing} = nothing # knowledgeFn that this neuron belongs to knowledgeFnName::Union{String,Nothing} = nothing # knowledgeFn that this neuron belongs to
subscriptionList::Union{Array{Int64},Nothing} = nothing # list of other neuron that this neuron synapse subscribed to subscriptionList::Union{Array{Int64},Nothing} = nothing # list of other neuron that this neuron synapse subscribed to
subExInType::Array{Int64} = Vector{Int64}() # store ExIn type of subscribed neurons # subExInType::Array{Int64} = Vector{Int64}() # store ExIn type of subscribed neurons
timeStep::Number = 0.0 # current time timeStep::Number = 0.0 # current time
wRec::Union{Array{Float64},Nothing} = nothing # synaptic weight (for receiving signal from other neuron) wRec::Union{Array{Float64},Nothing} = nothing # synaptic weight (for receiving signal from other neuron)
v_t::Float64 = 0.0 # vᵗ, postsynaptic neuron membrane potential of previous timestep v_t::Float64 = 0.0 # vᵗ, postsynaptic neuron membrane potential of previous timestep
@@ -397,7 +399,7 @@ Base.@kwdef mutable struct alifNeuron <: computeNeuron
ExInType::Integer = -1 # 1 excitatory, -1 inhabitory ExInType::Integer = -1 # 1 excitatory, -1 inhabitory
knowledgeFnName::Union{String,Nothing} = nothing # knowledgeFn that this neuron belongs to knowledgeFnName::Union{String,Nothing} = nothing # knowledgeFn that this neuron belongs to
subscriptionList::Union{Array{Int64},Nothing} = nothing # list of other neuron that this neuron synapse subscribed to subscriptionList::Union{Array{Int64},Nothing} = nothing # list of other neuron that this neuron synapse subscribed to
subExInType::Array{Int64} = Vector{Int64}() # store ExIn type of subscribed neurons # subExInType::Array{Int64} = Vector{Int64}() # store ExIn type of subscribed neurons
timeStep::Union{Number,Nothing} = nothing # current time timeStep::Union{Number,Nothing} = nothing # current time
wRec::Union{Array{Float64},Nothing} = nothing # synaptic weight (for receiving signal from other neuron) wRec::Union{Array{Float64},Nothing} = nothing # synaptic weight (for receiving signal from other neuron)
v_t::Float64 = 0.0 # vᵗ, postsynaptic neuron membrane potential of previous timestep v_t::Float64 = 0.0 # vᵗ, postsynaptic neuron membrane potential of previous timestep
@@ -504,7 +506,7 @@ Base.@kwdef mutable struct linearNeuron <: outputNeuron
knowledgeFnName::Union{String,Nothing} = nothing # knowledgeFn that this neuron belongs to knowledgeFnName::Union{String,Nothing} = nothing # knowledgeFn that this neuron belongs to
subscriptionList::Union{Array{Int64},Nothing} = nothing # list of other neuron that this neuron synapse subscribed to subscriptionList::Union{Array{Int64},Nothing} = nothing # list of other neuron that this neuron synapse subscribed to
timeStep::Union{Number,Nothing} = nothing # current time timeStep::Union{Number,Nothing} = nothing # current time
subExInType::Array{Int64} = Vector{Int64}() # store ExIn type of subscribed neurons # subExInType::Array{Int64} = Vector{Int64}() # store ExIn type of subscribed neurons
wRec::Union{Array{Float64},Nothing} = nothing # synaptic weight (for receiving signal from other neuron) wRec::Union{Array{Float64},Nothing} = nothing # synaptic weight (for receiving signal from other neuron)
v_t::Float64 = 0.0 # vᵗ, postsynaptic neuron membrane potential of previous timestep v_t::Float64 = 0.0 # vᵗ, postsynaptic neuron membrane potential of previous timestep
v_t1::Float64 = rand() # vᵗ⁺¹, postsynaptic neuron membrane potential at current timestep v_t1::Float64 = rand() # vᵗ⁺¹, postsynaptic neuron membrane potential at current timestep