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/src/version.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from keras.src.api_export import keras_export
2
2
 
3
3
  # Unique source of truth for the version number.
4
- __version__ = "3.12.0.dev2025090303"
4
+ __version__ = "3.12.0.dev2025090503"
5
5
 
6
6
 
7
7
  @keras_export("keras.version")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: keras-nightly
3
- Version: 3.12.0.dev2025090303
3
+ Version: 3.12.0.dev2025090503
4
4
  Summary: Multi-backend Keras
5
5
  Author-email: Keras team <keras-users@googlegroups.com>
6
6
  License: Apache License 2.0
@@ -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=yQXz8CrRtgdWsn8hAnqlj598WXteZ-z_-TfgDKxV_WA,14731
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=PWk69Pi1Z8KLcK_ByDepAxBHvPfU5DL1vxXuvqkd3cU,9027
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=yQXz8CrRtgdWsn8hAnqlj598WXteZ-z_-TfgDKxV_WA,14731
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=PWk69Pi1Z8KLcK_ByDepAxBHvPfU5DL1vxXuvqkd3cU,9027
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=10rfmpGBb6KJKrifewkNq8aWHatUOvbKV8SoOP3HJUw,204
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=S0FA9ZM0U9zYH_011-89xAoe_UCpMKeSTTskniBNAoE,36907
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=gr2kiDR9bbFFDOkM-q0h1Ke6o2b-GFS33Cw0Cab8cnk,35408
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=XYXmWh7i-3jsPq0Dpzw8bwcspgKUoIzKa1_wa_EX5fg,65713
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=3KqOBtVfMf8qQ9YEqpLSZLbv5oWftvBOjNjVE8j67o0,96100
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=8kQfqtbMwDoi9Ra8I1ykphf2ZY0-RYlMC61MfwDeBU4,55098
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=HE-F8jSY1X-Xkkb-KH3ikI6l96Vzsc7sORWgs69rx5A,36188
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=ovWnm3XHDIzjiwjm_GjM0oVZHCGige7Ek95cX4qCAvk,236694
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=rbRi2qmZsvYG2APg6Sh0TysXSeTop_Ehp9wRqZOW12U,14509
517
- keras/src/quantizers/gptq_config.py,sha256=X6HTcYSE2m0m7s3btRwgWmJ09KkhULtWtabANW7vI9Y,6766
518
- keras/src/quantizers/gptq_core.py,sha256=WrTTnPxMoAXTMS748ROI38FAYo46Djh9-zK3IFKTmLA,13587
519
- keras/src/quantizers/gptq_quant.py,sha256=ZTN7xQCULgczhdKOL-9KGEw9kyA-YmK5JItVPfa8r-w,5129
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.dev2025090303.dist-info/METADATA,sha256=rA14PbRaPmupzN7_lPZAarq7u9P8Zfkv8Ahlyd8YJWg,5970
601
- keras_nightly-3.12.0.dev2025090303.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
602
- keras_nightly-3.12.0.dev2025090303.dist-info/top_level.txt,sha256=ptcw_-QuGZ4ZDjMdwi_Z0clZm8QAqFdvzzFnDEOTs9o,6
603
- keras_nightly-3.12.0.dev2025090303.dist-info/RECORD,,
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