keras-nightly 3.14.0.dev2026011904__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.
- 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 +5 -0
- keras/src/backend/numpy/numpy.py +11 -0
- keras/src/backend/openvino/numpy.py +4 -0
- keras/src/backend/tensorflow/numpy.py +16 -0
- keras/src/backend/torch/numpy.py +14 -0
- keras/src/layers/preprocessing/image_preprocessing/center_crop.py +13 -15
- keras/src/ops/image.py +53 -96
- keras/src/ops/numpy.py +61 -0
- keras/src/saving/orbax_util.py +30 -6
- keras/src/version.py +1 -1
- {keras_nightly-3.14.0.dev2026011904.dist-info → keras_nightly-3.14.0.dev2026012104.dist-info}/METADATA +1 -1
- {keras_nightly-3.14.0.dev2026011904.dist-info → keras_nightly-3.14.0.dev2026012104.dist-info}/RECORD +18 -18
- {keras_nightly-3.14.0.dev2026011904.dist-info → keras_nightly-3.14.0.dev2026012104.dist-info}/WHEEL +0 -0
- {keras_nightly-3.14.0.dev2026011904.dist-info → keras_nightly-3.14.0.dev2026012104.dist-info}/top_level.txt +0 -0
|
@@ -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
|
keras/ops/numpy/__init__.py
CHANGED
|
@@ -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/src/backend/jax/numpy.py
CHANGED
|
@@ -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)
|
keras/src/backend/numpy/numpy.py
CHANGED
|
@@ -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
|
|
keras/src/backend/torch/numpy.py
CHANGED
|
@@ -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 =
|
|
188
|
-
init_width =
|
|
189
|
+
init_height = inputs_shape[-2]
|
|
190
|
+
init_width = inputs_shape[-1]
|
|
189
191
|
else:
|
|
190
|
-
init_height =
|
|
191
|
-
init_width =
|
|
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 =
|
|
205
|
-
w_start =
|
|
200
|
+
h_start = h_diff // 2
|
|
201
|
+
w_start = w_diff // 2
|
|
206
202
|
|
|
207
|
-
if h_diff >= 0 and
|
|
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
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
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
|
-
|
|
606
|
-
|
|
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
|
|
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)
|
keras/src/saving/orbax_util.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
{keras_nightly-3.14.0.dev2026011904.dist-info → keras_nightly-3.14.0.dev2026012104.dist-info}/RECORD
RENAMED
|
@@ -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
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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.
|
|
622
|
-
keras_nightly-3.14.0.
|
|
623
|
-
keras_nightly-3.14.0.
|
|
624
|
-
keras_nightly-3.14.0.
|
|
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,,
|
{keras_nightly-3.14.0.dev2026011904.dist-info → keras_nightly-3.14.0.dev2026012104.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|