## keras-team/keras — v3.14.1…v3.15.0

_265+ commits._

### Features
- **Add erfinv tests and TensorFlow CPU fallback for half precision (#23086)** (9d1bbf9)
- **Support native Grouped-Query Attention (GQA) Key/Value head broadcast. (#23081)** (915ec7e)
- **Add JAX multi-process distribution tests (#23105)** (49d668d)
- **Refactor rematerialization logic into Operation and support more modes (#23107)** (b49fde7)
- **Add to the list of APIs that should not be part of a reloaded model. (#23115)** (e0bfa2d)
- **Add foundational distribution metadata (num_processes, num_model_replicas, data_shard_id) (#23025)** (4725b68)
- **Add keras.config.enable_jit_cache for JAX persistent compilation cache (#22911)** (acdd20a)
- **Add fmin function for element-wise minimum, handling NaNs across backends (#23035)** (d7f8c58)
- **Add fmax function for element-wise maximum, handling NaNs across backends (#23024)** (9f2f1f4)
- **feat: add CITATION.cff file for GitHub repository citation (#23005)** (d268895)
- **Add more best practices to Gemini review style guide (#22961)** (e88ab8c)
- **feat: Add dsplit function across multiple backends (#22964)** (60b1478)
- **Implement fabs function across multiple backends and add tests (#22904)** (c94125e)
- **Add fused bidirectional GRU for torch and harden gru() dispatch (#22913)** (911d980)
- **LossScaleOptimizer and Callback Support for MultiOptimizers. (#22959)** (81a1fd9)
- **Add keras.ops.erf test coverage and update NumPy backend dtype logic (#22912)** (ce31ac2)
- **MultiOptimizer support for training sub-networks. (#22897)** (47e2e97)
- **feat: Add a predict_proba method on SKLearnClassifier (#21556)** (dc92e00)
- **Add keras.ops.cdist for pairwise Euclidean distances (#22095)** (aa71e6e)
- **Add LiteRT export support for PyTorch backend (#22758)** (8a63687)
- **Add sliding_window to MultiHeadAttention and GroupedQueryAttention (#22814)** (b0bdb8a)
- **add rnn test masking (#22817)** (4978237)

### Fixes
- **Fix pad_sequences string dtype check (np.bytes_ instead of duplicate np.str_) (#23092)** (b34af30)
- **Fix wrong parameter names in ops.select and ops.argpartition docstrings (#23091)** (f512e93)
- **[Fix] ValueError when loading SAMImageSegmenter from preset sam_huge_sa1b in Keras Hub (#23036)** (76c1585)
- **Add rsqrt dtype tests and fix dtype mismatches in the NumPy backend (#23067)** (8f2ba6b)
- **[Bug-Fix] Empty Python generator passed to model.fit raises raw IndexError (#23074)** (cdb63a5)
- **Security: Fix prompt injection in issue triage workflow (#23066)** (5798af8)
- **[Bug-Fix] Torch divide_no_nan() produces NaN gradients (#23064)** (1219515)
- **Fix TensorBoard callback step counter never updating (#22357)** (1ddde95)
- **[Bug-fix] Audio padded batching assumes scalar labels (#23062)** (4eaf883)
- **[Bug-Fix] Sparse TensorFlow wrapper drops trailing all-zero rows (#23060)** (bf21416)
- **Add regression test for dict input name preservation in LiteRT torch export (#23053)** (48622d7)
- **Fix TF backend depthwise and separable conv with stride and dilation (#23027)** (09873ce)
- **🛡️ Sentinel: [HIGH] Fix insecure deserialization in dataset utilities (#23026)** (2d166b6)
- **Fix bin boundaries calculation in Discretization layer (#22892)** (34849f5)
- **Fix torch median to average the two middle values for even-length inputs (#23013)** (19796fa)
- **Fix: reject HDF5 shape-bomb datasets in the main load_model/load_weights path (#22975)** (4933ea4)
- **Fix: reject hard-link tar members whose name escapes the extraction directory (#22973)** (f937c53)
- **Fix for flaky BatchNormalization renorm test. (#23007)** (b01b6c9)
- **Fix data distribution for model training in Jax Training (#23003)** (b963d40)
- **fix: added type validation for inner_config in deserialize_keras_object (#22974)** (341ab04)
- **fix(backend/torch): handle SymInt/SymFloat in convert_to_tensor and slice (#22998)** (e488861)
- **fix(ops): drop temp dim from matmul output shape for 1-D operands (#22994)** (8348c36)
- **Fix: KerasFileEditor reject HDF5 virtual datasets (#22976)** (460ec47)
- **Fix int8 quantization test with MultiHeadAttention on JAX on GPU. (#22992)** (c42b5ae)
- **Fix pytree related JaxLayer tests. (#22991)** (db8809d)
- **Fix bug introduced by Orbax's recent change from using the name "pytree" as default to "state" (#22985)** (d99987a)
- **fix(ops): validate axis in symbolic sort/argsort/cumsum/cumprod/take (#22924)** (a58d65f)
- **fix(callbacks): reset `self.best` in EarlyStopping/ReduceLROnPlateau between fit calls (#22967)** (bbf2995)
- **fix(layers): validate scalar args in GroupNormalization and MultiHeadAttention (#22966)** (dbb4aba)
- **fix(ops): validate axis in softmax/normalize/swapaxes/moveaxis (#22963)** (3d04e5c)
- **Fix flaky linalg.qr test by relaxing tolerance (#22946)** (0172a2f)
- **Fix: load_weights reject HDF5 ExternalLink/SoftLink on legacy .h5 dispatcher (#22900)** (d2dbae5)
- **Fix: KerasFileEditor eject HDF5 ExternalLink/SoftLink groups (#22899)** (23370f1)
- **Fix multi-axis reduction bugs in all, any, and prod for Torch backend (#22907)** (3e24550)
- **fix(ops): raise on zero-size pooling outputs when pool_size > input spatial dim (#22919)** (766c0ee)
- **[OpenVINO]  Fix dynamic batch shape propagation through ops.slice (#22915)** (469c480)
- **Fixing resize bug (#22903)** (a1f5499)
- **Fix torch BiLSTM dispatch and engage cuDNN (#22874)** (28bad7a)
- **Fix misleading error messages in ReLU and add missing tests for ReLU, constraints, and regularizers (#22444)** (50106a4)
- **Fix validate_reshape_shape crash under torch.compile with dynamic shapes (#22894)** (4b9f71f)
- **Fix torch Conv2DTranspose same padding (#22876)** (9125289)
- **Fix argpartition unit test with Torch on GPU. (#22882)** (6d4b584)
- **Fix #20429 — `Attention` layer hardcodes 3-D shape assumptions, breaking N-D inputs (#22361)** (91d58df)
- **Fix: keras.ops.argpartition failed when axis==None (#22560)** (61e8971)
- **fix(ops): validate newshape in reshape for consistent backend behavior (#22868)** (3411a62)
- **fix(ops): validate input channels in conv/depthwise_conv/separable_conv symbolic path (#22853)** (7149720)
- **Fix: Mask out-of-bounds class IDs (#22835) (#22844)** (75b81b3)
- **fix: setting a fix seed in update kernel initializer (#22845)** (b800fdf)
- **Fix workflow naming by using matrix-aware job names instead of unsupported top-level expressions. (#22781)** (52f8ed6)
- **Fix torch convert_to_tensor: honor explicit dtype for Python scalars (#22821)** (6a83d39)
- **[Fix] Dense layer GPU OOM with rank-3 input due to BatchMatMulV2 gradient materialization (#22832)** (604e6dd)
- **Fix wrapping in PR template. (#22840)** (6a66a89)
- **Fix Keras LiteRT export for Keras 3 + TF 2.20 + Python 3.13 (#22816)** (ef22c47)
- **Fix TPU test workflow job name rendering raw template expression (#22824)** (96d5c2f)
- **Relax tolerance in OpenVINO export tests to fix nightly failures (#22826)** (fe69834)
- **[Fix] Refactor axis validation and canonicalization for targeted review (#22708)** (ae83d5d)
- **Fix torch lstsq with rcond, re-enable test (#22808)** (10e2d0b)
- **Fix segment_max: infer num_segments from max(segment_ids) + 1 (#22804)** (42b6628)
- **Fix _rel_center_xywh_to_xyxy height/width multiplier swap (#22806)** (b317dc2)

### Backend
- **Suppress spurious 'Skipping nested container' warning on freshly-saved files (#23022)** (69d7fd6)
- **Delete temp files after loading model from remote path. (#23113)** (048d142)
- **Bump GitHub Actions versions to the latest (#23104)** (46f5eac)
- **Use `filter="data"` in `TarFile.extractall` on supported versions of Python 3.10 and 3.11. (#23108)** (9b2a16b)
- **On TF, don't request counts in `unique` unless needed. (#23078)** (4bf039e)
- **Disable autocast in GroupNormalization for mixed precision stability (#23070)** (d863dc8)
- **Transpose channels_first to NHWC on CPU for depthwise/separable conv (#23041)** (cfdd513)
- **Make Lambda and TorchModuleWrapper from_config fail closed when safe_mode is unset (#23048)** (55888d3)
- **Apply causal mask in MHA/GQA manual attention path (#23040)** (75a660e)
- **Replace `np.prod` and `np.sum` with `math.prod` and `sum` when handling shapes. (#23065)** (8361562)
- **fixes `LambdaCallback` docs (#23057)** (32fc5c7)
- **[Distribution] Refactor TF dataset distribution and implement centralized sharding routing (#23043)** (b52739c)
- **[OpenVINO] Upgrade to opset16 (#23039)** (f0d77d5)
- **Respect compiled trainable state in TensorFlowTrainer (#22787)** (2771c4e)
- **Optimize vectorized_map using list comprehension (#23012)** (18d8cbf)
- **On Tensorflow, allow `unique` argument `size` to be dynamic. (#23042)** (bbf4ece)
- **[OpenVINO] Implement erfc op (#23037)** (3da1da2)
- **🛡️ Sentinel: [ENHANCEMENT] Explicitly disable pickle in `np.load` (#23034)** (0ce4def)
- **Remove progress bar double averaging of metrics. (#23030)** (8bd6635)
- **Save seed in Attention layer get_config (#23029)** (b04df0b)
- **Save data_format in image preprocessing layers' get_config (#23023)** (5fd88e3)
- **Reject npz weight members that declare far more data than is stored (#23016)** (696b1ad)
- **Save output_padding in Conv1D/2D/3DTranspose get_config (#23014)** (30201a5)
- **Validate DiskIOStore asset paths stay within the working directory (#23017)** (d8caeb5)
- **Resolve paths with realpath to prevent symlink traversal in extraction (#23015)** (9867df4)
- **Reject ZIP archive members that declare far more data than is stored (#23010)** (e5d9412)
- **Validate Pipeline.from_config layers and avoid mutating input config (#23004)** (c648387)
- **Use parameterization in test_rank_adjustment (#22990)** (25456e6)
- **Unskip more NumPy masking related tests. (#23009)** (ac17285)
- **Updates to nightly github workflow. (#23008)** (8c565bc)
- **Implement Hashing.compute_output_shape (#23002)** (6de7f15)
- **Make EinsumDense.compute_output_shape work before build (#23000)** (595a2b7)
- **Keras subclass optimizers default name to None (#22972)** (8e5f325)
- **Implement erfc function in keras.ops (#22977)** (93b4e70)
- **Correct symbolic output shape of ops.inner for multi-dimensional inputs (#22989)** (fa20e42)
- **Validate positive integer size in RepeatVector and UpSampling1D (#22987)** (4024614)
- **Validate axis in symbolic stack/concatenate/split/diff/take_along_axis/unstack (#22981)** (4be1566)
- **Document static input signature requirement for LiteRT PyTorch export (#22997)** (12766e2)
- **Respect axis when squeezing singleton class dim in sparse_categorical_crossentropy (#22969)** (cecd743)
- **Implement correctness assertions for test_ema in Adam optimizer (#22979)** (36ef6cb)
- **Engage flash SDPA in MHA/GQA causal-only path (#22910)** (5a52400)
- **Update assignee list (#22995)** (bce1c57)
- **Optimize tf.tensordot by removing redundant float casts (#22932)** (6941d9d)
- **Give clearer error when dict-input Functional model receives non-dict (#22968)** (02d276e)
- **Relax validation threshold for int8 quantization tests. (#22970)** (09548c1)
- **Validate axes is a valid permutation in transpose (#22922)** (2b75ecb)
- **Revert "Auto-enable tf2onnx large_model for models >1.5GB (#22825)" (#22954)** (fe9b656)
- **Auto-enable tf2onnx large_model for models >1.5GB (#22825)** (8f09b27)
- **[OpenVINO] Implement segment_min and segment_prod (#22917)** (36d9ca1)
- **Supports symbolic and dynamic tensor shapes in `reshape` (#22927)** (6f67a88)
- **Replaces saving_lib_test.py filesystem calls with gfile (#22901)** (a357db2)
- **Fixes backward-compatiblity loading of legacy  files after #22362 (#22891)** (0f3a15a)
- **Validate input channels in conv_transpose for symbolic and eager paths (#22861)** (28e1dbb)
- **Remove duplication of qr in linalg and math modules for all backends (#22871)** (1ccb5a2)
- **Implement segment_prod function in keras.ops (#22854)** (4cf55af)
- **[OpenVINO] Implement cdist op (#22870)** (a3692b5)
- **Replace cast+multiply masking with ops.where to reduce memory (#22392)** (d36087c)
- **skip one-batch-ahead prefetch iterator on CPU (#22847)** (c15e0ad)
- **Improve sub path resolution in `file_utils`. (#22839)** (1239f13)
- **Unique ops (#22827)** (4d4736a)
- **Implement segment_min function in keras.ops (#22829)** (7118df8)
- **Update Gemini CLI action version in workflow (#22843)** (b1af667)
- **Update Gemini CLI action version in workflow (#22841)** (92d45d3)
- **Parallelize CPU tests to have them run faster. (#22658)** (7374e20)
- **Skip LiteRT export test if ai-edge-litert is missing (#22831)** (3e600a5)
- **Fuse JAX Bidirectional LSTM into a single cuDNN call (#22791)** (b4ce4be)
- **Update namex requirement from >=0.0.8 to >=0.1.0 in the python group (#22811)** (d0c1d8f)

### Chore
- **Build(deps): Update litert-torch requirement in the python group (#23019)** (4e4aaf6)
- **Build(deps): Bump the github-actions group with 2 updates (#23020)** (04e6f79)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/keras-team/keras?utm_source=github-action)._