keras-nightly 3.12.0.dev2025090303__py3-none-any.whl → 3.12.0.dev2025090503__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.
- keras/_tf_keras/keras/ops/__init__.py +1 -0
- keras/_tf_keras/keras/ops/numpy/__init__.py +1 -0
- keras/ops/__init__.py +1 -0
- keras/ops/numpy/__init__.py +1 -0
- keras/src/backend/jax/numpy.py +6 -0
- keras/src/backend/numpy/numpy.py +7 -0
- keras/src/backend/openvino/numpy.py +4 -0
- keras/src/backend/tensorflow/numpy.py +46 -0
- keras/src/backend/torch/numpy.py +6 -0
- keras/src/models/model.py +2 -2
- keras/src/ops/numpy.py +43 -0
- keras/src/quantizers/gptq.py +284 -192
- keras/src/quantizers/gptq_config.py +3 -13
- keras/src/quantizers/gptq_core.py +211 -158
- keras/src/quantizers/quantizers.py +200 -0
- keras/src/version.py +1 -1
- {keras_nightly-3.12.0.dev2025090303.dist-info → keras_nightly-3.12.0.dev2025090503.dist-info}/METADATA +1 -1
- {keras_nightly-3.12.0.dev2025090303.dist-info → keras_nightly-3.12.0.dev2025090503.dist-info}/RECORD +20 -21
- keras/src/quantizers/gptq_quant.py +0 -133
- {keras_nightly-3.12.0.dev2025090303.dist-info → keras_nightly-3.12.0.dev2025090503.dist-info}/WHEEL +0 -0
- {keras_nightly-3.12.0.dev2025090303.dist-info → keras_nightly-3.12.0.dev2025090503.dist-info}/top_level.txt +0 -0
keras/src/version.py
CHANGED
{keras_nightly-3.12.0.dev2025090303.dist-info → keras_nightly-3.12.0.dev2025090503.dist-info}/RECORD
RENAMED
@@ -44,11 +44,11 @@ keras/_tf_keras/keras/losses/__init__.py,sha256=xBc_KOtSLwp3h3CKQ0EnCuIy-Bsak2SP
|
|
44
44
|
keras/_tf_keras/keras/metrics/__init__.py,sha256=_wF31PTvua5ahF9JEW4Hx1UVNjVCLqVI8J5JNrZCBf8,6546
|
45
45
|
keras/_tf_keras/keras/mixed_precision/__init__.py,sha256=AM51CzHqzcY75tqdpQiuVcTRUEpUzBqeb-EfLeSDSV8,727
|
46
46
|
keras/_tf_keras/keras/models/__init__.py,sha256=83pyA0pzytqin8JLV6FEbPreCb-V64ToebxFGrHsVdQ,501
|
47
|
-
keras/_tf_keras/keras/ops/__init__.py,sha256=
|
47
|
+
keras/_tf_keras/keras/ops/__init__.py,sha256=xRJsr1GlVFl3FOzL-q80ZyKdc5p87EaphlALJIdR1SQ,14776
|
48
48
|
keras/_tf_keras/keras/ops/image/__init__.py,sha256=K57F1fBruHn6hacx9uQFWPYO1qbdNM40VR3djvKIRq4,961
|
49
49
|
keras/_tf_keras/keras/ops/linalg/__init__.py,sha256=cc8apE35y2X8idUxY-kc7qYCUm3SAvY2b_StSjRB7Ro,778
|
50
50
|
keras/_tf_keras/keras/ops/nn/__init__.py,sha256=DAloStL366PAGID_tqeSKnConPl5aB4dcyNVm8bWnUU,2802
|
51
|
-
keras/_tf_keras/keras/ops/numpy/__init__.py,sha256=
|
51
|
+
keras/_tf_keras/keras/ops/numpy/__init__.py,sha256=3AL2NyuxFcski5t45CbatwY3VGa6hco-hvHcxW_WcQo,9072
|
52
52
|
keras/_tf_keras/keras/optimizers/__init__.py,sha256=1fx0vEB-oGu-9dumxoIvX4qVHdgJvf74OLyYoBkE2y0,1267
|
53
53
|
keras/_tf_keras/keras/optimizers/legacy/__init__.py,sha256=uIMQESCV80Q0FY-9ikQUjXYPyZqmTfAM3dfohQ5DzYs,516
|
54
54
|
keras/_tf_keras/keras/optimizers/schedules/__init__.py,sha256=pQF3rQiAPuUSTUdflTr-fpL77oyGIv9xzGdjae3M3kw,1120
|
@@ -109,11 +109,11 @@ keras/losses/__init__.py,sha256=VIXBHQFNdLUPZ7JuwtIKj_4E-xf2yvNyrmdklvjr_xM,3667
|
|
109
109
|
keras/metrics/__init__.py,sha256=qeEwtqpSCAaCr8BMUv1eVaqJl2Zb83OB5K0BG3JB0nI,6245
|
110
110
|
keras/mixed_precision/__init__.py,sha256=AM51CzHqzcY75tqdpQiuVcTRUEpUzBqeb-EfLeSDSV8,727
|
111
111
|
keras/models/__init__.py,sha256=83pyA0pzytqin8JLV6FEbPreCb-V64ToebxFGrHsVdQ,501
|
112
|
-
keras/ops/__init__.py,sha256=
|
112
|
+
keras/ops/__init__.py,sha256=xRJsr1GlVFl3FOzL-q80ZyKdc5p87EaphlALJIdR1SQ,14776
|
113
113
|
keras/ops/image/__init__.py,sha256=K57F1fBruHn6hacx9uQFWPYO1qbdNM40VR3djvKIRq4,961
|
114
114
|
keras/ops/linalg/__init__.py,sha256=cc8apE35y2X8idUxY-kc7qYCUm3SAvY2b_StSjRB7Ro,778
|
115
115
|
keras/ops/nn/__init__.py,sha256=DAloStL366PAGID_tqeSKnConPl5aB4dcyNVm8bWnUU,2802
|
116
|
-
keras/ops/numpy/__init__.py,sha256=
|
116
|
+
keras/ops/numpy/__init__.py,sha256=3AL2NyuxFcski5t45CbatwY3VGa6hco-hvHcxW_WcQo,9072
|
117
117
|
keras/optimizers/__init__.py,sha256=1fx0vEB-oGu-9dumxoIvX4qVHdgJvf74OLyYoBkE2y0,1267
|
118
118
|
keras/optimizers/legacy/__init__.py,sha256=uIMQESCV80Q0FY-9ikQUjXYPyZqmTfAM3dfohQ5DzYs,516
|
119
119
|
keras/optimizers/schedules/__init__.py,sha256=pQF3rQiAPuUSTUdflTr-fpL77oyGIv9xzGdjae3M3kw,1120
|
@@ -126,7 +126,7 @@ keras/regularizers/__init__.py,sha256=542Shphw7W8h4Dyf2rmqMKUECVZ8IVBvN9g1LWhz-b
|
|
126
126
|
keras/saving/__init__.py,sha256=KvL2GZxjvgFgEhvEnkvqjIR9JSNHKz-NWZacXajsjLI,1298
|
127
127
|
keras/src/__init__.py,sha256=Gi4S7EiCMkE03PbdGNpFdaUYySWDs_FcAJ8Taz9Y1BE,684
|
128
128
|
keras/src/api_export.py,sha256=gXOkBOnmscV013WAc75lc4Up01-Kkg9EylIAT_QWctg,1173
|
129
|
-
keras/src/version.py,sha256=
|
129
|
+
keras/src/version.py,sha256=f4wgAnvTNADitPmga3-jCHgq7Iz24bPZA31q1dURAJE,204
|
130
130
|
keras/src/activations/__init__.py,sha256=0nL3IFDB9unlrMz8ninKOWo-uCHasTUpTo1tXZb2u44,4433
|
131
131
|
keras/src/activations/activations.py,sha256=mogPggtp4CGldI3VOPNmesRxp6EbiR1_i4KLGaVwzL8,17614
|
132
132
|
keras/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -169,7 +169,7 @@ keras/src/backend/jax/layer.py,sha256=o6CicT06udwamTRQIjNSDLZLyYHFzBXNbxewXgWe0i
|
|
169
169
|
keras/src/backend/jax/linalg.py,sha256=dtGHRYCvoVlRX0UwbDDdunA8Vp_mA3sdqoasX4P8SbQ,2532
|
170
170
|
keras/src/backend/jax/math.py,sha256=1IEDpdoF8e5ltu3D4wbDQuihzvJHhMXz8W9Z_E-eJqU,9391
|
171
171
|
keras/src/backend/jax/nn.py,sha256=R0a8-WB0YCl14FpRi2CQ45MFRvHCFtPTedk0Q1LfWYc,45935
|
172
|
-
keras/src/backend/jax/numpy.py,sha256=
|
172
|
+
keras/src/backend/jax/numpy.py,sha256=24u0ypCCjvlnpr0diBlGAP373XnzYNjFK3kuv9N_Oro,37017
|
173
173
|
keras/src/backend/jax/optimizer.py,sha256=JSKRkBteb7u-He5rtHwU6Wy5p8IjSsZf-IIL4-eQfsE,4102
|
174
174
|
keras/src/backend/jax/random.py,sha256=Uk2huGIk_dlzMrx5eDVrrr2TeCEMitn2vr4yzA0NXjs,3594
|
175
175
|
keras/src/backend/jax/rnn.py,sha256=Ycq0qfLY4M4jhltvztpLQyywjEM17T7CZQFh4hhHOUE,7767
|
@@ -184,7 +184,7 @@ keras/src/backend/numpy/layer.py,sha256=dTk7W7ql7vRgll7JbOXK5PlIhQw5VHdpSjKciHd8
|
|
184
184
|
keras/src/backend/numpy/linalg.py,sha256=H8Bdu8LG6OlzXqx8uVxLmTKKE8s9lMoZHMsM2tW4e04,2417
|
185
185
|
keras/src/backend/numpy/math.py,sha256=HdkEA5ro7dtQBTP78GFIgqTFLgNQ49PXHhqI1vLRGfo,10169
|
186
186
|
keras/src/backend/numpy/nn.py,sha256=wTh4s2ZvL4PjPjz4VE6tMrFkRMaQiqpdBeNb6RY5kyE,36623
|
187
|
-
keras/src/backend/numpy/numpy.py,sha256=
|
187
|
+
keras/src/backend/numpy/numpy.py,sha256=KfzmeN5WO1u8lhZJSiewWO3psln7p9XL3Id-Zglijos,35582
|
188
188
|
keras/src/backend/numpy/random.py,sha256=wx2nE75q7L2cBMjtQlQx8yKMj4Ie3puFMDQsbrZO8SA,3961
|
189
189
|
keras/src/backend/numpy/rnn.py,sha256=thOsMung1qR3lQsR4_D6hqKMFollQgrB0KwsJLk4BMY,7867
|
190
190
|
keras/src/backend/numpy/trainer.py,sha256=MzWr8_LLHa1P6fxdUWirGw_lQwHGF_vkZ7RUGLUzjUs,11126
|
@@ -196,7 +196,7 @@ keras/src/backend/openvino/layer.py,sha256=5RdvaH1yOyPAphjKiuQAK1H_yZFYKE1Hp7c5b
|
|
196
196
|
keras/src/backend/openvino/linalg.py,sha256=Q09iv7fcE-xtNOop_hTG_RADkI0CHhjfrcOHqdWCmIY,1486
|
197
197
|
keras/src/backend/openvino/math.py,sha256=qw9kX2sJ2qr0dBJF12Ey0E2GcwixPUqoev6UcNra4NI,3944
|
198
198
|
keras/src/backend/openvino/nn.py,sha256=FUjNvBOcwP-A1BHffaCIZ-bl6na6xM_v91dcaTP4Q4U,15121
|
199
|
-
keras/src/backend/openvino/numpy.py,sha256=
|
199
|
+
keras/src/backend/openvino/numpy.py,sha256=LmVuPzBjgYZ9RAuw2JeRfKcaLJSw-BOADXfvszC2F8w,65812
|
200
200
|
keras/src/backend/openvino/random.py,sha256=bR7BYdfYHsBi5rYgCKmpFf310fa1q7JT48Z29XxhwmA,5851
|
201
201
|
keras/src/backend/openvino/rnn.py,sha256=ErmuZLPSgG9qU-NfYPPvBZ6Ysy8k-fA4g19Vhqq7OVQ,866
|
202
202
|
keras/src/backend/openvino/trainer.py,sha256=bMmtSALqydqdS6ke-5sYW5fgxZDshDH810p_C0xCRTg,9087
|
@@ -209,7 +209,7 @@ keras/src/backend/tensorflow/layer.py,sha256=iE6XYSZENEoTpNhoXrEOm7gnIOHwOjETZd_
|
|
209
209
|
keras/src/backend/tensorflow/linalg.py,sha256=fpzxql1ycXIAks9AvS753aiSoaVqAuM6xbv671BulhQ,8038
|
210
210
|
keras/src/backend/tensorflow/math.py,sha256=zTu_7Ff6B2Ro862z_xH0OCmIWbV74DjsO5UnfjYuOUQ,12370
|
211
211
|
keras/src/backend/tensorflow/nn.py,sha256=oS7sngoA2C2SFfKQdYWvSZe7HCFfG29t4glbE6yv9CM,34616
|
212
|
-
keras/src/backend/tensorflow/numpy.py,sha256=
|
212
|
+
keras/src/backend/tensorflow/numpy.py,sha256=dDJwshRZcG8jRJg82B3YbGZV-uyfHJXARPKRtha-XAs,97185
|
213
213
|
keras/src/backend/tensorflow/optimizer.py,sha256=kFlyEOnGjEYdLpd8mpwhUeku78__xBfZbbrDWpJrq60,9307
|
214
214
|
keras/src/backend/tensorflow/random.py,sha256=iO8V_soaDXZm9ewyAVbjudhsMj08C348c9Bz64nxXC4,6475
|
215
215
|
keras/src/backend/tensorflow/rnn.py,sha256=99EJqbPdWddmG14zyjjhUZfU5zo9ObmslF_Mak7EmAs,34602
|
@@ -225,7 +225,7 @@ keras/src/backend/torch/layer.py,sha256=htECdpv9ioHWM8_zqQkEdxgDsgLu8XJi5yXgnLl-
|
|
225
225
|
keras/src/backend/torch/linalg.py,sha256=2GUb107BufiHEK2zJ_fkFREo8Y8mo0OqUZLkwNNgOv4,1991
|
226
226
|
keras/src/backend/torch/math.py,sha256=g-ElDii2Y_o1-t6BAu2nbS7JH-aPqVS5Fqds8aYzIlg,14324
|
227
227
|
keras/src/backend/torch/nn.py,sha256=8sqbeYU1siImRRyF4J-7JEE_CvcVeGnQ4D9aGijAyxo,33379
|
228
|
-
keras/src/backend/torch/numpy.py,sha256=
|
228
|
+
keras/src/backend/torch/numpy.py,sha256=t_JTibPexzQcZ-_x27Y26cGdSDzF6k_KzggnlRAXhE4,55210
|
229
229
|
keras/src/backend/torch/random.py,sha256=YhLfC7qkGpzlU_i6gGPVormo3BMSo7OUA3TC3GCehrA,8292
|
230
230
|
keras/src/backend/torch/rnn.py,sha256=J0vg7ikxBiv1FzEavgwT8IVCs0ceBcEv5LYyM5C2suA,25545
|
231
231
|
keras/src/backend/torch/trainer.py,sha256=TCnq0Tl9W0OUYesGGaSTWtGMnPiz-s6jrR5AC2F-TTg,17837
|
@@ -477,7 +477,7 @@ keras/src/metrics/regression_metrics.py,sha256=eLacV_8CKtzA26BJDJuncUDATuL1x8O6S
|
|
477
477
|
keras/src/models/__init__.py,sha256=DPbBPSfIGgsufTfJH5U5xJOeN_Ef4FMadT7KKYg3Kjg,143
|
478
478
|
keras/src/models/cloning.py,sha256=jwVtVVVYVasFIrln2hrzJ8bR2Xhsx9wYgEqpF1AjSvE,15786
|
479
479
|
keras/src/models/functional.py,sha256=VqCbEAmUXdrrt2X_BdC8iUQmt-GOVtfgpTMoN8l3k-s,33667
|
480
|
-
keras/src/models/model.py,sha256=
|
480
|
+
keras/src/models/model.py,sha256=mqT7eOFF2BhL0VdhtsG85-hEB3k0vwSLXAYVzvgeiA4,36178
|
481
481
|
keras/src/models/sequential.py,sha256=CC9Q1BNB9m7TkgMHRyjOzhQvneng576wJpmdgHrACKY,14352
|
482
482
|
keras/src/models/variable_mapping.py,sha256=FVtcgjBRqOxtvkzOE6kjG9SpcB9keDg2gS5LOTlXvG0,2181
|
483
483
|
keras/src/ops/__init__.py,sha256=aORlvnrqY_eQl0EFLWdpHsXHnQ6JLSw1qhwJMr-VXJ0,644
|
@@ -489,7 +489,7 @@ keras/src/ops/linalg.py,sha256=1Z6my5X0e0uoTYPGJ0I0s2hiKbxYFmdyvoifBcZJEsc,22636
|
|
489
489
|
keras/src/ops/math.py,sha256=4qYMJ5qAPmeSyeF63YWoGbUkQt6f4_VX0enOChU4mXU,37233
|
490
490
|
keras/src/ops/nn.py,sha256=1BC-zmnpsUhqG5lSE4VvV5PsBf81wN0ZGg4kU-R8TJY,95259
|
491
491
|
keras/src/ops/node.py,sha256=aJgn9D-GkteE--Bbt2cZ9JjVxb2W2uS1OWEKoeLsl3Y,5583
|
492
|
-
keras/src/ops/numpy.py,sha256=
|
492
|
+
keras/src/ops/numpy.py,sha256=xA4ozOEzgEzWlS28OnMMG6W0euvaN5lRWSL-fT65R5Y,238034
|
493
493
|
keras/src/ops/operation.py,sha256=dpPI6bQsdBk6j0EUNygoLRHngrMTDoqT2Z55mgq6hbE,15520
|
494
494
|
keras/src/ops/operation_utils.py,sha256=BSarr5DZF5dr-URdXNzawwZlFx6R7VRjh6P2DGwgrT4,14457
|
495
495
|
keras/src/ops/symbolic_arguments.py,sha256=MKwXxZYkyouD9BPmQ1uUNxILdcwPvTayAqXaUV3P3o4,1628
|
@@ -513,11 +513,10 @@ keras/src/optimizers/sgd.py,sha256=_3xanWOI0s2dISxEVT7i_tehsWakQQz2y480Iwkonas,4
|
|
513
513
|
keras/src/optimizers/schedules/__init__.py,sha256=vuUuHNTev8sD2-swsuq7zqyYbmaOhDyiIE6F3dGGSZU,546
|
514
514
|
keras/src/optimizers/schedules/learning_rate_schedule.py,sha256=Sqvd0SRHLMilsBsVXuolElJR6z5tBTphlGJ99Yq8axw,35784
|
515
515
|
keras/src/quantizers/__init__.py,sha256=gxZQYNL-XyUYV1BQgC6V9qVH2MpqI-R1wqhM6o2Sywo,1967
|
516
|
-
keras/src/quantizers/gptq.py,sha256=
|
517
|
-
keras/src/quantizers/gptq_config.py,sha256=
|
518
|
-
keras/src/quantizers/gptq_core.py,sha256=
|
519
|
-
keras/src/quantizers/
|
520
|
-
keras/src/quantizers/quantizers.py,sha256=s-SXe9339RpcpPSIwRS-pi4HBqVpL7qr9bZnpLkDL_s,22413
|
516
|
+
keras/src/quantizers/gptq.py,sha256=PZur5-9UFu8hhH2U8nfdz27awdKEV1NWf4V81OpxWvE,17457
|
517
|
+
keras/src/quantizers/gptq_config.py,sha256=s_3ZCh4R-3E5l64JTuQFC13ZzqhpWFHy-tGZQa1CJxk,6382
|
518
|
+
keras/src/quantizers/gptq_core.py,sha256=o-48-UwH6lbACvWTazuqgYKBYV-_4a148zQaT3dLz1w,14782
|
519
|
+
keras/src/quantizers/quantizers.py,sha256=aljlsok9ISTLgn6QUfK9GJBKLqGshG6BZQTW62NzEus,29520
|
521
520
|
keras/src/random/__init__.py,sha256=BmXVYPzxbhADohoLtAEEzB3cesP7YBFDsp1qc6BWWlg,420
|
522
521
|
keras/src/random/random.py,sha256=bUADZIVDuCghwIWTk0qBxXTxUdiNGWIdsRi8QJ3ePg4,17581
|
523
522
|
keras/src/random/seed_generator.py,sha256=hQTFxKSGCkGdBJHMmJj-cSRfqI3AhHtVxYT0tfOU6Fw,5590
|
@@ -597,7 +596,7 @@ keras/utils/bounding_boxes/__init__.py,sha256=jtvQll4u8ZY0Z96HwNhP1nxWEG9FM3gI-6
|
|
597
596
|
keras/utils/legacy/__init__.py,sha256=oSYZz6uS8UxSElRaaJYWJEoweJ4GAasZjnn7fNaOlog,342
|
598
597
|
keras/visualization/__init__.py,sha256=UKWmiy6sps4SWlmQi9WX8_Z53cPpLlphz2zIeHdwJpQ,722
|
599
598
|
keras/wrappers/__init__.py,sha256=QkS-O5K8qGS7C3sytF8MpmO6PasATpNVGF8qtb7Ojsw,407
|
600
|
-
keras_nightly-3.12.0.
|
601
|
-
keras_nightly-3.12.0.
|
602
|
-
keras_nightly-3.12.0.
|
603
|
-
keras_nightly-3.12.0.
|
599
|
+
keras_nightly-3.12.0.dev2025090503.dist-info/METADATA,sha256=e94GtM-StE3GqZVta2RoPZGBYV6hQeS_ZFSlUJWJRbE,5970
|
600
|
+
keras_nightly-3.12.0.dev2025090503.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
601
|
+
keras_nightly-3.12.0.dev2025090503.dist-info/top_level.txt,sha256=ptcw_-QuGZ4ZDjMdwi_Z0clZm8QAqFdvzzFnDEOTs9o,6
|
602
|
+
keras_nightly-3.12.0.dev2025090503.dist-info/RECORD,,
|
@@ -1,133 +0,0 @@
|
|
1
|
-
from keras.src import ops
|
2
|
-
|
3
|
-
|
4
|
-
def dequantize(input_tensor, scale, zero, maxq):
|
5
|
-
"""The core quantization function."""
|
6
|
-
epsilon = ops.cast(1e-8, dtype=scale.dtype)
|
7
|
-
scale = ops.where(ops.equal(scale, 0), epsilon, scale)
|
8
|
-
|
9
|
-
quantized_tensor = ops.divide(input_tensor, scale)
|
10
|
-
quantized_tensor = ops.round(quantized_tensor)
|
11
|
-
q = ops.add(quantized_tensor, zero)
|
12
|
-
q = ops.clip(q, 0, maxq)
|
13
|
-
|
14
|
-
dequantized_tensor = ops.subtract(q, zero)
|
15
|
-
return ops.multiply(scale, dequantized_tensor)
|
16
|
-
|
17
|
-
|
18
|
-
class GPTQQuantization:
|
19
|
-
"""A class that handles the quantization of weights using GPTQ method.
|
20
|
-
|
21
|
-
This class provides methods to find quantization parameters (scale and zero)
|
22
|
-
for a given tensor and can be used to quantize weights in a GPTQ context.
|
23
|
-
|
24
|
-
Args:
|
25
|
-
weight_bits: (int) The number of bits to quantize to (e.g., 4).
|
26
|
-
per_channel: (bool) A flag indicating whether quantization is
|
27
|
-
applied per-channel (`True`) or per-tensor (`False`).
|
28
|
-
Defaults to `False`.
|
29
|
-
symmetric: (bool) A flag indicating whether symmetric (`True`) or
|
30
|
-
asymmetric (`False`) quantization is used. Defaults to `False`.
|
31
|
-
group_size: (int) The size of weight groups for quantization. A
|
32
|
-
value of -1 indicates that grouping is not used.
|
33
|
-
Defaults to -1.
|
34
|
-
"""
|
35
|
-
|
36
|
-
def __init__(
|
37
|
-
self, weight_bits, per_channel=True, symmetric=False, group_size=-1
|
38
|
-
):
|
39
|
-
self.weight_bits = weight_bits
|
40
|
-
self.maxq = ops.cast(
|
41
|
-
ops.subtract(ops.power(2, weight_bits), 1), "float32"
|
42
|
-
)
|
43
|
-
self.per_channel = per_channel
|
44
|
-
self.symmetric = symmetric
|
45
|
-
self.group_size = group_size
|
46
|
-
|
47
|
-
# These are now determined later by `find_params`
|
48
|
-
self.scale = None
|
49
|
-
self.zero = None
|
50
|
-
|
51
|
-
def find_params(self, input_tensor, weight=False):
|
52
|
-
"""Finds quantization parameters (scale and zero) for a given tensor."""
|
53
|
-
|
54
|
-
if input_tensor is None:
|
55
|
-
raise ValueError("Input tensor 'input_tensor' cannot be None.")
|
56
|
-
|
57
|
-
# For weights, we typically expect at least a 2D tensor.
|
58
|
-
if weight and len(input_tensor.shape) < 2:
|
59
|
-
raise ValueError(
|
60
|
-
f"Input weight tensor 'input_tensor' must have a rank of at "
|
61
|
-
f"least 2, but got rank {len(input_tensor.shape)}."
|
62
|
-
)
|
63
|
-
|
64
|
-
if ops.size(input_tensor) == 0:
|
65
|
-
raise ValueError("Input tensor 'input_tensor' cannot be empty.")
|
66
|
-
|
67
|
-
original_shape = input_tensor.shape
|
68
|
-
|
69
|
-
if self.per_channel:
|
70
|
-
if weight:
|
71
|
-
if self.group_size != -1:
|
72
|
-
input_reshaped = ops.reshape(
|
73
|
-
input_tensor, [-1, self.group_size]
|
74
|
-
)
|
75
|
-
else:
|
76
|
-
input_reshaped = ops.reshape(
|
77
|
-
input_tensor, [original_shape[0], -1]
|
78
|
-
)
|
79
|
-
else: # per-tensor
|
80
|
-
input_reshaped = ops.reshape(input_tensor, [1, -1])
|
81
|
-
|
82
|
-
# Find min/max values
|
83
|
-
min_values = ops.min(input_reshaped, axis=1)
|
84
|
-
max_values = ops.max(input_reshaped, axis=1)
|
85
|
-
|
86
|
-
# Apply symmetric quantization logic if enabled
|
87
|
-
if self.symmetric:
|
88
|
-
max_values = ops.maximum(ops.abs(min_values), max_values)
|
89
|
-
min_values = ops.where(
|
90
|
-
ops.less(min_values, 0), ops.negative(max_values), min_values
|
91
|
-
)
|
92
|
-
|
93
|
-
# Ensure range is not zero to avoid division errors
|
94
|
-
zero_range = ops.equal(min_values, max_values)
|
95
|
-
min_values = ops.where(
|
96
|
-
zero_range, ops.subtract(min_values, 1), min_values
|
97
|
-
)
|
98
|
-
max_values = ops.where(zero_range, ops.add(max_values, 1), max_values)
|
99
|
-
|
100
|
-
# Calculate scale and zero-point
|
101
|
-
self.scale = ops.divide(ops.subtract(max_values, min_values), self.maxq)
|
102
|
-
if self.symmetric:
|
103
|
-
self.zero = ops.full_like(
|
104
|
-
self.scale, ops.divide(ops.add(self.maxq, 1), 2)
|
105
|
-
)
|
106
|
-
else:
|
107
|
-
self.zero = ops.round(
|
108
|
-
ops.divide(ops.negative(min_values), self.scale)
|
109
|
-
)
|
110
|
-
|
111
|
-
# Ensure scale is non-zero
|
112
|
-
self.scale = ops.where(ops.less_equal(self.scale, 0), 1e-8, self.scale)
|
113
|
-
|
114
|
-
if weight:
|
115
|
-
# Per-channel, non-grouped case: simple reshape is correct.
|
116
|
-
if self.per_channel and self.group_size == -1:
|
117
|
-
self.scale = ops.reshape(self.scale, [-1, 1])
|
118
|
-
self.zero = ops.reshape(self.zero, [-1, 1])
|
119
|
-
elif not self.per_channel:
|
120
|
-
num_rows = original_shape[0]
|
121
|
-
self.scale = ops.tile(
|
122
|
-
ops.reshape(self.scale, (1, 1)), (num_rows, 1)
|
123
|
-
)
|
124
|
-
self.zero = ops.tile(
|
125
|
-
ops.reshape(self.zero, (1, 1)), (num_rows, 1)
|
126
|
-
)
|
127
|
-
if self.per_channel:
|
128
|
-
self.scale = ops.reshape(self.scale, [-1, 1])
|
129
|
-
self.zero = ops.reshape(self.zero, [-1, 1])
|
130
|
-
|
131
|
-
def ready(self):
|
132
|
-
"""Checks if the quantization parameters have been computed."""
|
133
|
-
return self.scale is not None and self.zero is not None
|
{keras_nightly-3.12.0.dev2025090303.dist-info → keras_nightly-3.12.0.dev2025090503.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|