From 5f5d13434f53ebbfc58737ef865cd660e3f37b62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Aur=C3=A9lie=20saulquin?= <aurelie.saulq@gmail.com>
Date: Wed, 19 Mar 2025 22:21:33 +0100
Subject: [PATCH] add quantizer modif
---
.../modnef_neurons/modnef_torch_neuron.py | 46 +++++++++++++++++--
.../modnef_neurons/srlif_model/shiftlif.py | 29 ++++--------
.../quantizer/dynamic_scale_quantizer.py | 2 +-
.../modnef/quantizer/fixed_point_quantizer.py | 2 +-
.../modnef/quantizer/min_max_quantizer.py | 2 +-
modneflib/modnef/quantizer/quantizer.py | 8 ++--
6 files changed, 57 insertions(+), 32 deletions(-)
diff --git a/modneflib/modnef/modnef_torch/modnef_neurons/modnef_torch_neuron.py b/modneflib/modnef/modnef_torch/modnef_neurons/modnef_torch_neuron.py
index 7322594..0a1acd9 100644
--- a/modneflib/modnef/modnef_torch/modnef_neurons/modnef_torch_neuron.py
+++ b/modneflib/modnef/modnef_torch/modnef_neurons/modnef_torch_neuron.py
@@ -10,6 +10,8 @@ Descriptions: ModNEF torch neuron interface builder
import torch
from modnef.quantizer import *
+from snntorch._neurons import SpikingNeuron
+from snntorch.surrogate import fast_sigmoid
_quantizer = {
"FixedPointQuantizer" : FixedPointQuantizer,
@@ -17,7 +19,7 @@ _quantizer = {
"DynamicScaleFactorQuantizer" : DynamicScaleFactorQuantizer
}
-class ModNEFNeuron():
+class ModNEFNeuron(SpikingNeuron):
"""
ModNEF torch neuron interface
@@ -42,7 +44,27 @@ class ModNEFNeuron():
create and return the corresponding modnef archbuilder module from internal neuron parameters
"""
- def __init__(self, quantizer : Quantizer):
+ def __init__(self,
+ threshold,
+ reset_mechanism,
+ quantizer : Quantizer,
+ spike_grad=fast_sigmoid(slope=25)):
+
+ SpikingNeuron.__init__(
+ self=self,
+ threshold=threshold,
+ reset_mechanism=reset_mechanism,
+ spike_gard=spike_grad,
+ surrogate_disable=False,
+ init_hidden=False,
+ inhibition=False,
+ learn_threshold=False,
+ state_quant=False,
+ output=False,
+ graded_spikes_factor=1.0,
+ learn_graded_spikes_factor=False
+ )
+
self.hardware_estimation_flag = False
self.quantization_flag = False
@@ -61,7 +83,20 @@ class ModNEFNeuron():
raise NotImplementedError()
- def quantize_weight(self):
+ def init_quantizer(self):
+
+ params = list(self.parameters())
+
+ w1 = params[0].data
+
+ if len(params)==2:
+ w2 = params[0].data
+ else:
+ w2 = torch.zeros((1))
+
+ self.quantizer.init_quantizer(w1, w2)
+
+ def quantize_weight(self, unscaled : bool = False):
"""
synaptic weight quantization
@@ -70,9 +105,10 @@ class ModNEFNeuron():
NotImplementedError()
"""
- raise NotImplementedError()
+ for param in self.parameters():
+ param.data = self.quantizer(param.data, unscale=unscaled)
- def quantize_parameters(self):
+ def quantize_hp(self):
"""
neuron hyper-parameters quantization
"""
diff --git a/modneflib/modnef/modnef_torch/modnef_neurons/srlif_model/shiftlif.py b/modneflib/modnef/modnef_torch/modnef_neurons/srlif_model/shiftlif.py
index 9bb6d1d..195e965 100644
--- a/modneflib/modnef/modnef_torch/modnef_neurons/srlif_model/shiftlif.py
+++ b/modneflib/modnef/modnef_torch/modnef_neurons/srlif_model/shiftlif.py
@@ -11,14 +11,14 @@ Based on snntorch.Leaky and snntroch.LIF class
import torch.nn as nn
import torch
-from snntorch import LIF
+from snntorch.surrogate import fast_sigmoid
import modnef.arch_builder as builder
from modnef.arch_builder.modules.utilities import *
from ..modnef_torch_neuron import ModNEFNeuron, _quantizer
from math import log, ceil
from modnef.quantizer import DynamicScaleFactorQuantizer
-class ShiftLIF(LIF, ModNEFNeuron):
+class ShiftLIF(ModNEFNeuron):
"""
ModNEFTorch Shift LIF neuron model
@@ -86,7 +86,7 @@ class ShiftLIF(LIF, ModNEFNeuron):
out_features,
beta,
threshold=1.0,
- spike_grad=None,
+ spike_grad=fast_sigmoid(slope=25),
reset_mechanism="subtract",
quantizer=DynamicScaleFactorQuantizer(8)
):
@@ -117,24 +117,13 @@ class ShiftLIF(LIF, ModNEFNeuron):
print(f"initial value of beta ({beta}) has been change for {1-2**-self.shift} = 1-2**-{self.shift}")
beta = 1-2**-self.shift
- LIF.__init__(
- self=self,
- beta=beta,
- threshold=threshold,
- spike_grad=spike_grad,
- surrogate_disable=False,
- init_hidden=False,
- inhibition=False,
- learn_beta=False,
- learn_threshold=False,
- reset_mechanism=reset_mechanism,
- state_quant=False,
- output=False,
- graded_spikes_factor=1.0,
- learn_graded_spikes_factor=False,
- )
- ModNEFNeuron.__init__(self=self, quantizer=quantizer)
+ ModNEFNeuron.__init__(self=self,
+ threshold=threshold,
+ reset_mechanism=reset_mechanism,
+ spike_grad=spike_grad,
+ quantizer=quantizer
+ )
self.fc = nn.Linear(in_features, out_features, bias=False)
diff --git a/modneflib/modnef/quantizer/dynamic_scale_quantizer.py b/modneflib/modnef/quantizer/dynamic_scale_quantizer.py
index 2631170..43a6aa1 100644
--- a/modneflib/modnef/quantizer/dynamic_scale_quantizer.py
+++ b/modneflib/modnef/quantizer/dynamic_scale_quantizer.py
@@ -96,7 +96,7 @@ class DynamicScaleFactorQuantizer(Quantizer):
is_initialize=config["is_initialize"]
)
- def init_from_weight(self, weight, rec_weight=torch.zeros((1))):
+ def init_quantizer(self, weight, rec_weight=torch.zeros((1))):
"""
initialize quantizer parameters from synaptic weight
diff --git a/modneflib/modnef/quantizer/fixed_point_quantizer.py b/modneflib/modnef/quantizer/fixed_point_quantizer.py
index 106a242..c48e690 100644
--- a/modneflib/modnef/quantizer/fixed_point_quantizer.py
+++ b/modneflib/modnef/quantizer/fixed_point_quantizer.py
@@ -109,7 +109,7 @@ class FixedPointQuantizer(Quantizer):
is_initialize=config["is_initialize"]
)
- def init_from_weight(self, weight, rec_weight=torch.zeros((1))):
+ def init_quantizer(self, weight, rec_weight=torch.zeros((1))):
"""
initialize quantizer parameters from synaptic weight
diff --git a/modneflib/modnef/quantizer/min_max_quantizer.py b/modneflib/modnef/quantizer/min_max_quantizer.py
index 6ca8131..ebc4ae9 100644
--- a/modneflib/modnef/quantizer/min_max_quantizer.py
+++ b/modneflib/modnef/quantizer/min_max_quantizer.py
@@ -105,7 +105,7 @@ class MinMaxQuantizer(Quantizer):
is_initialize=config["is_initialize"]
)
- def init_from_weight(self, weight, rec_weight=torch.zeros((1))):
+ def init_quantizer(self, weight, rec_weight=torch.zeros((1))):
"""
initialize quantizer parameters from synaptic weight
diff --git a/modneflib/modnef/quantizer/quantizer.py b/modneflib/modnef/quantizer/quantizer.py
index d753162..6ab752e 100644
--- a/modneflib/modnef/quantizer/quantizer.py
+++ b/modneflib/modnef/quantizer/quantizer.py
@@ -77,7 +77,7 @@ class Quantizer():
raise NotImplementedError()
- def init_from_weight(self, weight, rec_weight=torch.zeros((1))):
+ def init_quantizer(self, weight, rec_weight=torch.zeros((1))):
"""
initialize quantizer parameters from synaptic weight
@@ -112,10 +112,10 @@ class Quantizer():
else:
tdata = data
+ qdata = self._quant(tdata)
+
if unscale:
- qdata = self._unquant(self._quant(tdata))
- else:
- qdata = self._quant(tdata)
+ qdata = self._unquant(qdata)
if isinstance(data, (int, float)):
return qdata.item()
--
GitLab