11#!/usr/bin/env python
22# -*- coding: utf-8 -*-
33#
4- # Copyright (c) 2022 Intel Corporation
4+ # Copyright (c) 2024 Intel Corporation
55#
66# Licensed under the Apache License, Version 2.0 (the "License");
77# you may not use this file except in compliance with the License.
2323
2424from neural_compressor .tensorflow .utils import version1_gte_version2
2525
26- if version1_gte_version2 (tf .__version__ , "2.16.1" ):
27- from keras .src .layers .convolutional .base_conv import BaseConv # pylint: disable=E0401
28-
29- Conv = BaseConv
30- elif version1_gte_version2 (tf .__version__ , "2.13.0" ):
26+ if version1_gte_version2 (tf .__version__ , "2.13.0" ):
3127 from keras .src .layers .convolutional .base_conv import Conv # pylint: disable=E0401
3228else :
3329 from keras .layers .convolutional .base_conv import Conv # pylint: disable=E0401
3632class QConv2D (Conv ):
3733 def __init__ (
3834 self ,
35+ name ,
3936 filters ,
4037 kernel_size ,
4138 strides = (1 , 1 ),
@@ -52,11 +49,12 @@ def __init__(
5249 activity_regularizer = None ,
5350 kernel_constraint = None ,
5451 bias_constraint = None ,
55- min_value = - 10000 ,
56- max_value = 10000 ,
52+ min_value = None ,
53+ max_value = None ,
5754 ** kwargs
5855 ):
5956 super (QConv2D , self ).__init__ (
57+ name = name ,
6058 rank = 2 ,
6159 filters = filters ,
6260 kernel_size = kernel_size ,
@@ -76,10 +74,17 @@ def __init__(
7674 bias_constraint = constraints .get (bias_constraint ),
7775 ** kwargs
7876 )
79- self .min_value = json . loads ( min_value )
80- self .max_value = json . loads ( max_value )
77+ self .min_value = min_value
78+ self .max_value = max_value
8179
8280 def call (self , inputs ):
81+ kernel_size = self .kernel .shape [- 1 ]
82+
83+ if not self .min_value :
84+ self .min_value = [- 10000 ] * kernel_size
85+ if not self .max_value :
86+ self .max_value = [10000 ] * kernel_size
87+
8388 # add the Q/DQ here
8489 kernel , _ , _ = quantization .quantize (
8590 self .kernel , self .min_value , self .max_value , tf .qint8 , axis = 3 , mode = "SCALED"
@@ -111,3 +116,69 @@ def call(self, inputs):
111116 @classmethod
112117 def from_config (cls , config ):
113118 return cls (** config )
119+
120+
121+ def initialize_int8_conv2d (fp32_layer ):
122+ kwargs = fp32_layer .get_config ()
123+
124+ if "name" in kwargs :
125+ del kwargs ["name" ]
126+ if "filters" in kwargs :
127+ del kwargs ["filters" ]
128+ if "kernel_size" in kwargs :
129+ del kwargs ["kernel_size" ]
130+ if "strides" in kwargs :
131+ del kwargs ["strides" ]
132+ if "padding" in kwargs :
133+ del kwargs ["padding" ]
134+ if "data_format" in kwargs :
135+ del kwargs ["data_format" ]
136+ if "dilation_rate" in kwargs :
137+ del kwargs ["dilation_rate" ]
138+ if "groups" in kwargs :
139+ del kwargs ["groups" ]
140+ if "activation" in kwargs :
141+ del kwargs ["activation" ]
142+ if "use_bias" in kwargs :
143+ del kwargs ["use_bias" ]
144+ if "kernel_initializer" in kwargs :
145+ del kwargs ["kernel_initializer" ]
146+ if "bias_initializer" in kwargs :
147+ del kwargs ["bias_initializer" ]
148+ if "kernel_regularizer" in kwargs :
149+ del kwargs ["kernel_regularizer" ]
150+ if "activity_regularizer" in kwargs :
151+ del kwargs ["activity_regularizer" ]
152+ if "bias_regularizer" in kwargs :
153+ del kwargs ["bias_regularizer" ]
154+ if "kernel_constraint" in kwargs :
155+ del kwargs ["kernel_constraint" ]
156+ if "bias_constraint" in kwargs :
157+ del kwargs ["bias_constraint" ]
158+ if "min_value" in kwargs :
159+ del kwargs ["min_value" ]
160+ if "max_value" in kwargs :
161+ del kwargs ["max_value" ]
162+
163+ return QConv2D (
164+ name = fp32_layer .name ,
165+ filters = fp32_layer .filters ,
166+ kernel_size = fp32_layer .kernel_size ,
167+ strides = fp32_layer .strides ,
168+ padding = fp32_layer .padding ,
169+ data_format = fp32_layer .data_format ,
170+ dilation_rate = fp32_layer .dilation_rate ,
171+ groups = fp32_layer .groups ,
172+ activation = fp32_layer .activation ,
173+ use_bias = fp32_layer .use_bias ,
174+ kernel_initializer = fp32_layer .kernel_initializer ,
175+ bias_initializer = fp32_layer .bias_initializer ,
176+ kernel_regularizer = fp32_layer .kernel_regularizer ,
177+ bias_regularizer = fp32_layer .bias_regularizer ,
178+ activity_regularizer = fp32_layer .activity_regularizer ,
179+ kernel_constraint = fp32_layer .kernel_constraint ,
180+ bias_constraint = fp32_layer .bias_constraint ,
181+ min_value = fp32_layer .min_value ,
182+ max_value = fp32_layer .max_value ,
183+ ** kwargs
184+ )
0 commit comments