keras-nightly 3.14.0.dev2026012004__py3-none-any.whl → 3.14.0.dev2026012104__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.
@@ -245,6 +245,7 @@ from keras.src.ops.numpy import mod as mod
245
245
  from keras.src.ops.numpy import moveaxis as moveaxis
246
246
  from keras.src.ops.numpy import multiply as multiply
247
247
  from keras.src.ops.numpy import nan_to_num as nan_to_num
248
+ from keras.src.ops.numpy import nansum as nansum
248
249
  from keras.src.ops.numpy import ndim as ndim
249
250
  from keras.src.ops.numpy import negative as negative
250
251
  from keras.src.ops.numpy import nextafter as nextafter
@@ -129,6 +129,7 @@ from keras.src.ops.numpy import mod as mod
129
129
  from keras.src.ops.numpy import moveaxis as moveaxis
130
130
  from keras.src.ops.numpy import multiply as multiply
131
131
  from keras.src.ops.numpy import nan_to_num as nan_to_num
132
+ from keras.src.ops.numpy import nansum as nansum
132
133
  from keras.src.ops.numpy import ndim as ndim
133
134
  from keras.src.ops.numpy import negative as negative
134
135
  from keras.src.ops.numpy import nextafter as nextafter
keras/ops/__init__.py CHANGED
@@ -245,6 +245,7 @@ from keras.src.ops.numpy import mod as mod
245
245
  from keras.src.ops.numpy import moveaxis as moveaxis
246
246
  from keras.src.ops.numpy import multiply as multiply
247
247
  from keras.src.ops.numpy import nan_to_num as nan_to_num
248
+ from keras.src.ops.numpy import nansum as nansum
248
249
  from keras.src.ops.numpy import ndim as ndim
249
250
  from keras.src.ops.numpy import negative as negative
250
251
  from keras.src.ops.numpy import nextafter as nextafter
@@ -129,6 +129,7 @@ from keras.src.ops.numpy import mod as mod
129
129
  from keras.src.ops.numpy import moveaxis as moveaxis
130
130
  from keras.src.ops.numpy import multiply as multiply
131
131
  from keras.src.ops.numpy import nan_to_num as nan_to_num
132
+ from keras.src.ops.numpy import nansum as nansum
132
133
  from keras.src.ops.numpy import ndim as ndim
133
134
  from keras.src.ops.numpy import negative as negative
134
135
  from keras.src.ops.numpy import nextafter as nextafter
@@ -1013,6 +1013,11 @@ def moveaxis(x, source, destination):
1013
1013
  return jnp.moveaxis(x, source=source, destination=destination)
1014
1014
 
1015
1015
 
1016
+ def nansum(x, axis=None, keepdims=False):
1017
+ x = convert_to_tensor(x)
1018
+ return jnp.nansum(x, axis=axis, keepdims=keepdims)
1019
+
1020
+
1016
1021
  def nan_to_num(x, nan=0.0, posinf=None, neginf=None):
1017
1022
  x = convert_to_tensor(x)
1018
1023
  return jnp.nan_to_num(x, nan=nan, posinf=posinf, neginf=neginf)
@@ -960,6 +960,17 @@ def moveaxis(x, source, destination):
960
960
  return np.moveaxis(x, source=source, destination=destination)
961
961
 
962
962
 
963
+ def nansum(x, axis=None, keepdims=False):
964
+ axis = standardize_axis_for_numpy(axis)
965
+ dtype = standardize_dtype(x.dtype)
966
+
967
+ if dtype in ("bool", "int8", "int16"):
968
+ dtype = "int32"
969
+ elif dtype in ("uint8", "uint16"):
970
+ dtype = "uint32"
971
+ return np.nansum(x, axis=axis, keepdims=keepdims).astype(dtype)
972
+
973
+
963
974
  def nan_to_num(x, nan=0.0, posinf=None, neginf=None):
964
975
  return np.nan_to_num(x, nan=nan, posinf=posinf, neginf=neginf)
965
976
 
@@ -2056,6 +2056,10 @@ def moveaxis(x, source, destination):
2056
2056
  return OpenVINOKerasTensor(ov_opset.transpose(x, axes_const).output(0))
2057
2057
 
2058
2058
 
2059
+ def nansum(x, axis=None, keepdims=False):
2060
+ raise NotImplementedError("`nansum` is not supported with openvino backend")
2061
+
2062
+
2059
2063
  def nan_to_num(x, nan=0.0, posinf=None, neginf=None):
2060
2064
  x = get_ov_output(x)
2061
2065
  dtype = x.get_element_type()
@@ -2125,6 +2125,22 @@ def moveaxis(x, source, destination):
2125
2125
  return tf.transpose(x, perm)
2126
2126
 
2127
2127
 
2128
+ def nansum(x, axis=None, keepdims=False):
2129
+ x = convert_to_tensor(x)
2130
+ dtype = standardize_dtype(x.dtype)
2131
+ x_clean = tf.where(
2132
+ tf.math.is_nan(cast(x, config.floatx())), tf.zeros((), dtype=dtype), x
2133
+ )
2134
+
2135
+ if dtype in ("bool", "int8", "int16"):
2136
+ dtype = "int32"
2137
+ elif dtype in ("uint8", "uint16"):
2138
+ dtype = "uint32"
2139
+ x_clean = cast(x_clean, dtype)
2140
+
2141
+ return tf.reduce_sum(x_clean, axis=axis, keepdims=keepdims)
2142
+
2143
+
2128
2144
  def nan_to_num(x, nan=0.0, posinf=None, neginf=None):
