add frequency regulator

This commit is contained in:
ton
2023-08-10 14:20:08 +07:00
parent 403be8be02
commit fa3ac5c934
3 changed files with 21 additions and 12 deletions

View File

@@ -421,13 +421,13 @@ function alifForward( zit,
phi[i1,i2,i3,i4] = (gammaPd[i1,i2,i3,i4] / vth[i1,i2,i3,i4]) * 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])) 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 # compute epsilonRecA use eq.26
epsilonRecA[i1,i2,i3,i4] = (rho[i1,i2,i3,i4] * 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]) (zit[i1,i2,i3,i4] * subscription[i1,i2,i3,i4])
end end
end end

View File

@@ -10,7 +10,8 @@ using ..type, ..snnUtil
function compute_paramsChange!(kfn::kfn_1, modelError, outputError) function compute_paramsChange!(kfn::kfn_1, modelError, outputError)
modelError = reshape(modelError, (1,1,1,:)) # (1,1,1,batch) 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_epsilonRec,
kfn.lif_eta, kfn.lif_eta,
kfn.lif_eRec, kfn.lif_eRec,
@@ -26,7 +27,8 @@ function compute_paramsChange!(kfn::kfn_1, modelError, outputError)
kfn.inputSize, kfn.inputSize,
) )
alifComputeParamsChange!(kfn.alif_phi, alifComputeParamsChange!(kfn.timeStep,
kfn.alif_phi,
kfn.alif_epsilonRec, kfn.alif_epsilonRec,
kfn.alif_eta, kfn.alif_eta,
kfn.alif_eRec, kfn.alif_eRec,
@@ -47,7 +49,6 @@ function compute_paramsChange!(kfn::kfn_1, modelError, outputError)
kfn.on_epsilonRec, kfn.on_epsilonRec,
kfn.on_eta, kfn.on_eta,
kfn.on_eRec, kfn.on_eRec,
kfn.on_wOut,
kfn.on_wOutChange, kfn.on_wOutChange,
kfn.on_arrayProjection4d, kfn.on_arrayProjection4d,
kfn.on_error, kfn.on_error,
@@ -56,7 +57,8 @@ function compute_paramsChange!(kfn::kfn_1, modelError, outputError)
# error("DEBUG -> kfn compute_paramsChange! $(Dates.now())") # error("DEBUG -> kfn compute_paramsChange! $(Dates.now())")
end end
function lifComputeParamsChange!( phi::CuArray, function lifComputeParamsChange!( timeStep::CuArray,
phi::CuArray,
epsilonRec::CuArray, epsilonRec::CuArray,
eta::CuArray, eta::CuArray,
eRec::CuArray, eRec::CuArray,
@@ -88,12 +90,15 @@ function lifComputeParamsChange!( phi::CuArray,
wRecChange .+= (-eta .* nError .* eRec) wRecChange .+= (-eta .* nError .* eRec)
#TODO frequency regulator #TODO frequency regulator
wRecChange .+= 0.0001 .* ((firingTargetFrequency - (firingCounter./timeStep)) ./ timeStep) .*
eta .* eRec
# reset epsilonRec # reset epsilonRec
epsilonRec .= 0 epsilonRec .= 0
end end
function alifComputeParamsChange!( phi::CuArray, function alifComputeParamsChange!( timeStep::CuArray,
phi::CuArray,
epsilonRec::CuArray, epsilonRec::CuArray,
eta::CuArray, eta::CuArray,
eRec::CuArray, eRec::CuArray,
@@ -125,6 +130,8 @@ function alifComputeParamsChange!( phi::CuArray,
wRecChange .+= (-eta .* nError .* eRec) wRecChange .+= (-eta .* nError .* eRec)
#TODO frequency regulator #TODO frequency regulator
wRecChange .+= 0.0001 .* ((firingTargetFrequency - (firingCounter./timeStep)) ./ timeStep) .*
eta .* eRec
# reset epsilonRec # reset epsilonRec
epsilonRec .= 0 epsilonRec .= 0

View File

@@ -217,7 +217,8 @@ function kfn_1(params::Dict; device=cpu)
kfn.lif_subscription = (GeneralUtils.isNotEqual.(kfn.lif_wRec, 0)) |> device kfn.lif_subscription = (GeneralUtils.isNotEqual.(kfn.lif_wRec, 0)) |> device
kfn.lif_firingCounter = (similar(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_arrayProjection4d = (similar(kfn.lif_wRec) .= 1) |> device
kfn.lif_recSignal = (similar(kfn.lif_wRec) .= 0) |> 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_subscription = (GeneralUtils.isNotEqual.(kfn.alif_wRec, 0)) |> device
kfn.alif_firingCounter = (similar(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_arrayProjection4d = (similar(kfn.alif_wRec) .= 1) |> device
kfn.alif_recSignal = (similar(kfn.alif_wRec) .= 0) |> device kfn.alif_recSignal = (similar(kfn.alif_wRec) .= 0) |> device