1
1
#!/usr/bin/env python
2
2
# -*- coding: utf-8 -*-
3
3
#
4
- # Copyright (c) 2022 Intel Corporation
4
+ # Copyright (c) 2024 Intel Corporation
5
5
#
6
6
# Licensed under the Apache License, Version 2.0 (the "License");
7
7
# you may not use this file except in compliance with the License.
23
23
24
24
from neural_compressor .tensorflow .utils import version1_gte_version2
25
25
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" ):
31
27
from keras .src .layers .convolutional .base_conv import Conv # pylint: disable=E0401
32
28
else :
33
29
from keras .layers .convolutional .base_conv import Conv # pylint: disable=E0401
36
32
class QConv2D (Conv ):
37
33
def __init__ (
38
34
self ,
35
+ name ,
39
36
filters ,
40
37
kernel_size ,
41
38
strides = (1 , 1 ),
@@ -52,11 +49,12 @@ def __init__(
52
49
activity_regularizer = None ,
53
50
kernel_constraint = None ,
54
51
bias_constraint = None ,
55
- min_value = - 10000 ,
56
- max_value = 10000 ,
52
+ min_value = None ,
53
+ max_value = None ,
57
54
** kwargs
58
55
):
59
56
super (QConv2D , self ).__init__ (
57
+ name = name ,
60
58
rank = 2 ,
61
59
filters = filters ,
62
60
kernel_size = kernel_size ,
@@ -76,10 +74,17 @@ def __init__(
76
74
bias_constraint = constraints .get (bias_constraint ),
77
75
** kwargs
78
76
)
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
81
79
82
80
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
+
83
88
# add the Q/DQ here
84
89
kernel , _ , _ = quantization .quantize (
85
90
self .kernel , self .min_value , self .max_value , tf .qint8 , axis = 3 , mode = "SCALED"
@@ -111,3 +116,69 @@ def call(self, inputs):
111
116
@classmethod
112
117
def from_config (cls , config ):
113
118
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