ai-edge-quantizer-nightly 0.4.0.dev20251015__py3-none-any.whl → 0.4.0.dev20251016__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ai_edge_quantizer/utils/validation_utils.py +39 -0
- ai_edge_quantizer/utils/validation_utils_test.py +28 -0
- {ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info → ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info}/METADATA +1 -1
- {ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info → ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info}/RECORD +7 -7
- {ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info → ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info}/LICENSE +0 -0
- {ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info → ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info}/WHEEL +0 -0
- {ai_edge_quantizer_nightly-0.4.0.dev20251015.dist-info → ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info}/top_level.txt +0 -0
|
@@ -40,6 +40,8 @@ def get_validation_func(
|
|
|
40
40
|
return median_diff_ratio
|
|
41
41
|
elif func_name == "cosine_similarity":
|
|
42
42
|
return cosine_similarity
|
|
43
|
+
elif func_name == "kl_divergence":
|
|
44
|
+
return kl_divergence
|
|
43
45
|
else:
|
|
44
46
|
raise ValueError(f"Validation function {func_name} not supported")
|
|
45
47
|
|
|
@@ -134,6 +136,43 @@ def cosine_similarity(
|
|
|
134
136
|
return np.dot(data1, data2) / (norm_data1 * norm_data2)
|
|
135
137
|
|
|
136
138
|
|
|
139
|
+
def kl_divergence(
|
|
140
|
+
data1: np._typing.ArrayLike,
|
|
141
|
+
data2: np._typing.ArrayLike,
|
|
142
|
+
epsilon: float = 1e-9,
|
|
143
|
+
) -> float:
|
|
144
|
+
"""Calculates the KL divergence between data1 & data2.
|
|
145
|
+
|
|
146
|
+
KL(data2 || data1) = sum(data2 * log(data2 / data1)).
|
|
147
|
+
data2 is treated as the true distribution P, and data1 as the
|
|
148
|
+
approximated distribution Q.
|
|
149
|
+
Non-positive values in data1 and data2 are clipped to 0 before
|
|
150
|
+
KL divergence calculation. Epsilon is added to avoid log(0) and
|
|
151
|
+
division by zero.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
data1: input data to be used for comparison (distribution Q)
|
|
155
|
+
data2: input data to be used for comparison (distribution P),
|
|
156
|
+
data1 & 2 must be of the same shape
|
|
157
|
+
epsilon: small value to avoid log(0) and division by zero.
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
A float value representing the KL divergence between data1 & 2.
|
|
161
|
+
|
|
162
|
+
Raises:
|
|
163
|
+
Value error if the two inputs don't have the same number of elements.
|
|
164
|
+
"""
|
|
165
|
+
data1, data2 = _preprocess_same_size_arrays(data1, data2)
|
|
166
|
+
# special handling for tensor of size 0
|
|
167
|
+
if data1.size == 0:
|
|
168
|
+
return float(0)
|
|
169
|
+
|
|
170
|
+
p = np.maximum(0, data2)
|
|
171
|
+
q = np.maximum(0, data1)
|
|
172
|
+
|
|
173
|
+
return float(np.sum(p * np.log((p + epsilon) / (q + epsilon))))
|
|
174
|
+
|
|
175
|
+
|
|
137
176
|
def _preprocess_same_size_arrays(
|
|
138
177
|
data1: np._typing.ArrayLike, data2: np._typing.ArrayLike
|
|
139
178
|
) -> Tuple[np.ndarray, np.ndarray]:
|
|
@@ -106,6 +106,34 @@ class ValidationUtilTest(googletest.TestCase):
|
|
|
106
106
|
result = validation_utils.cosine_similarity(data1, data2)
|
|
107
107
|
self.assertEqual(result, 0)
|
|
108
108
|
|
|
109
|
+
def test_kl_divergence(self):
|
|
110
|
+
data1 = [0.5, 0.5]
|
|
111
|
+
data2 = [0.1, 0.9]
|
|
112
|
+
result = validation_utils.kl_divergence(data1, data2)
|
|
113
|
+
self.assertAlmostEqual(result, 0.36808, 4)
|
|
114
|
+
|
|
115
|
+
def test_kl_divergence_zero_in_q(self):
|
|
116
|
+
data1 = [0, 1]
|
|
117
|
+
data2 = [1, 0]
|
|
118
|
+
result = validation_utils.kl_divergence(data1, data2)
|
|
119
|
+
self.assertAlmostEqual(result, 20.7232658, 4)
|
|
120
|
+
|
|
121
|
+
def test_kl_divergence_negative_values(self):
|
|
122
|
+
data1 = [-1, 1]
|
|
123
|
+
data2 = [1, -1]
|
|
124
|
+
result = validation_utils.kl_divergence(data1, data2)
|
|
125
|
+
self.assertAlmostEqual(result, 20.7232658, 4)
|
|
126
|
+
|
|
127
|
+
def test_kl_divergence_0d(self):
|
|
128
|
+
data1 = []
|
|
129
|
+
data2 = []
|
|
130
|
+
result = validation_utils.kl_divergence(data1, data2)
|
|
131
|
+
self.assertEqual(result, 0)
|
|
132
|
+
|
|
133
|
+
def test_get_validation_func_kl_divergence(self):
|
|
134
|
+
func = validation_utils.get_validation_func("kl_divergence")
|
|
135
|
+
self.assertEqual(func, validation_utils.kl_divergence)
|
|
136
|
+
|
|
109
137
|
|
|
110
138
|
if __name__ == "__main__":
|
|
111
139
|
googletest.main()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ai-edge-quantizer-nightly
|
|
3
|
-
Version: 0.4.0.
|
|
3
|
+
Version: 0.4.0.dev20251016
|
|
4
4
|
Summary: A quantizer for advanced developers to quantize converted AI Edge models.
|
|
5
5
|
Home-page: https://github.com/google-ai-edge/ai-edge-quantizer
|
|
6
6
|
Keywords: On-Device ML,AI,Google,TFLite,Quantization,LLMs,GenAI
|
|
@@ -72,10 +72,10 @@ ai_edge_quantizer/utils/tfl_flatbuffer_utils.py,sha256=42OWzQsRTXq3XQYmoxlz177_d
|
|
|
72
72
|
ai_edge_quantizer/utils/tfl_flatbuffer_utils_test.py,sha256=K1SbK8q92qYVtiVj0I0GtugsPTkpIpEKv9zakvFV_Sc,8555
|
|
73
73
|
ai_edge_quantizer/utils/tfl_interpreter_utils.py,sha256=EoVjI_hplX_Rml3hfRsGmQOihexmizeJqt4SQcET9aA,14925
|
|
74
74
|
ai_edge_quantizer/utils/tfl_interpreter_utils_test.py,sha256=6fjkM-rycZ95L4yfvlr0TN6RlrhfPzxNUYrZaYO_F0A,12013
|
|
75
|
-
ai_edge_quantizer/utils/validation_utils.py,sha256=
|
|
76
|
-
ai_edge_quantizer/utils/validation_utils_test.py,sha256=
|
|
77
|
-
ai_edge_quantizer_nightly-0.4.0.
|
|
78
|
-
ai_edge_quantizer_nightly-0.4.0.
|
|
79
|
-
ai_edge_quantizer_nightly-0.4.0.
|
|
80
|
-
ai_edge_quantizer_nightly-0.4.0.
|
|
81
|
-
ai_edge_quantizer_nightly-0.4.0.
|
|
75
|
+
ai_edge_quantizer/utils/validation_utils.py,sha256=QTYyQ_HDVrFTGPIsrA240Lv8tUw1fwWp2fu9kTVISkE,6224
|
|
76
|
+
ai_edge_quantizer/utils/validation_utils_test.py,sha256=lO51rGskhzpXePRdZMU87u_YO35_sDp9_eQ85CmupL4,4600
|
|
77
|
+
ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
78
|
+
ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info/METADATA,sha256=Pb491ErUpqbWSgau8BYJwALz1jrD-ziX6af_1Jg_caE,1508
|
|
79
|
+
ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
|
80
|
+
ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info/top_level.txt,sha256=8QTfPnFXNVUhScFLaa-NWZMFWMn72M50DVPubpwWB1g,18
|
|
81
|
+
ai_edge_quantizer_nightly-0.4.0.dev20251016.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|