From fa3ac5c934670bf0ca579562d00c5629198d672f Mon Sep 17 00:00:00 2001 From: ton Date: Thu, 10 Aug 2023 14:20:08 +0700 Subject: [PATCH] add frequency regulator --- src/forward.jl | 10 +++++----- src/learn.jl | 17 ++++++++++++----- src/type.jl | 6 ++++-- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/forward.jl b/src/forward.jl index 1684606..09873e2 100644 --- a/src/forward.jl +++ b/src/forward.jl @@ -421,13 +421,13 @@ function alifForward( zit, phi[i1,i2,i3,i4] = (gammaPd[i1,i2,i3,i4] / vth[i1,i2,i3,i4]) * max(0, 1 - ((vt[i1,i2,i3,i4] - vth[i1,i2,i3,i4]) / vth[i1,i2,i3,i4])) - # compute epsilonRec - epsilonRec[i1,i2,i3,i4] = (alpha[i1,i2,i3,i4] * epsilonRec[i1,i2,i3,i4]) + - (zit[i1,i2,i3,i4] * subscription[i1,i2,i3,i4]) - # compute epsilonRecA use eq.26 epsilonRecA[i1,i2,i3,i4] = (rho[i1,i2,i3,i4] * - (phi[i1,i2,i3,i4] * epsilonRecA[i1,i2,i3,i4])) + + (phi[i1,i2,i3,i4] * epsilonRec[i1,i2,i3,i4])) + + (zit[i1,i2,i3,i4] * subscription[i1,i2,i3,i4]) + + # compute epsilonRec + epsilonRec[i1,i2,i3,i4] = (alpha[i1,i2,i3,i4] * epsilonRec[i1,i2,i3,i4]) + (zit[i1,i2,i3,i4] * subscription[i1,i2,i3,i4]) end end diff --git a/src/learn.jl b/src/learn.jl index b3c66af..1db2cf8 100644 --- a/src/learn.jl +++ b/src/learn.jl @@ -10,7 +10,8 @@ using ..type, ..snnUtil function compute_paramsChange!(kfn::kfn_1, modelError, outputError) modelError = reshape(modelError, (1,1,1,:)) # (1,1,1,batch) - lifComputeParamsChange!(kfn.lif_phi, + lifComputeParamsChange!(kfn.timeStep, + kfn.lif_phi, kfn.lif_epsilonRec, kfn.lif_eta, kfn.lif_eRec, @@ -26,7 +27,8 @@ function compute_paramsChange!(kfn::kfn_1, modelError, outputError) kfn.inputSize, ) - alifComputeParamsChange!(kfn.alif_phi, + alifComputeParamsChange!(kfn.timeStep, + kfn.alif_phi, kfn.alif_epsilonRec, kfn.alif_eta, kfn.alif_eRec, @@ -47,7 +49,6 @@ function compute_paramsChange!(kfn::kfn_1, modelError, outputError) kfn.on_epsilonRec, kfn.on_eta, kfn.on_eRec, - kfn.on_wOut, kfn.on_wOutChange, kfn.on_arrayProjection4d, kfn.on_error, @@ -56,7 +57,8 @@ function compute_paramsChange!(kfn::kfn_1, modelError, outputError) # error("DEBUG -> kfn compute_paramsChange! $(Dates.now())") end -function lifComputeParamsChange!( phi::CuArray, +function lifComputeParamsChange!( timeStep::CuArray, + phi::CuArray, epsilonRec::CuArray, eta::CuArray, eRec::CuArray, @@ -88,12 +90,15 @@ function lifComputeParamsChange!( phi::CuArray, wRecChange .+= (-eta .* nError .* eRec) #TODO frequency regulator + wRecChange .+= 0.0001 .* ((firingTargetFrequency - (firingCounter./timeStep)) ./ timeStep) .* + eta .* eRec # reset epsilonRec epsilonRec .= 0 end -function alifComputeParamsChange!( phi::CuArray, +function alifComputeParamsChange!( timeStep::CuArray, + phi::CuArray, epsilonRec::CuArray, eta::CuArray, eRec::CuArray, @@ -125,6 +130,8 @@ function alifComputeParamsChange!( phi::CuArray, wRecChange .+= (-eta .* nError .* eRec) #TODO frequency regulator + wRecChange .+= 0.0001 .* ((firingTargetFrequency - (firingCounter./timeStep)) ./ timeStep) .* + eta .* eRec # reset epsilonRec epsilonRec .= 0 diff --git a/src/type.jl b/src/type.jl index 2bdac00..28ab1b5 100644 --- a/src/type.jl +++ b/src/type.jl @@ -217,7 +217,8 @@ function kfn_1(params::Dict; device=cpu) kfn.lif_subscription = (GeneralUtils.isNotEqual.(kfn.lif_wRec, 0)) |> device kfn.lif_firingCounter = (similar(kfn.lif_wRec) .= 0) |> device - kfn.lif_firingTargetFrequency = (similar(kfn.lif_wRec) .= 80) |> device + # firingTargetFrequency = desired count / total sequence length + kfn.lif_firingTargetFrequency = (similar(kfn.lif_wRec) .= 0.2) |> device kfn.lif_arrayProjection4d = (similar(kfn.lif_wRec) .= 1) |> device kfn.lif_recSignal = (similar(kfn.lif_wRec) .= 0) |> device @@ -265,7 +266,8 @@ function kfn_1(params::Dict; device=cpu) kfn.alif_subscription = (GeneralUtils.isNotEqual.(kfn.alif_wRec, 0)) |> device kfn.alif_firingCounter = (similar(kfn.alif_wRec) .= 0) |> device - kfn.alif_firingTargetFrequency = (similar(kfn.alif_wRec) .= 80) |> device + # firingTargetFrequency = desired count / total sequence length + kfn.alif_firingTargetFrequency = (similar(kfn.alif_wRec) .= 0.2) |> device kfn.alif_arrayProjection4d = (similar(kfn.alif_wRec) .= 1) |> device kfn.alif_recSignal = (similar(kfn.alif_wRec) .= 0) |> device