building forward()

This commit is contained in:
ton
2023-07-11 09:26:14 +07:00
parent 3482e87892
commit fc676d1ccd

View File

@@ -26,8 +26,10 @@ Base.@kwdef mutable struct kfn_1 <: knowledgeFn
z_i_t0::Union{AbstractArray, Nothing} = nothing
lif_w::Union{AbstractArray, Nothing} = nothing
lif_recSignal::Union{AbstractArray, Nothing} = nothing
alif_w::Union{AbstractArray, Nothing} = nothing
alif_recSignal::Union{AbstractArray, Nothing} = nothing
end
# outer constructor
@@ -35,35 +37,42 @@ function kfn_1(params::Dict)
kfn = kfn_1()
kfn.params = params
# initialize activation matrix
row, col = kfn.params[:inputPort][:noise][:numbers]
row += kfn.params[:inputPort][:signal][:numbers][1]
row, col, batch = kfn.params[:inputPort][:signal][:numbers] # z-axis represent signal batch number
row += kfn.params[:inputPort][:noise][:numbers][1]
col += kfn.params[:inputPort][:signal][:numbers][2]
col += kfn.params[:computeNeuron][:lif][:numbers][2]
col += kfn.params[:computeNeuron][:alif][:numbers][2]
kfn.z_i_t1 = zeros(row, col, 1)
kfn.z_i_t0 = zeros(row, col, 1)
kfn.z_i_t1 = zeros(row, col, batch)
kfn.z_i_t0 = zeros(row, col, batch)
kfn.lif_w = zeros(row, col, row*col)
kfn.alif_w = zeros(row, col, row*col)
# LIF
z = kfn.params[:computeNeuron][:lif][:numbers][1] * kfn.params[:computeNeuron][:lif][:numbers][2]
kfn.lif_w = zeros(row, col, z) # matrix z-axis represent each neurons
kfn.lif_recSignal = zeros(row, col, z, batch)
# ALIF
z = kfn.params[:computeNeuron][:alif][:numbers][1] * kfn.params[:computeNeuron][:alif][:numbers][2]
kfn.alif_w = zeros(row, col, z)
kfn.alif_recSignal = zeros(row, col, z, batch)
# lif subscription
row, col, z = size(kfn.lif_w) # row*col is synaptic subscribe weight for each neuron in z
row, col, _ = size(kfn.lif_w) # row*col is synaptic subscribe weight for each neuron in z-axis
synapticConnectionPercent = kfn.params[:computeNeuron][:lif][:params][:synapticConnectionPercent]
synapticConnection = Int(floor(z*synapticConnectionPercent/100))
synapticConnection = Int(floor(row*col * synapticConnectionPercent/100))
for slice in eachslice(kfn.lif_w, dims=3)
pool = shuffle!([1:z...])[1:synapticConnection]
pool = shuffle!([1:row*col...])[1:synapticConnection]
for i in pool
slice[i] = randn()/10
end
end
# alif subscription
row, col, z = size(kfn.alif_w) # row*col is synaptic subscribe weight for each neuron in z
row, col, _ = size(kfn.alif_w) # row*col is synaptic subscribe weight for each neuron in z-axis
synapticConnectionPercent = kfn.params[:computeNeuron][:alif][:params][:synapticConnectionPercent]
synapticConnection = Int(floor(z*synapticConnectionPercent/100))
synapticConnection = Int(floor(row*col * synapticConnectionPercent/100))
for slice in eachslice(kfn.alif_w, dims=3)
pool = shuffle!([1:z...])[1:synapticConnection]
pool = shuffle!([1:row*col...])[1:synapticConnection]
for i in pool
slice[i] = randn()/10
end
@@ -87,19 +96,23 @@ end
function (kfn::kfn_1)(input::AbstractArray)
kfn.timeStep .+= 1
# time step forward
# row, col = size(input) # if input is a 2D matrix
println(">>> 5 ", size(input))
println(">>> 6 ", size(kfn.z_i_t1))
println(">>> 1 ", size(input))
println(">>> 2 ", size(kfn.z_i_t1))
#WORKING multiply input with kfn.z_i_t1 may be using cartesian coordinates
println(">>> 7 ", view(kfn.z_i_t1, :, 1, :))
view(kfn.z_i_t1, :, 1) .= input
println(">>> 8 ", kfn.z_i_t1[:, 1])
# multiply input with kfn.z_i_t1 may be using cartesian coordinates
GeneralUtils.cartesianAssign!(kfn.z_i_t1, input)
println(">>> 3 ", sum(kfn.z_i_t1))
println(">>> 4 ", size(kfn.lif_recSignal))
println(">>> 5 ", size(kfn.lif_w))
kfn.lif_recSignal .= GeneralUtils.batchMatEleMul(kfn.z_i_t1, kfn.lif_w)
kfn.alif_recSignal .= GeneralUtils.batchMatEleMul(kfn.z_i_t1, kfn.alif_w)
# multiply kfn.z_i_t1 with kfn.lif_w
r = GeneralUtils.batchMatEleMul(kfn.z_i_t1, kfn.lif_w)
println(size(r))