2129
2145
  x = convert_to_tensor(x)
2130
2146
 
@@ -1272,6 +1272,20 @@ def moveaxis(x, source, destination):
1272
1272
  return torch.moveaxis(x, source=source, destination=destination)
1273
1273
 
1274
1274
 
1275
+ def nansum(x, axis=None, keepdims=False):
1276
+ if isinstance(x, (list, tuple)):
1277
+ x = stack(x)
1278
+ x = convert_to_tensor(x)
1279
+ dtype = standardize_dtype(x.dtype)
1280
+
1281
+ if dtype in ("bool", "uint8", "int8", "int16"):
1282
+ dtype = "int32"
1283
+
1284
+ if axis == () or axis == []:
1285
+ return cast(torch.nan_to_num(x, nan=0), dtype)
1286
+ return cast(torch.nansum(x, dim=axis, keepdim=keepdims), dtype)
1287
+
1288
+
1275
1289
  def nan_to_num(x, nan=0.0, posinf=None, neginf=None):
1276
1290
  x = convert_to_tensor(x)
1277
1291
  return torch.nan_to_num(x, nan=nan, posinf=posinf, neginf=neginf)
@@ -183,28 +183,26 @@ class CenterCrop(BaseImagePreprocessingLayer):
183
183
 
184
184
  def transform_images(self, images, transformation=None, training=True):
185
185
  inputs = self.backend.cast(images, self.compute_dtype)
186
+ inputs_shape = self.backend.shape(inputs)
187
+
186
188
  if self.data_format == "channels_first":
187
- init_height = inputs.shape[-2]
188
- init_width = inputs.shape[-1]
189
+ init_height = inputs_shape[-2]
190
+ init_width = inputs_shape[-1]
189
191
  else:
190
- init_height = inputs.shape[-3]
191
- init_width = inputs.shape[-2]
192
-
193
- if init_height is None or init_width is None:
194
- # Dynamic size case. TODO.
195
- raise ValueError(
196
- "At this time, CenterCrop can only "
197
- "process images with a static spatial "
198
- f"shape. Received: inputs.shape={inputs.shape}"
199
- )
192
+ init_height = inputs_shape[-3]
193
+ init_width = inputs_shape[-2]
200
194
 
195
+ # All these operations work both with ints (static sizes) and scalar
196
+ # tensors (dynamic sizes).
201
197
  h_diff = init_height - self.height
202
198
  w_diff = init_width - self.width
203
199
 
204
- h_start = int(h_diff / 2)
205
- w_start = int(w_diff / 2)
200
+ h_start = h_diff // 2
201
+ w_start = w_diff // 2
206
202
 
207
- if h_diff >= 0 and w_diff >= 0:
203
+ if (not isinstance(h_diff, int) or h_diff >= 0) and (
204
+ not isinstance(w_diff, int) or w_diff >= 0
205
+ ):
208
206
  if len(inputs.shape) == 4:
209
207
  if self.data_format == "channels_first":
