Source code for elasticai.creator.nn.fixed_point.hard_sigmoid.layer
from elasticai.creator.base_modules.hard_sigmoid import HardSigmoid as HardSigmoidBase
from elasticai.creator.nn.design_creator_module import DesignCreatorModule
from elasticai.creator.nn.fixed_point.two_complement_fixed_point_config import (
FixedPointConfig,
)
from .design import HardSigmoid as HardSigmoidDesign
[docs]
class HardSigmoid(DesignCreatorModule, HardSigmoidBase):
def __init__(self, total_bits: int, frac_bits: int) -> None:
"""Quantized Activation Function for Sigmoid
:param total_bits: Total number of bits
:param frac_bits: Fraction of bits
"""
super().__init__()
self._config = FixedPointConfig(total_bits=total_bits, frac_bits=frac_bits)
[docs]
def create_design(self, name: str) -> HardSigmoidDesign:
neg_thr = -3.0
if self._config.rational_out_of_bounds(neg_thr):
neg_thr = self._config.minimum_as_rational
pos_thr = +3.0
if self._config.rational_out_of_bounds(pos_thr):
pos_thr = self._config.maximum_as_rational
y_int = 0.5
if self._config.rational_out_of_bounds(y_int):
pos_thr = self._config.maximum_as_rational
y_max = 1.0
if self._config.rational_out_of_bounds(y_max):
y_max = self._config.maximum_as_rational
slope = 1 / 6
if self._config.rational_out_of_bounds(slope):
y_max = self._config.minimum_step_as_rational
return HardSigmoidDesign(
name=name,
total_bits=self._config.total_bits,
frac_bits=self._config.frac_bits,
one=self._config.cut_as_integer(y_max),
zero_threshold=self._config.cut_as_integer(neg_thr),
one_threshold=self._config.cut_as_integer(pos_thr),
slope=self._config.cut_as_integer(slope),
y_intercept=self._config.cut_as_integer(y_int),
)