210
208
  return inputs[
keras/src/ops/image.py CHANGED
@@ -565,6 +565,7 @@ class ExtractPatches(Operation):
565
565
  if isinstance(size, int):
566
566
  size = (size, size)
567
567
  self.size = size
568
+ self.is_3d = len(self.size) == 3
568
569
  if strides is None:
569
570
  strides = size
570
571
  self.strides = strides
@@ -588,11 +589,21 @@ class ExtractPatches(Operation):
588
589
  if self.data_format == "channels_last":
589
590
  channels_in = images_shape[-1]
590
591
  else:
591
- channels_in = images_shape[-3]
592
- if original_ndim == 3:
593
- images_shape = [1] + images_shape
594
- filters = self.size[0] * self.size[1] * channels_in
595
- kernel_size = (self.size[0], self.size[1])
592
+ channels_in = images_shape[-4] if self.is_3d else images_shape[-3]
593
+
594
+ if self.is_3d:
595
+ # 3D patch extraction
596
+ if original_ndim == 4:
597
+ images_shape = [1] + images_shape
598
+ filters = self.size[0] * self.size[1] * self.size[2] * channels_in
599
+ kernel_size = (self.size[0], self.size[1], self.size[2])
600
+ else:
601
+ # 2D patch extraction
602
+ if original_ndim == 3:
603
+ images_shape = [1] + images_shape
604
+ filters = self.size[0] * self.size[1] * channels_in
605
+ kernel_size = (self.size[0], self.size[1])
606
+
596
607
  out_shape = compute_conv_output_shape(
597
608
  images_shape,
598
609
  filters,
@@ -602,10 +613,24 @@ class ExtractPatches(Operation):
602
613
  data_format=self.data_format,
603
614
  dilation_rate=self.dilation_rate,
604
615
  )
605
- if original_ndim == 3:
606
- out_shape = out_shape[1:]
616
+
617
+ if self.is_3d:
618
+ if original_ndim == 4:
619
+ out_shape = out_shape[1:]
620
+ else:
621
+ if original_ndim == 3:
622
+ out_shape = out_shape[1:]
607
623
  return KerasTensor(shape=out_shape, dtype=images.dtype)
608
624
 
625
+ def get_config(self):
626
+ return {
627
+ "size": self.size,
628
+ "strides": self.strides,
629
+ "dilation_rate": self.dilation_rate,
630
+ "padding": self.padding,
631
+ "data_format": self.data_format,
632
+ }
633
+
609
634
 
610
635
  @keras_export("keras.ops.image.extract_patches")
611
636
  def extract_patches(
@@ -687,26 +712,6 @@ def extract_patches(
687
712
  f"Received: size={size} with length {len(size)}"
688
713
  )
689
714
 
690
- # Determine 2D vs 3D based on size argument
691
- if not isinstance(size, int) and len(size) == 3:
692
- # 3D patch extraction
693
- if any_symbolic_tensors((images,)):
694
- return ExtractPatches3D(
695
- size=size,
696
- strides=strides,
697
- dilation_rate=dilation_rate,
698
- padding=padding,
699
- data_format=data_format,
700
- ).symbolic_call(images)
701
- return _extract_patches_3d(
702
- images,
703
- size,
704
- strides,
705
- dilation_rate,
706
- padding,
707
- data_format=data_format,
708
- )
709
-
710
715
  # 2D patch extraction (default)
711
716
  if any_symbolic_tensors((images,)):
712
717
  return ExtractPatches(
@@ -729,6 +734,23 @@ def _extract_patches(
729
734
  dilation_rate=1,
730
735
  padding="valid",
731
736
  data_format=None,
737
+ ):
738
+ if not isinstance(size, int) and len(size) == 3:
739
+ return _extract_patches_3d(
740
+ images, size, strides, dilation_rate, padding, data_format
741
+ )
742
+ return _extract_patches_2d(
743
+ images, size, strides, dilation_rate, padding, data_format
744
+ )
745
+
746
+
747
+ def _extract_patches_2d(
748
+ images,
749
+ size,
750
+ strides=None,
751
+ dilation_rate=1,
752
+ padding="valid",
753
+ data_format=None,
732
754
  ):
733
755
  if isinstance(size, int):
734
756
  patch_h = patch_w = size
@@ -768,74 +790,6 @@ def _extract_patches(
768
790
  return patches
769
791
 
770
792
 
771
- class ExtractPatches3D(Operation):
772
- def __init__(
773
- self,
774
- size,
775
- strides=None,
776
- dilation_rate=1,
777
- padding="valid",
778
- data_format=None,
779
- *,
780
- name=None,
781
- ):
782
- super().__init__(name=name)
783
- if isinstance(size, int):
784
- size = (size, size, size)
785
- elif len(size) != 3:
786
- raise TypeError(
787
- "Invalid `size` argument. Expected an "
788
- f"int or a tuple of length 3. Received: size={size}"
789
- )
790
- self.size = size
791
- if strides is not None:
792
- if isinstance(strides, int):
793
- strides = (strides, strides, strides)
794
- elif len(strides) != 3:
795
- raise ValueError(f"Invalid `strides` argument. Got: {strides}")
796
- else:
797
- strides = size
798
- self.strides = strides
799
- self.dilation_rate = dilation_rate
800
- self.padding = padding
801
- self.data_format = backend.standardize_data_format(data_format)
802
-
803
- def call(self, volumes):
804
- return _extract_patches_3d(
805
- volumes,
806
- self.size,
807
- self.strides,
808
- self.dilation_rate,
809
- self.padding,
810
- self.data_format,
811
- )
812
-
813
- def compute_output_spec(self, volumes):
814
- volumes_shape = list(volumes.shape)
815
- original_ndim = len(volumes_shape)
816
- strides = self.strides
817
- if self.data_format == "channels_last":
818
- channels_in = volumes_shape[-1]
819
- else:
820
- channels_in = volumes_shape[-4]
821
- if original_ndim == 4:
822
- volumes_shape = [1] + volumes_shape
823
- filters = self.size[0] * self.size[1] * self.size[2] * channels_in
824
- kernel_size = (self.size[0], self.size[1], self.size[2])
825
- out_shape = compute_conv_output_shape(
826
- volumes_shape,
827
- filters,
828
- kernel_size,
829
- strides=strides,
830
- padding=self.padding,
831
- data_format=self.data_format,
832
- dilation_rate=self.dilation_rate,
833
- )
834
- if original_ndim == 4:
835
- out_shape = out_shape[1:]
836
- return KerasTensor(shape=out_shape, dtype=volumes.dtype)
837
-
838
-
839
793
  def _extract_patches_3d(
840
794
  volumes,
841
795
  size,
@@ -935,8 +889,11 @@ def extract_patches_3d(
935
889
  >>> patches.shape
936
890
  (3, 3, 3, 81)
937
891
  """
892
+ # Convert int to 3-tuple for 3D
893
+ if isinstance(size, int):
894
+ size = (size, size, size)
938
895
  if any_symbolic_tensors((volumes,)):
939
- return ExtractPatches3D(
896
+ return ExtractPatches(
940
897
  size=size,
941
898
  strides=strides,
942
899
  dilation_rate=dilation_rate,
keras/src/ops/numpy.py CHANGED
@@ -5064,6 +5064,67 @@ def moveaxis(x, source, destination):
5064
5064
  return backend.numpy.moveaxis(x, source=source, destination=destination)
5065
5065
 
5066
5066
 
5067
+ class Nansum(Operation):
5068
+ def __init__(self, axis=None, keepdims=False, *, name=None):
5069
+ super().__init__(name=name)
5070
+ self.axis = axis
5071
+ self.keepdims = keepdims
5072
+
5073
+ def call(self, x):
5074
+ return backend.numpy.nansum(x, axis=self.axis, keepdims=self.keepdims)
5075
+
5076
+ def compute_output_spec(self, x):
5077
+ dtype = dtypes.result_type(getattr(x, "dtype", backend.floatx()))
5078
+
5079
+ if dtype in ("bool", "int8", "int16"):
5080
+ dtype = "int32"
5081
+ elif dtype in ("uint8", "uint16"):
5082
+ dtype = "uint32"
5083
+
5084
+ if backend.backend() == "torch" and dtype == "uint32":
5085
+ dtype = "int32"
5086
+ sparse = getattr(x, "sparse", False)
5087
+ return KerasTensor(
5088
+ reduce_shape(x.shape, axis=self.axis, keepdims=self.keepdims),
5089
+ dtype=dtype,
5090
+ sparse=sparse,
5091
+ )
5092
+
5093
+
5094
+ @keras_export(["keras.ops.nansum", "keras.ops.numpy.nansum"])
5095
+ def nansum(x, axis=None, keepdims=False):
5096
+ """Sum of a tensor over the given axes, ignoring NaNs.
5097
+
5098
+ Args:
5099
+ x: Input tensor.
5100
+ axis: Axis or axes along which the sum is computed. The default is to
5101
+ compute the sum of the flattened tensor.
5102
+ keepdims: If this is set to `True`, the axes which are reduced are left
5103
+ in the result as dimensions with size one.
5104
+
5105
+ Returns:
5106
+ Output tensor containing the sum, with NaN values ignored.
5107
+
5108
+ Examples:
5109
+ >>> import numpy as np
5110
+ >>> from keras import ops
5111
+ >>> x = np.array([[1.0, np.nan, 3.0],
5112
+ ... [np.nan, 2.0, 1.0]])
5113
+ >>> ops.nansum(x)
5114
+ 7.0
5115
+
5116
+ >>> ops.nansum(x, axis=1)
5117
+ array([4., 3.])
5118
+
5119
+ >>> ops.nansum(x, axis=1, keepdims=True)
5120
+ array([[4.],
5121
+ [3.]])
5122
+ """
5123
+ if any_symbolic_tensors((x,)):
5124
+ return Nansum(axis=axis, keepdims=keepdims).symbolic_call(x)
5125
+ return backend.numpy.nansum(x, axis=axis, keepdims=keepdims)
5126
+
5127
+
5067
5128
  class NanToNum(Operation):
5068
5129
  def __init__(self, nan=0.0, posinf=None, neginf=None, *, name=None):
5069
5130
  super().__init__(name=name)
@@ -6,15 +6,39 @@ from keras.src.utils.module_utils import ocp
6
6
 
7
7
 
8
8
  def is_orbax_checkpoint(filepath):
9
- """Check if the given path is an Orbax checkpoint directory."""
10
- if not os.path.exists(filepath):
9
+ """Check if the given path is an Orbax checkpoint directory.
10
+
11
+ This function implements custom detection logic instead of relying on
12
+ Orbax APIs which may be unreliable in some environments.
13
+ """
14
+ if not os.path.exists(filepath) or not os.path.isdir(filepath):
11
15
  return False
12
16
 
13
17
  try:
14
- return ocp.is_orbax_checkpoint(filepath)
15
- except (ImportError, AttributeError):
16
- # Fallback to check for orbax.checkpoint file if Orbax API not available
17
- return os.path.isfile(os.path.join(filepath, "orbax.checkpoint"))
18
+ # List directory contents
19
+ contents = os.listdir(filepath)
20
+
21
+ # A set is more efficient for membership testing
22
+ orbax_indicators = {
23
+ "orbax.checkpoint",
24
+ "pytree.orbax-checkpoint",
25
+ "checkpoint_metadata",
26
+ }
27
+
28
+ # Fast check for standard files
29
+ if not orbax_indicators.isdisjoint(contents):
30
+ return True
31
+
32
+ # Check for step directories or temporary files in a single pass
33
+ return any(
34
+ ".orbax-checkpoint-tmp" in item
35
+ or (item.isdigit() and os.path.isdir(os.path.join(filepath, item)))
36
+ for item in contents
37
+ )
38
+
39
+ except (OSError, PermissionError):
40
+ # If we can't read the directory, assume it's not a checkpoint
41
+ return False
18
42
 
19
43
 
20
44
  def find_latest_orbax_checkpoint(checkpoint_dir):
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.14.0.dev2026012004"
4
+ __version__ = "3.14.0.dev2026012104"
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.14.0.dev2026012004
3
+ Version: 3.14.0.dev2026012104
4
4
  Summary: Multi-backend Keras
5
5
  Author-email: Keras team <keras-users@googlegroups.com>
6
6
  License: Apache License 2.0
@@ -45,11 +45,11 @@ keras/_tf_keras/keras/losses/__init__.py,sha256=xBc_KOtSLwp3h3CKQ0EnCuIy-Bsak2SP
45
45
  keras/_tf_keras/keras/metrics/__init__.py,sha256=_wF31PTvua5ahF9JEW4Hx1UVNjVCLqVI8J5JNrZCBf8,6546
46
46
  keras/_tf_keras/keras/mixed_precision/__init__.py,sha256=AM51CzHqzcY75tqdpQiuVcTRUEpUzBqeb-EfLeSDSV8,727
47
47
  keras/_tf_keras/keras/models/__init__.py,sha256=83pyA0pzytqin8JLV6FEbPreCb-V64ToebxFGrHsVdQ,501
48
- keras/_tf_keras/keras/ops/__init__.py,sha256=-ywp71gN-DpkhtlIzzXpK0CG0CDIYW7L3TRnI1Tondo,15569
48
+ keras/_tf_keras/keras/ops/__init__.py,sha256=b95A91bWrAp3S61ui69zIwEJUMsFYVi90E5TfIX7MpE,15618
49
49
  keras/_tf_keras/keras/ops/image/__init__.py,sha256=oM_PLh5Jk9OGfi1bbJcfWkjoq0Ye5JQG9a7v_KzDfoc,1034
50
50
  keras/_tf_keras/keras/ops/linalg/__init__.py,sha256=0ab6icK3yuIm4khSfAksGRFLEAJhaOu6gGgarau4iEQ,822
51
51
  keras/_tf_keras/keras/ops/nn/__init__.py,sha256=2eD8IlkfBrsmJjHpzsxMM3_058oGeZVgohdBd27iDnI,2992
52
- keras/_tf_keras/keras/ops/numpy/__init__.py,sha256=mIZ_5ZA-QOALvz9jkMwOTDw8iu2NxCGqwmZyJPA3vy4,9631
52
+ keras/_tf_keras/keras/ops/numpy/__init__.py,sha256=jiEp6-gAl22y9Qzz1HS4T3VzDBlw4VViiXti65xkeAM,9680
53
53
  keras/_tf_keras/keras/optimizers/__init__.py,sha256=1fx0vEB-oGu-9dumxoIvX4qVHdgJvf74OLyYoBkE2y0,1267
54
54
  keras/_tf_keras/keras/optimizers/legacy/__init__.py,sha256=uIMQESCV80Q0FY-9ikQUjXYPyZqmTfAM3dfohQ5DzYs,516
55
55
  keras/_tf_keras/keras/optimizers/schedules/__init__.py,sha256=pQF3rQiAPuUSTUdflTr-fpL77oyGIv9xzGdjae3M3kw,1120
@@ -111,11 +111,11 @@ keras/losses/__init__.py,sha256=VIXBHQFNdLUPZ7JuwtIKj_4E-xf2yvNyrmdklvjr_xM,3667
111
111
  keras/metrics/__init__.py,sha256=qeEwtqpSCAaCr8BMUv1eVaqJl2Zb83OB5K0BG3JB0nI,6245
112
112
  keras/mixed_precision/__init__.py,sha256=AM51CzHqzcY75tqdpQiuVcTRUEpUzBqeb-EfLeSDSV8,727
113
113
  keras/models/__init__.py,sha256=83pyA0pzytqin8JLV6FEbPreCb-V64ToebxFGrHsVdQ,501
114
- keras/ops/__init__.py,sha256=-ywp71gN-DpkhtlIzzXpK0CG0CDIYW7L3TRnI1Tondo,15569
114
+ keras/ops/__init__.py,sha256=b95A91bWrAp3S61ui69zIwEJUMsFYVi90E5TfIX7MpE,15618
115
115
  keras/ops/image/__init__.py,sha256=oM_PLh5Jk9OGfi1bbJcfWkjoq0Ye5JQG9a7v_KzDfoc,1034
116
116
  keras/ops/linalg/__init__.py,sha256=0ab6icK3yuIm4khSfAksGRFLEAJhaOu6gGgarau4iEQ,822
117
117
  keras/ops/nn/__init__.py,sha256=2eD8IlkfBrsmJjHpzsxMM3_058oGeZVgohdBd27iDnI,2992
118
- keras/ops/numpy/__init__.py,sha256=mIZ_5ZA-QOALvz9jkMwOTDw8iu2NxCGqwmZyJPA3vy4,9631
118
+ keras/ops/numpy/__init__.py,sha256=jiEp6-gAl22y9Qzz1HS4T3VzDBlw4VViiXti65xkeAM,9680
119
119
  keras/optimizers/__init__.py,sha256=1fx0vEB-oGu-9dumxoIvX4qVHdgJvf74OLyYoBkE2y0,1267
120
120
  keras/optimizers/legacy/__init__.py,sha256=uIMQESCV80Q0FY-9ikQUjXYPyZqmTfAM3dfohQ5DzYs,516
121
121
  keras/optimizers/schedules/__init__.py,sha256=pQF3rQiAPuUSTUdflTr-fpL77oyGIv9xzGdjae3M3kw,1120
@@ -128,7 +128,7 @@ keras/regularizers/__init__.py,sha256=542Shphw7W8h4Dyf2rmqMKUECVZ8IVBvN9g1LWhz-b
128
128
  keras/saving/__init__.py,sha256=KvL2GZxjvgFgEhvEnkvqjIR9JSNHKz-NWZacXajsjLI,1298
129
129
  keras/src/__init__.py,sha256=Gi4S7EiCMkE03PbdGNpFdaUYySWDs_FcAJ8Taz9Y1BE,684
130
130
  keras/src/api_export.py,sha256=gXOkBOnmscV013WAc75lc4Up01-Kkg9EylIAT_QWctg,1173
131
- keras/src/version.py,sha256=9LZy9WW3ZU2GUsZI4b8ZLDM_EODbfD60ReUUWuXtC2s,204
131
+ keras/src/version.py,sha256=j3Ml6phnds_K6jMOGglQnTbKSNPTKDHjsbdTSMqC_v8,204
132
132
  keras/src/activations/__init__.py,sha256=0nL3IFDB9unlrMz8ninKOWo-uCHasTUpTo1tXZb2u44,4433
133
133
  keras/src/activations/activations.py,sha256=mogPggtp4CGldI3VOPNmesRxp6EbiR1_i4KLGaVwzL8,17614
134
134
  keras/src/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -171,7 +171,7 @@ keras/src/backend/jax/layer.py,sha256=o6CicT06udwamTRQIjNSDLZLyYHFzBXNbxewXgWe0i
171
171
  keras/src/backend/jax/linalg.py,sha256=LDaLZYz49ChE2kJR3YpaM9xuwusvd3krV7nNAAazTWA,2642
172
172
  keras/src/backend/jax/math.py,sha256=1IEDpdoF8e5ltu3D4wbDQuihzvJHhMXz8W9Z_E-eJqU,9391
173
173
  keras/src/backend/jax/nn.py,sha256=mrRawNvf9EWe8rdTwK_Auz6xdLkVG6hH0nIAP7hyUDE,60271
174
- keras/src/backend/jax/numpy.py,sha256=_WCCYgFddNSs_1vd_65hxHgomKR3NHOsmbvTsfcddzc,38741
174
+ keras/src/backend/jax/numpy.py,sha256=5C-obBCsAdY288BhjtxDIccqXDDle5eaP2yt7jfeUy8,38869
175
175
  keras/src/backend/jax/optimizer.py,sha256=5DeXQHcYmUI6F9i1m1VHn3sBt4LEStOeBXnKdESevLM,4134
176
176
  keras/src/backend/jax/random.py,sha256=Uk2huGIk_dlzMrx5eDVrrr2TeCEMitn2vr4yzA0NXjs,3594
177
177
  keras/src/backend/jax/rnn.py,sha256=Ycq0qfLY4M4jhltvztpLQyywjEM17T7CZQFh4hhHOUE,7767
@@ -186,7 +186,7 @@ keras/src/backend/numpy/layer.py,sha256=dTk7W7ql7vRgll7JbOXK5PlIhQw5VHdpSjKciHd8
186
186
  keras/src/backend/numpy/linalg.py,sha256=uzLTxEyuX_gDcnoA5Q59GdTg33py0WooKK5T6T9Td6c,2543
187
187
  keras/src/backend/numpy/math.py,sha256=HdkEA5ro7dtQBTP78GFIgqTFLgNQ49PXHhqI1vLRGfo,10169
188
188
  keras/src/backend/numpy/nn.py,sha256=P9JAnTlwSTI7bVv8WIv1pDQJHpjML_WJ0RsJWy-LJMc,46200
189
- keras/src/backend/numpy/numpy.py,sha256=Qu6Ia_EasEVt4UDOmvi6mx9HmFO2eva_E8NxSMnzr5E,37743
189
+ keras/src/backend/numpy/numpy.py,sha256=W2P2A1_Y54xR07xmR-T4ALrqJA_SliDwmoOALeI37P0,38070
190
190
  keras/src/backend/numpy/random.py,sha256=wx2nE75q7L2cBMjtQlQx8yKMj4Ie3puFMDQsbrZO8SA,3961
191
191
  keras/src/backend/numpy/rnn.py,sha256=thOsMung1qR3lQsR4_D6hqKMFollQgrB0KwsJLk4BMY,7867
192
192
  keras/src/backend/numpy/trainer.py,sha256=MzWr8_LLHa1P6fxdUWirGw_lQwHGF_vkZ7RUGLUzjUs,11126
@@ -198,7 +198,7 @@ keras/src/backend/openvino/layer.py,sha256=5RdvaH1yOyPAphjKiuQAK1H_yZFYKE1Hp7c5b
198
198
  keras/src/backend/openvino/linalg.py,sha256=L6a4MFGND2wWzPVCh44cwuOgkcC4wJTo8Xy3HwW04lg,1614
199
199
  keras/src/backend/openvino/math.py,sha256=qw9kX2sJ2qr0dBJF12Ey0E2GcwixPUqoev6UcNra4NI,3944
200
200
  keras/src/backend/openvino/nn.py,sha256=zULPxdwVO7JDZUUtsuoEEPCLQ09ew8z8T6G_i_NEqrM,23741
201
- keras/src/backend/openvino/numpy.py,sha256=sSPcjNoUxP9qsIEOf3m37I8rqV0MrGPtPEijeQpp0yk,105535
201
+ keras/src/backend/openvino/numpy.py,sha256=nZnbUk_nNaSqKaShEUwyu7Z7buGvFNxEfiNCePuYBiM,105660
202
202
  keras/src/backend/openvino/random.py,sha256=4hRUtIP6qJxO3Qy9uH1x6jSuJna3nWPdUf4x2QU8-ew,5575
203
203
  keras/src/backend/openvino/rnn.py,sha256=ErmuZLPSgG9qU-NfYPPvBZ6Ysy8k-fA4g19Vhqq7OVQ,866
204
204
  keras/src/backend/openvino/trainer.py,sha256=bMmtSALqydqdS6ke-5sYW5fgxZDshDH810p_C0xCRTg,9087
@@ -211,7 +211,7 @@ keras/src/backend/tensorflow/layer.py,sha256=69d40LwL4HhKRsCjj1VRpjfrQXXF8VV3vh0
211
211
  keras/src/backend/tensorflow/linalg.py,sha256=_lZVfdY1tFvrN7xwbt3INGoTR0yC5v-kI1Q0XppVibY,8773
212
212
  keras/src/backend/tensorflow/math.py,sha256=zTu_7Ff6B2Ro862z_xH0OCmIWbV74DjsO5UnfjYuOUQ,12370
213
213
  keras/src/backend/tensorflow/nn.py,sha256=6vtZHzUED6_blUPE1Tnc3GAxPpJ2ebxoaiMn80tTL9k,51328
214
- keras/src/backend/tensorflow/numpy.py,sha256=nIpMvr-g81I9KF74RD4AbU4e4t-0eFa9MND2Fh1u8Tk,104623
214
+ keras/src/backend/tensorflow/numpy.py,sha256=I5S0igFo2Mq3Q0SodRyNggip9F_gwWfch6TyvVbQj_E,105076
215
215
  keras/src/backend/tensorflow/optimizer.py,sha256=kFlyEOnGjEYdLpd8mpwhUeku78__xBfZbbrDWpJrq60,9307
216
216
  keras/src/backend/tensorflow/random.py,sha256=iO8V_soaDXZm9ewyAVbjudhsMj08C348c9Bz64nxXC4,6475
217
217
  keras/src/backend/tensorflow/rnn.py,sha256=JbOSpt48cm612c7YwiTYOQCQsNXyI_6QeRhtUn8qEvM,34829
@@ -227,7 +227,7 @@ keras/src/backend/torch/layer.py,sha256=htECdpv9ioHWM8_zqQkEdxgDsgLu8XJi5yXgnLl-
227
227
  keras/src/backend/torch/linalg.py,sha256=wgPCfnscp5HOBmX9_-m-57lzxs1ttLNzmHqj2VYYq7k,2108
228
228
  keras/src/backend/torch/math.py,sha256=g-ElDii2Y_o1-t6BAu2nbS7JH-aPqVS5Fqds8aYzIlg,14324
229
229
  keras/src/backend/torch/nn.py,sha256=zmEzXEuwD7fVRDm145zsxzUDmqNmRgZS4LmeIx4Nbus,37498
230
- keras/src/backend/torch/numpy.py,sha256=gvHviedkAoEaTax89wDqUrjbUSX1ndjxicHy-PLv2Nc,57668
230
+ keras/src/backend/torch/numpy.py,sha256=zZDkUDmph1c_D0VOsSzkYjAj4TKln7laDxypVRBsZ6o,58072
231
231
  keras/src/backend/torch/random.py,sha256=YhLfC7qkGpzlU_i6gGPVormo3BMSo7OUA3TC3GCehrA,8292
232
232
  keras/src/backend/torch/rnn.py,sha256=MJIVbHKsUA2dZm4Gu2NvRxlrFCWeWSxSZRmFxSsC3Zg,26041
233
233
  keras/src/backend/torch/trainer.py,sha256=dcikz1c5O0FHNzRKSi6WhIHsHfLV2HDlrXPElSd1cgE,17985
@@ -392,7 +392,7 @@ keras/src/layers/preprocessing/image_preprocessing/__init__.py,sha256=47DEQpj8HB
392
392
  keras/src/layers/preprocessing/image_preprocessing/aug_mix.py,sha256=spvWYUG6GcPrYZgedaE8LIwTbYE2yvPg2Hwao9UAang,11221
393
393
  keras/src/layers/preprocessing/image_preprocessing/auto_contrast.py,sha256=gY7hmXXVTO15dswR8ISf9h_gox4zDSDih2owjzb7WmE,3930
394
394
  keras/src/layers/preprocessing/image_preprocessing/base_image_preprocessing_layer.py,sha256=Ga1Wewc0Pl9uLGUp3x6dxS2j4Lh-1o7TaOtxxo9kf5o,13853
395
- keras/src/layers/preprocessing/image_preprocessing/center_crop.py,sha256=4v8SeerBR5GMmoFpVA0mI_LPQ-GkcI-7a0JFWAMe5VY,10033
395
+ keras/src/layers/preprocessing/image_preprocessing/center_crop.py,sha256=Pi9GlYTo7kZbfZpfF1FUwkwi0y9v8PcQYQAurixHaeU,9965
396
396
  keras/src/layers/preprocessing/image_preprocessing/cut_mix.py,sha256=reDSKzm15J7TR5TLrx92mWE-os2H6X0jY2Pd_ra_i_E,7877
397
397
  keras/src/layers/preprocessing/image_preprocessing/equalization.py,sha256=Q6URzVSxTxcd166oNFJsVlNO3x8EUMS0plqthDwKzu4,8659
398
398
  keras/src/layers/preprocessing/image_preprocessing/max_num_bounding_box.py,sha256=BTQaWjx-bMnwtsQDQLmeohs_VQECu1WZzPmi2PkDYHs,3435
@@ -499,12 +499,12 @@ keras/src/ops/__init__.py,sha256=aORlvnrqY_eQl0EFLWdpHsXHnQ6JLSw1qhwJMr-VXJ0,644
499
499
  keras/src/ops/core.py,sha256=t06-MvptYb6ZVwmNj083JyUtzU4M6UTVXOT2vVHtKyU,42781
500
500
  keras/src/ops/einops.py,sha256=-pxW0_AzDQNsR7t2TJrzvYXBJpmLYA3fJoO0U_U96PY,6268
501
501
  keras/src/ops/function.py,sha256=QV9n1-xeTPDK_FJ3sjlHDWVH2sqDj96R6YQnJueMOlA,17821
502
- keras/src/ops/image.py,sha256=-UBomIodLByXhxN9aSt0JUGn-N5yulXgRZ06XpXq8mM,68743
502
+ keras/src/ops/image.py,sha256=Drfouun3Gaod0LNgG5nxrKkgIJ4STjWQWvzbTIjKOxs,67251
503
503
  keras/src/ops/linalg.py,sha256=3V8S_cgNxZZCIFcFj-FBHTdRqWNbimDtumMvfoc0f30,26736
504
504
  keras/src/ops/math.py,sha256=4qYMJ5qAPmeSyeF63YWoGbUkQt6f4_VX0enOChU4mXU,37233
505
505
  keras/src/ops/nn.py,sha256=04gjHB2BWusy4tWm59EO5Ns1paJC5umDNGwNCKzaJWQ,104658
506
506
  keras/src/ops/node.py,sha256=aJgn9D-GkteE--Bbt2cZ9JjVxb2W2uS1OWEKoeLsl3Y,5583
507
- keras/src/ops/numpy.py,sha256=6oaYtC0HDCPAKjn3lG4Yd9SjYKL8nRySC0IA9aXsKbg,257233
507
+ keras/src/ops/numpy.py,sha256=c5jXbWiE5jrGh1AteL3XsSgs1wNrpNUKxmTdThpNh-0,259129
508
508
  keras/src/ops/operation.py,sha256=A7sh9Hi6kZb7wkeMmhrDQIq770ofANXuP-Qg-kwCM3o,15485
509
509
  keras/src/ops/operation_utils.py,sha256=C6eThl-haKzlDH0fC1rn5-P1P-pCfIfXs-fy-ADR534,14523
510
510
  keras/src/ops/symbolic_arguments.py,sha256=MKwXxZYkyouD9BPmQ1uUNxILdcwPvTayAqXaUV3P3o4,1628
@@ -546,7 +546,7 @@ keras/src/saving/__init__.py,sha256=vnrtfvnzW7Gwtxe5COhaMoEnVYB5iDe2YlqJ-DvqFIk,
546
546
  keras/src/saving/file_editor.py,sha256=tsUo9mQbMa8433tHTnOKWFhDeathYwDb0CeWcDTTTBQ,32089
547
547
  keras/src/saving/keras_saveable.py,sha256=aGIt1ajtsaamfUq18LM6ql8JEoQzi3HwzJEuwQ9bmKE,1285
548
548
  keras/src/saving/object_registration.py,sha256=OOO-7-SNfPoFkFsR_c5jzE6aSIDIlHlnMcm9IlI_Gbs,7357
549
- keras/src/saving/orbax_util.py,sha256=0o05YKFjiePHgeW_d5fvuUAGzymqbJTeuquUR-7uVGE,906
549
+ keras/src/saving/orbax_util.py,sha256=ArJI9hQODUyyvzCiXt8AS3VH6E4SL0vF02-RHBk30gU,1621
550
550
  keras/src/saving/saving_api.py,sha256=PMkxXhtNNKX8GlwIsCP8-Plt19M012wNEk7i8BhxWzo,12670
551
551
  keras/src/saving/saving_lib.py,sha256=-uSXsojqzSl19FtW5FogCclvnu_nnVU3S-Si293DNq0,58723
552
552
  keras/src/saving/serialization_lib.py,sha256=yzCTm8hin__MGA2N5M5F-8Zbts5ZJVmINbrH4wEtIwI,30334
@@ -618,7 +618,7 @@ keras/utils/bounding_boxes/__init__.py,sha256=jtvQll4u8ZY0Z96HwNhP1nxWEG9FM3gI-6
618
618
  keras/utils/legacy/__init__.py,sha256=oSYZz6uS8UxSElRaaJYWJEoweJ4GAasZjnn7fNaOlog,342
619
619
  keras/visualization/__init__.py,sha256=UKWmiy6sps4SWlmQi9WX8_Z53cPpLlphz2zIeHdwJpQ,722
620
620
  keras/wrappers/__init__.py,sha256=QkS-O5K8qGS7C3sytF8MpmO6PasATpNVGF8qtb7Ojsw,407
621
- keras_nightly-3.14.0.dev2026012004.dist-info/METADATA,sha256=xBiVNAhlJ7BwQFGxrlFQVW5YAHVpTVEGfTXxPBoLBUc,6339
622
- keras_nightly-3.14.0.dev2026012004.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
623
- keras_nightly-3.14.0.dev2026012004.dist-info/top_level.txt,sha256=ptcw_-QuGZ4ZDjMdwi_Z0clZm8QAqFdvzzFnDEOTs9o,6
624
- keras_nightly-3.14.0.dev2026012004.dist-info/RECORD,,
621
+ keras_nightly-3.14.0.dev2026012104.dist-info/METADATA,sha256=X7LrSSzvSkKfxvLyQxMDiMc62ql2aJbcD2AE3hH-ogc,6339
622
+ keras_nightly-3.14.0.dev2026012104.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
623
+ keras_nightly-3.14.0.dev2026012104.dist-info/top_level.txt,sha256=ptcw_-QuGZ4ZDjMdwi_Z0clZm8QAqFdvzzFnDEOTs9o,6
624
+ keras_nightly-3.14.0.dev2026012104.dist-info/RECORD,,