diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml
index d4d6a1710dc8..2d2e17e1e025 100644
--- a/.github/workflows/actions.yml
+++ b/.github/workflows/actions.yml
@@ -24,13 +24,13 @@ jobs:
       KERAS_HOME: .github/workflows/config/${{ matrix.backend }}
     steps:
       - uses: actions/checkout@v4
-      - name: Check for changes in keras/applications
+      - name: Check for changes in keras/src/applications
         uses: dorny/paths-filter@v3
         id: filter
         with:
           filters: |
             applications:
-              - 'keras/applications/**'
+              - 'keras/src/applications/**'
       - name: Set up Python
         uses: actions/setup-python@v5
         with:
@@ -49,13 +49,13 @@ jobs:
         run: |
           pip install -r requirements.txt --progress-bar off --upgrade
           pip uninstall -y keras keras-nightly
-          pip install tf_keras==2.16.0rc0 --progress-bar off --upgrade
+          pip install tf_keras==2.16.0 --progress-bar off --upgrade
           pip install -e "." --progress-bar off --upgrade
       - name: Test applications with pytest
         if: ${{ steps.filter.outputs.applications == 'true' }}
         run: |
-          pytest keras/applications --cov=keras/applications
-          coverage xml --include='keras/applications/*' -o apps-coverage.xml
+          pytest keras/src/applications --cov=keras/src/applications
+          coverage xml --include='keras/src/applications/*' -o apps-coverage.xml
       - name: Codecov keras.applications
         if: ${{ steps.filter.outputs.applications == 'true' }}
         uses: codecov/codecov-action@v4
@@ -80,8 +80,8 @@ jobs:
           pytest integration_tests/torch_workflow_test.py
       - name: Test with pytest
         run: |
-          pytest keras --ignore keras/applications --cov=keras
-          coverage xml --omit='keras/applications/*' -o core-coverage.xml
+          pytest keras --ignore keras/src/applications --cov=keras
+          coverage xml --omit='keras/src/applications/*,keras/api' -o core-coverage.xml
       - name: Codecov keras
         uses: codecov/codecov-action@v4
         with:
@@ -115,5 +115,14 @@ jobs:
           pip install -r requirements.txt --progress-bar off --upgrade
           pip uninstall -y keras keras-nightly
           pip install -e "." --progress-bar off --upgrade
+      - name: Check for API changes
+        run: |
+          bash shell/api_gen.sh
+          git status
+          clean=$(git status | grep "nothing to commit")
+          if [ -z "$clean" ]; then
+            echo "Please run shell/api_gen.sh to generate API."
+            exit 1
+          fi
       - name: Lint
         run: bash shell/lint.sh
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 4d34c8bfab82..5edfd2c988b1 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -55,7 +55,7 @@ jobs:
           pytest integration_tests/torch_workflow_test.py
       - name: Test with pytest
         run: |
-          pytest keras --ignore keras/applications --cov=keras
+          pytest keras --ignore keras/src/applications --cov=keras
 
   format:
     name: Check the code format
@@ -81,6 +81,15 @@ jobs:
           pip install -r requirements.txt --progress-bar off --upgrade
           pip uninstall -y keras keras-nightly
           pip install -e "." --progress-bar off --upgrade
+      - name: Check for API changes
+        run: |
+          bash shell/api_gen.sh
+          git status
+          clean=$(git status | grep "nothing to commit")
+          if [ -z "$clean" ]; then
+            echo "Please run shell/api_gen.sh to generate API."
+            exit 1
+          fi
       - name: Lint
         run: bash shell/lint.sh
 
@@ -108,4 +117,4 @@ jobs:
         with:
           password: ${{ secrets.PYPI_NIGHTLY_API_TOKEN }}
           packages-dir: dist/
-          verbose: true
\ No newline at end of file
+          verbose: true
diff --git a/api_gen.py b/api_gen.py
new file mode 100644
index 000000000000..51a0128861ac
--- /dev/null
+++ b/api_gen.py
@@ -0,0 +1,175 @@
+"""Script to generate keras public API in `keras/api` directory.
+
+Usage:
+
+Run via `./shell/api_gen.sh`.
+It generates API and formats user and generated APIs.
+"""
+
+import os
+import shutil
+
+import namex
+
+package = "keras"
+
+
+def ignore_files(_, filenames):
+    return [f for f in filenames if f.endswith("_test.py")]
+
+
+def create_legacy_directory():
+    API_DIR = os.path.join(package, "api")
+    # Make keras/_tf_keras/ by copying keras/
+    tf_keras_dirpath_parent = os.path.join(API_DIR, "_tf_keras")
+    tf_keras_dirpath = os.path.join(tf_keras_dirpath_parent, "keras")
+    os.makedirs(tf_keras_dirpath, exist_ok=True)
+    with open(os.path.join(tf_keras_dirpath_parent, "__init__.py"), "w") as f:
+        f.write("from keras.api._tf_keras import keras\n")
+    with open(os.path.join(API_DIR, "__init__.py")) as f:
+        init_file = f.read()
+        init_file = init_file.replace(
+            "from keras.api import _legacy",
+            "from keras.api import _tf_keras",
+        )
+    with open(os.path.join(API_DIR, "__init__.py"), "w") as f:
+        f.write(init_file)
+    # Remove the import of `_tf_keras` in `keras/_tf_keras/keras/__init__.py`
+    init_file = init_file.replace("from keras.api import _tf_keras\n", "\n")
+    with open(os.path.join(tf_keras_dirpath, "__init__.py"), "w") as f:
+        f.write(init_file)
+    for dirname in os.listdir(API_DIR):
+        dirpath = os.path.join(API_DIR, dirname)
+        if os.path.isdir(dirpath) and dirname not in (
+            "_legacy",
+            "_tf_keras",
+            "src",
+        ):
+            destpath = os.path.join(tf_keras_dirpath, dirname)
+            if os.path.exists(destpath):
+                shutil.rmtree(destpath)
+            shutil.copytree(
+                dirpath,
+                destpath,
+                ignore=ignore_files,
+            )
+
+    # Copy keras/_legacy/ file contents to keras/_tf_keras/keras
+    legacy_submodules = [
+        path[:-3]
+        for path in os.listdir(os.path.join(package, "src", "legacy"))
+        if path.endswith(".py")
+    ]
+    legacy_submodules += [
+        path
+        for path in os.listdir(os.path.join(package, "src", "legacy"))
+        if os.path.isdir(os.path.join(package, "src", "legacy", path))
+    ]
+
+    for root, _, fnames in os.walk(os.path.join(package, "_legacy")):
+        for fname in fnames:
+            if fname.endswith(".py"):
+                legacy_fpath = os.path.join(root, fname)
+                tf_keras_root = root.replace("/_legacy", "/_tf_keras/keras")
+                core_api_fpath = os.path.join(
+                    root.replace("/_legacy", ""), fname
+                )
+                if not os.path.exists(tf_keras_root):
+                    os.makedirs(tf_keras_root)
+                tf_keras_fpath = os.path.join(tf_keras_root, fname)
+                with open(legacy_fpath) as f:
+                    legacy_contents = f.read()
+                    legacy_contents = legacy_contents.replace(
+                        "keras.api._legacy", "keras.api._tf_keras.keras"
+                    )
+                if os.path.exists(core_api_fpath):
+                    with open(core_api_fpath) as f:
+                        core_api_contents = f.read()
+                    core_api_contents = core_api_contents.replace(
+                        "from keras.api import _tf_keras\n", ""
+                    )
+                    for legacy_submodule in legacy_submodules:
+                        core_api_contents = core_api_contents.replace(
+                            f"from keras.api import {legacy_submodule}\n",
+                            "",
+                        )
+                        core_api_contents = core_api_contents.replace(
+                            f"keras.api.{legacy_submodule}",
+                            f"keras.api._tf_keras.keras.{legacy_submodule}",
+                        )
+                    legacy_contents = core_api_contents + "\n" + legacy_contents
+                with open(tf_keras_fpath, "w") as f:
+                    f.write(legacy_contents)
+
+    # Delete keras/api/_legacy/
+    shutil.rmtree(os.path.join(API_DIR, "_legacy"))
+
+
+def export_version_string():
+    API_INIT = os.path.join(package, "api", "__init__.py")
+    with open(API_INIT) as f:
+        contents = f.read()
+    with open(API_INIT, "w") as f:
+        contents += "from keras.src.version import __version__\n"
+        f.write(contents)
+
+
+def update_package_init():
+    contents = """
+# Import everything from /api/ into keras.
+from keras.api import *  # noqa: F403
+from keras.api import __version__  # Import * ignores names start with "_".
+
+import os
+
+# Add everything in /api/ to the module search path.
+__path__.append(os.path.join(os.path.dirname(__file__), "api"))  # noqa: F405
+
+# Don't pollute namespace.
+del os
+
+# Never autocomplete `.src` or `.api` on an imported keras object.
+def __dir__():
+    keys = dict.fromkeys((globals().keys()))
+    keys.pop("src")
+    keys.pop("api")
+    return list(keys)
+
+
+# Don't import `.src` or `.api` during `from keras import *`.
+__all__ = [
+    name
+    for name in globals().keys()
+    if not (name.startswith("_") or name in ("src", "api"))
+]"""
+    with open(os.path.join(package, "__init__.py")) as f:
+        init_contents = f.read()
+    with open(os.path.join(package, "__init__.py"), "w") as f:
+        f.write(init_contents.replace("\nfrom keras import api", contents))
+
+
+if __name__ == "__main__":
+    # Backup the `keras/__init__.py` and restore it on error in api gen.
+    os.makedirs(os.path.join(package, "api"), exist_ok=True)
+    init_fname = os.path.join(package, "__init__.py")
+    backup_init_fname = os.path.join(package, "__init__.py.bak")
+    try:
+        if os.path.exists(init_fname):
+            shutil.move(init_fname, backup_init_fname)
+        # Generates `keras/api` directory.
+        namex.generate_api_files(
+            "keras", code_directory="src", target_directory="api"
+        )
+        # Creates `keras/__init__.py` importing from `keras/api`
+        update_package_init()
+    except Exception as e:
+        if os.path.exists(backup_init_fname):
+            shutil.move(backup_init_fname, init_fname)
+        raise e
+    finally:
+        if os.path.exists(backup_init_fname):
+            os.remove(backup_init_fname)
+    # Add __version__ to keras package
+    export_version_string()
+    # Creates `_tf_keras` with full keras API
+    create_legacy_directory()
diff --git a/conftest.py b/conftest.py
index 2fcc51ec0062..5c27d947c13b 100644
--- a/conftest.py
+++ b/conftest.py
@@ -14,7 +14,7 @@
 
 import pytest  # noqa: E402
 
-from keras.backend import backend  # noqa: E402
+from keras.src.backend import backend  # noqa: E402
 
 
 def pytest_configure(config):
diff --git a/integration_tests/basic_full_flow.py b/integration_tests/basic_full_flow.py
index e7e2d0fbd09c..6361b32d4794 100644
--- a/integration_tests/basic_full_flow.py
+++ b/integration_tests/basic_full_flow.py
@@ -2,11 +2,11 @@
 import pytest
 
 import keras
-from keras import layers
-from keras import losses
-from keras import metrics
-from keras import optimizers
-from keras import testing
+from keras.src import layers
+from keras.src import losses
+from keras.src import metrics
+from keras.src import optimizers
+from keras.src import testing
 
 
 class MyModel(keras.Model):
diff --git a/integration_tests/dataset_tests/boston_housing_test.py b/integration_tests/dataset_tests/boston_housing_test.py
index eb5ac411cac9..4d4c3399beb6 100644
--- a/integration_tests/dataset_tests/boston_housing_test.py
+++ b/integration_tests/dataset_tests/boston_housing_test.py
@@ -1,5 +1,5 @@
-from keras import testing
-from keras.datasets import boston_housing
+from keras.src import testing
+from keras.src.datasets import boston_housing
 
 
 class BostonHousingTest(testing.TestCase):
diff --git a/integration_tests/dataset_tests/california_housing_test.py b/integration_tests/dataset_tests/california_housing_test.py
index ec63578b709f..d49abb7c0142 100644
--- a/integration_tests/dataset_tests/california_housing_test.py
+++ b/integration_tests/dataset_tests/california_housing_test.py
@@ -1,5 +1,5 @@
-from keras import testing
-from keras.datasets import california_housing
+from keras.src import testing
+from keras.src.datasets import california_housing
 
 
 class CaliforniaHousingTest(testing.TestCase):
diff --git a/integration_tests/dataset_tests/cifar100_test.py b/integration_tests/dataset_tests/cifar100_test.py
index d2ef4f7edeea..3a497dd205ac 100644
--- a/integration_tests/dataset_tests/cifar100_test.py
+++ b/integration_tests/dataset_tests/cifar100_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import testing
-from keras.datasets import cifar100
+from keras.src import testing
+from keras.src.datasets import cifar100
 
 
 class Cifar100LoadDataTest(testing.TestCase):
diff --git a/integration_tests/dataset_tests/cifar10_test.py b/integration_tests/dataset_tests/cifar10_test.py
index 58185d230a09..fe1c20319b00 100644
--- a/integration_tests/dataset_tests/cifar10_test.py
+++ b/integration_tests/dataset_tests/cifar10_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import testing
-from keras.datasets import cifar10
+from keras.src import testing
+from keras.src.datasets import cifar10
 
 
 class Cifar10LoadDataTest(testing.TestCase):
diff --git a/integration_tests/dataset_tests/fashion_mnist_test.py b/integration_tests/dataset_tests/fashion_mnist_test.py
index e3374730dfbc..92c43eeefe32 100644
--- a/integration_tests/dataset_tests/fashion_mnist_test.py
+++ b/integration_tests/dataset_tests/fashion_mnist_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import testing
-from keras.datasets import fashion_mnist
+from keras.src import testing
+from keras.src.datasets import fashion_mnist
 
 
 class FashionMnistLoadDataTest(testing.TestCase):
diff --git a/integration_tests/dataset_tests/imdb_test.py b/integration_tests/dataset_tests/imdb_test.py
index 8d740904a23c..e2971c4709b6 100644
--- a/integration_tests/dataset_tests/imdb_test.py
+++ b/integration_tests/dataset_tests/imdb_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import testing
-from keras.datasets import imdb
+from keras.src import testing
+from keras.src.datasets import imdb
 
 
 class ImdbLoadDataTest(testing.TestCase):
diff --git a/integration_tests/dataset_tests/mnist_test.py b/integration_tests/dataset_tests/mnist_test.py
index aed6ef5e8654..5aeaae4548bd 100644
--- a/integration_tests/dataset_tests/mnist_test.py
+++ b/integration_tests/dataset_tests/mnist_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import testing
-from keras.datasets import mnist
+from keras.src import testing
+from keras.src.datasets import mnist
 
 
 class MnistLoadDataTest(testing.TestCase):
diff --git a/integration_tests/dataset_tests/reuters_test.py b/integration_tests/dataset_tests/reuters_test.py
index 14b1eb0c1f05..3d83de560869 100644
--- a/integration_tests/dataset_tests/reuters_test.py
+++ b/integration_tests/dataset_tests/reuters_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import testing
-from keras.datasets import reuters
+from keras.src import testing
+from keras.src.datasets import reuters
 
 
 class ReutersLoadDataTest(testing.TestCase):
diff --git a/integration_tests/import_test.py b/integration_tests/import_test.py
index 54509a88492f..9330b834e0a1 100644
--- a/integration_tests/import_test.py
+++ b/integration_tests/import_test.py
@@ -2,12 +2,16 @@
 import re
 import subprocess
 
-from keras import backend
+from keras.src import backend
 
+# For torch, use index url to avoid installing nvidia drivers for the test.
 BACKEND_REQ = {
-    "tensorflow": "tensorflow",
-    "torch": "torch torchvision",
-    "jax": "jax jaxlib",
+    "tensorflow": ("tensorflow-cpu", ""),
+    "torch": (
+        "torch torchvision",
+        "--extra-index-url https://download.pytorch.org/whl/cpu ",
+    ),
+    "jax": ("jax[cpu]", ""),
 }
 
 
@@ -43,16 +47,17 @@ def create_virtualenv():
 
 def manage_venv_installs(whl_path):
     other_backends = list(set(BACKEND_REQ.keys()) - {backend.backend()})
+    backend_pkg, backend_extra_url = BACKEND_REQ[backend.backend()]
     install_setup = [
         # Installs the backend's package and common requirements
-        "pip install " + BACKEND_REQ[backend.backend()],
+        "pip install " + backend_extra_url + backend_pkg,
         "pip install -r requirements-common.txt",
         "pip install pytest",
         # Ensure other backends are uninstalled
         "pip uninstall -y "
-        + BACKEND_REQ[other_backends[0]]
+        + BACKEND_REQ[other_backends[0]][0]
         + " "
-        + BACKEND_REQ[other_backends[1]],
+        + BACKEND_REQ[other_backends[1]][0],
         # Install `.whl` package
         "pip install " + whl_path,
     ]
diff --git a/integration_tests/model_visualization_test.py b/integration_tests/model_visualization_test.py
index ed5c4e87ee52..29c666aee6fc 100644
--- a/integration_tests/model_visualization_test.py
+++ b/integration_tests/model_visualization_test.py
@@ -1,5 +1,5 @@
 import keras
-from keras.utils import plot_model
+from keras.src.utils import plot_model
 
 
 def plot_sequential_model():
diff --git a/integration_tests/tf_distribute_training_test.py b/integration_tests/tf_distribute_training_test.py
index 76fa55ed64f4..ec2a7d5bfb92 100644
--- a/integration_tests/tf_distribute_training_test.py
+++ b/integration_tests/tf_distribute_training_test.py
@@ -2,12 +2,12 @@
 import tensorflow as tf
 
 import keras
-from keras import layers
-from keras import losses
-from keras import metrics
-from keras import models
-from keras import optimizers
-from keras.callbacks import LearningRateScheduler
+from keras.src import layers
+from keras.src import losses
+from keras.src import metrics
+from keras.src import models
+from keras.src import optimizers
+from keras.src.callbacks import LearningRateScheduler
 
 
 def test_model_fit():
diff --git a/integration_tests/torch_workflow_test.py b/integration_tests/torch_workflow_test.py
index 1bab5a4b7e46..3737197b86e5 100644
--- a/integration_tests/torch_workflow_test.py
+++ b/integration_tests/torch_workflow_test.py
@@ -1,8 +1,8 @@
 import torch
 
-from keras import layers
-from keras import testing
-from keras.backend.common import KerasVariable
+from keras.src import layers
+from keras.src import testing
+from keras.src.backend.common import KerasVariable
 
 
 class Net(torch.nn.Module):
diff --git a/keras/__init__.py b/keras/__init__.py
index 4cda3efc0e7f..6276b51e1f85 100644
--- a/keras/__init__.py
+++ b/keras/__init__.py
@@ -1,19 +1,33 @@
-from keras import activations
-from keras import applications
-from keras import backend
-from keras import constraints
-from keras import datasets
-from keras import initializers
-from keras import layers
-from keras import models
-from keras import ops
-from keras import optimizers
-from keras import regularizers
-from keras import utils
-from keras.backend import KerasTensor
-from keras.layers import Input
-from keras.layers import Layer
-from keras.models import Functional
-from keras.models import Model
-from keras.models import Sequential
-from keras.version import __version__
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+import os
+
+# Import everything from /api/ into keras.
+from keras.api import *  # noqa: F403
+from keras.api import __version__  # Import * ignores names start with "_".
+
+# Add everything in /api/ to the module search path.
+__path__.append(os.path.join(os.path.dirname(__file__), "api"))  # noqa: F405
+
+# Don't pollute namespace.
+del os
+
+
+# Never autocomplete `.src` or `.api` on an imported keras object.
+def __dir__():
+    keys = dict.fromkeys((globals().keys()))
+    keys.pop("src")
+    keys.pop("api")
+    return list(keys)
+
+
+# Don't import `.src` or `.api` during `from keras import *`.
+__all__ = [
+    name
+    for name in globals().keys()
+    if not (name.startswith("_") or name in ("src", "api"))
+]
diff --git a/keras/api/__init__.py b/keras/api/__init__.py
new file mode 100644
index 000000000000..d93460c26c53
--- /dev/null
+++ b/keras/api/__init__.py
@@ -0,0 +1,58 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api import _tf_keras
+from keras.api import activations
+from keras.api import applications
+from keras.api import backend
+from keras.api import callbacks
+from keras.api import config
+from keras.api import constraints
+from keras.api import datasets
+from keras.api import distribution
+from keras.api import dtype_policies
+from keras.api import export
+from keras.api import initializers
+from keras.api import layers
+from keras.api import legacy
+from keras.api import losses
+from keras.api import metrics
+from keras.api import mixed_precision
+from keras.api import models
+from keras.api import ops
+from keras.api import optimizers
+from keras.api import preprocessing
+from keras.api import quantizers
+from keras.api import random
+from keras.api import regularizers
+from keras.api import saving
+from keras.api import tree
+from keras.api import utils
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.backend.common.stateless_scope import StatelessScope
+from keras.src.backend.exports import Variable
+from keras.src.backend.exports import device
+from keras.src.backend.exports import name_scope
+from keras.src.dtype_policies.dtype_policy import DTypePolicy
+from keras.src.dtype_policies.dtype_policy import FloatDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedFloat8DTypePolicy
+from keras.src.initializers.initializer import Initializer
+from keras.src.layers.core.input_layer import Input
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.losses.loss import Loss
+from keras.src.metrics.metric import Metric
+from keras.src.models.model import Model
+from keras.src.models.sequential import Sequential
+from keras.src.ops.function import Function
+from keras.src.ops.operation import Operation
+from keras.src.optimizers.optimizer import Optimizer
+from keras.src.quantizers.quantizers import AbsMaxQuantizer
+from keras.src.quantizers.quantizers import Quantizer
+from keras.src.regularizers.regularizers import Regularizer
+from keras.src.version import __version__
+from keras.src.version import version
diff --git a/keras/api/_tf_keras/__init__.py b/keras/api/_tf_keras/__init__.py
new file mode 100644
index 000000000000..249c46d892a7
--- /dev/null
+++ b/keras/api/_tf_keras/__init__.py
@@ -0,0 +1 @@
+from keras.api._tf_keras import keras
diff --git a/keras/api/_tf_keras/keras/__init__.py b/keras/api/_tf_keras/keras/__init__.py
new file mode 100644
index 000000000000..767853b2be3b
--- /dev/null
+++ b/keras/api/_tf_keras/keras/__init__.py
@@ -0,0 +1,57 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api import activations
+from keras.api import applications
+from keras.api import backend
+from keras.api import callbacks
+from keras.api import config
+from keras.api import constraints
+from keras.api import datasets
+from keras.api import distribution
+from keras.api import dtype_policies
+from keras.api import export
+from keras.api import initializers
+from keras.api import layers
+from keras.api import legacy
+from keras.api import losses
+from keras.api import metrics
+from keras.api import mixed_precision
+from keras.api import models
+from keras.api import ops
+from keras.api import optimizers
+from keras.api import preprocessing
+from keras.api import quantizers
+from keras.api import random
+from keras.api import regularizers
+from keras.api import saving
+from keras.api import tree
+from keras.api import utils
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.backend.common.stateless_scope import StatelessScope
+from keras.src.backend.exports import Variable
+from keras.src.backend.exports import device
+from keras.src.backend.exports import name_scope
+from keras.src.dtype_policies.dtype_policy import DTypePolicy
+from keras.src.dtype_policies.dtype_policy import FloatDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedFloat8DTypePolicy
+from keras.src.initializers.initializer import Initializer
+from keras.src.layers.core.input_layer import Input
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.losses.loss import Loss
+from keras.src.metrics.metric import Metric
+from keras.src.models.model import Model
+from keras.src.models.sequential import Sequential
+from keras.src.ops.function import Function
+from keras.src.ops.operation import Operation
+from keras.src.optimizers.optimizer import Optimizer
+from keras.src.quantizers.quantizers import AbsMaxQuantizer
+from keras.src.quantizers.quantizers import Quantizer
+from keras.src.regularizers.regularizers import Regularizer
+from keras.src.version import __version__
+from keras.src.version import version
diff --git a/keras/api/_tf_keras/keras/activations/__init__.py b/keras/api/_tf_keras/keras/activations/__init__.py
new file mode 100644
index 000000000000..17624b6ba5dc
--- /dev/null
+++ b/keras/api/_tf_keras/keras/activations/__init__.py
@@ -0,0 +1,29 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.activations import deserialize
+from keras.src.activations import get
+from keras.src.activations import serialize
+from keras.src.activations.activations import elu
+from keras.src.activations.activations import exponential
+from keras.src.activations.activations import gelu
+from keras.src.activations.activations import hard_sigmoid
+from keras.src.activations.activations import hard_silu
+from keras.src.activations.activations import hard_silu as hard_swish
+from keras.src.activations.activations import leaky_relu
+from keras.src.activations.activations import linear
+from keras.src.activations.activations import log_softmax
+from keras.src.activations.activations import mish
+from keras.src.activations.activations import relu
+from keras.src.activations.activations import relu6
+from keras.src.activations.activations import selu
+from keras.src.activations.activations import sigmoid
+from keras.src.activations.activations import silu
+from keras.src.activations.activations import silu as swish
+from keras.src.activations.activations import softmax
+from keras.src.activations.activations import softplus
+from keras.src.activations.activations import softsign
+from keras.src.activations.activations import tanh
diff --git a/keras/api/_tf_keras/keras/applications/__init__.py b/keras/api/_tf_keras/keras/applications/__init__.py
new file mode 100644
index 000000000000..183b3ca66142
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/__init__.py
@@ -0,0 +1,63 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.applications import convnext
+from keras.api.applications import densenet
+from keras.api.applications import efficientnet
+from keras.api.applications import efficientnet_v2
+from keras.api.applications import imagenet_utils
+from keras.api.applications import inception_resnet_v2
+from keras.api.applications import inception_v3
+from keras.api.applications import mobilenet
+from keras.api.applications import mobilenet_v2
+from keras.api.applications import mobilenet_v3
+from keras.api.applications import nasnet
+from keras.api.applications import resnet
+from keras.api.applications import resnet50
+from keras.api.applications import resnet_v2
+from keras.api.applications import vgg16
+from keras.api.applications import vgg19
+from keras.api.applications import xception
+from keras.src.applications.convnext import ConvNeXtBase
+from keras.src.applications.convnext import ConvNeXtLarge
+from keras.src.applications.convnext import ConvNeXtSmall
+from keras.src.applications.convnext import ConvNeXtTiny
+from keras.src.applications.convnext import ConvNeXtXLarge
+from keras.src.applications.densenet import DenseNet121
+from keras.src.applications.densenet import DenseNet169
+from keras.src.applications.densenet import DenseNet201
+from keras.src.applications.efficientnet import EfficientNetB0
+from keras.src.applications.efficientnet import EfficientNetB1
+from keras.src.applications.efficientnet import EfficientNetB2
+from keras.src.applications.efficientnet import EfficientNetB3
+from keras.src.applications.efficientnet import EfficientNetB4
+from keras.src.applications.efficientnet import EfficientNetB5
+from keras.src.applications.efficientnet import EfficientNetB6
+from keras.src.applications.efficientnet import EfficientNetB7
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B0
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B1
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B2
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B3
+from keras.src.applications.efficientnet_v2 import EfficientNetV2L
+from keras.src.applications.efficientnet_v2 import EfficientNetV2M
+from keras.src.applications.efficientnet_v2 import EfficientNetV2S
+from keras.src.applications.inception_resnet_v2 import InceptionResNetV2
+from keras.src.applications.inception_v3 import InceptionV3
+from keras.src.applications.mobilenet import MobileNet
+from keras.src.applications.mobilenet_v2 import MobileNetV2
+from keras.src.applications.mobilenet_v3 import MobileNetV3Large
+from keras.src.applications.mobilenet_v3 import MobileNetV3Small
+from keras.src.applications.nasnet import NASNetLarge
+from keras.src.applications.nasnet import NASNetMobile
+from keras.src.applications.resnet import ResNet50
+from keras.src.applications.resnet import ResNet101
+from keras.src.applications.resnet import ResNet152
+from keras.src.applications.resnet_v2 import ResNet50V2
+from keras.src.applications.resnet_v2 import ResNet101V2
+from keras.src.applications.resnet_v2 import ResNet152V2
+from keras.src.applications.vgg16 import VGG16
+from keras.src.applications.vgg19 import VGG19
+from keras.src.applications.xception import Xception
diff --git a/keras/api/_tf_keras/keras/applications/convnext/__init__.py b/keras/api/_tf_keras/keras/applications/convnext/__init__.py
new file mode 100644
index 000000000000..b4eaaa3834b1
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/convnext/__init__.py
@@ -0,0 +1,13 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.convnext import ConvNeXtBase
+from keras.src.applications.convnext import ConvNeXtLarge
+from keras.src.applications.convnext import ConvNeXtSmall
+from keras.src.applications.convnext import ConvNeXtTiny
+from keras.src.applications.convnext import ConvNeXtXLarge
+from keras.src.applications.convnext import decode_predictions
+from keras.src.applications.convnext import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/densenet/__init__.py b/keras/api/_tf_keras/keras/applications/densenet/__init__.py
new file mode 100644
index 000000000000..0173a2c3ed9d
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/densenet/__init__.py
@@ -0,0 +1,11 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.densenet import DenseNet121
+from keras.src.applications.densenet import DenseNet169
+from keras.src.applications.densenet import DenseNet201
+from keras.src.applications.densenet import decode_predictions
+from keras.src.applications.densenet import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/efficientnet/__init__.py b/keras/api/_tf_keras/keras/applications/efficientnet/__init__.py
new file mode 100644
index 000000000000..c4af0199bea6
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/efficientnet/__init__.py
@@ -0,0 +1,16 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.efficientnet import EfficientNetB0
+from keras.src.applications.efficientnet import EfficientNetB1
+from keras.src.applications.efficientnet import EfficientNetB2
+from keras.src.applications.efficientnet import EfficientNetB3
+from keras.src.applications.efficientnet import EfficientNetB4
+from keras.src.applications.efficientnet import EfficientNetB5
+from keras.src.applications.efficientnet import EfficientNetB6
+from keras.src.applications.efficientnet import EfficientNetB7
+from keras.src.applications.efficientnet import decode_predictions
+from keras.src.applications.efficientnet import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/efficientnet_v2/__init__.py b/keras/api/_tf_keras/keras/applications/efficientnet_v2/__init__.py
new file mode 100644
index 000000000000..ee85821a1d74
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/efficientnet_v2/__init__.py
@@ -0,0 +1,15 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B0
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B1
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B2
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B3
+from keras.src.applications.efficientnet_v2 import EfficientNetV2L
+from keras.src.applications.efficientnet_v2 import EfficientNetV2M
+from keras.src.applications.efficientnet_v2 import EfficientNetV2S
+from keras.src.applications.efficientnet_v2 import decode_predictions
+from keras.src.applications.efficientnet_v2 import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/imagenet_utils/__init__.py b/keras/api/_tf_keras/keras/applications/imagenet_utils/__init__.py
new file mode 100644
index 000000000000..81a923e55b9e
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/imagenet_utils/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.imagenet_utils import decode_predictions
+from keras.src.applications.imagenet_utils import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/inception_resnet_v2/__init__.py b/keras/api/_tf_keras/keras/applications/inception_resnet_v2/__init__.py
new file mode 100644
index 000000000000..b710829bd377
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/inception_resnet_v2/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.inception_resnet_v2 import InceptionResNetV2
+from keras.src.applications.inception_resnet_v2 import decode_predictions
+from keras.src.applications.inception_resnet_v2 import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/inception_v3/__init__.py b/keras/api/_tf_keras/keras/applications/inception_v3/__init__.py
new file mode 100644
index 000000000000..8a2379ca1b13
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/inception_v3/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.inception_v3 import InceptionV3
+from keras.src.applications.inception_v3 import decode_predictions
+from keras.src.applications.inception_v3 import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/mobilenet/__init__.py b/keras/api/_tf_keras/keras/applications/mobilenet/__init__.py
new file mode 100644
index 000000000000..0194cdfd0ac6
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/mobilenet/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.mobilenet import MobileNet
+from keras.src.applications.mobilenet import decode_predictions
+from keras.src.applications.mobilenet import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/mobilenet_v2/__init__.py b/keras/api/_tf_keras/keras/applications/mobilenet_v2/__init__.py
new file mode 100644
index 000000000000..ceb0625e3519
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/mobilenet_v2/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.mobilenet_v2 import MobileNetV2
+from keras.src.applications.mobilenet_v2 import decode_predictions
+from keras.src.applications.mobilenet_v2 import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/mobilenet_v3/__init__.py b/keras/api/_tf_keras/keras/applications/mobilenet_v3/__init__.py
new file mode 100644
index 000000000000..c27e6669f0f1
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/mobilenet_v3/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.mobilenet_v3 import decode_predictions
+from keras.src.applications.mobilenet_v3 import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/nasnet/__init__.py b/keras/api/_tf_keras/keras/applications/nasnet/__init__.py
new file mode 100644
index 000000000000..874de61f00ab
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/nasnet/__init__.py
@@ -0,0 +1,10 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.nasnet import NASNetLarge
+from keras.src.applications.nasnet import NASNetMobile
+from keras.src.applications.nasnet import decode_predictions
+from keras.src.applications.nasnet import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/resnet/__init__.py b/keras/api/_tf_keras/keras/applications/resnet/__init__.py
new file mode 100644
index 000000000000..5aaa3ee0e5e2
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/resnet/__init__.py
@@ -0,0 +1,11 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.resnet import ResNet50
+from keras.src.applications.resnet import ResNet101
+from keras.src.applications.resnet import ResNet152
+from keras.src.applications.resnet import decode_predictions
+from keras.src.applications.resnet import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/resnet50/__init__.py b/keras/api/_tf_keras/keras/applications/resnet50/__init__.py
new file mode 100644
index 000000000000..ac08b5322682
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/resnet50/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.resnet import ResNet50
+from keras.src.applications.resnet import decode_predictions
+from keras.src.applications.resnet import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/resnet_v2/__init__.py b/keras/api/_tf_keras/keras/applications/resnet_v2/__init__.py
new file mode 100644
index 000000000000..273dd3019d85
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/resnet_v2/__init__.py
@@ -0,0 +1,11 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.resnet_v2 import ResNet50V2
+from keras.src.applications.resnet_v2 import ResNet101V2
+from keras.src.applications.resnet_v2 import ResNet152V2
+from keras.src.applications.resnet_v2 import decode_predictions
+from keras.src.applications.resnet_v2 import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/vgg16/__init__.py b/keras/api/_tf_keras/keras/applications/vgg16/__init__.py
new file mode 100644
index 000000000000..5a31084a4676
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/vgg16/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.vgg16 import VGG16
+from keras.src.applications.vgg16 import decode_predictions
+from keras.src.applications.vgg16 import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/vgg19/__init__.py b/keras/api/_tf_keras/keras/applications/vgg19/__init__.py
new file mode 100644
index 000000000000..14355514d7cf
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/vgg19/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.vgg19 import VGG19
+from keras.src.applications.vgg19 import decode_predictions
+from keras.src.applications.vgg19 import preprocess_input
diff --git a/keras/api/_tf_keras/keras/applications/xception/__init__.py b/keras/api/_tf_keras/keras/applications/xception/__init__.py
new file mode 100644
index 000000000000..c200dc66df35
--- /dev/null
+++ b/keras/api/_tf_keras/keras/applications/xception/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.xception import Xception
+from keras.src.applications.xception import decode_predictions
+from keras.src.applications.xception import preprocess_input
diff --git a/keras/api/_tf_keras/keras/backend/__init__.py b/keras/api/_tf_keras/keras/backend/__init__.py
new file mode 100644
index 000000000000..840bde6e4ded
--- /dev/null
+++ b/keras/api/_tf_keras/keras/backend/__init__.py
@@ -0,0 +1,20 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.backend.common.dtypes import result_type
+from keras.src.backend.common.global_state import clear_session
+from keras.src.backend.common.keras_tensor import is_keras_tensor
+from keras.src.backend.common.variables import is_float_dtype
+from keras.src.backend.common.variables import is_int_dtype
+from keras.src.backend.common.variables import standardize_dtype
+from keras.src.backend.config import backend
+from keras.src.backend.config import epsilon
+from keras.src.backend.config import floatx
+from keras.src.backend.config import image_data_format
+from keras.src.backend.config import set_epsilon
+from keras.src.backend.config import set_floatx
+from keras.src.backend.config import set_image_data_format
+from keras.src.utils.naming import get_uid
diff --git a/keras/api/_tf_keras/keras/callbacks/__init__.py b/keras/api/_tf_keras/keras/callbacks/__init__.py
new file mode 100644
index 000000000000..42ba958b9bb3
--- /dev/null
+++ b/keras/api/_tf_keras/keras/callbacks/__init__.py
@@ -0,0 +1,21 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.callbacks.backup_and_restore import BackupAndRestore
+from keras.src.callbacks.callback import Callback
+from keras.src.callbacks.callback_list import CallbackList
+from keras.src.callbacks.csv_logger import CSVLogger
+from keras.src.callbacks.early_stopping import EarlyStopping
+from keras.src.callbacks.history import History
+from keras.src.callbacks.lambda_callback import LambdaCallback
+from keras.src.callbacks.learning_rate_scheduler import LearningRateScheduler
+from keras.src.callbacks.model_checkpoint import ModelCheckpoint
+from keras.src.callbacks.progbar_logger import ProgbarLogger
+from keras.src.callbacks.reduce_lr_on_plateau import ReduceLROnPlateau
+from keras.src.callbacks.remote_monitor import RemoteMonitor
+from keras.src.callbacks.swap_ema_weights import SwapEMAWeights
+from keras.src.callbacks.tensorboard import TensorBoard
+from keras.src.callbacks.terminate_on_nan import TerminateOnNaN
diff --git a/keras/api/_tf_keras/keras/config/__init__.py b/keras/api/_tf_keras/keras/config/__init__.py
new file mode 100644
index 000000000000..13e334cb7c06
--- /dev/null
+++ b/keras/api/_tf_keras/keras/config/__init__.py
@@ -0,0 +1,23 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.backend.config import backend
+from keras.src.backend.config import epsilon
+from keras.src.backend.config import floatx
+from keras.src.backend.config import image_data_format
+from keras.src.backend.config import set_epsilon
+from keras.src.backend.config import set_floatx
+from keras.src.backend.config import set_image_data_format
+from keras.src.dtype_policies.dtype_policy import dtype_policy
+from keras.src.dtype_policies.dtype_policy import set_dtype_policy
+from keras.src.saving.serialization_lib import enable_unsafe_deserialization
+from keras.src.utils.backend_utils import set_backend
+from keras.src.utils.io_utils import disable_interactive_logging
+from keras.src.utils.io_utils import enable_interactive_logging
+from keras.src.utils.io_utils import is_interactive_logging_enabled
+from keras.src.utils.traceback_utils import disable_traceback_filtering
+from keras.src.utils.traceback_utils import enable_traceback_filtering
+from keras.src.utils.traceback_utils import is_traceback_filtering_enabled
diff --git a/keras/api/_tf_keras/keras/constraints/__init__.py b/keras/api/_tf_keras/keras/constraints/__init__.py
new file mode 100644
index 000000000000..6372e149d3ba
--- /dev/null
+++ b/keras/api/_tf_keras/keras/constraints/__init__.py
@@ -0,0 +1,18 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.constraints import deserialize
+from keras.src.constraints import get
+from keras.src.constraints import serialize
+from keras.src.constraints.constraints import Constraint
+from keras.src.constraints.constraints import MaxNorm
+from keras.src.constraints.constraints import MaxNorm as max_norm
+from keras.src.constraints.constraints import MinMaxNorm
+from keras.src.constraints.constraints import MinMaxNorm as min_max_norm
+from keras.src.constraints.constraints import NonNeg
+from keras.src.constraints.constraints import NonNeg as non_neg
+from keras.src.constraints.constraints import UnitNorm
+from keras.src.constraints.constraints import UnitNorm as unit_norm
diff --git a/keras/api/_tf_keras/keras/datasets/__init__.py b/keras/api/_tf_keras/keras/datasets/__init__.py
new file mode 100644
index 000000000000..cf153fefcd4d
--- /dev/null
+++ b/keras/api/_tf_keras/keras/datasets/__init__.py
@@ -0,0 +1,14 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.datasets import boston_housing
+from keras.api.datasets import california_housing
+from keras.api.datasets import cifar10
+from keras.api.datasets import cifar100
+from keras.api.datasets import fashion_mnist
+from keras.api.datasets import imdb
+from keras.api.datasets import mnist
+from keras.api.datasets import reuters
diff --git a/keras/api/_tf_keras/keras/datasets/boston_housing/__init__.py b/keras/api/_tf_keras/keras/datasets/boston_housing/__init__.py
new file mode 100644
index 000000000000..f5a179db9968
--- /dev/null
+++ b/keras/api/_tf_keras/keras/datasets/boston_housing/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.boston_housing import load_data
diff --git a/keras/api/_tf_keras/keras/datasets/california_housing/__init__.py b/keras/api/_tf_keras/keras/datasets/california_housing/__init__.py
new file mode 100644
index 000000000000..52b6157dcf28
--- /dev/null
+++ b/keras/api/_tf_keras/keras/datasets/california_housing/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.california_housing import load_data
diff --git a/keras/api/_tf_keras/keras/datasets/cifar10/__init__.py b/keras/api/_tf_keras/keras/datasets/cifar10/__init__.py
new file mode 100644
index 000000000000..68c72a91b495
--- /dev/null
+++ b/keras/api/_tf_keras/keras/datasets/cifar10/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.cifar10 import load_data
diff --git a/keras/api/_tf_keras/keras/datasets/cifar100/__init__.py b/keras/api/_tf_keras/keras/datasets/cifar100/__init__.py
new file mode 100644
index 000000000000..e49e67faeecf
--- /dev/null
+++ b/keras/api/_tf_keras/keras/datasets/cifar100/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.cifar100 import load_data
diff --git a/keras/api/_tf_keras/keras/datasets/fashion_mnist/__init__.py b/keras/api/_tf_keras/keras/datasets/fashion_mnist/__init__.py
new file mode 100644
index 000000000000..33512169fc9f
--- /dev/null
+++ b/keras/api/_tf_keras/keras/datasets/fashion_mnist/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.fashion_mnist import load_data
diff --git a/keras/api/_tf_keras/keras/datasets/imdb/__init__.py b/keras/api/_tf_keras/keras/datasets/imdb/__init__.py
new file mode 100644
index 000000000000..6bcddbd11dbe
--- /dev/null
+++ b/keras/api/_tf_keras/keras/datasets/imdb/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.imdb import get_word_index
+from keras.src.datasets.imdb import load_data
diff --git a/keras/api/_tf_keras/keras/datasets/mnist/__init__.py b/keras/api/_tf_keras/keras/datasets/mnist/__init__.py
new file mode 100644
index 000000000000..45568c463ba8
--- /dev/null
+++ b/keras/api/_tf_keras/keras/datasets/mnist/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.mnist import load_data
diff --git a/keras/api/_tf_keras/keras/datasets/reuters/__init__.py b/keras/api/_tf_keras/keras/datasets/reuters/__init__.py
new file mode 100644
index 000000000000..cdc9b68cff93
--- /dev/null
+++ b/keras/api/_tf_keras/keras/datasets/reuters/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.reuters import get_label_names
+from keras.src.datasets.reuters import get_word_index
+from keras.src.datasets.reuters import load_data
diff --git a/keras/api/_tf_keras/keras/distribution/__init__.py b/keras/api/_tf_keras/keras/distribution/__init__.py
new file mode 100644
index 000000000000..b56806af9fac
--- /dev/null
+++ b/keras/api/_tf_keras/keras/distribution/__init__.py
@@ -0,0 +1,16 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.distribution.distribution_lib import DataParallel
+from keras.src.distribution.distribution_lib import DeviceMesh
+from keras.src.distribution.distribution_lib import LayoutMap
+from keras.src.distribution.distribution_lib import ModelParallel
+from keras.src.distribution.distribution_lib import TensorLayout
+from keras.src.distribution.distribution_lib import distribute_tensor
+from keras.src.distribution.distribution_lib import distribution
+from keras.src.distribution.distribution_lib import initialize
+from keras.src.distribution.distribution_lib import list_devices
+from keras.src.distribution.distribution_lib import set_distribution
diff --git a/keras/api/_tf_keras/keras/dtype_policies/__init__.py b/keras/api/_tf_keras/keras/dtype_policies/__init__.py
new file mode 100644
index 000000000000..da8364263a22
--- /dev/null
+++ b/keras/api/_tf_keras/keras/dtype_policies/__init__.py
@@ -0,0 +1,10 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.dtype_policies.dtype_policy import DTypePolicy
+from keras.src.dtype_policies.dtype_policy import FloatDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedFloat8DTypePolicy
diff --git a/keras/api/_tf_keras/keras/export/__init__.py b/keras/api/_tf_keras/keras/export/__init__.py
new file mode 100644
index 000000000000..68fa60293961
--- /dev/null
+++ b/keras/api/_tf_keras/keras/export/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.export.export_lib import ExportArchive
diff --git a/keras/api/_tf_keras/keras/initializers/__init__.py b/keras/api/_tf_keras/keras/initializers/__init__.py
new file mode 100644
index 000000000000..5819d1b285eb
--- /dev/null
+++ b/keras/api/_tf_keras/keras/initializers/__init__.py
@@ -0,0 +1,64 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.initializers import deserialize
+from keras.src.initializers import get
+from keras.src.initializers import serialize
+from keras.src.initializers.constant_initializers import Constant
+from keras.src.initializers.constant_initializers import Constant as constant
+from keras.src.initializers.constant_initializers import Identity
+from keras.src.initializers.constant_initializers import (
+    Identity as IdentityInitializer,
+)
+from keras.src.initializers.constant_initializers import Identity as identity
+from keras.src.initializers.constant_initializers import Ones
+from keras.src.initializers.constant_initializers import Ones as ones
+from keras.src.initializers.constant_initializers import Zeros
+from keras.src.initializers.constant_initializers import Zeros as zeros
+from keras.src.initializers.initializer import Initializer
+from keras.src.initializers.random_initializers import GlorotNormal
+from keras.src.initializers.random_initializers import (
+    GlorotNormal as glorot_normal,
+)
+from keras.src.initializers.random_initializers import GlorotUniform
+from keras.src.initializers.random_initializers import (
+    GlorotUniform as glorot_uniform,
+)
+from keras.src.initializers.random_initializers import HeNormal
+from keras.src.initializers.random_initializers import HeNormal as he_normal
+from keras.src.initializers.random_initializers import HeUniform
+from keras.src.initializers.random_initializers import HeUniform as he_uniform
+from keras.src.initializers.random_initializers import LecunNormal
+from keras.src.initializers.random_initializers import (
+    LecunNormal as lecun_normal,
+)
+from keras.src.initializers.random_initializers import LecunUniform
+from keras.src.initializers.random_initializers import (
+    LecunUniform as lecun_uniform,
+)
+from keras.src.initializers.random_initializers import OrthogonalInitializer
+from keras.src.initializers.random_initializers import (
+    OrthogonalInitializer as Orthogonal,
+)
+from keras.src.initializers.random_initializers import (
+    OrthogonalInitializer as orthogonal,
+)
+from keras.src.initializers.random_initializers import RandomNormal
+from keras.src.initializers.random_initializers import (
+    RandomNormal as random_normal,
+)
+from keras.src.initializers.random_initializers import RandomUniform
+from keras.src.initializers.random_initializers import (
+    RandomUniform as random_uniform,
+)
+from keras.src.initializers.random_initializers import TruncatedNormal
+from keras.src.initializers.random_initializers import (
+    TruncatedNormal as truncated_normal,
+)
+from keras.src.initializers.random_initializers import VarianceScaling
+from keras.src.initializers.random_initializers import (
+    VarianceScaling as variance_scaling,
+)
diff --git a/keras/api/_tf_keras/keras/layers/__init__.py b/keras/api/_tf_keras/keras/layers/__init__.py
new file mode 100644
index 000000000000..a4e1bf9a6bbd
--- /dev/null
+++ b/keras/api/_tf_keras/keras/layers/__init__.py
@@ -0,0 +1,195 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.export.export_lib import TFSMLayer
+from keras.src.layers import deserialize
+from keras.src.layers import serialize
+from keras.src.layers.activations.activation import Activation
+from keras.src.layers.activations.elu import ELU
+from keras.src.layers.activations.leaky_relu import LeakyReLU
+from keras.src.layers.activations.prelu import PReLU
+from keras.src.layers.activations.relu import ReLU
+from keras.src.layers.activations.softmax import Softmax
+from keras.src.layers.attention.additive_attention import AdditiveAttention
+from keras.src.layers.attention.attention import Attention
+from keras.src.layers.attention.grouped_query_attention import (
+    GroupedQueryAttention as GroupQueryAttention,
+)
+from keras.src.layers.attention.multi_head_attention import MultiHeadAttention
+from keras.src.layers.convolutional.conv1d import Conv1D
+from keras.src.layers.convolutional.conv1d import Conv1D as Convolution1D
+from keras.src.layers.convolutional.conv1d_transpose import Conv1DTranspose
+from keras.src.layers.convolutional.conv1d_transpose import (
+    Conv1DTranspose as Convolution1DTranspose,
+)
+from keras.src.layers.convolutional.conv2d import Conv2D
+from keras.src.layers.convolutional.conv2d import Conv2D as Convolution2D
+from keras.src.layers.convolutional.conv2d_transpose import Conv2DTranspose
+from keras.src.layers.convolutional.conv2d_transpose import (
+    Conv2DTranspose as Convolution2DTranspose,
+)
+from keras.src.layers.convolutional.conv3d import Conv3D
+from keras.src.layers.convolutional.conv3d import Conv3D as Convolution3D
+from keras.src.layers.convolutional.conv3d_transpose import Conv3DTranspose
+from keras.src.layers.convolutional.conv3d_transpose import (
+    Conv3DTranspose as Convolution3DTranspose,
+)
+from keras.src.layers.convolutional.depthwise_conv1d import DepthwiseConv1D
+from keras.src.layers.convolutional.depthwise_conv2d import DepthwiseConv2D
+from keras.src.layers.convolutional.separable_conv1d import SeparableConv1D
+from keras.src.layers.convolutional.separable_conv1d import (
+    SeparableConv1D as SeparableConvolution1D,
+)
+from keras.src.layers.convolutional.separable_conv2d import SeparableConv2D
+from keras.src.layers.convolutional.separable_conv2d import (
+    SeparableConv2D as SeparableConvolution2D,
+)
+from keras.src.layers.core.dense import Dense
+from keras.src.layers.core.einsum_dense import EinsumDense
+from keras.src.layers.core.embedding import Embedding
+from keras.src.layers.core.identity import Identity
+from keras.src.layers.core.input_layer import Input
+from keras.src.layers.core.input_layer import InputLayer
+from keras.src.layers.core.lambda_layer import Lambda
+from keras.src.layers.core.masking import Masking
+from keras.src.layers.core.wrapper import Wrapper
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.layers.merging.add import Add
+from keras.src.layers.merging.add import add
+from keras.src.layers.merging.average import Average
+from keras.src.layers.merging.average import average
+from keras.src.layers.merging.concatenate import Concatenate
+from keras.src.layers.merging.concatenate import concatenate
+from keras.src.layers.merging.dot import Dot
+from keras.src.layers.merging.dot import dot
+from keras.src.layers.merging.maximum import Maximum
+from keras.src.layers.merging.maximum import maximum
+from keras.src.layers.merging.minimum import Minimum
+from keras.src.layers.merging.minimum import minimum
+from keras.src.layers.merging.multiply import Multiply
+from keras.src.layers.merging.multiply import multiply
+from keras.src.layers.merging.subtract import Subtract
+from keras.src.layers.merging.subtract import subtract
+from keras.src.layers.normalization.batch_normalization import (
+    BatchNormalization,
+)
+from keras.src.layers.normalization.group_normalization import (
+    GroupNormalization,
+)
+from keras.src.layers.normalization.layer_normalization import (
+    LayerNormalization,
+)
+from keras.src.layers.normalization.spectral_normalization import (
+    SpectralNormalization,
+)
+from keras.src.layers.normalization.unit_normalization import UnitNormalization
+from keras.src.layers.pooling.average_pooling1d import AveragePooling1D
+from keras.src.layers.pooling.average_pooling1d import (
+    AveragePooling1D as AvgPool1D,
+)
+from keras.src.layers.pooling.average_pooling2d import AveragePooling2D
+from keras.src.layers.pooling.average_pooling2d import (
+    AveragePooling2D as AvgPool2D,
+)
+from keras.src.layers.pooling.average_pooling3d import AveragePooling3D
+from keras.src.layers.pooling.average_pooling3d import (
+    AveragePooling3D as AvgPool3D,
+)
+from keras.src.layers.pooling.global_average_pooling1d import (
+    GlobalAveragePooling1D,
+)
+from keras.src.layers.pooling.global_average_pooling1d import (
+    GlobalAveragePooling1D as GlobalAvgPool1D,
+)
+from keras.src.layers.pooling.global_average_pooling2d import (
+    GlobalAveragePooling2D,
+)
+from keras.src.layers.pooling.global_average_pooling2d import (
+    GlobalAveragePooling2D as GlobalAvgPool2D,
+)
+from keras.src.layers.pooling.global_average_pooling3d import (
+    GlobalAveragePooling3D,
+)
+from keras.src.layers.pooling.global_average_pooling3d import (
+    GlobalAveragePooling3D as GlobalAvgPool3D,
+)
+from keras.src.layers.pooling.global_max_pooling1d import GlobalMaxPooling1D
+from keras.src.layers.pooling.global_max_pooling1d import (
+    GlobalMaxPooling1D as GlobalMaxPool1D,
+)
+from keras.src.layers.pooling.global_max_pooling2d import GlobalMaxPooling2D
+from keras.src.layers.pooling.global_max_pooling2d import (
+    GlobalMaxPooling2D as GlobalMaxPool2D,
+)
+from keras.src.layers.pooling.global_max_pooling3d import GlobalMaxPooling3D
+from keras.src.layers.pooling.global_max_pooling3d import (
+    GlobalMaxPooling3D as GlobalMaxPool3D,
+)
+from keras.src.layers.pooling.max_pooling1d import MaxPooling1D
+from keras.src.layers.pooling.max_pooling1d import MaxPooling1D as MaxPool1D
+from keras.src.layers.pooling.max_pooling2d import MaxPooling2D
+from keras.src.layers.pooling.max_pooling2d import MaxPooling2D as MaxPool2D
+from keras.src.layers.pooling.max_pooling3d import MaxPooling3D
+from keras.src.layers.pooling.max_pooling3d import MaxPooling3D as MaxPool3D
+from keras.src.layers.preprocessing.audio_preprocessing import MelSpectrogram
+from keras.src.layers.preprocessing.category_encoding import CategoryEncoding
+from keras.src.layers.preprocessing.center_crop import CenterCrop
+from keras.src.layers.preprocessing.discretization import Discretization
+from keras.src.layers.preprocessing.hashed_crossing import HashedCrossing
+from keras.src.layers.preprocessing.hashing import Hashing
+from keras.src.layers.preprocessing.integer_lookup import IntegerLookup
+from keras.src.layers.preprocessing.normalization import Normalization
+from keras.src.layers.preprocessing.random_brightness import RandomBrightness
+from keras.src.layers.preprocessing.random_contrast import RandomContrast
+from keras.src.layers.preprocessing.random_crop import RandomCrop
+from keras.src.layers.preprocessing.random_flip import RandomFlip
+from keras.src.layers.preprocessing.random_rotation import RandomRotation
+from keras.src.layers.preprocessing.random_translation import RandomTranslation
+from keras.src.layers.preprocessing.random_zoom import RandomZoom
+from keras.src.layers.preprocessing.rescaling import Rescaling
+from keras.src.layers.preprocessing.resizing import Resizing
+from keras.src.layers.preprocessing.string_lookup import StringLookup
+from keras.src.layers.preprocessing.text_vectorization import TextVectorization
+from keras.src.layers.regularization.activity_regularization import (
+    ActivityRegularization,
+)
+from keras.src.layers.regularization.alpha_dropout import AlphaDropout
+from keras.src.layers.regularization.dropout import Dropout
+from keras.src.layers.regularization.gaussian_dropout import GaussianDropout
+from keras.src.layers.regularization.gaussian_noise import GaussianNoise
+from keras.src.layers.regularization.spatial_dropout import SpatialDropout1D
+from keras.src.layers.regularization.spatial_dropout import SpatialDropout2D
+from keras.src.layers.regularization.spatial_dropout import SpatialDropout3D
+from keras.src.layers.reshaping.cropping1d import Cropping1D
+from keras.src.layers.reshaping.cropping2d import Cropping2D
+from keras.src.layers.reshaping.cropping3d import Cropping3D
+from keras.src.layers.reshaping.flatten import Flatten
+from keras.src.layers.reshaping.permute import Permute
+from keras.src.layers.reshaping.repeat_vector import RepeatVector
+from keras.src.layers.reshaping.reshape import Reshape
+from keras.src.layers.reshaping.up_sampling1d import UpSampling1D
+from keras.src.layers.reshaping.up_sampling2d import UpSampling2D
+from keras.src.layers.reshaping.up_sampling3d import UpSampling3D
+from keras.src.layers.reshaping.zero_padding1d import ZeroPadding1D
+from keras.src.layers.reshaping.zero_padding2d import ZeroPadding2D
+from keras.src.layers.reshaping.zero_padding3d import ZeroPadding3D
+from keras.src.layers.rnn.bidirectional import Bidirectional
+from keras.src.layers.rnn.conv_lstm1d import ConvLSTM1D
+from keras.src.layers.rnn.conv_lstm2d import ConvLSTM2D
+from keras.src.layers.rnn.conv_lstm3d import ConvLSTM3D
+from keras.src.layers.rnn.gru import GRU
+from keras.src.layers.rnn.gru import GRUCell
+from keras.src.layers.rnn.lstm import LSTM
+from keras.src.layers.rnn.lstm import LSTMCell
+from keras.src.layers.rnn.rnn import RNN
+from keras.src.layers.rnn.simple_rnn import SimpleRNN
+from keras.src.layers.rnn.simple_rnn import SimpleRNNCell
+from keras.src.layers.rnn.stacked_rnn_cells import StackedRNNCells
+from keras.src.layers.rnn.time_distributed import TimeDistributed
+from keras.src.utils.jax_layer import FlaxLayer
+from keras.src.utils.jax_layer import JaxLayer
+from keras.src.utils.torch_utils import TorchModuleWrapper
diff --git a/keras/api/_tf_keras/keras/legacy/__init__.py b/keras/api/_tf_keras/keras/legacy/__init__.py
new file mode 100644
index 000000000000..96347e2c32bf
--- /dev/null
+++ b/keras/api/_tf_keras/keras/legacy/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.legacy import saving
diff --git a/keras/api/_tf_keras/keras/legacy/saving/__init__.py b/keras/api/_tf_keras/keras/legacy/saving/__init__.py
new file mode 100644
index 000000000000..ac4d2d43dd9a
--- /dev/null
+++ b/keras/api/_tf_keras/keras/legacy/saving/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.legacy.saving.serialization import deserialize_keras_object
+from keras.src.legacy.saving.serialization import serialize_keras_object
diff --git a/keras/api/_tf_keras/keras/losses/__init__.py b/keras/api/_tf_keras/keras/losses/__init__.py
new file mode 100644
index 000000000000..ecaadddf6b7e
--- /dev/null
+++ b/keras/api/_tf_keras/keras/losses/__init__.py
@@ -0,0 +1,50 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.losses import deserialize
+from keras.src.losses import get
+from keras.src.losses import serialize
+from keras.src.losses.loss import Loss
+from keras.src.losses.losses import CTC
+from keras.src.losses.losses import BinaryCrossentropy
+from keras.src.losses.losses import BinaryFocalCrossentropy
+from keras.src.losses.losses import CategoricalCrossentropy
+from keras.src.losses.losses import CategoricalFocalCrossentropy
+from keras.src.losses.losses import CategoricalHinge
+from keras.src.losses.losses import CosineSimilarity
+from keras.src.losses.losses import Dice
+from keras.src.losses.losses import Hinge
+from keras.src.losses.losses import Huber
+from keras.src.losses.losses import KLDivergence
+from keras.src.losses.losses import LogCosh
+from keras.src.losses.losses import MeanAbsoluteError
+from keras.src.losses.losses import MeanAbsolutePercentageError
+from keras.src.losses.losses import MeanSquaredError
+from keras.src.losses.losses import MeanSquaredLogarithmicError
+from keras.src.losses.losses import Poisson
+from keras.src.losses.losses import SparseCategoricalCrossentropy
+from keras.src.losses.losses import SquaredHinge
+from keras.src.losses.losses import Tversky
+from keras.src.losses.losses import binary_crossentropy
+from keras.src.losses.losses import binary_focal_crossentropy
+from keras.src.losses.losses import categorical_crossentropy
+from keras.src.losses.losses import categorical_focal_crossentropy
+from keras.src.losses.losses import categorical_hinge
+from keras.src.losses.losses import cosine_similarity
+from keras.src.losses.losses import ctc
+from keras.src.losses.losses import dice
+from keras.src.losses.losses import hinge
+from keras.src.losses.losses import huber
+from keras.src.losses.losses import kl_divergence
+from keras.src.losses.losses import log_cosh
+from keras.src.losses.losses import mean_absolute_error
+from keras.src.losses.losses import mean_absolute_percentage_error
+from keras.src.losses.losses import mean_squared_error
+from keras.src.losses.losses import mean_squared_logarithmic_error
+from keras.src.losses.losses import poisson
+from keras.src.losses.losses import sparse_categorical_crossentropy
+from keras.src.losses.losses import squared_hinge
+from keras.src.losses.losses import tversky
diff --git a/keras/api/_tf_keras/keras/metrics/__init__.py b/keras/api/_tf_keras/keras/metrics/__init__.py
new file mode 100644
index 000000000000..dc59b32a46c3
--- /dev/null
+++ b/keras/api/_tf_keras/keras/metrics/__init__.py
@@ -0,0 +1,76 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.losses.losses import binary_crossentropy
+from keras.src.losses.losses import binary_focal_crossentropy
+from keras.src.losses.losses import categorical_crossentropy
+from keras.src.losses.losses import categorical_focal_crossentropy
+from keras.src.losses.losses import categorical_hinge
+from keras.src.losses.losses import hinge
+from keras.src.losses.losses import huber
+from keras.src.losses.losses import kl_divergence
+from keras.src.losses.losses import log_cosh
+from keras.src.losses.losses import mean_absolute_error
+from keras.src.losses.losses import mean_absolute_percentage_error
+from keras.src.losses.losses import mean_squared_error
+from keras.src.losses.losses import mean_squared_logarithmic_error
+from keras.src.losses.losses import poisson
+from keras.src.losses.losses import sparse_categorical_crossentropy
+from keras.src.losses.losses import squared_hinge
+from keras.src.metrics import deserialize
+from keras.src.metrics import get
+from keras.src.metrics import serialize
+from keras.src.metrics.accuracy_metrics import Accuracy
+from keras.src.metrics.accuracy_metrics import BinaryAccuracy
+from keras.src.metrics.accuracy_metrics import CategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import SparseCategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import SparseTopKCategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import TopKCategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import binary_accuracy
+from keras.src.metrics.accuracy_metrics import categorical_accuracy
+from keras.src.metrics.accuracy_metrics import sparse_categorical_accuracy
+from keras.src.metrics.accuracy_metrics import sparse_top_k_categorical_accuracy
+from keras.src.metrics.accuracy_metrics import top_k_categorical_accuracy
+from keras.src.metrics.confusion_metrics import AUC
+from keras.src.metrics.confusion_metrics import FalseNegatives
+from keras.src.metrics.confusion_metrics import FalsePositives
+from keras.src.metrics.confusion_metrics import Precision
+from keras.src.metrics.confusion_metrics import PrecisionAtRecall
+from keras.src.metrics.confusion_metrics import Recall
+from keras.src.metrics.confusion_metrics import RecallAtPrecision
+from keras.src.metrics.confusion_metrics import SensitivityAtSpecificity
+from keras.src.metrics.confusion_metrics import SpecificityAtSensitivity
+from keras.src.metrics.confusion_metrics import TrueNegatives
+from keras.src.metrics.confusion_metrics import TruePositives
+from keras.src.metrics.f_score_metrics import F1Score
+from keras.src.metrics.f_score_metrics import FBetaScore
+from keras.src.metrics.hinge_metrics import CategoricalHinge
+from keras.src.metrics.hinge_metrics import Hinge
+from keras.src.metrics.hinge_metrics import SquaredHinge
+from keras.src.metrics.iou_metrics import BinaryIoU
+from keras.src.metrics.iou_metrics import IoU
+from keras.src.metrics.iou_metrics import MeanIoU
+from keras.src.metrics.iou_metrics import OneHotIoU
+from keras.src.metrics.iou_metrics import OneHotMeanIoU
+from keras.src.metrics.metric import Metric
+from keras.src.metrics.probabilistic_metrics import BinaryCrossentropy
+from keras.src.metrics.probabilistic_metrics import CategoricalCrossentropy
+from keras.src.metrics.probabilistic_metrics import KLDivergence
+from keras.src.metrics.probabilistic_metrics import Poisson
+from keras.src.metrics.probabilistic_metrics import (
+    SparseCategoricalCrossentropy,
+)
+from keras.src.metrics.reduction_metrics import Mean
+from keras.src.metrics.reduction_metrics import MeanMetricWrapper
+from keras.src.metrics.reduction_metrics import Sum
+from keras.src.metrics.regression_metrics import CosineSimilarity
+from keras.src.metrics.regression_metrics import LogCoshError
+from keras.src.metrics.regression_metrics import MeanAbsoluteError
+from keras.src.metrics.regression_metrics import MeanAbsolutePercentageError
+from keras.src.metrics.regression_metrics import MeanSquaredError
+from keras.src.metrics.regression_metrics import MeanSquaredLogarithmicError
+from keras.src.metrics.regression_metrics import R2Score
+from keras.src.metrics.regression_metrics import RootMeanSquaredError
diff --git a/keras/api/_tf_keras/keras/mixed_precision/__init__.py b/keras/api/_tf_keras/keras/mixed_precision/__init__.py
new file mode 100644
index 000000000000..85a421651d16
--- /dev/null
+++ b/keras/api/_tf_keras/keras/mixed_precision/__init__.py
@@ -0,0 +1,15 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.dtype_policies.dtype_policy import DTypePolicy
+from keras.src.dtype_policies.dtype_policy import DTypePolicy as Policy
+from keras.src.dtype_policies.dtype_policy import dtype_policy
+from keras.src.dtype_policies.dtype_policy import dtype_policy as global_policy
+from keras.src.dtype_policies.dtype_policy import set_dtype_policy
+from keras.src.dtype_policies.dtype_policy import (
+    set_dtype_policy as set_global_policy,
+)
+from keras.src.optimizers.loss_scale_optimizer import LossScaleOptimizer
diff --git a/keras/api/_tf_keras/keras/models/__init__.py b/keras/api/_tf_keras/keras/models/__init__.py
new file mode 100644
index 000000000000..48760da64791
--- /dev/null
+++ b/keras/api/_tf_keras/keras/models/__init__.py
@@ -0,0 +1,12 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.models.cloning import clone_model
+from keras.src.models.model import Model
+from keras.src.models.model import model_from_json
+from keras.src.models.sequential import Sequential
+from keras.src.saving.saving_api import load_model
+from keras.src.saving.saving_api import save_model
diff --git a/keras/api/_tf_keras/keras/ops/__init__.py b/keras/api/_tf_keras/keras/ops/__init__.py
new file mode 100644
index 000000000000..1253650e9bc0
--- /dev/null
+++ b/keras/api/_tf_keras/keras/ops/__init__.py
@@ -0,0 +1,223 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.ops import image
+from keras.api.ops import linalg
+from keras.api.ops import nn
+from keras.api.ops import numpy
+from keras.src.ops.core import cast
+from keras.src.ops.core import cond
+from keras.src.ops.core import convert_to_numpy
+from keras.src.ops.core import convert_to_tensor
+from keras.src.ops.core import custom_gradient
+from keras.src.ops.core import fori_loop
+from keras.src.ops.core import is_tensor
+from keras.src.ops.core import scatter
+from keras.src.ops.core import scatter_update
+from keras.src.ops.core import shape
+from keras.src.ops.core import slice
+from keras.src.ops.core import slice_update
+from keras.src.ops.core import stop_gradient
+from keras.src.ops.core import unstack
+from keras.src.ops.core import vectorized_map
+from keras.src.ops.core import while_loop
+from keras.src.ops.linalg import cholesky
+from keras.src.ops.linalg import det
+from keras.src.ops.linalg import eig
+from keras.src.ops.linalg import inv
+from keras.src.ops.linalg import lu_factor
+from keras.src.ops.linalg import norm
+from keras.src.ops.linalg import qr
+from keras.src.ops.linalg import solve
+from keras.src.ops.linalg import solve_triangular
+from keras.src.ops.linalg import svd
+from keras.src.ops.math import erf
+from keras.src.ops.math import erfinv
+from keras.src.ops.math import extract_sequences
+from keras.src.ops.math import fft
+from keras.src.ops.math import fft2
+from keras.src.ops.math import in_top_k
+from keras.src.ops.math import irfft
+from keras.src.ops.math import istft
+from keras.src.ops.math import logsumexp
+from keras.src.ops.math import rfft
+from keras.src.ops.math import rsqrt
+from keras.src.ops.math import segment_max
+from keras.src.ops.math import segment_sum
+from keras.src.ops.math import stft
+from keras.src.ops.math import top_k
+from keras.src.ops.nn import average_pool
+from keras.src.ops.nn import batch_normalization
+from keras.src.ops.nn import binary_crossentropy
+from keras.src.ops.nn import categorical_crossentropy
+from keras.src.ops.nn import conv
+from keras.src.ops.nn import conv_transpose
+from keras.src.ops.nn import ctc_loss
+from keras.src.ops.nn import depthwise_conv
+from keras.src.ops.nn import elu
+from keras.src.ops.nn import gelu
+from keras.src.ops.nn import hard_sigmoid
+from keras.src.ops.nn import hard_silu
+from keras.src.ops.nn import hard_silu as hard_swish
+from keras.src.ops.nn import leaky_relu
+from keras.src.ops.nn import log_sigmoid
+from keras.src.ops.nn import log_softmax
+from keras.src.ops.nn import max_pool
+from keras.src.ops.nn import moments
+from keras.src.ops.nn import multi_hot
+from keras.src.ops.nn import normalize
+from keras.src.ops.nn import one_hot
+from keras.src.ops.nn import relu
+from keras.src.ops.nn import relu6
+from keras.src.ops.nn import selu
+from keras.src.ops.nn import separable_conv
+from keras.src.ops.nn import sigmoid
+from keras.src.ops.nn import silu
+from keras.src.ops.nn import silu as swish
+from keras.src.ops.nn import softmax
+from keras.src.ops.nn import softplus
+from keras.src.ops.nn import softsign
+from keras.src.ops.nn import sparse_categorical_crossentropy
+from keras.src.ops.numpy import abs
+from keras.src.ops.numpy import absolute
+from keras.src.ops.numpy import add
+from keras.src.ops.numpy import all
+from keras.src.ops.numpy import amax
+from keras.src.ops.numpy import amin
+from keras.src.ops.numpy import any
+from keras.src.ops.numpy import append
+from keras.src.ops.numpy import arange
+from keras.src.ops.numpy import arccos
+from keras.src.ops.numpy import arccosh
+from keras.src.ops.numpy import arcsin
+from keras.src.ops.numpy import arcsinh
+from keras.src.ops.numpy import arctan
+from keras.src.ops.numpy import arctan2
+from keras.src.ops.numpy import arctanh
+from keras.src.ops.numpy import argmax
+from keras.src.ops.numpy import argmin
+from keras.src.ops.numpy import argsort
+from keras.src.ops.numpy import array
+from keras.src.ops.numpy import average
+from keras.src.ops.numpy import bincount
+from keras.src.ops.numpy import broadcast_to
+from keras.src.ops.numpy import ceil
+from keras.src.ops.numpy import clip
+from keras.src.ops.numpy import concatenate
+from keras.src.ops.numpy import conj
+from keras.src.ops.numpy import conjugate
+from keras.src.ops.numpy import copy
+from keras.src.ops.numpy import correlate
+from keras.src.ops.numpy import cos
+from keras.src.ops.numpy import cosh
+from keras.src.ops.numpy import count_nonzero
+from keras.src.ops.numpy import cross
+from keras.src.ops.numpy import cumprod
+from keras.src.ops.numpy import cumsum
+from keras.src.ops.numpy import diag
+from keras.src.ops.numpy import diagonal
+from keras.src.ops.numpy import diff
+from keras.src.ops.numpy import digitize
+from keras.src.ops.numpy import divide
+from keras.src.ops.numpy import divide_no_nan
+from keras.src.ops.numpy import dot
+from keras.src.ops.numpy import einsum
+from keras.src.ops.numpy import empty
+from keras.src.ops.numpy import equal
+from keras.src.ops.numpy import exp
+from keras.src.ops.numpy import expand_dims
+from keras.src.ops.numpy import expm1
+from keras.src.ops.numpy import eye
+from keras.src.ops.numpy import flip
+from keras.src.ops.numpy import floor
+from keras.src.ops.numpy import floor_divide
+from keras.src.ops.numpy import full
+from keras.src.ops.numpy import full_like
+from keras.src.ops.numpy import get_item
+from keras.src.ops.numpy import greater
+from keras.src.ops.numpy import greater_equal
+from keras.src.ops.numpy import hstack
+from keras.src.ops.numpy import identity
+from keras.src.ops.numpy import imag
+from keras.src.ops.numpy import isclose
+from keras.src.ops.numpy import isfinite
+from keras.src.ops.numpy import isinf
+from keras.src.ops.numpy import isnan
+from keras.src.ops.numpy import less
+from keras.src.ops.numpy import less_equal
+from keras.src.ops.numpy import linspace
+from keras.src.ops.numpy import log
+from keras.src.ops.numpy import log1p
+from keras.src.ops.numpy import log2
+from keras.src.ops.numpy import log10
+from keras.src.ops.numpy import logaddexp
+from keras.src.ops.numpy import logical_and
+from keras.src.ops.numpy import logical_not
+from keras.src.ops.numpy import logical_or
+from keras.src.ops.numpy import logical_xor
+from keras.src.ops.numpy import logspace
+from keras.src.ops.numpy import matmul
+from keras.src.ops.numpy import max
+from keras.src.ops.numpy import maximum
+from keras.src.ops.numpy import mean
+from keras.src.ops.numpy import median
+from keras.src.ops.numpy import meshgrid
+from keras.src.ops.numpy import min
+from keras.src.ops.numpy import minimum
+from keras.src.ops.numpy import mod
+from keras.src.ops.numpy import moveaxis
+from keras.src.ops.numpy import multiply
+from keras.src.ops.numpy import nan_to_num
+from keras.src.ops.numpy import ndim
+from keras.src.ops.numpy import negative
+from keras.src.ops.numpy import nonzero
+from keras.src.ops.numpy import not_equal
+from keras.src.ops.numpy import ones
+from keras.src.ops.numpy import ones_like
+from keras.src.ops.numpy import outer
+from keras.src.ops.numpy import pad
+from keras.src.ops.numpy import power
+from keras.src.ops.numpy import prod
+from keras.src.ops.numpy import quantile
+from keras.src.ops.numpy import ravel
+from keras.src.ops.numpy import real
+from keras.src.ops.numpy import reciprocal
+from keras.src.ops.numpy import repeat
+from keras.src.ops.numpy import reshape
+from keras.src.ops.numpy import roll
+from keras.src.ops.numpy import round
+from keras.src.ops.numpy import sign
+from keras.src.ops.numpy import sin
+from keras.src.ops.numpy import sinh
+from keras.src.ops.numpy import size
+from keras.src.ops.numpy import sort
+from keras.src.ops.numpy import split
+from keras.src.ops.numpy import sqrt
+from keras.src.ops.numpy import square
+from keras.src.ops.numpy import squeeze
+from keras.src.ops.numpy import stack
+from keras.src.ops.numpy import std
+from keras.src.ops.numpy import subtract
+from keras.src.ops.numpy import sum
+from keras.src.ops.numpy import swapaxes
+from keras.src.ops.numpy import take
+from keras.src.ops.numpy import take_along_axis
+from keras.src.ops.numpy import tan
+from keras.src.ops.numpy import tanh
+from keras.src.ops.numpy import tensordot
+from keras.src.ops.numpy import tile
+from keras.src.ops.numpy import trace
+from keras.src.ops.numpy import transpose
+from keras.src.ops.numpy import tri
+from keras.src.ops.numpy import tril
+from keras.src.ops.numpy import triu
+from keras.src.ops.numpy import true_divide
+from keras.src.ops.numpy import var
+from keras.src.ops.numpy import vdot
+from keras.src.ops.numpy import vstack
+from keras.src.ops.numpy import where
+from keras.src.ops.numpy import zeros
+from keras.src.ops.numpy import zeros_like
diff --git a/keras/api/_tf_keras/keras/ops/image/__init__.py b/keras/api/_tf_keras/keras/ops/image/__init__.py
new file mode 100644
index 000000000000..e4c8464c2195
--- /dev/null
+++ b/keras/api/_tf_keras/keras/ops/image/__init__.py
@@ -0,0 +1,13 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.ops.image import affine_transform
+from keras.src.ops.image import crop_images
+from keras.src.ops.image import extract_patches
+from keras.src.ops.image import map_coordinates
+from keras.src.ops.image import pad_images
+from keras.src.ops.image import resize
+from keras.src.ops.image import rgb_to_grayscale
diff --git a/keras/api/_tf_keras/keras/ops/linalg/__init__.py b/keras/api/_tf_keras/keras/ops/linalg/__init__.py
new file mode 100644
index 000000000000..da392d6c2490
--- /dev/null
+++ b/keras/api/_tf_keras/keras/ops/linalg/__init__.py
@@ -0,0 +1,16 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.ops.linalg import cholesky
+from keras.src.ops.linalg import det
+from keras.src.ops.linalg import eig
+from keras.src.ops.linalg import inv
+from keras.src.ops.linalg import lu_factor
+from keras.src.ops.linalg import norm
+from keras.src.ops.linalg import qr
+from keras.src.ops.linalg import solve
+from keras.src.ops.linalg import solve_triangular
+from keras.src.ops.linalg import svd
diff --git a/keras/api/_tf_keras/keras/ops/nn/__init__.py b/keras/api/_tf_keras/keras/ops/nn/__init__.py
new file mode 100644
index 000000000000..9452ea18a766
--- /dev/null
+++ b/keras/api/_tf_keras/keras/ops/nn/__init__.py
@@ -0,0 +1,38 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.ops.nn import average_pool
+from keras.src.ops.nn import batch_normalization
+from keras.src.ops.nn import binary_crossentropy
+from keras.src.ops.nn import categorical_crossentropy
+from keras.src.ops.nn import conv
+from keras.src.ops.nn import conv_transpose
+from keras.src.ops.nn import ctc_loss
+from keras.src.ops.nn import depthwise_conv
+from keras.src.ops.nn import elu
+from keras.src.ops.nn import gelu
+from keras.src.ops.nn import hard_sigmoid
+from keras.src.ops.nn import hard_silu
+from keras.src.ops.nn import hard_silu as hard_swish
+from keras.src.ops.nn import leaky_relu
+from keras.src.ops.nn import log_sigmoid
+from keras.src.ops.nn import log_softmax
+from keras.src.ops.nn import max_pool
+from keras.src.ops.nn import moments
+from keras.src.ops.nn import multi_hot
+from keras.src.ops.nn import normalize
+from keras.src.ops.nn import one_hot
+from keras.src.ops.nn import relu
+from keras.src.ops.nn import relu6
+from keras.src.ops.nn import selu
+from keras.src.ops.nn import separable_conv
+from keras.src.ops.nn import sigmoid
+from keras.src.ops.nn import silu
+from keras.src.ops.nn import silu as swish
+from keras.src.ops.nn import softmax
+from keras.src.ops.nn import softplus
+from keras.src.ops.nn import softsign
+from keras.src.ops.nn import sparse_categorical_crossentropy
diff --git a/keras/api/_tf_keras/keras/ops/numpy/__init__.py b/keras/api/_tf_keras/keras/ops/numpy/__init__.py
new file mode 100644
index 000000000000..1d5434e40288
--- /dev/null
+++ b/keras/api/_tf_keras/keras/ops/numpy/__init__.py
@@ -0,0 +1,146 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.ops.numpy import abs
+from keras.src.ops.numpy import absolute
+from keras.src.ops.numpy import add
+from keras.src.ops.numpy import all
+from keras.src.ops.numpy import amax
+from keras.src.ops.numpy import amin
+from keras.src.ops.numpy import any
+from keras.src.ops.numpy import append
+from keras.src.ops.numpy import arange
+from keras.src.ops.numpy import arccos
+from keras.src.ops.numpy import arccosh
+from keras.src.ops.numpy import arcsin
+from keras.src.ops.numpy import arcsinh
+from keras.src.ops.numpy import arctan
+from keras.src.ops.numpy import arctan2
+from keras.src.ops.numpy import arctanh
+from keras.src.ops.numpy import argmax
+from keras.src.ops.numpy import argmin
+from keras.src.ops.numpy import argsort
+from keras.src.ops.numpy import array
+from keras.src.ops.numpy import average
+from keras.src.ops.numpy import bincount
+from keras.src.ops.numpy import broadcast_to
+from keras.src.ops.numpy import ceil
+from keras.src.ops.numpy import clip
+from keras.src.ops.numpy import concatenate
+from keras.src.ops.numpy import conj
+from keras.src.ops.numpy import conjugate
+from keras.src.ops.numpy import copy
+from keras.src.ops.numpy import correlate
+from keras.src.ops.numpy import cos
+from keras.src.ops.numpy import cosh
+from keras.src.ops.numpy import count_nonzero
+from keras.src.ops.numpy import cross
+from keras.src.ops.numpy import cumprod
+from keras.src.ops.numpy import cumsum
+from keras.src.ops.numpy import diag
+from keras.src.ops.numpy import diagonal
+from keras.src.ops.numpy import diff
+from keras.src.ops.numpy import digitize
+from keras.src.ops.numpy import divide
+from keras.src.ops.numpy import divide_no_nan
+from keras.src.ops.numpy import dot
+from keras.src.ops.numpy import einsum
+from keras.src.ops.numpy import empty
+from keras.src.ops.numpy import equal
+from keras.src.ops.numpy import exp
+from keras.src.ops.numpy import expand_dims
+from keras.src.ops.numpy import expm1
+from keras.src.ops.numpy import eye
+from keras.src.ops.numpy import flip
+from keras.src.ops.numpy import floor
+from keras.src.ops.numpy import floor_divide
+from keras.src.ops.numpy import full
+from keras.src.ops.numpy import full_like
+from keras.src.ops.numpy import get_item
+from keras.src.ops.numpy import greater
+from keras.src.ops.numpy import greater_equal
+from keras.src.ops.numpy import hstack
+from keras.src.ops.numpy import identity
+from keras.src.ops.numpy import imag
+from keras.src.ops.numpy import isclose
+from keras.src.ops.numpy import isfinite
+from keras.src.ops.numpy import isinf
+from keras.src.ops.numpy import isnan
+from keras.src.ops.numpy import less
+from keras.src.ops.numpy import less_equal
+from keras.src.ops.numpy import linspace
+from keras.src.ops.numpy import log
+from keras.src.ops.numpy import log1p
+from keras.src.ops.numpy import log2
+from keras.src.ops.numpy import log10
+from keras.src.ops.numpy import logaddexp
+from keras.src.ops.numpy import logical_and
+from keras.src.ops.numpy import logical_not
+from keras.src.ops.numpy import logical_or
+from keras.src.ops.numpy import logical_xor
+from keras.src.ops.numpy import logspace
+from keras.src.ops.numpy import matmul
+from keras.src.ops.numpy import max
+from keras.src.ops.numpy import maximum
+from keras.src.ops.numpy import mean
+from keras.src.ops.numpy import median
+from keras.src.ops.numpy import meshgrid
+from keras.src.ops.numpy import min
+from keras.src.ops.numpy import minimum
+from keras.src.ops.numpy import mod
+from keras.src.ops.numpy import moveaxis
+from keras.src.ops.numpy import multiply
+from keras.src.ops.numpy import nan_to_num
+from keras.src.ops.numpy import ndim
+from keras.src.ops.numpy import negative
+from keras.src.ops.numpy import nonzero
+from keras.src.ops.numpy import not_equal
+from keras.src.ops.numpy import ones
+from keras.src.ops.numpy import ones_like
+from keras.src.ops.numpy import outer
+from keras.src.ops.numpy import pad
+from keras.src.ops.numpy import power
+from keras.src.ops.numpy import prod
+from keras.src.ops.numpy import quantile
+from keras.src.ops.numpy import ravel
+from keras.src.ops.numpy import real
+from keras.src.ops.numpy import reciprocal
+from keras.src.ops.numpy import repeat
+from keras.src.ops.numpy import reshape
+from keras.src.ops.numpy import roll
+from keras.src.ops.numpy import round
+from keras.src.ops.numpy import sign
+from keras.src.ops.numpy import sin
+from keras.src.ops.numpy import sinh
+from keras.src.ops.numpy import size
+from keras.src.ops.numpy import sort
+from keras.src.ops.numpy import split
+from keras.src.ops.numpy import sqrt
+from keras.src.ops.numpy import square
+from keras.src.ops.numpy import squeeze
+from keras.src.ops.numpy import stack
+from keras.src.ops.numpy import std
+from keras.src.ops.numpy import subtract
+from keras.src.ops.numpy import sum
+from keras.src.ops.numpy import swapaxes
+from keras.src.ops.numpy import take
+from keras.src.ops.numpy import take_along_axis
+from keras.src.ops.numpy import tan
+from keras.src.ops.numpy import tanh
+from keras.src.ops.numpy import tensordot
+from keras.src.ops.numpy import tile
+from keras.src.ops.numpy import trace
+from keras.src.ops.numpy import transpose
+from keras.src.ops.numpy import tri
+from keras.src.ops.numpy import tril
+from keras.src.ops.numpy import triu
+from keras.src.ops.numpy import true_divide
+from keras.src.ops.numpy import var
+from keras.src.ops.numpy import vdot
+from keras.src.ops.numpy import vstack
+from keras.src.ops.numpy import where
+from keras.src.ops.numpy import zeros
+from keras.src.ops.numpy import zeros_like
diff --git a/keras/api/_tf_keras/keras/optimizers/__init__.py b/keras/api/_tf_keras/keras/optimizers/__init__.py
new file mode 100644
index 000000000000..5dab6705b58d
--- /dev/null
+++ b/keras/api/_tf_keras/keras/optimizers/__init__.py
@@ -0,0 +1,24 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.optimizers import legacy
+from keras.api.optimizers import schedules
+from keras.src.optimizers import deserialize
+from keras.src.optimizers import get
+from keras.src.optimizers import serialize
+from keras.src.optimizers.adadelta import Adadelta
+from keras.src.optimizers.adafactor import Adafactor
+from keras.src.optimizers.adagrad import Adagrad
+from keras.src.optimizers.adam import Adam
+from keras.src.optimizers.adamax import Adamax
+from keras.src.optimizers.adamw import AdamW
+from keras.src.optimizers.ftrl import Ftrl
+from keras.src.optimizers.lion import Lion
+from keras.src.optimizers.loss_scale_optimizer import LossScaleOptimizer
+from keras.src.optimizers.nadam import Nadam
+from keras.src.optimizers.optimizer import Optimizer
+from keras.src.optimizers.rmsprop import RMSprop
+from keras.src.optimizers.sgd import SGD
diff --git a/keras/api/_tf_keras/keras/optimizers/legacy/__init__.py b/keras/api/_tf_keras/keras/optimizers/legacy/__init__.py
new file mode 100644
index 000000000000..bff1a0313630
--- /dev/null
+++ b/keras/api/_tf_keras/keras/optimizers/legacy/__init__.py
@@ -0,0 +1,12 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.optimizers import LegacyOptimizerWarning as Adagrad
+from keras.src.optimizers import LegacyOptimizerWarning as Adam
+from keras.src.optimizers import LegacyOptimizerWarning as Ftrl
+from keras.src.optimizers import LegacyOptimizerWarning as Optimizer
+from keras.src.optimizers import LegacyOptimizerWarning as RMSprop
+from keras.src.optimizers import LegacyOptimizerWarning as SGD
diff --git a/keras/api/_tf_keras/keras/optimizers/schedules/__init__.py b/keras/api/_tf_keras/keras/optimizers/schedules/__init__.py
new file mode 100644
index 000000000000..6178626258ed
--- /dev/null
+++ b/keras/api/_tf_keras/keras/optimizers/schedules/__init__.py
@@ -0,0 +1,27 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.optimizers.schedules.learning_rate_schedule import CosineDecay
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    CosineDecayRestarts,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    ExponentialDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    InverseTimeDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    LearningRateSchedule,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    PiecewiseConstantDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    PolynomialDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import deserialize
+from keras.src.optimizers.schedules.learning_rate_schedule import serialize
diff --git a/keras/api/_tf_keras/keras/preprocessing/__init__.py b/keras/api/_tf_keras/keras/preprocessing/__init__.py
new file mode 100644
index 000000000000..c9ed7fd664c2
--- /dev/null
+++ b/keras/api/_tf_keras/keras/preprocessing/__init__.py
@@ -0,0 +1,13 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.preprocessing import image
+from keras.api.preprocessing import sequence
+from keras.src.utils.image_dataset_utils import image_dataset_from_directory
+from keras.src.utils.text_dataset_utils import text_dataset_from_directory
+from keras.src.utils.timeseries_dataset_utils import (
+    timeseries_dataset_from_array,
+)
diff --git a/keras/api/_tf_keras/keras/preprocessing/image/__init__.py b/keras/api/_tf_keras/keras/preprocessing/image/__init__.py
new file mode 100644
index 000000000000..f68afe8789d5
--- /dev/null
+++ b/keras/api/_tf_keras/keras/preprocessing/image/__init__.py
@@ -0,0 +1,11 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.utils.image_utils import array_to_img
+from keras.src.utils.image_utils import img_to_array
+from keras.src.utils.image_utils import load_img
+from keras.src.utils.image_utils import save_img
+from keras.src.utils.image_utils import smart_resize
diff --git a/keras/api/_tf_keras/keras/preprocessing/sequence/__init__.py b/keras/api/_tf_keras/keras/preprocessing/sequence/__init__.py
new file mode 100644
index 000000000000..188e01af9c48
--- /dev/null
+++ b/keras/api/_tf_keras/keras/preprocessing/sequence/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.utils.sequence_utils import pad_sequences
diff --git a/keras/api/_tf_keras/keras/quantizers/__init__.py b/keras/api/_tf_keras/keras/quantizers/__init__.py
new file mode 100644
index 000000000000..d8a209bbb623
--- /dev/null
+++ b/keras/api/_tf_keras/keras/quantizers/__init__.py
@@ -0,0 +1,15 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.quantizers import deserialize
+from keras.src.quantizers import get
+from keras.src.quantizers import serialize
+from keras.src.quantizers.quantizers import AbsMaxQuantizer
+from keras.src.quantizers.quantizers import Quantizer
+from keras.src.quantizers.quantizers import abs_max_quantize
+from keras.src.quantizers.quantizers import compute_float8_amax_history
+from keras.src.quantizers.quantizers import compute_float8_scale
+from keras.src.quantizers.quantizers import quantize_and_dequantize
diff --git a/keras/api/_tf_keras/keras/random/__init__.py b/keras/api/_tf_keras/keras/random/__init__.py
new file mode 100644
index 000000000000..faf9c67f3fc4
--- /dev/null
+++ b/keras/api/_tf_keras/keras/random/__init__.py
@@ -0,0 +1,17 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.random.random import beta
+from keras.src.random.random import binomial
+from keras.src.random.random import categorical
+from keras.src.random.random import dropout
+from keras.src.random.random import gamma
+from keras.src.random.random import normal
+from keras.src.random.random import randint
+from keras.src.random.random import shuffle
+from keras.src.random.random import truncated_normal
+from keras.src.random.random import uniform
+from keras.src.random.seed_generator import SeedGenerator
diff --git a/keras/api/_tf_keras/keras/regularizers/__init__.py b/keras/api/_tf_keras/keras/regularizers/__init__.py
new file mode 100644
index 000000000000..93b51eaa51bd
--- /dev/null
+++ b/keras/api/_tf_keras/keras/regularizers/__init__.py
@@ -0,0 +1,20 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.regularizers import deserialize
+from keras.src.regularizers import get
+from keras.src.regularizers import serialize
+from keras.src.regularizers.regularizers import L1
+from keras.src.regularizers.regularizers import L1 as l1
+from keras.src.regularizers.regularizers import L1L2
+from keras.src.regularizers.regularizers import L1L2 as l1_l2
+from keras.src.regularizers.regularizers import L2
+from keras.src.regularizers.regularizers import L2 as l2
+from keras.src.regularizers.regularizers import OrthogonalRegularizer
+from keras.src.regularizers.regularizers import (
+    OrthogonalRegularizer as orthogonal_regularizer,
+)
+from keras.src.regularizers.regularizers import Regularizer
diff --git a/keras/api/_tf_keras/keras/saving/__init__.py b/keras/api/_tf_keras/keras/saving/__init__.py
new file mode 100644
index 000000000000..2f772922f8d1
--- /dev/null
+++ b/keras/api/_tf_keras/keras/saving/__init__.py
@@ -0,0 +1,20 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.saving.object_registration import CustomObjectScope
+from keras.src.saving.object_registration import (
+    CustomObjectScope as custom_object_scope,
+)
+from keras.src.saving.object_registration import get_custom_objects
+from keras.src.saving.object_registration import get_registered_name
+from keras.src.saving.object_registration import get_registered_object
+from keras.src.saving.object_registration import register_keras_serializable
+from keras.src.saving.saving_api import load_model
+from keras.src.saving.saving_api import load_weights
+from keras.src.saving.saving_api import save_model
+from keras.src.saving.saving_api import save_weights
+from keras.src.saving.serialization_lib import deserialize_keras_object
+from keras.src.saving.serialization_lib import serialize_keras_object
diff --git a/keras/api/_tf_keras/keras/tree/__init__.py b/keras/api/_tf_keras/keras/tree/__init__.py
new file mode 100644
index 000000000000..388d19a0ec26
--- /dev/null
+++ b/keras/api/_tf_keras/keras/tree/__init__.py
@@ -0,0 +1,15 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.tree.tree_api import assert_same_structure
+from keras.src.tree.tree_api import flatten
+from keras.src.tree.tree_api import is_nested
+from keras.src.tree.tree_api import lists_to_tuples
+from keras.src.tree.tree_api import map_shape_structure
+from keras.src.tree.tree_api import map_structure
+from keras.src.tree.tree_api import map_structure_up_to
+from keras.src.tree.tree_api import pack_sequence_as
+from keras.src.tree.tree_api import traverse
diff --git a/keras/api/_tf_keras/keras/utils/__init__.py b/keras/api/_tf_keras/keras/utils/__init__.py
new file mode 100644
index 000000000000..aab787cc930f
--- /dev/null
+++ b/keras/api/_tf_keras/keras/utils/__init__.py
@@ -0,0 +1,54 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.utils import legacy
+from keras.src.backend.common.global_state import clear_session
+from keras.src.backend.common.keras_tensor import is_keras_tensor
+from keras.src.backend.common.variables import standardize_dtype
+from keras.src.layers.preprocessing.feature_space import FeatureSpace
+from keras.src.ops.operation_utils import get_source_inputs
+from keras.src.saving.object_registration import CustomObjectScope
+from keras.src.saving.object_registration import (
+    CustomObjectScope as custom_object_scope,
+)
+from keras.src.saving.object_registration import get_custom_objects
+from keras.src.saving.object_registration import get_registered_name
+from keras.src.saving.object_registration import get_registered_object
+from keras.src.saving.object_registration import register_keras_serializable
+from keras.src.saving.serialization_lib import deserialize_keras_object
+from keras.src.saving.serialization_lib import serialize_keras_object
+from keras.src.trainers.data_adapters.data_adapter_utils import (
+    pack_x_y_sample_weight,
+)
+from keras.src.trainers.data_adapters.data_adapter_utils import (
+    unpack_x_y_sample_weight,
+)
+from keras.src.trainers.data_adapters.py_dataset_adapter import PyDataset
+from keras.src.trainers.data_adapters.py_dataset_adapter import (
+    PyDataset as Sequence,
+)
+from keras.src.utils.audio_dataset_utils import audio_dataset_from_directory
+from keras.src.utils.dataset_utils import split_dataset
+from keras.src.utils.file_utils import get_file
+from keras.src.utils.image_dataset_utils import image_dataset_from_directory
+from keras.src.utils.image_utils import array_to_img
+from keras.src.utils.image_utils import img_to_array
+from keras.src.utils.image_utils import load_img
+from keras.src.utils.image_utils import save_img
+from keras.src.utils.io_utils import disable_interactive_logging
+from keras.src.utils.io_utils import enable_interactive_logging
+from keras.src.utils.io_utils import is_interactive_logging_enabled
+from keras.src.utils.model_visualization import model_to_dot
+from keras.src.utils.model_visualization import plot_model
+from keras.src.utils.numerical_utils import normalize
+from keras.src.utils.numerical_utils import to_categorical
+from keras.src.utils.progbar import Progbar
+from keras.src.utils.rng_utils import set_random_seed
+from keras.src.utils.sequence_utils import pad_sequences
+from keras.src.utils.text_dataset_utils import text_dataset_from_directory
+from keras.src.utils.timeseries_dataset_utils import (
+    timeseries_dataset_from_array,
+)
diff --git a/keras/api/_tf_keras/keras/utils/legacy/__init__.py b/keras/api/_tf_keras/keras/utils/legacy/__init__.py
new file mode 100644
index 000000000000..ac4d2d43dd9a
--- /dev/null
+++ b/keras/api/_tf_keras/keras/utils/legacy/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.legacy.saving.serialization import deserialize_keras_object
+from keras.src.legacy.saving.serialization import serialize_keras_object
diff --git a/keras/api/activations/__init__.py b/keras/api/activations/__init__.py
new file mode 100644
index 000000000000..17624b6ba5dc
--- /dev/null
+++ b/keras/api/activations/__init__.py
@@ -0,0 +1,29 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.activations import deserialize
+from keras.src.activations import get
+from keras.src.activations import serialize
+from keras.src.activations.activations import elu
+from keras.src.activations.activations import exponential
+from keras.src.activations.activations import gelu
+from keras.src.activations.activations import hard_sigmoid
+from keras.src.activations.activations import hard_silu
+from keras.src.activations.activations import hard_silu as hard_swish
+from keras.src.activations.activations import leaky_relu
+from keras.src.activations.activations import linear
+from keras.src.activations.activations import log_softmax
+from keras.src.activations.activations import mish
+from keras.src.activations.activations import relu
+from keras.src.activations.activations import relu6
+from keras.src.activations.activations import selu
+from keras.src.activations.activations import sigmoid
+from keras.src.activations.activations import silu
+from keras.src.activations.activations import silu as swish
+from keras.src.activations.activations import softmax
+from keras.src.activations.activations import softplus
+from keras.src.activations.activations import softsign
+from keras.src.activations.activations import tanh
diff --git a/keras/api/applications/__init__.py b/keras/api/applications/__init__.py
new file mode 100644
index 000000000000..183b3ca66142
--- /dev/null
+++ b/keras/api/applications/__init__.py
@@ -0,0 +1,63 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.applications import convnext
+from keras.api.applications import densenet
+from keras.api.applications import efficientnet
+from keras.api.applications import efficientnet_v2
+from keras.api.applications import imagenet_utils
+from keras.api.applications import inception_resnet_v2
+from keras.api.applications import inception_v3
+from keras.api.applications import mobilenet
+from keras.api.applications import mobilenet_v2
+from keras.api.applications import mobilenet_v3
+from keras.api.applications import nasnet
+from keras.api.applications import resnet
+from keras.api.applications import resnet50
+from keras.api.applications import resnet_v2
+from keras.api.applications import vgg16
+from keras.api.applications import vgg19
+from keras.api.applications import xception
+from keras.src.applications.convnext import ConvNeXtBase
+from keras.src.applications.convnext import ConvNeXtLarge
+from keras.src.applications.convnext import ConvNeXtSmall
+from keras.src.applications.convnext import ConvNeXtTiny
+from keras.src.applications.convnext import ConvNeXtXLarge
+from keras.src.applications.densenet import DenseNet121
+from keras.src.applications.densenet import DenseNet169
+from keras.src.applications.densenet import DenseNet201
+from keras.src.applications.efficientnet import EfficientNetB0
+from keras.src.applications.efficientnet import EfficientNetB1
+from keras.src.applications.efficientnet import EfficientNetB2
+from keras.src.applications.efficientnet import EfficientNetB3
+from keras.src.applications.efficientnet import EfficientNetB4
+from keras.src.applications.efficientnet import EfficientNetB5
+from keras.src.applications.efficientnet import EfficientNetB6
+from keras.src.applications.efficientnet import EfficientNetB7
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B0
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B1
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B2
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B3
+from keras.src.applications.efficientnet_v2 import EfficientNetV2L
+from keras.src.applications.efficientnet_v2 import EfficientNetV2M
+from keras.src.applications.efficientnet_v2 import EfficientNetV2S
+from keras.src.applications.inception_resnet_v2 import InceptionResNetV2
+from keras.src.applications.inception_v3 import InceptionV3
+from keras.src.applications.mobilenet import MobileNet
+from keras.src.applications.mobilenet_v2 import MobileNetV2
+from keras.src.applications.mobilenet_v3 import MobileNetV3Large
+from keras.src.applications.mobilenet_v3 import MobileNetV3Small
+from keras.src.applications.nasnet import NASNetLarge
+from keras.src.applications.nasnet import NASNetMobile
+from keras.src.applications.resnet import ResNet50
+from keras.src.applications.resnet import ResNet101
+from keras.src.applications.resnet import ResNet152
+from keras.src.applications.resnet_v2 import ResNet50V2
+from keras.src.applications.resnet_v2 import ResNet101V2
+from keras.src.applications.resnet_v2 import ResNet152V2
+from keras.src.applications.vgg16 import VGG16
+from keras.src.applications.vgg19 import VGG19
+from keras.src.applications.xception import Xception
diff --git a/keras/api/applications/convnext/__init__.py b/keras/api/applications/convnext/__init__.py
new file mode 100644
index 000000000000..b4eaaa3834b1
--- /dev/null
+++ b/keras/api/applications/convnext/__init__.py
@@ -0,0 +1,13 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.convnext import ConvNeXtBase
+from keras.src.applications.convnext import ConvNeXtLarge
+from keras.src.applications.convnext import ConvNeXtSmall
+from keras.src.applications.convnext import ConvNeXtTiny
+from keras.src.applications.convnext import ConvNeXtXLarge
+from keras.src.applications.convnext import decode_predictions
+from keras.src.applications.convnext import preprocess_input
diff --git a/keras/api/applications/densenet/__init__.py b/keras/api/applications/densenet/__init__.py
new file mode 100644
index 000000000000..0173a2c3ed9d
--- /dev/null
+++ b/keras/api/applications/densenet/__init__.py
@@ -0,0 +1,11 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.densenet import DenseNet121
+from keras.src.applications.densenet import DenseNet169
+from keras.src.applications.densenet import DenseNet201
+from keras.src.applications.densenet import decode_predictions
+from keras.src.applications.densenet import preprocess_input
diff --git a/keras/api/applications/efficientnet/__init__.py b/keras/api/applications/efficientnet/__init__.py
new file mode 100644
index 000000000000..c4af0199bea6
--- /dev/null
+++ b/keras/api/applications/efficientnet/__init__.py
@@ -0,0 +1,16 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.efficientnet import EfficientNetB0
+from keras.src.applications.efficientnet import EfficientNetB1
+from keras.src.applications.efficientnet import EfficientNetB2
+from keras.src.applications.efficientnet import EfficientNetB3
+from keras.src.applications.efficientnet import EfficientNetB4
+from keras.src.applications.efficientnet import EfficientNetB5
+from keras.src.applications.efficientnet import EfficientNetB6
+from keras.src.applications.efficientnet import EfficientNetB7
+from keras.src.applications.efficientnet import decode_predictions
+from keras.src.applications.efficientnet import preprocess_input
diff --git a/keras/api/applications/efficientnet_v2/__init__.py b/keras/api/applications/efficientnet_v2/__init__.py
new file mode 100644
index 000000000000..ee85821a1d74
--- /dev/null
+++ b/keras/api/applications/efficientnet_v2/__init__.py
@@ -0,0 +1,15 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B0
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B1
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B2
+from keras.src.applications.efficientnet_v2 import EfficientNetV2B3
+from keras.src.applications.efficientnet_v2 import EfficientNetV2L
+from keras.src.applications.efficientnet_v2 import EfficientNetV2M
+from keras.src.applications.efficientnet_v2 import EfficientNetV2S
+from keras.src.applications.efficientnet_v2 import decode_predictions
+from keras.src.applications.efficientnet_v2 import preprocess_input
diff --git a/keras/api/applications/imagenet_utils/__init__.py b/keras/api/applications/imagenet_utils/__init__.py
new file mode 100644
index 000000000000..81a923e55b9e
--- /dev/null
+++ b/keras/api/applications/imagenet_utils/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.imagenet_utils import decode_predictions
+from keras.src.applications.imagenet_utils import preprocess_input
diff --git a/keras/api/applications/inception_resnet_v2/__init__.py b/keras/api/applications/inception_resnet_v2/__init__.py
new file mode 100644
index 000000000000..b710829bd377
--- /dev/null
+++ b/keras/api/applications/inception_resnet_v2/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.inception_resnet_v2 import InceptionResNetV2
+from keras.src.applications.inception_resnet_v2 import decode_predictions
+from keras.src.applications.inception_resnet_v2 import preprocess_input
diff --git a/keras/api/applications/inception_v3/__init__.py b/keras/api/applications/inception_v3/__init__.py
new file mode 100644
index 000000000000..8a2379ca1b13
--- /dev/null
+++ b/keras/api/applications/inception_v3/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.inception_v3 import InceptionV3
+from keras.src.applications.inception_v3 import decode_predictions
+from keras.src.applications.inception_v3 import preprocess_input
diff --git a/keras/api/applications/mobilenet/__init__.py b/keras/api/applications/mobilenet/__init__.py
new file mode 100644
index 000000000000..0194cdfd0ac6
--- /dev/null
+++ b/keras/api/applications/mobilenet/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.mobilenet import MobileNet
+from keras.src.applications.mobilenet import decode_predictions
+from keras.src.applications.mobilenet import preprocess_input
diff --git a/keras/api/applications/mobilenet_v2/__init__.py b/keras/api/applications/mobilenet_v2/__init__.py
new file mode 100644
index 000000000000..ceb0625e3519
--- /dev/null
+++ b/keras/api/applications/mobilenet_v2/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.mobilenet_v2 import MobileNetV2
+from keras.src.applications.mobilenet_v2 import decode_predictions
+from keras.src.applications.mobilenet_v2 import preprocess_input
diff --git a/keras/api/applications/mobilenet_v3/__init__.py b/keras/api/applications/mobilenet_v3/__init__.py
new file mode 100644
index 000000000000..c27e6669f0f1
--- /dev/null
+++ b/keras/api/applications/mobilenet_v3/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.mobilenet_v3 import decode_predictions
+from keras.src.applications.mobilenet_v3 import preprocess_input
diff --git a/keras/api/applications/nasnet/__init__.py b/keras/api/applications/nasnet/__init__.py
new file mode 100644
index 000000000000..874de61f00ab
--- /dev/null
+++ b/keras/api/applications/nasnet/__init__.py
@@ -0,0 +1,10 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.nasnet import NASNetLarge
+from keras.src.applications.nasnet import NASNetMobile
+from keras.src.applications.nasnet import decode_predictions
+from keras.src.applications.nasnet import preprocess_input
diff --git a/keras/api/applications/resnet/__init__.py b/keras/api/applications/resnet/__init__.py
new file mode 100644
index 000000000000..5aaa3ee0e5e2
--- /dev/null
+++ b/keras/api/applications/resnet/__init__.py
@@ -0,0 +1,11 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.resnet import ResNet50
+from keras.src.applications.resnet import ResNet101
+from keras.src.applications.resnet import ResNet152
+from keras.src.applications.resnet import decode_predictions
+from keras.src.applications.resnet import preprocess_input
diff --git a/keras/api/applications/resnet50/__init__.py b/keras/api/applications/resnet50/__init__.py
new file mode 100644
index 000000000000..ac08b5322682
--- /dev/null
+++ b/keras/api/applications/resnet50/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.resnet import ResNet50
+from keras.src.applications.resnet import decode_predictions
+from keras.src.applications.resnet import preprocess_input
diff --git a/keras/api/applications/resnet_v2/__init__.py b/keras/api/applications/resnet_v2/__init__.py
new file mode 100644
index 000000000000..273dd3019d85
--- /dev/null
+++ b/keras/api/applications/resnet_v2/__init__.py
@@ -0,0 +1,11 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.resnet_v2 import ResNet50V2
+from keras.src.applications.resnet_v2 import ResNet101V2
+from keras.src.applications.resnet_v2 import ResNet152V2
+from keras.src.applications.resnet_v2 import decode_predictions
+from keras.src.applications.resnet_v2 import preprocess_input
diff --git a/keras/api/applications/vgg16/__init__.py b/keras/api/applications/vgg16/__init__.py
new file mode 100644
index 000000000000..5a31084a4676
--- /dev/null
+++ b/keras/api/applications/vgg16/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.vgg16 import VGG16
+from keras.src.applications.vgg16 import decode_predictions
+from keras.src.applications.vgg16 import preprocess_input
diff --git a/keras/api/applications/vgg19/__init__.py b/keras/api/applications/vgg19/__init__.py
new file mode 100644
index 000000000000..14355514d7cf
--- /dev/null
+++ b/keras/api/applications/vgg19/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.vgg19 import VGG19
+from keras.src.applications.vgg19 import decode_predictions
+from keras.src.applications.vgg19 import preprocess_input
diff --git a/keras/api/applications/xception/__init__.py b/keras/api/applications/xception/__init__.py
new file mode 100644
index 000000000000..c200dc66df35
--- /dev/null
+++ b/keras/api/applications/xception/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.applications.xception import Xception
+from keras.src.applications.xception import decode_predictions
+from keras.src.applications.xception import preprocess_input
diff --git a/keras/api/backend/__init__.py b/keras/api/backend/__init__.py
new file mode 100644
index 000000000000..840bde6e4ded
--- /dev/null
+++ b/keras/api/backend/__init__.py
@@ -0,0 +1,20 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.backend.common.dtypes import result_type
+from keras.src.backend.common.global_state import clear_session
+from keras.src.backend.common.keras_tensor import is_keras_tensor
+from keras.src.backend.common.variables import is_float_dtype
+from keras.src.backend.common.variables import is_int_dtype
+from keras.src.backend.common.variables import standardize_dtype
+from keras.src.backend.config import backend
+from keras.src.backend.config import epsilon
+from keras.src.backend.config import floatx
+from keras.src.backend.config import image_data_format
+from keras.src.backend.config import set_epsilon
+from keras.src.backend.config import set_floatx
+from keras.src.backend.config import set_image_data_format
+from keras.src.utils.naming import get_uid
diff --git a/keras/api/callbacks/__init__.py b/keras/api/callbacks/__init__.py
new file mode 100644
index 000000000000..42ba958b9bb3
--- /dev/null
+++ b/keras/api/callbacks/__init__.py
@@ -0,0 +1,21 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.callbacks.backup_and_restore import BackupAndRestore
+from keras.src.callbacks.callback import Callback
+from keras.src.callbacks.callback_list import CallbackList
+from keras.src.callbacks.csv_logger import CSVLogger
+from keras.src.callbacks.early_stopping import EarlyStopping
+from keras.src.callbacks.history import History
+from keras.src.callbacks.lambda_callback import LambdaCallback
+from keras.src.callbacks.learning_rate_scheduler import LearningRateScheduler
+from keras.src.callbacks.model_checkpoint import ModelCheckpoint
+from keras.src.callbacks.progbar_logger import ProgbarLogger
+from keras.src.callbacks.reduce_lr_on_plateau import ReduceLROnPlateau
+from keras.src.callbacks.remote_monitor import RemoteMonitor
+from keras.src.callbacks.swap_ema_weights import SwapEMAWeights
+from keras.src.callbacks.tensorboard import TensorBoard
+from keras.src.callbacks.terminate_on_nan import TerminateOnNaN
diff --git a/keras/api/config/__init__.py b/keras/api/config/__init__.py
new file mode 100644
index 000000000000..13e334cb7c06
--- /dev/null
+++ b/keras/api/config/__init__.py
@@ -0,0 +1,23 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.backend.config import backend
+from keras.src.backend.config import epsilon
+from keras.src.backend.config import floatx
+from keras.src.backend.config import image_data_format
+from keras.src.backend.config import set_epsilon
+from keras.src.backend.config import set_floatx
+from keras.src.backend.config import set_image_data_format
+from keras.src.dtype_policies.dtype_policy import dtype_policy
+from keras.src.dtype_policies.dtype_policy import set_dtype_policy
+from keras.src.saving.serialization_lib import enable_unsafe_deserialization
+from keras.src.utils.backend_utils import set_backend
+from keras.src.utils.io_utils import disable_interactive_logging
+from keras.src.utils.io_utils import enable_interactive_logging
+from keras.src.utils.io_utils import is_interactive_logging_enabled
+from keras.src.utils.traceback_utils import disable_traceback_filtering
+from keras.src.utils.traceback_utils import enable_traceback_filtering
+from keras.src.utils.traceback_utils import is_traceback_filtering_enabled
diff --git a/keras/api/constraints/__init__.py b/keras/api/constraints/__init__.py
new file mode 100644
index 000000000000..6372e149d3ba
--- /dev/null
+++ b/keras/api/constraints/__init__.py
@@ -0,0 +1,18 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.constraints import deserialize
+from keras.src.constraints import get
+from keras.src.constraints import serialize
+from keras.src.constraints.constraints import Constraint
+from keras.src.constraints.constraints import MaxNorm
+from keras.src.constraints.constraints import MaxNorm as max_norm
+from keras.src.constraints.constraints import MinMaxNorm
+from keras.src.constraints.constraints import MinMaxNorm as min_max_norm
+from keras.src.constraints.constraints import NonNeg
+from keras.src.constraints.constraints import NonNeg as non_neg
+from keras.src.constraints.constraints import UnitNorm
+from keras.src.constraints.constraints import UnitNorm as unit_norm
diff --git a/keras/api/datasets/__init__.py b/keras/api/datasets/__init__.py
new file mode 100644
index 000000000000..cf153fefcd4d
--- /dev/null
+++ b/keras/api/datasets/__init__.py
@@ -0,0 +1,14 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.datasets import boston_housing
+from keras.api.datasets import california_housing
+from keras.api.datasets import cifar10
+from keras.api.datasets import cifar100
+from keras.api.datasets import fashion_mnist
+from keras.api.datasets import imdb
+from keras.api.datasets import mnist
+from keras.api.datasets import reuters
diff --git a/keras/api/datasets/boston_housing/__init__.py b/keras/api/datasets/boston_housing/__init__.py
new file mode 100644
index 000000000000..f5a179db9968
--- /dev/null
+++ b/keras/api/datasets/boston_housing/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.boston_housing import load_data
diff --git a/keras/api/datasets/california_housing/__init__.py b/keras/api/datasets/california_housing/__init__.py
new file mode 100644
index 000000000000..52b6157dcf28
--- /dev/null
+++ b/keras/api/datasets/california_housing/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.california_housing import load_data
diff --git a/keras/api/datasets/cifar10/__init__.py b/keras/api/datasets/cifar10/__init__.py
new file mode 100644
index 000000000000..68c72a91b495
--- /dev/null
+++ b/keras/api/datasets/cifar10/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.cifar10 import load_data
diff --git a/keras/api/datasets/cifar100/__init__.py b/keras/api/datasets/cifar100/__init__.py
new file mode 100644
index 000000000000..e49e67faeecf
--- /dev/null
+++ b/keras/api/datasets/cifar100/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.cifar100 import load_data
diff --git a/keras/api/datasets/fashion_mnist/__init__.py b/keras/api/datasets/fashion_mnist/__init__.py
new file mode 100644
index 000000000000..33512169fc9f
--- /dev/null
+++ b/keras/api/datasets/fashion_mnist/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.fashion_mnist import load_data
diff --git a/keras/api/datasets/imdb/__init__.py b/keras/api/datasets/imdb/__init__.py
new file mode 100644
index 000000000000..6bcddbd11dbe
--- /dev/null
+++ b/keras/api/datasets/imdb/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.imdb import get_word_index
+from keras.src.datasets.imdb import load_data
diff --git a/keras/api/datasets/mnist/__init__.py b/keras/api/datasets/mnist/__init__.py
new file mode 100644
index 000000000000..45568c463ba8
--- /dev/null
+++ b/keras/api/datasets/mnist/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.mnist import load_data
diff --git a/keras/api/datasets/reuters/__init__.py b/keras/api/datasets/reuters/__init__.py
new file mode 100644
index 000000000000..cdc9b68cff93
--- /dev/null
+++ b/keras/api/datasets/reuters/__init__.py
@@ -0,0 +1,9 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.datasets.reuters import get_label_names
+from keras.src.datasets.reuters import get_word_index
+from keras.src.datasets.reuters import load_data
diff --git a/keras/api/distribution/__init__.py b/keras/api/distribution/__init__.py
new file mode 100644
index 000000000000..b56806af9fac
--- /dev/null
+++ b/keras/api/distribution/__init__.py
@@ -0,0 +1,16 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.distribution.distribution_lib import DataParallel
+from keras.src.distribution.distribution_lib import DeviceMesh
+from keras.src.distribution.distribution_lib import LayoutMap
+from keras.src.distribution.distribution_lib import ModelParallel
+from keras.src.distribution.distribution_lib import TensorLayout
+from keras.src.distribution.distribution_lib import distribute_tensor
+from keras.src.distribution.distribution_lib import distribution
+from keras.src.distribution.distribution_lib import initialize
+from keras.src.distribution.distribution_lib import list_devices
+from keras.src.distribution.distribution_lib import set_distribution
diff --git a/keras/api/dtype_policies/__init__.py b/keras/api/dtype_policies/__init__.py
new file mode 100644
index 000000000000..da8364263a22
--- /dev/null
+++ b/keras/api/dtype_policies/__init__.py
@@ -0,0 +1,10 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.dtype_policies.dtype_policy import DTypePolicy
+from keras.src.dtype_policies.dtype_policy import FloatDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedFloat8DTypePolicy
diff --git a/keras/api/export/__init__.py b/keras/api/export/__init__.py
new file mode 100644
index 000000000000..68fa60293961
--- /dev/null
+++ b/keras/api/export/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.export.export_lib import ExportArchive
diff --git a/keras/api/initializers/__init__.py b/keras/api/initializers/__init__.py
new file mode 100644
index 000000000000..5819d1b285eb
--- /dev/null
+++ b/keras/api/initializers/__init__.py
@@ -0,0 +1,64 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.initializers import deserialize
+from keras.src.initializers import get
+from keras.src.initializers import serialize
+from keras.src.initializers.constant_initializers import Constant
+from keras.src.initializers.constant_initializers import Constant as constant
+from keras.src.initializers.constant_initializers import Identity
+from keras.src.initializers.constant_initializers import (
+    Identity as IdentityInitializer,
+)
+from keras.src.initializers.constant_initializers import Identity as identity
+from keras.src.initializers.constant_initializers import Ones
+from keras.src.initializers.constant_initializers import Ones as ones
+from keras.src.initializers.constant_initializers import Zeros
+from keras.src.initializers.constant_initializers import Zeros as zeros
+from keras.src.initializers.initializer import Initializer
+from keras.src.initializers.random_initializers import GlorotNormal
+from keras.src.initializers.random_initializers import (
+    GlorotNormal as glorot_normal,
+)
+from keras.src.initializers.random_initializers import GlorotUniform
+from keras.src.initializers.random_initializers import (
+    GlorotUniform as glorot_uniform,
+)
+from keras.src.initializers.random_initializers import HeNormal
+from keras.src.initializers.random_initializers import HeNormal as he_normal
+from keras.src.initializers.random_initializers import HeUniform
+from keras.src.initializers.random_initializers import HeUniform as he_uniform
+from keras.src.initializers.random_initializers import LecunNormal
+from keras.src.initializers.random_initializers import (
+    LecunNormal as lecun_normal,
+)
+from keras.src.initializers.random_initializers import LecunUniform
+from keras.src.initializers.random_initializers import (
+    LecunUniform as lecun_uniform,
+)
+from keras.src.initializers.random_initializers import OrthogonalInitializer
+from keras.src.initializers.random_initializers import (
+    OrthogonalInitializer as Orthogonal,
+)
+from keras.src.initializers.random_initializers import (
+    OrthogonalInitializer as orthogonal,
+)
+from keras.src.initializers.random_initializers import RandomNormal
+from keras.src.initializers.random_initializers import (
+    RandomNormal as random_normal,
+)
+from keras.src.initializers.random_initializers import RandomUniform
+from keras.src.initializers.random_initializers import (
+    RandomUniform as random_uniform,
+)
+from keras.src.initializers.random_initializers import TruncatedNormal
+from keras.src.initializers.random_initializers import (
+    TruncatedNormal as truncated_normal,
+)
+from keras.src.initializers.random_initializers import VarianceScaling
+from keras.src.initializers.random_initializers import (
+    VarianceScaling as variance_scaling,
+)
diff --git a/keras/api/layers/__init__.py b/keras/api/layers/__init__.py
new file mode 100644
index 000000000000..a4e1bf9a6bbd
--- /dev/null
+++ b/keras/api/layers/__init__.py
@@ -0,0 +1,195 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.export.export_lib import TFSMLayer
+from keras.src.layers import deserialize
+from keras.src.layers import serialize
+from keras.src.layers.activations.activation import Activation
+from keras.src.layers.activations.elu import ELU
+from keras.src.layers.activations.leaky_relu import LeakyReLU
+from keras.src.layers.activations.prelu import PReLU
+from keras.src.layers.activations.relu import ReLU
+from keras.src.layers.activations.softmax import Softmax
+from keras.src.layers.attention.additive_attention import AdditiveAttention
+from keras.src.layers.attention.attention import Attention
+from keras.src.layers.attention.grouped_query_attention import (
+    GroupedQueryAttention as GroupQueryAttention,
+)
+from keras.src.layers.attention.multi_head_attention import MultiHeadAttention
+from keras.src.layers.convolutional.conv1d import Conv1D
+from keras.src.layers.convolutional.conv1d import Conv1D as Convolution1D
+from keras.src.layers.convolutional.conv1d_transpose import Conv1DTranspose
+from keras.src.layers.convolutional.conv1d_transpose import (
+    Conv1DTranspose as Convolution1DTranspose,
+)
+from keras.src.layers.convolutional.conv2d import Conv2D
+from keras.src.layers.convolutional.conv2d import Conv2D as Convolution2D
+from keras.src.layers.convolutional.conv2d_transpose import Conv2DTranspose
+from keras.src.layers.convolutional.conv2d_transpose import (
+    Conv2DTranspose as Convolution2DTranspose,
+)
+from keras.src.layers.convolutional.conv3d import Conv3D
+from keras.src.layers.convolutional.conv3d import Conv3D as Convolution3D
+from keras.src.layers.convolutional.conv3d_transpose import Conv3DTranspose
+from keras.src.layers.convolutional.conv3d_transpose import (
+    Conv3DTranspose as Convolution3DTranspose,
+)
+from keras.src.layers.convolutional.depthwise_conv1d import DepthwiseConv1D
+from keras.src.layers.convolutional.depthwise_conv2d import DepthwiseConv2D
+from keras.src.layers.convolutional.separable_conv1d import SeparableConv1D
+from keras.src.layers.convolutional.separable_conv1d import (
+    SeparableConv1D as SeparableConvolution1D,
+)
+from keras.src.layers.convolutional.separable_conv2d import SeparableConv2D
+from keras.src.layers.convolutional.separable_conv2d import (
+    SeparableConv2D as SeparableConvolution2D,
+)
+from keras.src.layers.core.dense import Dense
+from keras.src.layers.core.einsum_dense import EinsumDense
+from keras.src.layers.core.embedding import Embedding
+from keras.src.layers.core.identity import Identity
+from keras.src.layers.core.input_layer import Input
+from keras.src.layers.core.input_layer import InputLayer
+from keras.src.layers.core.lambda_layer import Lambda
+from keras.src.layers.core.masking import Masking
+from keras.src.layers.core.wrapper import Wrapper
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.layers.merging.add import Add
+from keras.src.layers.merging.add import add
+from keras.src.layers.merging.average import Average
+from keras.src.layers.merging.average import average
+from keras.src.layers.merging.concatenate import Concatenate
+from keras.src.layers.merging.concatenate import concatenate
+from keras.src.layers.merging.dot import Dot
+from keras.src.layers.merging.dot import dot
+from keras.src.layers.merging.maximum import Maximum
+from keras.src.layers.merging.maximum import maximum
+from keras.src.layers.merging.minimum import Minimum
+from keras.src.layers.merging.minimum import minimum
+from keras.src.layers.merging.multiply import Multiply
+from keras.src.layers.merging.multiply import multiply
+from keras.src.layers.merging.subtract import Subtract
+from keras.src.layers.merging.subtract import subtract
+from keras.src.layers.normalization.batch_normalization import (
+    BatchNormalization,
+)
+from keras.src.layers.normalization.group_normalization import (
+    GroupNormalization,
+)
+from keras.src.layers.normalization.layer_normalization import (
+    LayerNormalization,
+)
+from keras.src.layers.normalization.spectral_normalization import (
+    SpectralNormalization,
+)
+from keras.src.layers.normalization.unit_normalization import UnitNormalization
+from keras.src.layers.pooling.average_pooling1d import AveragePooling1D
+from keras.src.layers.pooling.average_pooling1d import (
+    AveragePooling1D as AvgPool1D,
+)
+from keras.src.layers.pooling.average_pooling2d import AveragePooling2D
+from keras.src.layers.pooling.average_pooling2d import (
+    AveragePooling2D as AvgPool2D,
+)
+from keras.src.layers.pooling.average_pooling3d import AveragePooling3D
+from keras.src.layers.pooling.average_pooling3d import (
+    AveragePooling3D as AvgPool3D,
+)
+from keras.src.layers.pooling.global_average_pooling1d import (
+    GlobalAveragePooling1D,
+)
+from keras.src.layers.pooling.global_average_pooling1d import (
+    GlobalAveragePooling1D as GlobalAvgPool1D,
+)
+from keras.src.layers.pooling.global_average_pooling2d import (
+    GlobalAveragePooling2D,
+)
+from keras.src.layers.pooling.global_average_pooling2d import (
+    GlobalAveragePooling2D as GlobalAvgPool2D,
+)
+from keras.src.layers.pooling.global_average_pooling3d import (
+    GlobalAveragePooling3D,
+)
+from keras.src.layers.pooling.global_average_pooling3d import (
+    GlobalAveragePooling3D as GlobalAvgPool3D,
+)
+from keras.src.layers.pooling.global_max_pooling1d import GlobalMaxPooling1D
+from keras.src.layers.pooling.global_max_pooling1d import (
+    GlobalMaxPooling1D as GlobalMaxPool1D,
+)
+from keras.src.layers.pooling.global_max_pooling2d import GlobalMaxPooling2D
+from keras.src.layers.pooling.global_max_pooling2d import (
+    GlobalMaxPooling2D as GlobalMaxPool2D,
+)
+from keras.src.layers.pooling.global_max_pooling3d import GlobalMaxPooling3D
+from keras.src.layers.pooling.global_max_pooling3d import (
+    GlobalMaxPooling3D as GlobalMaxPool3D,
+)
+from keras.src.layers.pooling.max_pooling1d import MaxPooling1D
+from keras.src.layers.pooling.max_pooling1d import MaxPooling1D as MaxPool1D
+from keras.src.layers.pooling.max_pooling2d import MaxPooling2D
+from keras.src.layers.pooling.max_pooling2d import MaxPooling2D as MaxPool2D
+from keras.src.layers.pooling.max_pooling3d import MaxPooling3D
+from keras.src.layers.pooling.max_pooling3d import MaxPooling3D as MaxPool3D
+from keras.src.layers.preprocessing.audio_preprocessing import MelSpectrogram
+from keras.src.layers.preprocessing.category_encoding import CategoryEncoding
+from keras.src.layers.preprocessing.center_crop import CenterCrop
+from keras.src.layers.preprocessing.discretization import Discretization
+from keras.src.layers.preprocessing.hashed_crossing import HashedCrossing
+from keras.src.layers.preprocessing.hashing import Hashing
+from keras.src.layers.preprocessing.integer_lookup import IntegerLookup
+from keras.src.layers.preprocessing.normalization import Normalization
+from keras.src.layers.preprocessing.random_brightness import RandomBrightness
+from keras.src.layers.preprocessing.random_contrast import RandomContrast
+from keras.src.layers.preprocessing.random_crop import RandomCrop
+from keras.src.layers.preprocessing.random_flip import RandomFlip
+from keras.src.layers.preprocessing.random_rotation import RandomRotation
+from keras.src.layers.preprocessing.random_translation import RandomTranslation
+from keras.src.layers.preprocessing.random_zoom import RandomZoom
+from keras.src.layers.preprocessing.rescaling import Rescaling
+from keras.src.layers.preprocessing.resizing import Resizing
+from keras.src.layers.preprocessing.string_lookup import StringLookup
+from keras.src.layers.preprocessing.text_vectorization import TextVectorization
+from keras.src.layers.regularization.activity_regularization import (
+    ActivityRegularization,
+)
+from keras.src.layers.regularization.alpha_dropout import AlphaDropout
+from keras.src.layers.regularization.dropout import Dropout
+from keras.src.layers.regularization.gaussian_dropout import GaussianDropout
+from keras.src.layers.regularization.gaussian_noise import GaussianNoise
+from keras.src.layers.regularization.spatial_dropout import SpatialDropout1D
+from keras.src.layers.regularization.spatial_dropout import SpatialDropout2D
+from keras.src.layers.regularization.spatial_dropout import SpatialDropout3D
+from keras.src.layers.reshaping.cropping1d import Cropping1D
+from keras.src.layers.reshaping.cropping2d import Cropping2D
+from keras.src.layers.reshaping.cropping3d import Cropping3D
+from keras.src.layers.reshaping.flatten import Flatten
+from keras.src.layers.reshaping.permute import Permute
+from keras.src.layers.reshaping.repeat_vector import RepeatVector
+from keras.src.layers.reshaping.reshape import Reshape
+from keras.src.layers.reshaping.up_sampling1d import UpSampling1D
+from keras.src.layers.reshaping.up_sampling2d import UpSampling2D
+from keras.src.layers.reshaping.up_sampling3d import UpSampling3D
+from keras.src.layers.reshaping.zero_padding1d import ZeroPadding1D
+from keras.src.layers.reshaping.zero_padding2d import ZeroPadding2D
+from keras.src.layers.reshaping.zero_padding3d import ZeroPadding3D
+from keras.src.layers.rnn.bidirectional import Bidirectional
+from keras.src.layers.rnn.conv_lstm1d import ConvLSTM1D
+from keras.src.layers.rnn.conv_lstm2d import ConvLSTM2D
+from keras.src.layers.rnn.conv_lstm3d import ConvLSTM3D
+from keras.src.layers.rnn.gru import GRU
+from keras.src.layers.rnn.gru import GRUCell
+from keras.src.layers.rnn.lstm import LSTM
+from keras.src.layers.rnn.lstm import LSTMCell
+from keras.src.layers.rnn.rnn import RNN
+from keras.src.layers.rnn.simple_rnn import SimpleRNN
+from keras.src.layers.rnn.simple_rnn import SimpleRNNCell
+from keras.src.layers.rnn.stacked_rnn_cells import StackedRNNCells
+from keras.src.layers.rnn.time_distributed import TimeDistributed
+from keras.src.utils.jax_layer import FlaxLayer
+from keras.src.utils.jax_layer import JaxLayer
+from keras.src.utils.torch_utils import TorchModuleWrapper
diff --git a/keras/api/legacy/__init__.py b/keras/api/legacy/__init__.py
new file mode 100644
index 000000000000..96347e2c32bf
--- /dev/null
+++ b/keras/api/legacy/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.legacy import saving
diff --git a/keras/api/legacy/saving/__init__.py b/keras/api/legacy/saving/__init__.py
new file mode 100644
index 000000000000..ac4d2d43dd9a
--- /dev/null
+++ b/keras/api/legacy/saving/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.legacy.saving.serialization import deserialize_keras_object
+from keras.src.legacy.saving.serialization import serialize_keras_object
diff --git a/keras/api/losses/__init__.py b/keras/api/losses/__init__.py
new file mode 100644
index 000000000000..ecaadddf6b7e
--- /dev/null
+++ b/keras/api/losses/__init__.py
@@ -0,0 +1,50 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.losses import deserialize
+from keras.src.losses import get
+from keras.src.losses import serialize
+from keras.src.losses.loss import Loss
+from keras.src.losses.losses import CTC
+from keras.src.losses.losses import BinaryCrossentropy
+from keras.src.losses.losses import BinaryFocalCrossentropy
+from keras.src.losses.losses import CategoricalCrossentropy
+from keras.src.losses.losses import CategoricalFocalCrossentropy
+from keras.src.losses.losses import CategoricalHinge
+from keras.src.losses.losses import CosineSimilarity
+from keras.src.losses.losses import Dice
+from keras.src.losses.losses import Hinge
+from keras.src.losses.losses import Huber
+from keras.src.losses.losses import KLDivergence
+from keras.src.losses.losses import LogCosh
+from keras.src.losses.losses import MeanAbsoluteError
+from keras.src.losses.losses import MeanAbsolutePercentageError
+from keras.src.losses.losses import MeanSquaredError
+from keras.src.losses.losses import MeanSquaredLogarithmicError
+from keras.src.losses.losses import Poisson
+from keras.src.losses.losses import SparseCategoricalCrossentropy
+from keras.src.losses.losses import SquaredHinge
+from keras.src.losses.losses import Tversky
+from keras.src.losses.losses import binary_crossentropy
+from keras.src.losses.losses import binary_focal_crossentropy
+from keras.src.losses.losses import categorical_crossentropy
+from keras.src.losses.losses import categorical_focal_crossentropy
+from keras.src.losses.losses import categorical_hinge
+from keras.src.losses.losses import cosine_similarity
+from keras.src.losses.losses import ctc
+from keras.src.losses.losses import dice
+from keras.src.losses.losses import hinge
+from keras.src.losses.losses import huber
+from keras.src.losses.losses import kl_divergence
+from keras.src.losses.losses import log_cosh
+from keras.src.losses.losses import mean_absolute_error
+from keras.src.losses.losses import mean_absolute_percentage_error
+from keras.src.losses.losses import mean_squared_error
+from keras.src.losses.losses import mean_squared_logarithmic_error
+from keras.src.losses.losses import poisson
+from keras.src.losses.losses import sparse_categorical_crossentropy
+from keras.src.losses.losses import squared_hinge
+from keras.src.losses.losses import tversky
diff --git a/keras/api/metrics/__init__.py b/keras/api/metrics/__init__.py
new file mode 100644
index 000000000000..dc59b32a46c3
--- /dev/null
+++ b/keras/api/metrics/__init__.py
@@ -0,0 +1,76 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.losses.losses import binary_crossentropy
+from keras.src.losses.losses import binary_focal_crossentropy
+from keras.src.losses.losses import categorical_crossentropy
+from keras.src.losses.losses import categorical_focal_crossentropy
+from keras.src.losses.losses import categorical_hinge
+from keras.src.losses.losses import hinge
+from keras.src.losses.losses import huber
+from keras.src.losses.losses import kl_divergence
+from keras.src.losses.losses import log_cosh
+from keras.src.losses.losses import mean_absolute_error
+from keras.src.losses.losses import mean_absolute_percentage_error
+from keras.src.losses.losses import mean_squared_error
+from keras.src.losses.losses import mean_squared_logarithmic_error
+from keras.src.losses.losses import poisson
+from keras.src.losses.losses import sparse_categorical_crossentropy
+from keras.src.losses.losses import squared_hinge
+from keras.src.metrics import deserialize
+from keras.src.metrics import get
+from keras.src.metrics import serialize
+from keras.src.metrics.accuracy_metrics import Accuracy
+from keras.src.metrics.accuracy_metrics import BinaryAccuracy
+from keras.src.metrics.accuracy_metrics import CategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import SparseCategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import SparseTopKCategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import TopKCategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import binary_accuracy
+from keras.src.metrics.accuracy_metrics import categorical_accuracy
+from keras.src.metrics.accuracy_metrics import sparse_categorical_accuracy
+from keras.src.metrics.accuracy_metrics import sparse_top_k_categorical_accuracy
+from keras.src.metrics.accuracy_metrics import top_k_categorical_accuracy
+from keras.src.metrics.confusion_metrics import AUC
+from keras.src.metrics.confusion_metrics import FalseNegatives
+from keras.src.metrics.confusion_metrics import FalsePositives
+from keras.src.metrics.confusion_metrics import Precision
+from keras.src.metrics.confusion_metrics import PrecisionAtRecall
+from keras.src.metrics.confusion_metrics import Recall
+from keras.src.metrics.confusion_metrics import RecallAtPrecision
+from keras.src.metrics.confusion_metrics import SensitivityAtSpecificity
+from keras.src.metrics.confusion_metrics import SpecificityAtSensitivity
+from keras.src.metrics.confusion_metrics import TrueNegatives
+from keras.src.metrics.confusion_metrics import TruePositives
+from keras.src.metrics.f_score_metrics import F1Score
+from keras.src.metrics.f_score_metrics import FBetaScore
+from keras.src.metrics.hinge_metrics import CategoricalHinge
+from keras.src.metrics.hinge_metrics import Hinge
+from keras.src.metrics.hinge_metrics import SquaredHinge
+from keras.src.metrics.iou_metrics import BinaryIoU
+from keras.src.metrics.iou_metrics import IoU
+from keras.src.metrics.iou_metrics import MeanIoU
+from keras.src.metrics.iou_metrics import OneHotIoU
+from keras.src.metrics.iou_metrics import OneHotMeanIoU
+from keras.src.metrics.metric import Metric
+from keras.src.metrics.probabilistic_metrics import BinaryCrossentropy
+from keras.src.metrics.probabilistic_metrics import CategoricalCrossentropy
+from keras.src.metrics.probabilistic_metrics import KLDivergence
+from keras.src.metrics.probabilistic_metrics import Poisson
+from keras.src.metrics.probabilistic_metrics import (
+    SparseCategoricalCrossentropy,
+)
+from keras.src.metrics.reduction_metrics import Mean
+from keras.src.metrics.reduction_metrics import MeanMetricWrapper
+from keras.src.metrics.reduction_metrics import Sum
+from keras.src.metrics.regression_metrics import CosineSimilarity
+from keras.src.metrics.regression_metrics import LogCoshError
+from keras.src.metrics.regression_metrics import MeanAbsoluteError
+from keras.src.metrics.regression_metrics import MeanAbsolutePercentageError
+from keras.src.metrics.regression_metrics import MeanSquaredError
+from keras.src.metrics.regression_metrics import MeanSquaredLogarithmicError
+from keras.src.metrics.regression_metrics import R2Score
+from keras.src.metrics.regression_metrics import RootMeanSquaredError
diff --git a/keras/api/mixed_precision/__init__.py b/keras/api/mixed_precision/__init__.py
new file mode 100644
index 000000000000..85a421651d16
--- /dev/null
+++ b/keras/api/mixed_precision/__init__.py
@@ -0,0 +1,15 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.dtype_policies.dtype_policy import DTypePolicy
+from keras.src.dtype_policies.dtype_policy import DTypePolicy as Policy
+from keras.src.dtype_policies.dtype_policy import dtype_policy
+from keras.src.dtype_policies.dtype_policy import dtype_policy as global_policy
+from keras.src.dtype_policies.dtype_policy import set_dtype_policy
+from keras.src.dtype_policies.dtype_policy import (
+    set_dtype_policy as set_global_policy,
+)
+from keras.src.optimizers.loss_scale_optimizer import LossScaleOptimizer
diff --git a/keras/api/models/__init__.py b/keras/api/models/__init__.py
new file mode 100644
index 000000000000..48760da64791
--- /dev/null
+++ b/keras/api/models/__init__.py
@@ -0,0 +1,12 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.models.cloning import clone_model
+from keras.src.models.model import Model
+from keras.src.models.model import model_from_json
+from keras.src.models.sequential import Sequential
+from keras.src.saving.saving_api import load_model
+from keras.src.saving.saving_api import save_model
diff --git a/keras/api/ops/__init__.py b/keras/api/ops/__init__.py
new file mode 100644
index 000000000000..1253650e9bc0
--- /dev/null
+++ b/keras/api/ops/__init__.py
@@ -0,0 +1,223 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.ops import image
+from keras.api.ops import linalg
+from keras.api.ops import nn
+from keras.api.ops import numpy
+from keras.src.ops.core import cast
+from keras.src.ops.core import cond
+from keras.src.ops.core import convert_to_numpy
+from keras.src.ops.core import convert_to_tensor
+from keras.src.ops.core import custom_gradient
+from keras.src.ops.core import fori_loop
+from keras.src.ops.core import is_tensor
+from keras.src.ops.core import scatter
+from keras.src.ops.core import scatter_update
+from keras.src.ops.core import shape
+from keras.src.ops.core import slice
+from keras.src.ops.core import slice_update
+from keras.src.ops.core import stop_gradient
+from keras.src.ops.core import unstack
+from keras.src.ops.core import vectorized_map
+from keras.src.ops.core import while_loop
+from keras.src.ops.linalg import cholesky
+from keras.src.ops.linalg import det
+from keras.src.ops.linalg import eig
+from keras.src.ops.linalg import inv
+from keras.src.ops.linalg import lu_factor
+from keras.src.ops.linalg import norm
+from keras.src.ops.linalg import qr
+from keras.src.ops.linalg import solve
+from keras.src.ops.linalg import solve_triangular
+from keras.src.ops.linalg import svd
+from keras.src.ops.math import erf
+from keras.src.ops.math import erfinv
+from keras.src.ops.math import extract_sequences
+from keras.src.ops.math import fft
+from keras.src.ops.math import fft2
+from keras.src.ops.math import in_top_k
+from keras.src.ops.math import irfft
+from keras.src.ops.math import istft
+from keras.src.ops.math import logsumexp
+from keras.src.ops.math import rfft
+from keras.src.ops.math import rsqrt
+from keras.src.ops.math import segment_max
+from keras.src.ops.math import segment_sum
+from keras.src.ops.math import stft
+from keras.src.ops.math import top_k
+from keras.src.ops.nn import average_pool
+from keras.src.ops.nn import batch_normalization
+from keras.src.ops.nn import binary_crossentropy
+from keras.src.ops.nn import categorical_crossentropy
+from keras.src.ops.nn import conv
+from keras.src.ops.nn import conv_transpose
+from keras.src.ops.nn import ctc_loss
+from keras.src.ops.nn import depthwise_conv
+from keras.src.ops.nn import elu
+from keras.src.ops.nn import gelu
+from keras.src.ops.nn import hard_sigmoid
+from keras.src.ops.nn import hard_silu
+from keras.src.ops.nn import hard_silu as hard_swish
+from keras.src.ops.nn import leaky_relu
+from keras.src.ops.nn import log_sigmoid
+from keras.src.ops.nn import log_softmax
+from keras.src.ops.nn import max_pool
+from keras.src.ops.nn import moments
+from keras.src.ops.nn import multi_hot
+from keras.src.ops.nn import normalize
+from keras.src.ops.nn import one_hot
+from keras.src.ops.nn import relu
+from keras.src.ops.nn import relu6
+from keras.src.ops.nn import selu
+from keras.src.ops.nn import separable_conv
+from keras.src.ops.nn import sigmoid
+from keras.src.ops.nn import silu
+from keras.src.ops.nn import silu as swish
+from keras.src.ops.nn import softmax
+from keras.src.ops.nn import softplus
+from keras.src.ops.nn import softsign
+from keras.src.ops.nn import sparse_categorical_crossentropy
+from keras.src.ops.numpy import abs
+from keras.src.ops.numpy import absolute
+from keras.src.ops.numpy import add
+from keras.src.ops.numpy import all
+from keras.src.ops.numpy import amax
+from keras.src.ops.numpy import amin
+from keras.src.ops.numpy import any
+from keras.src.ops.numpy import append
+from keras.src.ops.numpy import arange
+from keras.src.ops.numpy import arccos
+from keras.src.ops.numpy import arccosh
+from keras.src.ops.numpy import arcsin
+from keras.src.ops.numpy import arcsinh
+from keras.src.ops.numpy import arctan
+from keras.src.ops.numpy import arctan2
+from keras.src.ops.numpy import arctanh
+from keras.src.ops.numpy import argmax
+from keras.src.ops.numpy import argmin
+from keras.src.ops.numpy import argsort
+from keras.src.ops.numpy import array
+from keras.src.ops.numpy import average
+from keras.src.ops.numpy import bincount
+from keras.src.ops.numpy import broadcast_to
+from keras.src.ops.numpy import ceil
+from keras.src.ops.numpy import clip
+from keras.src.ops.numpy import concatenate
+from keras.src.ops.numpy import conj
+from keras.src.ops.numpy import conjugate
+from keras.src.ops.numpy import copy
+from keras.src.ops.numpy import correlate
+from keras.src.ops.numpy import cos
+from keras.src.ops.numpy import cosh
+from keras.src.ops.numpy import count_nonzero
+from keras.src.ops.numpy import cross
+from keras.src.ops.numpy import cumprod
+from keras.src.ops.numpy import cumsum
+from keras.src.ops.numpy import diag
+from keras.src.ops.numpy import diagonal
+from keras.src.ops.numpy import diff
+from keras.src.ops.numpy import digitize
+from keras.src.ops.numpy import divide
+from keras.src.ops.numpy import divide_no_nan
+from keras.src.ops.numpy import dot
+from keras.src.ops.numpy import einsum
+from keras.src.ops.numpy import empty
+from keras.src.ops.numpy import equal
+from keras.src.ops.numpy import exp
+from keras.src.ops.numpy import expand_dims
+from keras.src.ops.numpy import expm1
+from keras.src.ops.numpy import eye
+from keras.src.ops.numpy import flip
+from keras.src.ops.numpy import floor
+from keras.src.ops.numpy import floor_divide
+from keras.src.ops.numpy import full
+from keras.src.ops.numpy import full_like
+from keras.src.ops.numpy import get_item
+from keras.src.ops.numpy import greater
+from keras.src.ops.numpy import greater_equal
+from keras.src.ops.numpy import hstack
+from keras.src.ops.numpy import identity
+from keras.src.ops.numpy import imag
+from keras.src.ops.numpy import isclose
+from keras.src.ops.numpy import isfinite
+from keras.src.ops.numpy import isinf
+from keras.src.ops.numpy import isnan
+from keras.src.ops.numpy import less
+from keras.src.ops.numpy import less_equal
+from keras.src.ops.numpy import linspace
+from keras.src.ops.numpy import log
+from keras.src.ops.numpy import log1p
+from keras.src.ops.numpy import log2
+from keras.src.ops.numpy import log10
+from keras.src.ops.numpy import logaddexp
+from keras.src.ops.numpy import logical_and
+from keras.src.ops.numpy import logical_not
+from keras.src.ops.numpy import logical_or
+from keras.src.ops.numpy import logical_xor
+from keras.src.ops.numpy import logspace
+from keras.src.ops.numpy import matmul
+from keras.src.ops.numpy import max
+from keras.src.ops.numpy import maximum
+from keras.src.ops.numpy import mean
+from keras.src.ops.numpy import median
+from keras.src.ops.numpy import meshgrid
+from keras.src.ops.numpy import min
+from keras.src.ops.numpy import minimum
+from keras.src.ops.numpy import mod
+from keras.src.ops.numpy import moveaxis
+from keras.src.ops.numpy import multiply
+from keras.src.ops.numpy import nan_to_num
+from keras.src.ops.numpy import ndim
+from keras.src.ops.numpy import negative
+from keras.src.ops.numpy import nonzero
+from keras.src.ops.numpy import not_equal
+from keras.src.ops.numpy import ones
+from keras.src.ops.numpy import ones_like
+from keras.src.ops.numpy import outer
+from keras.src.ops.numpy import pad
+from keras.src.ops.numpy import power
+from keras.src.ops.numpy import prod
+from keras.src.ops.numpy import quantile
+from keras.src.ops.numpy import ravel
+from keras.src.ops.numpy import real
+from keras.src.ops.numpy import reciprocal
+from keras.src.ops.numpy import repeat
+from keras.src.ops.numpy import reshape
+from keras.src.ops.numpy import roll
+from keras.src.ops.numpy import round
+from keras.src.ops.numpy import sign
+from keras.src.ops.numpy import sin
+from keras.src.ops.numpy import sinh
+from keras.src.ops.numpy import size
+from keras.src.ops.numpy import sort
+from keras.src.ops.numpy import split
+from keras.src.ops.numpy import sqrt
+from keras.src.ops.numpy import square
+from keras.src.ops.numpy import squeeze
+from keras.src.ops.numpy import stack
+from keras.src.ops.numpy import std
+from keras.src.ops.numpy import subtract
+from keras.src.ops.numpy import sum
+from keras.src.ops.numpy import swapaxes
+from keras.src.ops.numpy import take
+from keras.src.ops.numpy import take_along_axis
+from keras.src.ops.numpy import tan
+from keras.src.ops.numpy import tanh
+from keras.src.ops.numpy import tensordot
+from keras.src.ops.numpy import tile
+from keras.src.ops.numpy import trace
+from keras.src.ops.numpy import transpose
+from keras.src.ops.numpy import tri
+from keras.src.ops.numpy import tril
+from keras.src.ops.numpy import triu
+from keras.src.ops.numpy import true_divide
+from keras.src.ops.numpy import var
+from keras.src.ops.numpy import vdot
+from keras.src.ops.numpy import vstack
+from keras.src.ops.numpy import where
+from keras.src.ops.numpy import zeros
+from keras.src.ops.numpy import zeros_like
diff --git a/keras/api/ops/image/__init__.py b/keras/api/ops/image/__init__.py
new file mode 100644
index 000000000000..e4c8464c2195
--- /dev/null
+++ b/keras/api/ops/image/__init__.py
@@ -0,0 +1,13 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.ops.image import affine_transform
+from keras.src.ops.image import crop_images
+from keras.src.ops.image import extract_patches
+from keras.src.ops.image import map_coordinates
+from keras.src.ops.image import pad_images
+from keras.src.ops.image import resize
+from keras.src.ops.image import rgb_to_grayscale
diff --git a/keras/api/ops/linalg/__init__.py b/keras/api/ops/linalg/__init__.py
new file mode 100644
index 000000000000..da392d6c2490
--- /dev/null
+++ b/keras/api/ops/linalg/__init__.py
@@ -0,0 +1,16 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.ops.linalg import cholesky
+from keras.src.ops.linalg import det
+from keras.src.ops.linalg import eig
+from keras.src.ops.linalg import inv
+from keras.src.ops.linalg import lu_factor
+from keras.src.ops.linalg import norm
+from keras.src.ops.linalg import qr
+from keras.src.ops.linalg import solve
+from keras.src.ops.linalg import solve_triangular
+from keras.src.ops.linalg import svd
diff --git a/keras/api/ops/nn/__init__.py b/keras/api/ops/nn/__init__.py
new file mode 100644
index 000000000000..9452ea18a766
--- /dev/null
+++ b/keras/api/ops/nn/__init__.py
@@ -0,0 +1,38 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.ops.nn import average_pool
+from keras.src.ops.nn import batch_normalization
+from keras.src.ops.nn import binary_crossentropy
+from keras.src.ops.nn import categorical_crossentropy
+from keras.src.ops.nn import conv
+from keras.src.ops.nn import conv_transpose
+from keras.src.ops.nn import ctc_loss
+from keras.src.ops.nn import depthwise_conv
+from keras.src.ops.nn import elu
+from keras.src.ops.nn import gelu
+from keras.src.ops.nn import hard_sigmoid
+from keras.src.ops.nn import hard_silu
+from keras.src.ops.nn import hard_silu as hard_swish
+from keras.src.ops.nn import leaky_relu
+from keras.src.ops.nn import log_sigmoid
+from keras.src.ops.nn import log_softmax
+from keras.src.ops.nn import max_pool
+from keras.src.ops.nn import moments
+from keras.src.ops.nn import multi_hot
+from keras.src.ops.nn import normalize
+from keras.src.ops.nn import one_hot
+from keras.src.ops.nn import relu
+from keras.src.ops.nn import relu6
+from keras.src.ops.nn import selu
+from keras.src.ops.nn import separable_conv
+from keras.src.ops.nn import sigmoid
+from keras.src.ops.nn import silu
+from keras.src.ops.nn import silu as swish
+from keras.src.ops.nn import softmax
+from keras.src.ops.nn import softplus
+from keras.src.ops.nn import softsign
+from keras.src.ops.nn import sparse_categorical_crossentropy
diff --git a/keras/api/ops/numpy/__init__.py b/keras/api/ops/numpy/__init__.py
new file mode 100644
index 000000000000..1d5434e40288
--- /dev/null
+++ b/keras/api/ops/numpy/__init__.py
@@ -0,0 +1,146 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.ops.numpy import abs
+from keras.src.ops.numpy import absolute
+from keras.src.ops.numpy import add
+from keras.src.ops.numpy import all
+from keras.src.ops.numpy import amax
+from keras.src.ops.numpy import amin
+from keras.src.ops.numpy import any
+from keras.src.ops.numpy import append
+from keras.src.ops.numpy import arange
+from keras.src.ops.numpy import arccos
+from keras.src.ops.numpy import arccosh
+from keras.src.ops.numpy import arcsin
+from keras.src.ops.numpy import arcsinh
+from keras.src.ops.numpy import arctan
+from keras.src.ops.numpy import arctan2
+from keras.src.ops.numpy import arctanh
+from keras.src.ops.numpy import argmax
+from keras.src.ops.numpy import argmin
+from keras.src.ops.numpy import argsort
+from keras.src.ops.numpy import array
+from keras.src.ops.numpy import average
+from keras.src.ops.numpy import bincount
+from keras.src.ops.numpy import broadcast_to
+from keras.src.ops.numpy import ceil
+from keras.src.ops.numpy import clip
+from keras.src.ops.numpy import concatenate
+from keras.src.ops.numpy import conj
+from keras.src.ops.numpy import conjugate
+from keras.src.ops.numpy import copy
+from keras.src.ops.numpy import correlate
+from keras.src.ops.numpy import cos
+from keras.src.ops.numpy import cosh
+from keras.src.ops.numpy import count_nonzero
+from keras.src.ops.numpy import cross
+from keras.src.ops.numpy import cumprod
+from keras.src.ops.numpy import cumsum
+from keras.src.ops.numpy import diag
+from keras.src.ops.numpy import diagonal
+from keras.src.ops.numpy import diff
+from keras.src.ops.numpy import digitize
+from keras.src.ops.numpy import divide
+from keras.src.ops.numpy import divide_no_nan
+from keras.src.ops.numpy import dot
+from keras.src.ops.numpy import einsum
+from keras.src.ops.numpy import empty
+from keras.src.ops.numpy import equal
+from keras.src.ops.numpy import exp
+from keras.src.ops.numpy import expand_dims
+from keras.src.ops.numpy import expm1
+from keras.src.ops.numpy import eye
+from keras.src.ops.numpy import flip
+from keras.src.ops.numpy import floor
+from keras.src.ops.numpy import floor_divide
+from keras.src.ops.numpy import full
+from keras.src.ops.numpy import full_like
+from keras.src.ops.numpy import get_item
+from keras.src.ops.numpy import greater
+from keras.src.ops.numpy import greater_equal
+from keras.src.ops.numpy import hstack
+from keras.src.ops.numpy import identity
+from keras.src.ops.numpy import imag
+from keras.src.ops.numpy import isclose
+from keras.src.ops.numpy import isfinite
+from keras.src.ops.numpy import isinf
+from keras.src.ops.numpy import isnan
+from keras.src.ops.numpy import less
+from keras.src.ops.numpy import less_equal
+from keras.src.ops.numpy import linspace
+from keras.src.ops.numpy import log
+from keras.src.ops.numpy import log1p
+from keras.src.ops.numpy import log2
+from keras.src.ops.numpy import log10
+from keras.src.ops.numpy import logaddexp
+from keras.src.ops.numpy import logical_and
+from keras.src.ops.numpy import logical_not
+from keras.src.ops.numpy import logical_or
+from keras.src.ops.numpy import logical_xor
+from keras.src.ops.numpy import logspace
+from keras.src.ops.numpy import matmul
+from keras.src.ops.numpy import max
+from keras.src.ops.numpy import maximum
+from keras.src.ops.numpy import mean
+from keras.src.ops.numpy import median
+from keras.src.ops.numpy import meshgrid
+from keras.src.ops.numpy import min
+from keras.src.ops.numpy import minimum
+from keras.src.ops.numpy import mod
+from keras.src.ops.numpy import moveaxis
+from keras.src.ops.numpy import multiply
+from keras.src.ops.numpy import nan_to_num
+from keras.src.ops.numpy import ndim
+from keras.src.ops.numpy import negative
+from keras.src.ops.numpy import nonzero
+from keras.src.ops.numpy import not_equal
+from keras.src.ops.numpy import ones
+from keras.src.ops.numpy import ones_like
+from keras.src.ops.numpy import outer
+from keras.src.ops.numpy import pad
+from keras.src.ops.numpy import power
+from keras.src.ops.numpy import prod
+from keras.src.ops.numpy import quantile
+from keras.src.ops.numpy import ravel
+from keras.src.ops.numpy import real
+from keras.src.ops.numpy import reciprocal
+from keras.src.ops.numpy import repeat
+from keras.src.ops.numpy import reshape
+from keras.src.ops.numpy import roll
+from keras.src.ops.numpy import round
+from keras.src.ops.numpy import sign
+from keras.src.ops.numpy import sin
+from keras.src.ops.numpy import sinh
+from keras.src.ops.numpy import size
+from keras.src.ops.numpy import sort
+from keras.src.ops.numpy import split
+from keras.src.ops.numpy import sqrt
+from keras.src.ops.numpy import square
+from keras.src.ops.numpy import squeeze
+from keras.src.ops.numpy import stack
+from keras.src.ops.numpy import std
+from keras.src.ops.numpy import subtract
+from keras.src.ops.numpy import sum
+from keras.src.ops.numpy import swapaxes
+from keras.src.ops.numpy import take
+from keras.src.ops.numpy import take_along_axis
+from keras.src.ops.numpy import tan
+from keras.src.ops.numpy import tanh
+from keras.src.ops.numpy import tensordot
+from keras.src.ops.numpy import tile
+from keras.src.ops.numpy import trace
+from keras.src.ops.numpy import transpose
+from keras.src.ops.numpy import tri
+from keras.src.ops.numpy import tril
+from keras.src.ops.numpy import triu
+from keras.src.ops.numpy import true_divide
+from keras.src.ops.numpy import var
+from keras.src.ops.numpy import vdot
+from keras.src.ops.numpy import vstack
+from keras.src.ops.numpy import where
+from keras.src.ops.numpy import zeros
+from keras.src.ops.numpy import zeros_like
diff --git a/keras/api/optimizers/__init__.py b/keras/api/optimizers/__init__.py
new file mode 100644
index 000000000000..5dab6705b58d
--- /dev/null
+++ b/keras/api/optimizers/__init__.py
@@ -0,0 +1,24 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.optimizers import legacy
+from keras.api.optimizers import schedules
+from keras.src.optimizers import deserialize
+from keras.src.optimizers import get
+from keras.src.optimizers import serialize
+from keras.src.optimizers.adadelta import Adadelta
+from keras.src.optimizers.adafactor import Adafactor
+from keras.src.optimizers.adagrad import Adagrad
+from keras.src.optimizers.adam import Adam
+from keras.src.optimizers.adamax import Adamax
+from keras.src.optimizers.adamw import AdamW
+from keras.src.optimizers.ftrl import Ftrl
+from keras.src.optimizers.lion import Lion
+from keras.src.optimizers.loss_scale_optimizer import LossScaleOptimizer
+from keras.src.optimizers.nadam import Nadam
+from keras.src.optimizers.optimizer import Optimizer
+from keras.src.optimizers.rmsprop import RMSprop
+from keras.src.optimizers.sgd import SGD
diff --git a/keras/api/optimizers/legacy/__init__.py b/keras/api/optimizers/legacy/__init__.py
new file mode 100644
index 000000000000..bff1a0313630
--- /dev/null
+++ b/keras/api/optimizers/legacy/__init__.py
@@ -0,0 +1,12 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.optimizers import LegacyOptimizerWarning as Adagrad
+from keras.src.optimizers import LegacyOptimizerWarning as Adam
+from keras.src.optimizers import LegacyOptimizerWarning as Ftrl
+from keras.src.optimizers import LegacyOptimizerWarning as Optimizer
+from keras.src.optimizers import LegacyOptimizerWarning as RMSprop
+from keras.src.optimizers import LegacyOptimizerWarning as SGD
diff --git a/keras/api/optimizers/schedules/__init__.py b/keras/api/optimizers/schedules/__init__.py
new file mode 100644
index 000000000000..6178626258ed
--- /dev/null
+++ b/keras/api/optimizers/schedules/__init__.py
@@ -0,0 +1,27 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.optimizers.schedules.learning_rate_schedule import CosineDecay
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    CosineDecayRestarts,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    ExponentialDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    InverseTimeDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    LearningRateSchedule,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    PiecewiseConstantDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    PolynomialDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import deserialize
+from keras.src.optimizers.schedules.learning_rate_schedule import serialize
diff --git a/keras/api/preprocessing/__init__.py b/keras/api/preprocessing/__init__.py
new file mode 100644
index 000000000000..c9ed7fd664c2
--- /dev/null
+++ b/keras/api/preprocessing/__init__.py
@@ -0,0 +1,13 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.preprocessing import image
+from keras.api.preprocessing import sequence
+from keras.src.utils.image_dataset_utils import image_dataset_from_directory
+from keras.src.utils.text_dataset_utils import text_dataset_from_directory
+from keras.src.utils.timeseries_dataset_utils import (
+    timeseries_dataset_from_array,
+)
diff --git a/keras/api/preprocessing/image/__init__.py b/keras/api/preprocessing/image/__init__.py
new file mode 100644
index 000000000000..f68afe8789d5
--- /dev/null
+++ b/keras/api/preprocessing/image/__init__.py
@@ -0,0 +1,11 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.utils.image_utils import array_to_img
+from keras.src.utils.image_utils import img_to_array
+from keras.src.utils.image_utils import load_img
+from keras.src.utils.image_utils import save_img
+from keras.src.utils.image_utils import smart_resize
diff --git a/keras/api/preprocessing/sequence/__init__.py b/keras/api/preprocessing/sequence/__init__.py
new file mode 100644
index 000000000000..188e01af9c48
--- /dev/null
+++ b/keras/api/preprocessing/sequence/__init__.py
@@ -0,0 +1,7 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.utils.sequence_utils import pad_sequences
diff --git a/keras/api/quantizers/__init__.py b/keras/api/quantizers/__init__.py
new file mode 100644
index 000000000000..d8a209bbb623
--- /dev/null
+++ b/keras/api/quantizers/__init__.py
@@ -0,0 +1,15 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.quantizers import deserialize
+from keras.src.quantizers import get
+from keras.src.quantizers import serialize
+from keras.src.quantizers.quantizers import AbsMaxQuantizer
+from keras.src.quantizers.quantizers import Quantizer
+from keras.src.quantizers.quantizers import abs_max_quantize
+from keras.src.quantizers.quantizers import compute_float8_amax_history
+from keras.src.quantizers.quantizers import compute_float8_scale
+from keras.src.quantizers.quantizers import quantize_and_dequantize
diff --git a/keras/api/random/__init__.py b/keras/api/random/__init__.py
new file mode 100644
index 000000000000..faf9c67f3fc4
--- /dev/null
+++ b/keras/api/random/__init__.py
@@ -0,0 +1,17 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.random.random import beta
+from keras.src.random.random import binomial
+from keras.src.random.random import categorical
+from keras.src.random.random import dropout
+from keras.src.random.random import gamma
+from keras.src.random.random import normal
+from keras.src.random.random import randint
+from keras.src.random.random import shuffle
+from keras.src.random.random import truncated_normal
+from keras.src.random.random import uniform
+from keras.src.random.seed_generator import SeedGenerator
diff --git a/keras/api/regularizers/__init__.py b/keras/api/regularizers/__init__.py
new file mode 100644
index 000000000000..93b51eaa51bd
--- /dev/null
+++ b/keras/api/regularizers/__init__.py
@@ -0,0 +1,20 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.regularizers import deserialize
+from keras.src.regularizers import get
+from keras.src.regularizers import serialize
+from keras.src.regularizers.regularizers import L1
+from keras.src.regularizers.regularizers import L1 as l1
+from keras.src.regularizers.regularizers import L1L2
+from keras.src.regularizers.regularizers import L1L2 as l1_l2
+from keras.src.regularizers.regularizers import L2
+from keras.src.regularizers.regularizers import L2 as l2
+from keras.src.regularizers.regularizers import OrthogonalRegularizer
+from keras.src.regularizers.regularizers import (
+    OrthogonalRegularizer as orthogonal_regularizer,
+)
+from keras.src.regularizers.regularizers import Regularizer
diff --git a/keras/api/saving/__init__.py b/keras/api/saving/__init__.py
new file mode 100644
index 000000000000..2f772922f8d1
--- /dev/null
+++ b/keras/api/saving/__init__.py
@@ -0,0 +1,20 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.saving.object_registration import CustomObjectScope
+from keras.src.saving.object_registration import (
+    CustomObjectScope as custom_object_scope,
+)
+from keras.src.saving.object_registration import get_custom_objects
+from keras.src.saving.object_registration import get_registered_name
+from keras.src.saving.object_registration import get_registered_object
+from keras.src.saving.object_registration import register_keras_serializable
+from keras.src.saving.saving_api import load_model
+from keras.src.saving.saving_api import load_weights
+from keras.src.saving.saving_api import save_model
+from keras.src.saving.saving_api import save_weights
+from keras.src.saving.serialization_lib import deserialize_keras_object
+from keras.src.saving.serialization_lib import serialize_keras_object
diff --git a/keras/api/tree/__init__.py b/keras/api/tree/__init__.py
new file mode 100644
index 000000000000..388d19a0ec26
--- /dev/null
+++ b/keras/api/tree/__init__.py
@@ -0,0 +1,15 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.tree.tree_api import assert_same_structure
+from keras.src.tree.tree_api import flatten
+from keras.src.tree.tree_api import is_nested
+from keras.src.tree.tree_api import lists_to_tuples
+from keras.src.tree.tree_api import map_shape_structure
+from keras.src.tree.tree_api import map_structure
+from keras.src.tree.tree_api import map_structure_up_to
+from keras.src.tree.tree_api import pack_sequence_as
+from keras.src.tree.tree_api import traverse
diff --git a/keras/api/utils/__init__.py b/keras/api/utils/__init__.py
new file mode 100644
index 000000000000..aab787cc930f
--- /dev/null
+++ b/keras/api/utils/__init__.py
@@ -0,0 +1,54 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.api.utils import legacy
+from keras.src.backend.common.global_state import clear_session
+from keras.src.backend.common.keras_tensor import is_keras_tensor
+from keras.src.backend.common.variables import standardize_dtype
+from keras.src.layers.preprocessing.feature_space import FeatureSpace
+from keras.src.ops.operation_utils import get_source_inputs
+from keras.src.saving.object_registration import CustomObjectScope
+from keras.src.saving.object_registration import (
+    CustomObjectScope as custom_object_scope,
+)
+from keras.src.saving.object_registration import get_custom_objects
+from keras.src.saving.object_registration import get_registered_name
+from keras.src.saving.object_registration import get_registered_object
+from keras.src.saving.object_registration import register_keras_serializable
+from keras.src.saving.serialization_lib import deserialize_keras_object
+from keras.src.saving.serialization_lib import serialize_keras_object
+from keras.src.trainers.data_adapters.data_adapter_utils import (
+    pack_x_y_sample_weight,
+)
+from keras.src.trainers.data_adapters.data_adapter_utils import (
+    unpack_x_y_sample_weight,
+)
+from keras.src.trainers.data_adapters.py_dataset_adapter import PyDataset
+from keras.src.trainers.data_adapters.py_dataset_adapter import (
+    PyDataset as Sequence,
+)
+from keras.src.utils.audio_dataset_utils import audio_dataset_from_directory
+from keras.src.utils.dataset_utils import split_dataset
+from keras.src.utils.file_utils import get_file
+from keras.src.utils.image_dataset_utils import image_dataset_from_directory
+from keras.src.utils.image_utils import array_to_img
+from keras.src.utils.image_utils import img_to_array
+from keras.src.utils.image_utils import load_img
+from keras.src.utils.image_utils import save_img
+from keras.src.utils.io_utils import disable_interactive_logging
+from keras.src.utils.io_utils import enable_interactive_logging
+from keras.src.utils.io_utils import is_interactive_logging_enabled
+from keras.src.utils.model_visualization import model_to_dot
+from keras.src.utils.model_visualization import plot_model
+from keras.src.utils.numerical_utils import normalize
+from keras.src.utils.numerical_utils import to_categorical
+from keras.src.utils.progbar import Progbar
+from keras.src.utils.rng_utils import set_random_seed
+from keras.src.utils.sequence_utils import pad_sequences
+from keras.src.utils.text_dataset_utils import text_dataset_from_directory
+from keras.src.utils.timeseries_dataset_utils import (
+    timeseries_dataset_from_array,
+)
diff --git a/keras/api/utils/legacy/__init__.py b/keras/api/utils/legacy/__init__.py
new file mode 100644
index 000000000000..ac4d2d43dd9a
--- /dev/null
+++ b/keras/api/utils/legacy/__init__.py
@@ -0,0 +1,8 @@
+"""DO NOT EDIT.
+
+This file was autogenerated. Do not edit it by hand,
+since your modifications would be overwritten.
+"""
+
+from keras.src.legacy.saving.serialization import deserialize_keras_object
+from keras.src.legacy.saving.serialization import serialize_keras_object
diff --git a/keras/backend/__init__.py b/keras/backend/__init__.py
deleted file mode 100644
index 66e8bcb9ded9..000000000000
--- a/keras/backend/__init__.py
+++ /dev/null
@@ -1,45 +0,0 @@
-from keras.backend.config import backend
-
-if backend() == "torch":
-    # When using the torch backend,
-    # torch needs to be imported first, otherwise it will segfault
-    # upon import.
-    import torch
-
-from keras.backend.common.dtypes import result_type
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.backend.common.keras_tensor import any_symbolic_tensors
-from keras.backend.common.keras_tensor import is_keras_tensor
-from keras.backend.common.name_scope import name_scope
-from keras.backend.common.stateless_scope import StatelessScope
-from keras.backend.common.stateless_scope import get_stateless_scope
-from keras.backend.common.stateless_scope import in_stateless_scope
-from keras.backend.common.variables import AutocastScope
-from keras.backend.common.variables import get_autocast_scope
-from keras.backend.common.variables import is_float_dtype
-from keras.backend.common.variables import is_int_dtype
-from keras.backend.common.variables import standardize_dtype
-from keras.backend.common.variables import standardize_shape
-from keras.backend.config import epsilon
-from keras.backend.config import floatx
-from keras.backend.config import image_data_format
-from keras.backend.config import set_epsilon
-from keras.backend.config import set_floatx
-from keras.backend.config import set_image_data_format
-from keras.backend.config import standardize_data_format
-
-# Import backend functions.
-if backend() == "tensorflow":
-    from keras.backend.tensorflow import *  # noqa: F403
-elif backend() == "jax":
-    from keras.backend.jax import *  # noqa: F403
-elif backend() == "torch":
-    from keras.backend.torch import *  # noqa: F403
-
-    distribution_lib = None
-elif backend() == "numpy":
-    from keras.backend.numpy import *  # noqa: F403
-
-    distribution_lib = None
-else:
-    raise ValueError(f"Unable to import backend : {backend()}")
diff --git a/keras/backend/common/__init__.py b/keras/backend/common/__init__.py
deleted file mode 100644
index a29e86ce15ab..000000000000
--- a/keras/backend/common/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from keras.backend.common import backend_utils
-from keras.backend.common.dtypes import result_type
-from keras.backend.common.variables import AutocastScope
-from keras.backend.common.variables import KerasVariable
-from keras.backend.common.variables import get_autocast_scope
-from keras.backend.common.variables import is_float_dtype
-from keras.backend.common.variables import is_int_dtype
-from keras.backend.common.variables import standardize_dtype
-from keras.backend.common.variables import standardize_shape
-from keras.random import random
diff --git a/keras/backend/jax/__init__.py b/keras/backend/jax/__init__.py
deleted file mode 100644
index 327bd95dc0de..000000000000
--- a/keras/backend/jax/__init__.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from keras.backend.jax import core
-from keras.backend.jax import distribution_lib
-from keras.backend.jax import image
-from keras.backend.jax import linalg
-from keras.backend.jax import math
-from keras.backend.jax import nn
-from keras.backend.jax import numpy
-from keras.backend.jax import random
-from keras.backend.jax.core import SUPPORTS_SPARSE_TENSORS
-from keras.backend.jax.core import Variable
-from keras.backend.jax.core import cast
-from keras.backend.jax.core import compute_output_spec
-from keras.backend.jax.core import cond
-from keras.backend.jax.core import convert_to_numpy
-from keras.backend.jax.core import convert_to_tensor
-from keras.backend.jax.core import device_scope
-from keras.backend.jax.core import is_tensor
-from keras.backend.jax.core import scatter
-from keras.backend.jax.core import shape
-from keras.backend.jax.core import stop_gradient
-from keras.backend.jax.core import vectorized_map
-from keras.backend.jax.rnn import cudnn_ok
-from keras.backend.jax.rnn import gru
-from keras.backend.jax.rnn import lstm
-from keras.backend.jax.rnn import rnn
diff --git a/keras/backend/numpy/__init__.py b/keras/backend/numpy/__init__.py
deleted file mode 100644
index f84ec2e32291..000000000000
--- a/keras/backend/numpy/__init__.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from keras.backend.numpy import core
-from keras.backend.numpy import image
-from keras.backend.numpy import linalg
-from keras.backend.numpy import math
-from keras.backend.numpy import nn
-from keras.backend.numpy import numpy
-from keras.backend.numpy import random
-from keras.backend.numpy.core import SUPPORTS_SPARSE_TENSORS
-from keras.backend.numpy.core import Variable
-from keras.backend.numpy.core import cast
-from keras.backend.numpy.core import compute_output_spec
-from keras.backend.numpy.core import cond
-from keras.backend.numpy.core import convert_to_numpy
-from keras.backend.numpy.core import convert_to_tensor
-from keras.backend.numpy.core import is_tensor
-from keras.backend.numpy.core import shape
-from keras.backend.numpy.core import vectorized_map
-from keras.backend.numpy.rnn import cudnn_ok
-from keras.backend.numpy.rnn import gru
-from keras.backend.numpy.rnn import lstm
-from keras.backend.numpy.rnn import rnn
diff --git a/keras/backend/tensorflow/__init__.py b/keras/backend/tensorflow/__init__.py
deleted file mode 100644
index 2791de505385..000000000000
--- a/keras/backend/tensorflow/__init__.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from keras.backend.tensorflow import core
-from keras.backend.tensorflow import distribution_lib
-from keras.backend.tensorflow import image
-from keras.backend.tensorflow import linalg
-from keras.backend.tensorflow import math
-from keras.backend.tensorflow import nn
-from keras.backend.tensorflow import numpy
-from keras.backend.tensorflow import random
-from keras.backend.tensorflow import tensorboard
-from keras.backend.tensorflow.core import SUPPORTS_SPARSE_TENSORS
-from keras.backend.tensorflow.core import Variable
-from keras.backend.tensorflow.core import cast
-from keras.backend.tensorflow.core import compute_output_spec
-from keras.backend.tensorflow.core import cond
-from keras.backend.tensorflow.core import convert_to_numpy
-from keras.backend.tensorflow.core import convert_to_tensor
-from keras.backend.tensorflow.core import device_scope
-from keras.backend.tensorflow.core import is_tensor
-from keras.backend.tensorflow.core import name_scope
-from keras.backend.tensorflow.core import scatter
-from keras.backend.tensorflow.core import shape
-from keras.backend.tensorflow.core import stop_gradient
-from keras.backend.tensorflow.core import vectorized_map
-from keras.backend.tensorflow.rnn import cudnn_ok
-from keras.backend.tensorflow.rnn import gru
-from keras.backend.tensorflow.rnn import lstm
-from keras.backend.tensorflow.rnn import rnn
diff --git a/keras/backend/torch/__init__.py b/keras/backend/torch/__init__.py
deleted file mode 100644
index 1358104f6f4b..000000000000
--- a/keras/backend/torch/__init__.py
+++ /dev/null
@@ -1,41 +0,0 @@
-"""Torch backend APIs.
-
-# Note on device placement
-
-Torch has a different device placement style compared to TF and JAX.
-In short, variables/tensors are not created on GPU by default,
-and the GPU cannot directly communicate with the CPU.
-To bring Torch behavior in line with TF and JAX automated device placement,
-we are doing the following to automate device placement if a GPU is available:
-
-- Variables are created on GPU.
-- Input data will be placed on GPU at the first `keras.layers.Layer` call.
-- Tensor creation happens on GPU, e.g., `zeros()` will create a tensor on GPU.
-- `convert_to_numpy` will bring the tensor to CPU before converting it to NumPy.
-"""
-
-from keras.backend.torch import core
-from keras.backend.torch import image
-from keras.backend.torch import linalg
-from keras.backend.torch import math
-from keras.backend.torch import nn
-from keras.backend.torch import numpy
-from keras.backend.torch import random
-from keras.backend.torch.core import SUPPORTS_SPARSE_TENSORS
-from keras.backend.torch.core import Variable
-from keras.backend.torch.core import cast
-from keras.backend.torch.core import compute_output_spec
-from keras.backend.torch.core import cond
-from keras.backend.torch.core import convert_to_numpy
-from keras.backend.torch.core import convert_to_tensor
-from keras.backend.torch.core import device_scope
-from keras.backend.torch.core import is_tensor
-from keras.backend.torch.core import scatter
-from keras.backend.torch.core import shape
-from keras.backend.torch.core import stop_gradient
-from keras.backend.torch.core import to_torch_dtype
-from keras.backend.torch.core import vectorized_map
-from keras.backend.torch.rnn import cudnn_ok
-from keras.backend.torch.rnn import gru
-from keras.backend.torch.rnn import lstm
-from keras.backend.torch.rnn import rnn
diff --git a/keras/backend/torch/optimizers/__init__.py b/keras/backend/torch/optimizers/__init__.py
deleted file mode 100644
index d067b931b625..000000000000
--- a/keras/backend/torch/optimizers/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from keras.backend.torch.optimizers.torch_optimizer import TorchOptimizer
diff --git a/keras/backend/torch/optimizers/torch_adamw.py b/keras/backend/torch/optimizers/torch_adamw.py
deleted file mode 100644
index c43ed17bce75..000000000000
--- a/keras/backend/torch/optimizers/torch_adamw.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from keras import optimizers
-from keras.backend.torch.optimizers import torch_adam
-
-
-class AdamW(torch_adam.Adam, optimizers.AdamW):
-    pass
diff --git a/keras/callbacks/__init__.py b/keras/callbacks/__init__.py
deleted file mode 100644
index 42a6dd4948d9..000000000000
--- a/keras/callbacks/__init__.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from keras.callbacks.backup_and_restore import BackupAndRestore
-from keras.callbacks.callback import Callback
-from keras.callbacks.callback_list import CallbackList
-from keras.callbacks.csv_logger import CSVLogger
-from keras.callbacks.early_stopping import EarlyStopping
-from keras.callbacks.history import History
-from keras.callbacks.lambda_callback import LambdaCallback
-from keras.callbacks.learning_rate_scheduler import LearningRateScheduler
-from keras.callbacks.model_checkpoint import ModelCheckpoint
-from keras.callbacks.progbar_logger import ProgbarLogger
-from keras.callbacks.reduce_lr_on_plateau import ReduceLROnPlateau
-from keras.callbacks.remote_monitor import RemoteMonitor
-from keras.callbacks.swap_ema_weights import SwapEMAWeights
-from keras.callbacks.tensorboard import TensorBoard
-from keras.callbacks.terminate_on_nan import TerminateOnNaN
diff --git a/keras/datasets/__init__.py b/keras/datasets/__init__.py
deleted file mode 100644
index 8fb280792f88..000000000000
--- a/keras/datasets/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""Small NumPy datasets for debugging/testing."""
-
-from keras.datasets import boston_housing
-from keras.datasets import california_housing
-from keras.datasets import cifar10
-from keras.datasets import cifar100
-from keras.datasets import fashion_mnist
-from keras.datasets import imdb
-from keras.datasets import mnist
-from keras.datasets import reuters
diff --git a/keras/distribution/__init__.py b/keras/distribution/__init__.py
deleted file mode 100644
index 880faf6d8165..000000000000
--- a/keras/distribution/__init__.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from keras.distribution.distribution_lib import DataParallel
-from keras.distribution.distribution_lib import DeviceMesh
-from keras.distribution.distribution_lib import Distribution
-from keras.distribution.distribution_lib import LayoutMap
-from keras.distribution.distribution_lib import ModelParallel
-from keras.distribution.distribution_lib import TensorLayout
-from keras.distribution.distribution_lib import distribute_tensor
-from keras.distribution.distribution_lib import distribution
-from keras.distribution.distribution_lib import initialize
-from keras.distribution.distribution_lib import list_devices
-from keras.distribution.distribution_lib import set_distribution
diff --git a/keras/export/__init__.py b/keras/export/__init__.py
deleted file mode 100644
index f59fb3dd04d9..000000000000
--- a/keras/export/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from keras.export.export_lib import ExportArchive
diff --git a/keras/layers/__init__.py b/keras/layers/__init__.py
deleted file mode 100644
index 9f3f95743024..000000000000
--- a/keras/layers/__init__.py
+++ /dev/null
@@ -1,161 +0,0 @@
-from keras.api_export import keras_export
-from keras.layers.activations.activation import Activation
-from keras.layers.activations.elu import ELU
-from keras.layers.activations.leaky_relu import LeakyReLU
-from keras.layers.activations.prelu import PReLU
-from keras.layers.activations.relu import ReLU
-from keras.layers.activations.softmax import Softmax
-from keras.layers.attention.additive_attention import AdditiveAttention
-from keras.layers.attention.attention import Attention
-from keras.layers.attention.grouped_query_attention import GroupedQueryAttention
-from keras.layers.attention.multi_head_attention import MultiHeadAttention
-from keras.layers.convolutional.conv1d import Conv1D
-from keras.layers.convolutional.conv1d_transpose import Conv1DTranspose
-from keras.layers.convolutional.conv2d import Conv2D
-from keras.layers.convolutional.conv2d_transpose import Conv2DTranspose
-from keras.layers.convolutional.conv3d import Conv3D
-from keras.layers.convolutional.conv3d_transpose import Conv3DTranspose
-from keras.layers.convolutional.depthwise_conv1d import DepthwiseConv1D
-from keras.layers.convolutional.depthwise_conv2d import DepthwiseConv2D
-from keras.layers.convolutional.separable_conv1d import SeparableConv1D
-from keras.layers.convolutional.separable_conv2d import SeparableConv2D
-from keras.layers.core.dense import Dense
-from keras.layers.core.einsum_dense import EinsumDense
-from keras.layers.core.embedding import Embedding
-from keras.layers.core.identity import Identity
-from keras.layers.core.input_layer import Input
-from keras.layers.core.input_layer import InputLayer
-from keras.layers.core.lambda_layer import Lambda
-from keras.layers.core.masking import Masking
-from keras.layers.core.wrapper import Wrapper
-from keras.layers.layer import Layer
-from keras.layers.merging.add import Add
-from keras.layers.merging.add import add
-from keras.layers.merging.average import Average
-from keras.layers.merging.average import average
-from keras.layers.merging.concatenate import Concatenate
-from keras.layers.merging.concatenate import concatenate
-from keras.layers.merging.dot import Dot
-from keras.layers.merging.dot import dot
-from keras.layers.merging.maximum import Maximum
-from keras.layers.merging.maximum import maximum
-from keras.layers.merging.minimum import Minimum
-from keras.layers.merging.minimum import minimum
-from keras.layers.merging.multiply import Multiply
-from keras.layers.merging.multiply import multiply
-from keras.layers.merging.subtract import Subtract
-from keras.layers.merging.subtract import subtract
-from keras.layers.normalization.batch_normalization import BatchNormalization
-from keras.layers.normalization.group_normalization import GroupNormalization
-from keras.layers.normalization.layer_normalization import LayerNormalization
-from keras.layers.normalization.spectral_normalization import (
-    SpectralNormalization,
-)
-from keras.layers.normalization.unit_normalization import UnitNormalization
-from keras.layers.pooling.average_pooling1d import AveragePooling1D
-from keras.layers.pooling.average_pooling2d import AveragePooling2D
-from keras.layers.pooling.average_pooling3d import AveragePooling3D
-from keras.layers.pooling.global_average_pooling1d import GlobalAveragePooling1D
-from keras.layers.pooling.global_average_pooling2d import GlobalAveragePooling2D
-from keras.layers.pooling.global_average_pooling3d import GlobalAveragePooling3D
-from keras.layers.pooling.global_max_pooling1d import GlobalMaxPooling1D
-from keras.layers.pooling.global_max_pooling2d import GlobalMaxPooling2D
-from keras.layers.pooling.global_max_pooling3d import GlobalMaxPooling3D
-from keras.layers.pooling.max_pooling1d import MaxPooling1D
-from keras.layers.pooling.max_pooling2d import MaxPooling2D
-from keras.layers.pooling.max_pooling3d import MaxPooling3D
-from keras.layers.preprocessing.audio_preprocessing import MelSpectrogram
-from keras.layers.preprocessing.category_encoding import CategoryEncoding
-from keras.layers.preprocessing.center_crop import CenterCrop
-from keras.layers.preprocessing.discretization import Discretization
-from keras.layers.preprocessing.hashed_crossing import HashedCrossing
-from keras.layers.preprocessing.hashing import Hashing
-from keras.layers.preprocessing.index_lookup import IndexLookup
-from keras.layers.preprocessing.integer_lookup import IntegerLookup
-from keras.layers.preprocessing.normalization import Normalization
-from keras.layers.preprocessing.random_brightness import RandomBrightness
-from keras.layers.preprocessing.random_contrast import RandomContrast
-from keras.layers.preprocessing.random_crop import RandomCrop
-from keras.layers.preprocessing.random_flip import RandomFlip
-from keras.layers.preprocessing.random_rotation import RandomRotation
-from keras.layers.preprocessing.random_translation import RandomTranslation
-from keras.layers.preprocessing.random_zoom import RandomZoom
-from keras.layers.preprocessing.rescaling import Rescaling
-from keras.layers.preprocessing.resizing import Resizing
-from keras.layers.preprocessing.string_lookup import StringLookup
-from keras.layers.preprocessing.text_vectorization import TextVectorization
-from keras.layers.regularization.activity_regularization import (
-    ActivityRegularization,
-)
-from keras.layers.regularization.alpha_dropout import AlphaDropout
-from keras.layers.regularization.dropout import Dropout
-from keras.layers.regularization.gaussian_dropout import GaussianDropout
-from keras.layers.regularization.gaussian_noise import GaussianNoise
-from keras.layers.regularization.spatial_dropout import SpatialDropout1D
-from keras.layers.regularization.spatial_dropout import SpatialDropout2D
-from keras.layers.regularization.spatial_dropout import SpatialDropout3D
-from keras.layers.reshaping.cropping1d import Cropping1D
-from keras.layers.reshaping.cropping2d import Cropping2D
-from keras.layers.reshaping.cropping3d import Cropping3D
-from keras.layers.reshaping.flatten import Flatten
-from keras.layers.reshaping.permute import Permute
-from keras.layers.reshaping.repeat_vector import RepeatVector
-from keras.layers.reshaping.reshape import Reshape
-from keras.layers.reshaping.up_sampling1d import UpSampling1D
-from keras.layers.reshaping.up_sampling2d import UpSampling2D
-from keras.layers.reshaping.up_sampling3d import UpSampling3D
-from keras.layers.reshaping.zero_padding1d import ZeroPadding1D
-from keras.layers.reshaping.zero_padding2d import ZeroPadding2D
-from keras.layers.reshaping.zero_padding3d import ZeroPadding3D
-from keras.layers.rnn.bidirectional import Bidirectional
-from keras.layers.rnn.conv_lstm1d import ConvLSTM1D
-from keras.layers.rnn.conv_lstm2d import ConvLSTM2D
-from keras.layers.rnn.conv_lstm3d import ConvLSTM3D
-from keras.layers.rnn.gru import GRU
-from keras.layers.rnn.gru import GRUCell
-from keras.layers.rnn.lstm import LSTM
-from keras.layers.rnn.lstm import LSTMCell
-from keras.layers.rnn.rnn import RNN
-from keras.layers.rnn.simple_rnn import SimpleRNN
-from keras.layers.rnn.simple_rnn import SimpleRNNCell
-from keras.layers.rnn.stacked_rnn_cells import StackedRNNCells
-from keras.layers.rnn.time_distributed import TimeDistributed
-from keras.saving import serialization_lib
-
-
-@keras_export("keras.layers.serialize")
-def serialize(layer):
-    """Returns the layer configuration as a Python dict.
-
-    Args:
-        layer: A `keras.layers.Layer` instance to serialize.
-
-    Returns:
-        Python dict which contains the configuration of the layer.
-    """
-    return serialization_lib.serialize_keras_object(layer)
-
-
-@keras_export("keras.layers.deserialize")
-def deserialize(config, custom_objects=None):
-    """Returns a Keras layer object via its configuration.
-
-    Args:
-        config: A python dict containing a serialized layer configuration.
-        custom_objects: Optional dictionary mapping names (strings) to custom
-            objects (classes and functions) to be considered during
-            deserialization.
-
-    Returns:
-        A Keras layer instance.
-    """
-    obj = serialization_lib.deserialize_keras_object(
-        config,
-        custom_objects=custom_objects,
-    )
-    if not isinstance(obj, Layer):
-        raise ValueError(
-            "`keras.layers.deserialize` was passed a `config` object that is "
-            f"not a `keras.layers.Layer`. Received: {config}"
-        )
-    return obj
diff --git a/keras/layers/activations/__init__.py b/keras/layers/activations/__init__.py
deleted file mode 100644
index 176e43fe183d..000000000000
--- a/keras/layers/activations/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from keras.layers.activations.elu import ELU
-from keras.layers.activations.leaky_relu import LeakyReLU
-from keras.layers.activations.prelu import PReLU
-from keras.layers.activations.relu import ReLU
-from keras.layers.activations.softmax import Softmax
diff --git a/keras/models/__init__.py b/keras/models/__init__.py
deleted file mode 100644
index 21d90b45f81c..000000000000
--- a/keras/models/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from keras.models.functional import Functional
-from keras.models.model import Model
-from keras.models.sequential import Sequential
diff --git a/keras/ops/__init__.py b/keras/ops/__init__.py
deleted file mode 100644
index 3afb84a2b296..000000000000
--- a/keras/ops/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# from keras.ops.numpy import Matmul, matmul
-# from keras.ops.numpy import Add, add
-# from keras.ops.numpy import Multiply, multiply
-
-from keras.backend import cast
-from keras.backend import cond
-from keras.backend import is_tensor
-from keras.backend import name_scope
-from keras.backend import random
-from keras.ops import image
-from keras.ops import operation_utils
-from keras.ops.core import *  # noqa: F403
-from keras.ops.linalg import *  # noqa: F403
-from keras.ops.math import *  # noqa: F403
-from keras.ops.nn import *  # noqa: F403
-from keras.ops.numpy import *  # noqa: F403
diff --git a/keras/optimizers/schedules/__init__.py b/keras/optimizers/schedules/__init__.py
deleted file mode 100644
index 480e06da3a4f..000000000000
--- a/keras/optimizers/schedules/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from keras.optimizers.schedules.learning_rate_schedule import CosineDecay
-from keras.optimizers.schedules.learning_rate_schedule import (
-    CosineDecayRestarts,
-)
-from keras.optimizers.schedules.learning_rate_schedule import ExponentialDecay
-from keras.optimizers.schedules.learning_rate_schedule import InverseTimeDecay
-from keras.optimizers.schedules.learning_rate_schedule import (
-    PiecewiseConstantDecay,
-)
-from keras.optimizers.schedules.learning_rate_schedule import PolynomialDecay
diff --git a/keras/random/__init__.py b/keras/random/__init__.py
deleted file mode 100644
index 292f299ba7fd..000000000000
--- a/keras/random/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from keras.random.random import categorical
-from keras.random.random import dropout
-from keras.random.random import gamma
-from keras.random.random import normal
-from keras.random.random import randint
-from keras.random.random import shuffle
-from keras.random.random import truncated_normal
-from keras.random.random import uniform
-from keras.random.seed_generator import SeedGenerator
diff --git a/keras/saving/__init__.py b/keras/saving/__init__.py
deleted file mode 100644
index 9f709a3c1ba9..000000000000
--- a/keras/saving/__init__.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from keras.saving.object_registration import CustomObjectScope
-from keras.saving.object_registration import custom_object_scope
-from keras.saving.object_registration import get_custom_objects
-from keras.saving.object_registration import get_registered_name
-from keras.saving.object_registration import get_registered_object
-from keras.saving.object_registration import register_keras_serializable
-from keras.saving.saving_api import load_model
-from keras.saving.serialization_lib import deserialize_keras_object
-from keras.saving.serialization_lib import serialize_keras_object
diff --git a/keras/src/__init__.py b/keras/src/__init__.py
new file mode 100644
index 000000000000..d4cd3c0829a1
--- /dev/null
+++ b/keras/src/__init__.py
@@ -0,0 +1,19 @@
+from keras.src import activations
+from keras.src import applications
+from keras.src import backend
+from keras.src import constraints
+from keras.src import datasets
+from keras.src import initializers
+from keras.src import layers
+from keras.src import models
+from keras.src import ops
+from keras.src import optimizers
+from keras.src import regularizers
+from keras.src import utils
+from keras.src.backend import KerasTensor
+from keras.src.layers import Input
+from keras.src.layers import Layer
+from keras.src.models import Functional
+from keras.src.models import Model
+from keras.src.models import Sequential
+from keras.src.version import __version__
diff --git a/keras/activations/__init__.py b/keras/src/activations/__init__.py
similarity index 68%
rename from keras/activations/__init__.py
rename to keras/src/activations/__init__.py
index 8d9aaa5403eb..13bc6de5dba3 100644
--- a/keras/activations/__init__.py
+++ b/keras/src/activations/__init__.py
@@ -1,26 +1,26 @@
 import types
 
-from keras.activations.activations import elu
-from keras.activations.activations import exponential
-from keras.activations.activations import gelu
-from keras.activations.activations import hard_sigmoid
-from keras.activations.activations import hard_silu
-from keras.activations.activations import leaky_relu
-from keras.activations.activations import linear
-from keras.activations.activations import log_softmax
-from keras.activations.activations import mish
-from keras.activations.activations import relu
-from keras.activations.activations import relu6
-from keras.activations.activations import selu
-from keras.activations.activations import sigmoid
-from keras.activations.activations import silu
-from keras.activations.activations import softmax
-from keras.activations.activations import softplus
-from keras.activations.activations import softsign
-from keras.activations.activations import tanh
-from keras.api_export import keras_export
-from keras.saving import object_registration
-from keras.saving import serialization_lib
+from keras.src.activations.activations import elu
+from keras.src.activations.activations import exponential
+from keras.src.activations.activations import gelu
+from keras.src.activations.activations import hard_sigmoid
+from keras.src.activations.activations import hard_silu
+from keras.src.activations.activations import leaky_relu
+from keras.src.activations.activations import linear
+from keras.src.activations.activations import log_softmax
+from keras.src.activations.activations import mish
+from keras.src.activations.activations import relu
+from keras.src.activations.activations import relu6
+from keras.src.activations.activations import selu
+from keras.src.activations.activations import sigmoid
+from keras.src.activations.activations import silu
+from keras.src.activations.activations import softmax
+from keras.src.activations.activations import softplus
+from keras.src.activations.activations import softsign
+from keras.src.activations.activations import tanh
+from keras.src.api_export import keras_export
+from keras.src.saving import object_registration
+from keras.src.saving import serialization_lib
 
 ALL_OBJECTS = {
     relu,
diff --git a/keras/activations/activations.py b/keras/src/activations/activations.py
similarity index 99%
rename from keras/activations/activations.py
rename to keras/src/activations/activations.py
index b9617c80c20a..32c3f5855d71 100644
--- a/keras/activations/activations.py
+++ b/keras/src/activations/activations.py
@@ -1,6 +1,6 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
 
 
 @keras_export("keras.activations.relu")
diff --git a/keras/activations/activations_test.py b/keras/src/activations/activations_test.py
similarity index 99%
rename from keras/activations/activations_test.py
rename to keras/src/activations/activations_test.py
index c752468d34e1..c0ae34a1739f 100644
--- a/keras/activations/activations_test.py
+++ b/keras/src/activations/activations_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from keras import activations
-from keras import backend
-from keras import testing
+from keras.src import activations
+from keras.src import backend
+from keras.src import testing
 
 
 def _ref_softmax(values):
diff --git a/keras/api_export.py b/keras/src/api_export.py
similarity index 100%
rename from keras/api_export.py
rename to keras/src/api_export.py
diff --git a/keras/applications/__init__.py b/keras/src/applications/__init__.py
similarity index 100%
rename from keras/applications/__init__.py
rename to keras/src/applications/__init__.py
diff --git a/keras/applications/applications_test.py b/keras/src/applications/applications_test.py
similarity index 91%
rename from keras/applications/applications_test.py
rename to keras/src/applications/applications_test.py
index 8397cd275f0a..bf0d1cdb82f0 100644
--- a/keras/applications/applications_test.py
+++ b/keras/src/applications/applications_test.py
@@ -4,26 +4,26 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import testing
-from keras.applications import convnext
-from keras.applications import densenet
-from keras.applications import efficientnet
-from keras.applications import efficientnet_v2
-from keras.applications import inception_resnet_v2
-from keras.applications import inception_v3
-from keras.applications import mobilenet
-from keras.applications import mobilenet_v2
-from keras.applications import mobilenet_v3
-from keras.applications import nasnet
-from keras.applications import resnet
-from keras.applications import resnet_v2
-from keras.applications import vgg16
-from keras.applications import vgg19
-from keras.applications import xception
-from keras.saving import serialization_lib
-from keras.utils import file_utils
-from keras.utils import image_utils
+from keras.src import backend
+from keras.src import testing
+from keras.src.applications import convnext
+from keras.src.applications import densenet
+from keras.src.applications import efficientnet
+from keras.src.applications import efficientnet_v2
+from keras.src.applications import inception_resnet_v2
+from keras.src.applications import inception_v3
+from keras.src.applications import mobilenet
+from keras.src.applications import mobilenet_v2
+from keras.src.applications import mobilenet_v3
+from keras.src.applications import nasnet
+from keras.src.applications import resnet
+from keras.src.applications import resnet_v2
+from keras.src.applications import vgg16
+from keras.src.applications import vgg19
+from keras.src.applications import xception
+from keras.src.saving import serialization_lib
+from keras.src.utils import file_utils
+from keras.src.utils import image_utils
 
 try:
     import PIL
diff --git a/keras/applications/convnext.py b/keras/src/applications/convnext.py
similarity index 98%
rename from keras/applications/convnext.py
rename to keras/src/applications/convnext.py
index f658a2da1425..2e464be0c7f1 100644
--- a/keras/applications/convnext.py
+++ b/keras/src/applications/convnext.py
@@ -1,17 +1,17 @@
 import numpy as np
 
-from keras import backend
-from keras import initializers
-from keras import layers
-from keras import ops
-from keras import random
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.layers.layer import Layer
-from keras.models import Functional
-from keras.models import Sequential
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import initializers
+from keras.src import layers
+from keras.src import ops
+from keras.src import random
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.layers.layer import Layer
+from keras.src.models import Functional
+from keras.src.models import Sequential
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHTS_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/convnext/"
diff --git a/keras/applications/densenet.py b/keras/src/applications/densenet.py
similarity index 98%
rename from keras/applications/densenet.py
rename to keras/src/applications/densenet.py
index d9bca939c986..e7d2accb4d33 100644
--- a/keras/applications/densenet.py
+++ b/keras/src/applications/densenet.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHTS_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/densenet/"
diff --git a/keras/applications/efficientnet.py b/keras/src/applications/efficientnet.py
similarity index 98%
rename from keras/applications/efficientnet.py
rename to keras/src/applications/efficientnet.py
index eae679b5b05f..5d61bc904b19 100644
--- a/keras/applications/efficientnet.py
+++ b/keras/src/applications/efficientnet.py
@@ -1,13 +1,13 @@
 import copy
 import math
 
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHTS_PATH = "https://storage.googleapis.com/keras-applications/"
 
diff --git a/keras/applications/efficientnet_v2.py b/keras/src/applications/efficientnet_v2.py
similarity index 99%
rename from keras/applications/efficientnet_v2.py
rename to keras/src/applications/efficientnet_v2.py
index 2cd7cde1ac80..e9b626081c57 100644
--- a/keras/applications/efficientnet_v2.py
+++ b/keras/src/applications/efficientnet_v2.py
@@ -1,14 +1,14 @@
 import copy
 import math
 
-from keras import backend
-from keras import initializers
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import initializers
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHTS_PATH = "https://storage.googleapis.com/tensorflow/keras-applications/efficientnet_v2/"  # noqa: E501
 
diff --git a/keras/applications/imagenet_utils.py b/keras/src/applications/imagenet_utils.py
similarity index 98%
rename from keras/applications/imagenet_utils.py
rename to keras/src/applications/imagenet_utils.py
index 9e3f11bb1b16..f88c0af64d88 100644
--- a/keras/applications/imagenet_utils.py
+++ b/keras/src/applications/imagenet_utils.py
@@ -3,11 +3,11 @@
 
 import numpy as np
 
-from keras import activations
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.utils import file_utils
+from keras.src import activations
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.utils import file_utils
 
 CLASS_INDEX = None
 CLASS_INDEX_PATH = (
diff --git a/keras/applications/imagenet_utils_test.py b/keras/src/applications/imagenet_utils_test.py
similarity index 98%
rename from keras/applications/imagenet_utils_test.py
rename to keras/src/applications/imagenet_utils_test.py
index dc09911ed44f..861632a9eb05 100644
--- a/keras/applications/imagenet_utils_test.py
+++ b/keras/src/applications/imagenet_utils_test.py
@@ -3,10 +3,10 @@
 from absl.testing import parameterized
 
 import keras
-from keras import backend
-from keras import testing
-from keras.applications import imagenet_utils as utils
-from keras.dtype_policies.dtype_policy import set_dtype_policy
+from keras.src import backend
+from keras.src import testing
+from keras.src.applications import imagenet_utils as utils
+from keras.src.dtype_policies.dtype_policy import set_dtype_policy
 
 
 class TestImageNetUtils(testing.TestCase, parameterized.TestCase):
diff --git a/keras/applications/inception_resnet_v2.py b/keras/src/applications/inception_resnet_v2.py
similarity index 97%
rename from keras/applications/inception_resnet_v2.py
rename to keras/src/applications/inception_resnet_v2.py
index 46b008324023..ca01832b2d48 100644
--- a/keras/applications/inception_resnet_v2.py
+++ b/keras/src/applications/inception_resnet_v2.py
@@ -1,11 +1,11 @@
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.layers.layer import Layer
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.layers.layer import Layer
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHT_URL = (
     "https://storage.googleapis.com/tensorflow/"
diff --git a/keras/applications/inception_v3.py b/keras/src/applications/inception_v3.py
similarity index 98%
rename from keras/applications/inception_v3.py
rename to keras/src/applications/inception_v3.py
index beab281500f3..7eef55b60518 100644
--- a/keras/applications/inception_v3.py
+++ b/keras/src/applications/inception_v3.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 WEIGHTS_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/"
diff --git a/keras/applications/mobilenet.py b/keras/src/applications/mobilenet.py
similarity index 98%
rename from keras/applications/mobilenet.py
rename to keras/src/applications/mobilenet.py
index c748c11db617..7c01779405ff 100644
--- a/keras/applications/mobilenet.py
+++ b/keras/src/applications/mobilenet.py
@@ -1,12 +1,12 @@
 import warnings
 
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHT_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/mobilenet/"
diff --git a/keras/applications/mobilenet_v2.py b/keras/src/applications/mobilenet_v2.py
similarity index 98%
rename from keras/applications/mobilenet_v2.py
rename to keras/src/applications/mobilenet_v2.py
index 96db08c32e6c..3a6a8f0e14db 100644
--- a/keras/applications/mobilenet_v2.py
+++ b/keras/src/applications/mobilenet_v2.py
@@ -1,12 +1,12 @@
 import warnings
 
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHT_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/mobilenet_v2/"
diff --git a/keras/applications/mobilenet_v3.py b/keras/src/applications/mobilenet_v3.py
similarity index 98%
rename from keras/applications/mobilenet_v3.py
rename to keras/src/applications/mobilenet_v3.py
index 96f27d16a7cc..8f8b1422761b 100644
--- a/keras/applications/mobilenet_v3.py
+++ b/keras/src/applications/mobilenet_v3.py
@@ -1,12 +1,12 @@
 import warnings
 
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHT_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/mobilenet_v3/"
diff --git a/keras/applications/nasnet.py b/keras/src/applications/nasnet.py
similarity index 99%
rename from keras/applications/nasnet.py
rename to keras/src/applications/nasnet.py
index 4f1271de492c..5769adb14eb9 100644
--- a/keras/applications/nasnet.py
+++ b/keras/src/applications/nasnet.py
@@ -1,12 +1,12 @@
 import warnings
 
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHTS_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/nasnet/"
diff --git a/keras/applications/resnet.py b/keras/src/applications/resnet.py
similarity index 98%
rename from keras/applications/resnet.py
rename to keras/src/applications/resnet.py
index a5230e2da551..b752be1b208c 100644
--- a/keras/applications/resnet.py
+++ b/keras/src/applications/resnet.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 BASE_WEIGHTS_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/resnet/"
diff --git a/keras/applications/resnet_v2.py b/keras/src/applications/resnet_v2.py
similarity index 97%
rename from keras/applications/resnet_v2.py
rename to keras/src/applications/resnet_v2.py
index 21652ffc121f..9bdd09091481 100644
--- a/keras/applications/resnet_v2.py
+++ b/keras/src/applications/resnet_v2.py
@@ -1,6 +1,6 @@
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.applications import resnet
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.applications import resnet
 
 
 @keras_export(
diff --git a/keras/applications/vgg16.py b/keras/src/applications/vgg16.py
similarity index 96%
rename from keras/applications/vgg16.py
rename to keras/src/applications/vgg16.py
index f83983d8001b..af39dffc8df0 100644
--- a/keras/applications/vgg16.py
+++ b/keras/src/applications/vgg16.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 WEIGHTS_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/"
diff --git a/keras/applications/vgg19.py b/keras/src/applications/vgg19.py
similarity index 97%
rename from keras/applications/vgg19.py
rename to keras/src/applications/vgg19.py
index 48abebdfd005..0d416523138f 100644
--- a/keras/applications/vgg19.py
+++ b/keras/src/applications/vgg19.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 WEIGHTS_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/"
diff --git a/keras/applications/xception.py b/keras/src/applications/xception.py
similarity index 97%
rename from keras/applications/xception.py
rename to keras/src/applications/xception.py
index 93d0a4ac7078..0841321cd413 100644
--- a/keras/applications/xception.py
+++ b/keras/src/applications/xception.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras import layers
-from keras.api_export import keras_export
-from keras.applications import imagenet_utils
-from keras.models import Functional
-from keras.ops import operation_utils
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import layers
+from keras.src.api_export import keras_export
+from keras.src.applications import imagenet_utils
+from keras.src.models import Functional
+from keras.src.ops import operation_utils
+from keras.src.utils import file_utils
 
 WEIGHTS_PATH = (
     "https://storage.googleapis.com/tensorflow/keras-applications/"
diff --git a/keras/src/backend/__init__.py b/keras/src/backend/__init__.py
new file mode 100644
index 000000000000..5c7fa2235207
--- /dev/null
+++ b/keras/src/backend/__init__.py
@@ -0,0 +1,45 @@
+from keras.src.backend.config import backend
+
+if backend() == "torch":
+    # When using the torch backend,
+    # torch needs to be imported first, otherwise it will segfault
+    # upon import.
+    import torch
+
+from keras.src.backend.common.dtypes import result_type
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.backend.common.keras_tensor import any_symbolic_tensors
+from keras.src.backend.common.keras_tensor import is_keras_tensor
+from keras.src.backend.common.name_scope import name_scope
+from keras.src.backend.common.stateless_scope import StatelessScope
+from keras.src.backend.common.stateless_scope import get_stateless_scope
+from keras.src.backend.common.stateless_scope import in_stateless_scope
+from keras.src.backend.common.variables import AutocastScope
+from keras.src.backend.common.variables import get_autocast_scope
+from keras.src.backend.common.variables import is_float_dtype
+from keras.src.backend.common.variables import is_int_dtype
+from keras.src.backend.common.variables import standardize_dtype
+from keras.src.backend.common.variables import standardize_shape
+from keras.src.backend.config import epsilon
+from keras.src.backend.config import floatx
+from keras.src.backend.config import image_data_format
+from keras.src.backend.config import set_epsilon
+from keras.src.backend.config import set_floatx
+from keras.src.backend.config import set_image_data_format
+from keras.src.backend.config import standardize_data_format
+
+# Import backend functions.
+if backend() == "tensorflow":
+    from keras.src.backend.tensorflow import *  # noqa: F403
+elif backend() == "jax":
+    from keras.src.backend.jax import *  # noqa: F403
+elif backend() == "torch":
+    from keras.src.backend.torch import *  # noqa: F403
+
+    distribution_lib = None
+elif backend() == "numpy":
+    from keras.src.backend.numpy import *  # noqa: F403
+
+    distribution_lib = None
+else:
+    raise ValueError(f"Unable to import backend : {backend()}")
diff --git a/keras/src/backend/common/__init__.py b/keras/src/backend/common/__init__.py
new file mode 100644
index 000000000000..fabac625b5a6
--- /dev/null
+++ b/keras/src/backend/common/__init__.py
@@ -0,0 +1,10 @@
+from keras.src.backend.common import backend_utils
+from keras.src.backend.common.dtypes import result_type
+from keras.src.backend.common.variables import AutocastScope
+from keras.src.backend.common.variables import KerasVariable
+from keras.src.backend.common.variables import get_autocast_scope
+from keras.src.backend.common.variables import is_float_dtype
+from keras.src.backend.common.variables import is_int_dtype
+from keras.src.backend.common.variables import standardize_dtype
+from keras.src.backend.common.variables import standardize_shape
+from keras.src.random import random
diff --git a/keras/backend/common/backend_utils.py b/keras/src/backend/common/backend_utils.py
similarity index 100%
rename from keras/backend/common/backend_utils.py
rename to keras/src/backend/common/backend_utils.py
diff --git a/keras/backend/common/backend_utils_test.py b/keras/src/backend/common/backend_utils_test.py
similarity index 96%
rename from keras/backend/common/backend_utils_test.py
rename to keras/src/backend/common/backend_utils_test.py
index 3c737f4baa14..68b0bbddda0c 100644
--- a/keras/backend/common/backend_utils_test.py
+++ b/keras/src/backend/common/backend_utils_test.py
@@ -1,19 +1,19 @@
-from keras.backend.common.backend_utils import (
+from keras.src.backend.common.backend_utils import (
     _convert_conv_tranpose_padding_args_from_keras_to_jax,
 )
-from keras.backend.common.backend_utils import (
+from keras.src.backend.common.backend_utils import (
     _convert_conv_tranpose_padding_args_from_keras_to_torch,
 )
-from keras.backend.common.backend_utils import (
+from keras.src.backend.common.backend_utils import (
     _get_output_shape_given_tf_padding,
 )
-from keras.backend.common.backend_utils import (
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_padding_args_for_jax,
 )
-from keras.backend.common.backend_utils import (
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_padding_args_for_torch,
 )
-from keras.testing import test_case
+from keras.src.testing import test_case
 
 
 class ConvertConvTransposePaddingArgsJAXTest(test_case.TestCase):
diff --git a/keras/backend/common/compute_output_spec_test.py b/keras/src/backend/common/compute_output_spec_test.py
similarity index 97%
rename from keras/backend/common/compute_output_spec_test.py
rename to keras/src/backend/common/compute_output_spec_test.py
index def1a942cdc5..8ee856f4d31b 100644
--- a/keras/backend/common/compute_output_spec_test.py
+++ b/keras/src/backend/common/compute_output_spec_test.py
@@ -1,7 +1,7 @@
 import pytest
 
-from keras import backend
-from keras import testing
+from keras.src import backend
+from keras.src import testing
 
 
 def example_fn(x):
diff --git a/keras/backend/common/dtypes.py b/keras/src/backend/common/dtypes.py
similarity index 98%
rename from keras/backend/common/dtypes.py
rename to keras/src/backend/common/dtypes.py
index dcb922db2156..87253c87b8c4 100644
--- a/keras/backend/common/dtypes.py
+++ b/keras/src/backend/common/dtypes.py
@@ -1,8 +1,8 @@
 import functools
 
-from keras.api_export import keras_export
-from keras.backend import config
-from keras.backend.common.variables import standardize_dtype
+from keras.src.api_export import keras_export
+from keras.src.backend import config
+from keras.src.backend.common.variables import standardize_dtype
 
 BOOL_TYPES = ("bool",)
 INT_TYPES = (
diff --git a/keras/backend/common/dtypes_test.py b/keras/src/backend/common/dtypes_test.py
similarity index 96%
rename from keras/backend/common/dtypes_test.py
rename to keras/src/backend/common/dtypes_test.py
index 200e4fa2b9e3..bc6dbd74bbbe 100644
--- a/keras/backend/common/dtypes_test.py
+++ b/keras/src/backend/common/dtypes_test.py
@@ -2,18 +2,18 @@
 
 from absl.testing import parameterized
 
-from keras import backend
-from keras import ops
-from keras.backend.common import dtypes
-from keras.testing import test_case
-from keras.testing.test_utils import named_product
+from keras.src import backend
+from keras.src import ops
+from keras.src.backend.common import dtypes
+from keras.src.testing import test_case
+from keras.src.testing.test_utils import named_product
 
 
 class DtypesTest(test_case.TestCase, parameterized.TestCase):
     """Test the dtype to verify that the behavior matches JAX."""
 
     if backend.backend() == "torch":
-        from keras.backend.torch.core import to_torch_dtype
+        from keras.src.backend.torch.core import to_torch_dtype
 
         # TODO: torch doesn't support uint64.
         ALL_DTYPES = []
diff --git a/keras/backend/common/global_state.py b/keras/src/backend/common/global_state.py
similarity index 95%
rename from keras/backend/common/global_state.py
rename to keras/src/backend/common/global_state.py
index c0ed8c1e5a51..8ecf11b95056 100644
--- a/keras/backend/common/global_state.py
+++ b/keras/src/backend/common/global_state.py
@@ -1,8 +1,8 @@
 import gc
 import threading
 
-from keras import backend
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src.api_export import keras_export
 
 GLOBAL_STATE_TRACKER = threading.local()
 GLOBAL_SETTINGS_TRACKER = threading.local()
@@ -77,7 +77,7 @@ def clear_session(free_memory=True):
     GLOBAL_SETTINGS_TRACKER = threading.local()
 
     if backend.backend() == "tensorflow":
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         tf.compat.v1.reset_default_graph()
         if tf.executing_eagerly():
diff --git a/keras/backend/common/global_state_test.py b/keras/src/backend/common/global_state_test.py
similarity index 72%
rename from keras/backend/common/global_state_test.py
rename to keras/src/backend/common/global_state_test.py
index 880886a7d98b..5f2a05ba15a4 100644
--- a/keras/backend/common/global_state_test.py
+++ b/keras/src/backend/common/global_state_test.py
@@ -1,6 +1,6 @@
-from keras.backend.common import global_state
-from keras.testing import test_case
-from keras.utils.naming import auto_name
+from keras.src.backend.common import global_state
+from keras.src.testing import test_case
+from keras.src.utils.naming import auto_name
 
 
 class GlobalStateTest(test_case.TestCase):
diff --git a/keras/backend/common/keras_tensor.py b/keras/src/backend/common/keras_tensor.py
similarity index 85%
rename from keras/backend/common/keras_tensor.py
rename to keras/src/backend/common/keras_tensor.py
index af030407f231..2876a57cffb4 100644
--- a/keras/backend/common/keras_tensor.py
+++ b/keras/src/backend/common/keras_tensor.py
@@ -1,6 +1,6 @@
-from keras import tree
-from keras.api_export import keras_export
-from keras.utils.naming import auto_name
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.utils.naming import auto_name
 
 
 @keras_export("keras.KerasTensor")
@@ -35,7 +35,7 @@ def __init__(
         record_history=True,
         name=None,
     ):
-        from keras import backend
+        from keras.src import backend
 
         self.shape = backend.standardize_shape(shape)
         self.dtype = backend.standardize_dtype(dtype)
@@ -48,12 +48,12 @@ def ndim(self):
         return len(self.shape)
 
     def reshape(self, newshape):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Reshape(newshape)(self)
 
     def squeeze(self, axis=None):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Squeeze(axis)(self)
 
@@ -125,167 +125,167 @@ def __bool__(self):
         raise TypeError("A symbolic KerasTensor cannot be used as a boolean.")
 
     def __add__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Add().symbolic_call(self, other)
 
     def __radd__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Add().symbolic_call(other, self)
 
     def __sub__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Subtract().symbolic_call(self, other)
 
     def __rsub__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Subtract().symbolic_call(other, self)
 
     def __mul__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Multiply().symbolic_call(self, other)
 
     def __rmul__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Multiply().symbolic_call(other, self)
 
     def __matmul__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Matmul().symbolic_call(self, other)
 
     def __rmatmul__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Matmul().symbolic_call(other, self)
 
     def __div__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Divide().symbolic_call(self, other)
 
     def __rdiv__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Divide().symbolic_call(other, self)
 
     def __truediv__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.TrueDivide().symbolic_call(self, other)
 
     def __rtruediv__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.TrueDivide().symbolic_call(other, self)
 
     def __neg__(self):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Negative().symbolic_call(self)
 
     def __abs__(self):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Absolute().symbolic_call(self)
 
     def __pow__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Power().symbolic_call(self, other)
 
     def __rpow__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Power().symbolic_call(other, self)
 
     def __floordiv__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.FloorDivide().symbolic_call(self, other)
 
     def __rfloordiv__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.FloorDivide().symbolic_call(other, self)
 
     def __mod__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Mod().symbolic_call(self, other)
 
     def __rmod__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Mod().symbolic_call(other, self)
 
     def __lt__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Less().symbolic_call(self, other)
 
     def __le__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.LessEqual().symbolic_call(self, other)
 
     def __gt__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.Greater().symbolic_call(self, other)
 
     def __ge__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.GreaterEqual().symbolic_call(self, other)
 
     def __ne__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.NotEqual().symbolic_call(self, other)
 
     def __and__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.LogicalAnd().symbolic_call(self, other)
 
     def __rand__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.LogicalAnd().symbolic_call(other, self)
 
     def __or__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.LogicalOr().symbolic_call(self, other)
 
     def __ror__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.LogicalOr().symbolic_call(other, self)
 
     def __invert__(self):
-        from keras import ops
+        from keras.src import ops
 
         return ops.LogicalNot().symbolic_call(self)
 
     def __xor__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.LogicalXor().symbolic_call(self, other)
 
     def __rxor__(self, other):
-        from keras import ops
+        from keras.src import ops
 
         return ops.LogicalXor().symbolic_call(other, self)
 
     def __getitem__(self, key):
-        from keras import ops
+        from keras.src import ops
 
         return ops.GetItem().symbolic_call(self, key)
 
diff --git a/keras/backend/common/keras_tensor_test.py b/keras/src/backend/common/keras_tensor_test.py
similarity index 88%
rename from keras/backend/common/keras_tensor_test.py
rename to keras/src/backend/common/keras_tensor_test.py
index 5b63f4961ce2..ca6391024f87 100644
--- a/keras/backend/common/keras_tensor_test.py
+++ b/keras/src/backend/common/keras_tensor_test.py
@@ -4,10 +4,10 @@
 import numpy as np
 import tensorflow as tf
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.backend.common import keras_tensor
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.backend.common import keras_tensor
 
 
 class KerasTensorTest(testing.TestCase):
@@ -80,7 +80,7 @@ def test_is_keras_tensor(self):
         y = np.array([1, 2, 3])
         self.assertFalse(keras_tensor.is_keras_tensor(y))
 
-    @patch("keras.ops.Absolute.symbolic_call")
+    @patch("keras.src.ops.Absolute.symbolic_call")
     def test_abs_method(self, mock_symbolic_call):
         mock_tensor = Mock()
         mock_symbolic_call.return_value = mock_tensor
@@ -89,51 +89,51 @@ def test_abs_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x)
         self.assertEqual(abs_x, mock_tensor)
 
-    @patch("keras.ops.Negative.symbolic_call")
+    @patch("keras.src.ops.Negative.symbolic_call")
     def test_neg_method(self, mock_method):
         self._test_unary_op_method(mock_method, lambda x: -x)
 
-    @patch("keras.ops.Subtract.symbolic_call")
+    @patch("keras.src.ops.Subtract.symbolic_call")
     def test_sub_method(self, mock_method):
         y = Mock()
         self._test_binary_op_method(mock_method, y, lambda x, y: x - y)
 
-    @patch("keras.ops.Multiply.symbolic_call")
+    @patch("keras.src.ops.Multiply.symbolic_call")
     def test_mul_method(self, mock_method):
         y = Mock()
         self._test_binary_op_method(mock_method, y, lambda x, y: x * y)
 
-    @patch("keras.ops.Matmul.symbolic_call")
+    @patch("keras.src.ops.Matmul.symbolic_call")
     def test_matmul_method(self, mock_method):
         y = Mock()
         self._test_binary_op_method(mock_method, y, lambda x, y: x @ y)
 
-    @patch("keras.ops.Power.symbolic_call")
+    @patch("keras.src.ops.Power.symbolic_call")
     def test_pow_method(self, mock_method):
         y = Mock()
         self._test_binary_op_method(mock_method, y, lambda x, y: x**y)
 
-    @patch("keras.ops.Mod.symbolic_call")
+    @patch("keras.src.ops.Mod.symbolic_call")
     def test_mod_method(self, mock_method):
         y = Mock()
         self._test_binary_op_method(mock_method, y, lambda x, y: x % y)
 
-    @patch("keras.ops.Less.symbolic_call")
+    @patch("keras.src.ops.Less.symbolic_call")
     def test_lt_method(self, mock_method):
         y = Mock()
         self._test_binary_op_method(mock_method, y, lambda x, y: x < y)
 
-    @patch("keras.ops.LogicalAnd.symbolic_call")
+    @patch("keras.src.ops.LogicalAnd.symbolic_call")
     def test_and_method(self, mock_method):
         y = Mock()
         self._test_binary_op_method(mock_method, y, lambda x, y: x & y)
 
-    @patch("keras.ops.LogicalOr.symbolic_call")
+    @patch("keras.src.ops.LogicalOr.symbolic_call")
     def test_or_method(self, mock_method):
         y = Mock()
         self._test_binary_op_method(mock_method, y, lambda x, y: x | y)
 
-    @patch("keras.ops.GetItem.symbolic_call")
+    @patch("keras.src.ops.GetItem.symbolic_call")
     def test_getitem_method(self, mock_method):
         y = Mock()
         self._test_binary_op_method(mock_method, y, lambda x, y: x[y])
@@ -154,7 +154,7 @@ def _test_binary_op_method(self, mock_method, other, operator):
         mock_method.assert_called_once_with(x, other)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.Add.symbolic_call")
+    @patch("keras.src.ops.Add.symbolic_call")
     def test_radd_method(self, mock_symbolic_call):
         """Test __radd__ method"""
         mock_tensor = Mock()
@@ -165,7 +165,7 @@ def test_radd_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.Subtract.symbolic_call")
+    @patch("keras.src.ops.Subtract.symbolic_call")
     def test_rsub_method(self, mock_symbolic_call):
         """Test __rsub__ method"""
         mock_tensor = Mock()
@@ -176,7 +176,7 @@ def test_rsub_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.Multiply.symbolic_call")
+    @patch("keras.src.ops.Multiply.symbolic_call")
     def test_rmul_method(self, mock_symbolic_call):
         """Test __rmul__ method"""
         mock_tensor = Mock()
@@ -187,7 +187,7 @@ def test_rmul_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.Matmul.symbolic_call")
+    @patch("keras.src.ops.Matmul.symbolic_call")
     def test_rmatmul_method(self, mock_symbolic_call):
         """Test __rmatmul__ method"""
         mock_tensor = Mock()
@@ -198,7 +198,7 @@ def test_rmatmul_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.Power.symbolic_call")
+    @patch("keras.src.ops.Power.symbolic_call")
     def test_rpow_method(self, mock_symbolic_call):
         """Test __rpow__ method"""
         mock_tensor = Mock()
@@ -209,7 +209,7 @@ def test_rpow_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.FloorDivide.symbolic_call")
+    @patch("keras.src.ops.FloorDivide.symbolic_call")
     def test_floordiv_method(self, mock_symbolic_call):
         """Test __floordiv__ method"""
         mock_tensor = Mock()
@@ -220,7 +220,7 @@ def test_floordiv_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x, y)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.FloorDivide.symbolic_call")
+    @patch("keras.src.ops.FloorDivide.symbolic_call")
     def test_rfloordiv_method(self, mock_symbolic_call):
         """Test __rfloordiv__ method"""
         mock_tensor = Mock()
@@ -231,7 +231,7 @@ def test_rfloordiv_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.Mod.symbolic_call")
+    @patch("keras.src.ops.Mod.symbolic_call")
     def test_rmod_method(self, mock_symbolic_call):
         """Test __rmod__ method"""
         mock_tensor = Mock()
@@ -242,7 +242,7 @@ def test_rmod_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.LessEqual.symbolic_call")
+    @patch("keras.src.ops.LessEqual.symbolic_call")
     def test_le_method(self, mock_symbolic_call):
         """Test __le__ method"""
         mock_tensor = Mock()
@@ -253,7 +253,7 @@ def test_le_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x, y)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.Greater.symbolic_call")
+    @patch("keras.src.ops.Greater.symbolic_call")
     def test_gt_method(self, mock_symbolic_call):
         """Test __gt__ method"""
         mock_tensor = Mock()
@@ -264,7 +264,7 @@ def test_gt_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x, y)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.GreaterEqual.symbolic_call")
+    @patch("keras.src.ops.GreaterEqual.symbolic_call")
     def test_ge_method(self, mock_symbolic_call):
         """Test __ge__ method"""
         mock_tensor = Mock()
@@ -275,7 +275,7 @@ def test_ge_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x, y)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.NotEqual.symbolic_call")
+    @patch("keras.src.ops.NotEqual.symbolic_call")
     def test_ne_method(self, mock_symbolic_call):
         """Test __ne__ method"""
         mock_tensor = Mock()
@@ -286,7 +286,7 @@ def test_ne_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x, y)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.LogicalAnd.symbolic_call")
+    @patch("keras.src.ops.LogicalAnd.symbolic_call")
     def test_rand_method(self, mock_symbolic_call):
         """Test __rand__ method"""
         mock_tensor = Mock()
@@ -297,7 +297,7 @@ def test_rand_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.LogicalOr.symbolic_call")
+    @patch("keras.src.ops.LogicalOr.symbolic_call")
     def test_ror_method(self, mock_symbolic_call):
         """Test __ror__ method"""
         mock_tensor = Mock()
@@ -308,7 +308,7 @@ def test_ror_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.LogicalNot.symbolic_call")
+    @patch("keras.src.ops.LogicalNot.symbolic_call")
     def test_invert_method(self, mock_symbolic_call):
         """Test __invert__ method"""
         mock_tensor = Mock()
@@ -318,7 +318,7 @@ def test_invert_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.LogicalXor.symbolic_call")
+    @patch("keras.src.ops.LogicalXor.symbolic_call")
     def test_xor_method(self, mock_symbolic_call):
         """Test __xor__ method"""
         mock_tensor = Mock()
@@ -329,7 +329,7 @@ def test_xor_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x, y)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.LogicalXor.symbolic_call")
+    @patch("keras.src.ops.LogicalXor.symbolic_call")
     def test_rxor_method(self, mock_symbolic_call):
         """Test __rxor__ method"""
         mock_tensor = Mock()
@@ -340,7 +340,7 @@ def test_rxor_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.TrueDivide.symbolic_call")
+    @patch("keras.src.ops.TrueDivide.symbolic_call")
     def test_truediv_method(self, mock_symbolic_call):
         """Test __truediv__ method"""
         mock_tensor = Mock()
@@ -351,7 +351,7 @@ def test_truediv_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x, y)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.TrueDivide.symbolic_call")
+    @patch("keras.src.ops.TrueDivide.symbolic_call")
     def test_rtruediv_method(self, mock_symbolic_call):
         """Test __rtruediv__ method"""
         mock_tensor = Mock()
@@ -362,7 +362,7 @@ def test_rtruediv_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(y, x)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.Divide.symbolic_call")
+    @patch("keras.src.ops.Divide.symbolic_call")
     def test_div_method(self, mock_symbolic_call):
         """Test __div__ method"""
         mock_tensor = Mock()
@@ -374,7 +374,7 @@ def test_div_method(self, mock_symbolic_call):
         mock_symbolic_call.assert_called_once_with(x, y)
         self.assertEqual(result, mock_tensor)
 
-    @patch("keras.ops.Divide.symbolic_call")
+    @patch("keras.src.ops.Divide.symbolic_call")
     def test_rdiv_method(self, mock_symbolic_call):
         """Test __rdiv__ method"""
         mock_tensor = Mock()
diff --git a/keras/backend/common/name_scope.py b/keras/src/backend/common/name_scope.py
similarity index 98%
rename from keras/backend/common/name_scope.py
rename to keras/src/backend/common/name_scope.py
index 02768fd43d0d..71a8408767b6 100644
--- a/keras/backend/common/name_scope.py
+++ b/keras/src/backend/common/name_scope.py
@@ -1,4 +1,4 @@
-from keras.backend.common import global_state
+from keras.src.backend.common import global_state
 
 
 class name_scope:
diff --git a/keras/backend/common/name_scope_test.py b/keras/src/backend/common/name_scope_test.py
similarity index 92%
rename from keras/backend/common/name_scope_test.py
rename to keras/src/backend/common/name_scope_test.py
index 0650fadec093..2e79f2146958 100644
--- a/keras/backend/common/name_scope_test.py
+++ b/keras/src/backend/common/name_scope_test.py
@@ -1,6 +1,6 @@
-from keras import testing
-from keras.backend.common.name_scope import current_path
-from keras.backend.common.name_scope import name_scope
+from keras.src import testing
+from keras.src.backend.common.name_scope import current_path
+from keras.src.backend.common.name_scope import name_scope
 
 
 class NameScopeTest(testing.TestCase):
diff --git a/keras/backend/common/stateless_scope.py b/keras/src/backend/common/stateless_scope.py
similarity index 91%
rename from keras/backend/common/stateless_scope.py
rename to keras/src/backend/common/stateless_scope.py
index a3abf758e2c4..e3f4f9d69693 100644
--- a/keras/backend/common/stateless_scope.py
+++ b/keras/src/backend/common/stateless_scope.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.backend.common import global_state
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
 
 
 @keras_export("keras.StatelessScope")
@@ -38,8 +38,8 @@ def __init__(
         collect_losses=False,
         initialize_variables=True,
     ):
-        from keras import backend
-        from keras.backend.common.variables import KerasVariable
+        from keras.src import backend
+        from keras.src.backend.common.variables import KerasVariable
 
         self.collect_losses = collect_losses
         self.initialize_variables = initialize_variables
@@ -90,7 +90,9 @@ def __exit__(self, *args, **kwargs):
             # We're back in eager scope;
             # if any variables were created within the stateless
             # scope, we initialize them here.
-            from keras.backend.common.variables import initialize_all_variables
+            from keras.src.backend.common.variables import (
+                initialize_all_variables,
+            )
 
             initialize_all_variables()
 
diff --git a/keras/backend/common/stateless_scope_test.py b/keras/src/backend/common/stateless_scope_test.py
similarity index 92%
rename from keras/backend/common/stateless_scope_test.py
rename to keras/src/backend/common/stateless_scope_test.py
index f3f917620db9..295c6ffb091d 100644
--- a/keras/backend/common/stateless_scope_test.py
+++ b/keras/src/backend/common/stateless_scope_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.backend.common.stateless_scope import StatelessScope
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.backend.common.stateless_scope import StatelessScope
 
 
 class TestStatelessScope(testing.TestCase):
diff --git a/keras/backend/common/variables.py b/keras/src/backend/common/variables.py
similarity index 96%
rename from keras/backend/common/variables.py
rename to keras/src/backend/common/variables.py
index 3d9c80989687..156d50eba4bf 100644
--- a/keras/backend/common/variables.py
+++ b/keras/src/backend/common/variables.py
@@ -1,14 +1,14 @@
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.backend import config
-from keras.backend.common import dtypes
-from keras.backend.common import global_state
-from keras.backend.common.name_scope import current_path
-from keras.backend.common.stateless_scope import get_stateless_scope
-from keras.backend.common.stateless_scope import in_stateless_scope
-from keras.utils.module_utils import tensorflow as tf
-from keras.utils.naming import auto_name
+from keras.src.api_export import keras_export
+from keras.src.backend import config
+from keras.src.backend.common import dtypes
+from keras.src.backend.common import global_state
+from keras.src.backend.common.name_scope import current_path
+from keras.src.backend.common.stateless_scope import get_stateless_scope
+from keras.src.backend.common.stateless_scope import in_stateless_scope
+from keras.src.utils.module_utils import tensorflow as tf
+from keras.src.utils.naming import auto_name
 
 
 class KerasVariable:
@@ -55,7 +55,7 @@ class KerasVariable:
     **Using a Keras initializer to create a `Variable`:**
 
     ```python
-    from keras.initializers import Ones
+    from keras.src.initializers import Ones
     variable_from_initializer = keras.Variable(
         initializer=Ones(), shape=(3, 3), dtype="float32"
     )
@@ -120,7 +120,7 @@ def __init__(
         # Ref: https://github.com/google/flax/blob/main/flax/linen/fp8_ops.py
         self._overwrite_with_gradient = False
         if isinstance(initializer, str):
-            from keras import initializers
+            from keras.src import initializers
 
             initializer = initializers.get(initializer)
         if callable(initializer):
@@ -298,7 +298,7 @@ def regularizer(self):
 
     @regularizer.setter
     def regularizer(self, value):
-        from keras.regularizers import Regularizer
+        from keras.src.regularizers import Regularizer
 
         if value is not None and not isinstance(value, Regularizer):
             raise ValueError(
@@ -314,7 +314,7 @@ def constraint(self):
 
     @constraint.setter
     def constraint(self, value):
-        from keras.constraints import Constraint
+        from keras.src.constraints import Constraint
 
         if value is not None and not isinstance(value, Constraint):
             raise ValueError(
@@ -605,7 +605,7 @@ def __init__(self, dtype):
         self.original_scope = None
 
     def maybe_cast(self, value):
-        from keras import backend
+        from keras.src import backend
 
         if self.dtype is not None and is_float_dtype(value.dtype):
             return backend.cast(value, dtype=self.dtype)
diff --git a/keras/backend/common/variables_test.py b/keras/src/backend/common/variables_test.py
similarity index 98%
rename from keras/backend/common/variables_test.py
rename to keras/src/backend/common/variables_test.py
index 1062aa4ac76c..7ece491e8d05 100644
--- a/keras/backend/common/variables_test.py
+++ b/keras/src/backend/common/variables_test.py
@@ -2,15 +2,15 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import initializers
-from keras.backend.common import dtypes
-from keras.backend.common.variables import AutocastScope
-from keras.backend.common.variables import KerasVariable
-from keras.backend.common.variables import shape_equal
-from keras.backend.common.variables import standardize_dtype
-from keras.backend.common.variables import standardize_shape
-from keras.testing import test_case
+from keras.src import backend
+from keras.src import initializers
+from keras.src.backend.common import dtypes
+from keras.src.backend.common.variables import AutocastScope
+from keras.src.backend.common.variables import KerasVariable
+from keras.src.backend.common.variables import shape_equal
+from keras.src.backend.common.variables import standardize_dtype
+from keras.src.backend.common.variables import standardize_shape
+from keras.src.testing import test_case
 
 
 class VariableInitializationTest(test_case.TestCase):
@@ -267,7 +267,7 @@ def test_variable_numpy(self):
         reason="Tests for MirroredVariable under tf backend",
     )
     def test_variable_numpy_scalar(self):
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         strategy = tf.distribute.MirroredStrategy(["cpu:0", "cpu:1"])
         with strategy.scope():
diff --git a/keras/backend/config.py b/keras/src/backend/config.py
similarity index 99%
rename from keras/backend/config.py
rename to keras/src/backend/config.py
index 8725e27b56ff..19af01fe83a2 100644
--- a/keras/backend/config.py
+++ b/keras/src/backend/config.py
@@ -1,7 +1,7 @@
 import json
 import os
 
-from keras.api_export import keras_export
+from keras.src.api_export import keras_export
 
 # The type of float to use throughout a session.
 _FLOATX = "float32"
diff --git a/keras/backend/exports.py b/keras/src/backend/exports.py
similarity index 86%
rename from keras/backend/exports.py
rename to keras/src/backend/exports.py
index 2c02eed603d4..54ee1c74bb8a 100644
--- a/keras/backend/exports.py
+++ b/keras/src/backend/exports.py
@@ -1,5 +1,5 @@
-from keras import backend
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src.api_export import keras_export
 
 if backend.backend() == "tensorflow":
     BackendVariable = backend.tensorflow.core.Variable
@@ -11,7 +11,7 @@
     BackendVariable = backend.torch.core.Variable
     backend_name_scope = backend.common.name_scope.name_scope
 elif backend.backend() == "numpy":
-    from keras.backend.numpy.core import Variable as NumpyVariable
+    from keras.src.backend.numpy.core import Variable as NumpyVariable
 
     BackendVariable = NumpyVariable
     backend_name_scope = backend.common.name_scope.name_scope
diff --git a/keras/src/backend/jax/__init__.py b/keras/src/backend/jax/__init__.py
new file mode 100644
index 000000000000..934bf5f4b159
--- /dev/null
+++ b/keras/src/backend/jax/__init__.py
@@ -0,0 +1,25 @@
+from keras.src.backend.jax import core
+from keras.src.backend.jax import distribution_lib
+from keras.src.backend.jax import image
+from keras.src.backend.jax import linalg
+from keras.src.backend.jax import math
+from keras.src.backend.jax import nn
+from keras.src.backend.jax import numpy
+from keras.src.backend.jax import random
+from keras.src.backend.jax.core import SUPPORTS_SPARSE_TENSORS
+from keras.src.backend.jax.core import Variable
+from keras.src.backend.jax.core import cast
+from keras.src.backend.jax.core import compute_output_spec
+from keras.src.backend.jax.core import cond
+from keras.src.backend.jax.core import convert_to_numpy
+from keras.src.backend.jax.core import convert_to_tensor
+from keras.src.backend.jax.core import device_scope
+from keras.src.backend.jax.core import is_tensor
+from keras.src.backend.jax.core import scatter
+from keras.src.backend.jax.core import shape
+from keras.src.backend.jax.core import stop_gradient
+from keras.src.backend.jax.core import vectorized_map
+from keras.src.backend.jax.rnn import cudnn_ok
+from keras.src.backend.jax.rnn import gru
+from keras.src.backend.jax.rnn import lstm
+from keras.src.backend.jax.rnn import rnn
diff --git a/keras/backend/jax/core.py b/keras/src/backend/jax/core.py
similarity index 97%
rename from keras/backend/jax/core.py
rename to keras/src/backend/jax/core.py
index 7b37807239f4..4d95bcaa7004 100644
--- a/keras/backend/jax/core.py
+++ b/keras/src/backend/jax/core.py
@@ -4,13 +4,13 @@
 import ml_dtypes
 import numpy as np
 
-from keras import tree
-from keras.backend.common import KerasVariable
-from keras.backend.common import global_state
-from keras.backend.common import standardize_dtype
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.backend.common.stateless_scope import StatelessScope
-from keras.backend.jax import distribution_lib
+from keras.src import tree
+from keras.src.backend.common import KerasVariable
+from keras.src.backend.common import global_state
+from keras.src.backend.common import standardize_dtype
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.backend.common.stateless_scope import StatelessScope
+from keras.src.backend.jax import distribution_lib
 
 SUPPORTS_SPARSE_TENSORS = True
 
diff --git a/keras/backend/jax/distribution_lib.py b/keras/src/backend/jax/distribution_lib.py
similarity index 99%
rename from keras/backend/jax/distribution_lib.py
rename to keras/src/backend/jax/distribution_lib.py
index 8e15e3c96fb0..8dee363b86a1 100644
--- a/keras/backend/jax/distribution_lib.py
+++ b/keras/src/backend/jax/distribution_lib.py
@@ -9,7 +9,7 @@
 import jax
 import numpy as np
 
-from keras.utils import jax_utils
+from keras.src.utils import jax_utils
 
 
 def list_devices(device_type=None):
diff --git a/keras/backend/jax/distribution_lib_test.py b/keras/src/backend/jax/distribution_lib_test.py
similarity index 98%
rename from keras/backend/jax/distribution_lib_test.py
rename to keras/src/backend/jax/distribution_lib_test.py
index 130954fe050d..b3e6b014b70b 100644
--- a/keras/backend/jax/distribution_lib_test.py
+++ b/keras/src/backend/jax/distribution_lib_test.py
@@ -8,12 +8,12 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import testing
-from keras.backend import distribution_lib as backend_dlib
-from keras.distribution import distribution_lib
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
+from keras.src.backend import distribution_lib as backend_dlib
+from keras.src.distribution import distribution_lib
 
 if backend.backend() == "jax":
     # Due to https://github.com/google/jax/issues/17188, we can't
diff --git a/keras/backend/jax/image.py b/keras/src/backend/jax/image.py
similarity index 99%
rename from keras/backend/jax/image.py
rename to keras/src/backend/jax/image.py
index 462611ba968d..7bba72e3f927 100644
--- a/keras/backend/jax/image.py
+++ b/keras/src/backend/jax/image.py
@@ -3,7 +3,7 @@
 import jax
 import jax.numpy as jnp
 
-from keras.backend.jax.core import convert_to_tensor
+from keras.src.backend.jax.core import convert_to_tensor
 
 RESIZE_INTERPOLATIONS = (
     "bilinear",
diff --git a/keras/backend/jax/layer.py b/keras/src/backend/jax/layer.py
similarity index 100%
rename from keras/backend/jax/layer.py
rename to keras/src/backend/jax/layer.py
diff --git a/keras/backend/jax/linalg.py b/keras/src/backend/jax/linalg.py
similarity index 86%
rename from keras/backend/jax/linalg.py
rename to keras/src/backend/jax/linalg.py
index 73d548a2d91d..bffdeba67dcc 100644
--- a/keras/backend/jax/linalg.py
+++ b/keras/src/backend/jax/linalg.py
@@ -2,11 +2,11 @@
 import jax.numpy as jnp
 import jax.scipy as jsp
 
-from keras.backend import config
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.jax.core import cast
-from keras.backend.jax.core import convert_to_tensor
+from keras.src.backend import config
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.jax.core import cast
+from keras.src.backend.jax.core import convert_to_tensor
 
 
 def cholesky(a):
diff --git a/keras/backend/jax/math.py b/keras/src/backend/jax/math.py
similarity index 96%
rename from keras/backend/jax/math.py
rename to keras/src/backend/jax/math.py
index 70add7674269..361eeee89173 100644
--- a/keras/backend/jax/math.py
+++ b/keras/src/backend/jax/math.py
@@ -3,12 +3,12 @@
 import jax
 import jax.numpy as jnp
 
-from keras.backend import config
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.jax.core import cast
-from keras.backend.jax.core import convert_to_tensor
-from keras.utils.module_utils import scipy
+from keras.src.backend import config
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.jax.core import cast
+from keras.src.backend.jax.core import convert_to_tensor
+from keras.src.utils.module_utils import scipy
 
 
 def segment_sum(data, segment_ids, num_segments=None, sorted=False):
diff --git a/keras/backend/jax/nn.py b/keras/src/backend/jax/nn.py
similarity index 98%
rename from keras/backend/jax/nn.py
rename to keras/src/backend/jax/nn.py
index 608a0dadc7fc..740c9b17e5a2 100644
--- a/keras/backend/jax/nn.py
+++ b/keras/src/backend/jax/nn.py
@@ -5,14 +5,14 @@
 from jax import lax
 from jax import nn as jnn
 
-from keras.backend import standardize_data_format
-from keras.backend import standardize_dtype
-from keras.backend.common.backend_utils import (
+from keras.src.backend import standardize_data_format
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_padding_args_for_jax,
 )
-from keras.backend.config import epsilon
-from keras.backend.jax.core import cast
-from keras.backend.jax.core import convert_to_tensor
+from keras.src.backend.config import epsilon
+from keras.src.backend.jax.core import cast
+from keras.src.backend.jax.core import convert_to_tensor
 
 
 def relu(x):
diff --git a/keras/backend/jax/numpy.py b/keras/src/backend/jax/numpy.py
similarity index 98%
rename from keras/backend/jax/numpy.py
rename to keras/src/backend/jax/numpy.py
index 70435d144d32..9520b21ec281 100644
--- a/keras/backend/jax/numpy.py
+++ b/keras/src/backend/jax/numpy.py
@@ -4,15 +4,15 @@
 import jax.experimental.sparse as jax_sparse
 import jax.numpy as jnp
 
-from keras.backend import config
-from keras.backend.common import dtypes
-from keras.backend.common.backend_utils import canonicalize_axis
-from keras.backend.common.backend_utils import to_tuple_or_list
-from keras.backend.common.variables import standardize_dtype
-from keras.backend.jax import nn
-from keras.backend.jax import sparse
-from keras.backend.jax.core import cast
-from keras.backend.jax.core import convert_to_tensor
+from keras.src.backend import config
+from keras.src.backend.common import dtypes
+from keras.src.backend.common.backend_utils import canonicalize_axis
+from keras.src.backend.common.backend_utils import to_tuple_or_list
+from keras.src.backend.common.variables import standardize_dtype
+from keras.src.backend.jax import nn
+from keras.src.backend.jax import sparse
+from keras.src.backend.jax.core import cast
+from keras.src.backend.jax.core import convert_to_tensor
 
 
 @sparse.elementwise_binary_union(linear=True, use_sparsify=True)
@@ -860,7 +860,7 @@ def repeat(x, repeats, axis=None):
 
 def reshape(x, newshape):
     if isinstance(x, jax_sparse.BCOO):
-        from keras.ops import operation_utils
+        from keras.src.ops import operation_utils
 
         # Resolve the -1 in `new_shape` if applicable and possible
         output_shape = operation_utils.compute_reshape_output_shape(
diff --git a/keras/backend/jax/optimizer.py b/keras/src/backend/jax/optimizer.py
similarity index 98%
rename from keras/backend/jax/optimizer.py
rename to keras/src/backend/jax/optimizer.py
index 2a4d6844b9d9..cc461ce113a7 100644
--- a/keras/backend/jax/optimizer.py
+++ b/keras/src/backend/jax/optimizer.py
@@ -1,7 +1,7 @@
 import jax
 from jax import numpy as jnp
 
-from keras.optimizers import base_optimizer
+from keras.src.optimizers import base_optimizer
 
 
 class JaxOptimizer(base_optimizer.BaseOptimizer):
diff --git a/keras/backend/jax/random.py b/keras/src/backend/jax/random.py
similarity index 93%
rename from keras/backend/jax/random.py
rename to keras/src/backend/jax/random.py
index 6b2c7afba1b6..79901696339f 100644
--- a/keras/backend/jax/random.py
+++ b/keras/src/backend/jax/random.py
@@ -1,9 +1,9 @@
 import jax
 
-from keras.backend.config import floatx
-from keras.random.seed_generator import SeedGenerator
-from keras.random.seed_generator import draw_seed
-from keras.random.seed_generator import make_default_seed
+from keras.src.backend.config import floatx
+from keras.src.random.seed_generator import SeedGenerator
+from keras.src.random.seed_generator import draw_seed
+from keras.src.random.seed_generator import make_default_seed
 
 
 def jax_draw_seed(seed):
diff --git a/keras/backend/jax/rnn.py b/keras/src/backend/jax/rnn.py
similarity index 98%
rename from keras/backend/jax/rnn.py
rename to keras/src/backend/jax/rnn.py
index b6676fc8d3a9..688211b31f0d 100644
--- a/keras/backend/jax/rnn.py
+++ b/keras/src/backend/jax/rnn.py
@@ -3,8 +3,8 @@
 from jax import lax
 from jax import numpy as jnp
 
-from keras import tree
-from keras.backend.common import stateless_scope
+from keras.src import tree
+from keras.src.backend.common import stateless_scope
 
 
 def rnn(
diff --git a/keras/backend/jax/sparse.py b/keras/src/backend/jax/sparse.py
similarity index 99%
rename from keras/backend/jax/sparse.py
rename to keras/src/backend/jax/sparse.py
index 48359016cf1e..f2d7f19d7d16 100644
--- a/keras/backend/jax/sparse.py
+++ b/keras/src/backend/jax/sparse.py
@@ -3,7 +3,7 @@
 import jax.experimental.sparse as jax_sparse
 import jax.numpy as jnp
 
-from keras.utils import jax_utils
+from keras.src.utils import jax_utils
 
 
 def axis_shape_dims_for_broadcast_in_dim(axis, input_shape, insert_dims):
diff --git a/keras/backend/jax/trainer.py b/keras/src/backend/jax/trainer.py
similarity index 98%
rename from keras/backend/jax/trainer.py
rename to keras/src/backend/jax/trainer.py
index 85308f34175a..89ff3b0d1b7f 100644
--- a/keras/backend/jax/trainer.py
+++ b/keras/src/backend/jax/trainer.py
@@ -5,17 +5,17 @@
 import jax
 import numpy as np
 
-from keras import backend
-from keras import callbacks as callbacks_module
-from keras import optimizers as optimizers_module
-from keras import tree
-from keras.backend import distribution_lib as jax_distribution_lib
-from keras.distribution import distribution_lib
-from keras.trainers import trainer as base_trainer
-from keras.trainers.data_adapters import array_slicing
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.trainers.epoch_iterator import EpochIterator
-from keras.utils import traceback_utils
+from keras.src import backend
+from keras.src import callbacks as callbacks_module
+from keras.src import optimizers as optimizers_module
+from keras.src import tree
+from keras.src.backend import distribution_lib as jax_distribution_lib
+from keras.src.distribution import distribution_lib
+from keras.src.trainers import trainer as base_trainer
+from keras.src.trainers.data_adapters import array_slicing
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.trainers.epoch_iterator import EpochIterator
+from keras.src.utils import traceback_utils
 
 
 class JAXTrainer(base_trainer.Trainer):
diff --git a/keras/src/backend/numpy/__init__.py b/keras/src/backend/numpy/__init__.py
new file mode 100644
index 000000000000..ce1277b8ddc1
--- /dev/null
+++ b/keras/src/backend/numpy/__init__.py
@@ -0,0 +1,21 @@
+from keras.src.backend.numpy import core
+from keras.src.backend.numpy import image
+from keras.src.backend.numpy import linalg
+from keras.src.backend.numpy import math
+from keras.src.backend.numpy import nn
+from keras.src.backend.numpy import numpy
+from keras.src.backend.numpy import random
+from keras.src.backend.numpy.core import SUPPORTS_SPARSE_TENSORS
+from keras.src.backend.numpy.core import Variable
+from keras.src.backend.numpy.core import cast
+from keras.src.backend.numpy.core import compute_output_spec
+from keras.src.backend.numpy.core import cond
+from keras.src.backend.numpy.core import convert_to_numpy
+from keras.src.backend.numpy.core import convert_to_tensor
+from keras.src.backend.numpy.core import is_tensor
+from keras.src.backend.numpy.core import shape
+from keras.src.backend.numpy.core import vectorized_map
+from keras.src.backend.numpy.rnn import cudnn_ok
+from keras.src.backend.numpy.rnn import gru
+from keras.src.backend.numpy.rnn import lstm
+from keras.src.backend.numpy.rnn import rnn
diff --git a/keras/backend/numpy/core.py b/keras/src/backend/numpy/core.py
similarity index 95%
rename from keras/backend/numpy/core.py
rename to keras/src/backend/numpy/core.py
index dcd01554f2cb..c00b2598dfde 100644
--- a/keras/backend/numpy/core.py
+++ b/keras/src/backend/numpy/core.py
@@ -1,11 +1,11 @@
 import numpy as np
 
-from keras import tree
-from keras.backend.common import KerasVariable
-from keras.backend.common import standardize_dtype
-from keras.backend.common.dtypes import result_type
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.backend.common.stateless_scope import StatelessScope
+from keras.src import tree
+from keras.src.backend.common import KerasVariable
+from keras.src.backend.common import standardize_dtype
+from keras.src.backend.common.dtypes import result_type
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.backend.common.stateless_scope import StatelessScope
 
 SUPPORTS_SPARSE_TENSORS = False
 
diff --git a/keras/backend/numpy/image.py b/keras/src/backend/numpy/image.py
similarity index 98%
rename from keras/backend/numpy/image.py
rename to keras/src/backend/numpy/image.py
index efa42e42f137..2281c422d496 100644
--- a/keras/backend/numpy/image.py
+++ b/keras/src/backend/numpy/image.py
@@ -1,8 +1,8 @@
 import jax
 import numpy as np
 
-from keras.backend.numpy.core import convert_to_tensor
-from keras.utils.module_utils import scipy
+from keras.src.backend.numpy.core import convert_to_tensor
+from keras.src.utils.module_utils import scipy
 
 RESIZE_INTERPOLATIONS = (
     "bilinear",
diff --git a/keras/backend/numpy/layer.py b/keras/src/backend/numpy/layer.py
similarity index 100%
rename from keras/backend/numpy/layer.py
rename to keras/src/backend/numpy/layer.py
diff --git a/keras/backend/numpy/linalg.py b/keras/src/backend/numpy/linalg.py
similarity index 92%
rename from keras/backend/numpy/linalg.py
rename to keras/src/backend/numpy/linalg.py
index 1b651a59aa05..32d0f762fd76 100644
--- a/keras/backend/numpy/linalg.py
+++ b/keras/src/backend/numpy/linalg.py
@@ -1,9 +1,9 @@
 import numpy as np
 import scipy.linalg as sl
 
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.numpy.core import convert_to_tensor
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.numpy.core import convert_to_tensor
 
 
 def cholesky(a):
diff --git a/keras/backend/numpy/math.py b/keras/src/backend/numpy/math.py
similarity index 97%
rename from keras/backend/numpy/math.py
rename to keras/src/backend/numpy/math.py
index bb9c3d499e5a..f14e43d863b8 100644
--- a/keras/backend/numpy/math.py
+++ b/keras/src/backend/numpy/math.py
@@ -1,11 +1,11 @@
 import numpy as np
 
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.jax.math import fft as jax_fft
-from keras.backend.jax.math import fft2 as jax_fft2
-from keras.backend.numpy.core import convert_to_tensor
-from keras.utils.module_utils import scipy
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.jax.math import fft as jax_fft
+from keras.src.backend.jax.math import fft2 as jax_fft2
+from keras.src.backend.numpy.core import convert_to_tensor
+from keras.src.utils.module_utils import scipy
 
 
 def segment_sum(data, segment_ids, num_segments=None, sorted=False):
diff --git a/keras/backend/numpy/nn.py b/keras/src/backend/numpy/nn.py
similarity index 97%
rename from keras/backend/numpy/nn.py
rename to keras/src/backend/numpy/nn.py
index 45ed3f05ac9c..7dee370ef005 100644
--- a/keras/backend/numpy/nn.py
+++ b/keras/src/backend/numpy/nn.py
@@ -3,16 +3,16 @@
 from jax import lax
 from jax import numpy as jnp
 
-from keras.backend import standardize_data_format
-from keras.backend import standardize_dtype
-from keras.backend.common.backend_utils import (
+from keras.src.backend import standardize_data_format
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_padding_args_for_jax,
 )
-from keras.backend.config import epsilon
-from keras.backend.numpy.core import cast
-from keras.backend.numpy.core import convert_to_tensor
-from keras.backend.numpy.core import is_tensor
-from keras.utils.module_utils import scipy
+from keras.src.backend.config import epsilon
+from keras.src.backend.numpy.core import cast
+from keras.src.backend.numpy.core import convert_to_tensor
+from keras.src.backend.numpy.core import is_tensor
+from keras.src.utils.module_utils import scipy
 
 
 def relu(x):
diff --git a/keras/backend/numpy/numpy.py b/keras/src/backend/numpy/numpy.py
similarity index 98%
rename from keras/backend/numpy/numpy.py
rename to keras/src/backend/numpy/numpy.py
index 5965ce380218..fa098a029978 100644
--- a/keras/backend/numpy/numpy.py
+++ b/keras/src/backend/numpy/numpy.py
@@ -1,11 +1,11 @@
 import numpy as np
 
-from keras import tree
-from keras.backend import config
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.common.backend_utils import standardize_axis_for_numpy
-from keras.backend.numpy.core import convert_to_tensor
+from keras.src import tree
+from keras.src.backend import config
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.common.backend_utils import standardize_axis_for_numpy
+from keras.src.backend.numpy.core import convert_to_tensor
 
 
 def add(x1, x2):
diff --git a/keras/backend/numpy/random.py b/keras/src/backend/numpy/random.py
similarity index 93%
rename from keras/backend/numpy/random.py
rename to keras/src/backend/numpy/random.py
index b3204b430292..f8fd65aa38ba 100644
--- a/keras/backend/numpy/random.py
+++ b/keras/src/backend/numpy/random.py
@@ -1,10 +1,10 @@
 import numpy as np
 
-from keras.backend.config import floatx
-from keras.backend.numpy.nn import softmax
-from keras.random.seed_generator import SeedGenerator
-from keras.random.seed_generator import draw_seed
-from keras.random.seed_generator import make_default_seed
+from keras.src.backend.config import floatx
+from keras.src.backend.numpy.nn import softmax
+from keras.src.random.seed_generator import SeedGenerator
+from keras.src.random.seed_generator import draw_seed
+from keras.src.random.seed_generator import make_default_seed
 
 
 def normal(shape, mean=0.0, stddev=1.0, dtype=None, seed=None):
diff --git a/keras/backend/numpy/rnn.py b/keras/src/backend/numpy/rnn.py
similarity index 99%
rename from keras/backend/numpy/rnn.py
rename to keras/src/backend/numpy/rnn.py
index 6d760f0f6ebe..07f657525144 100644
--- a/keras/backend/numpy/rnn.py
+++ b/keras/src/backend/numpy/rnn.py
@@ -1,6 +1,6 @@
 import numpy as np
 
-from keras import tree
+from keras.src import tree
 
 
 def rnn(
diff --git a/keras/backend/numpy/trainer.py b/keras/src/backend/numpy/trainer.py
similarity index 95%
rename from keras/backend/numpy/trainer.py
rename to keras/src/backend/numpy/trainer.py
index 700e4b856dce..c92465874673 100644
--- a/keras/backend/numpy/trainer.py
+++ b/keras/src/backend/numpy/trainer.py
@@ -1,15 +1,15 @@
 import numpy as np
 
-from keras import backend
-from keras import callbacks as callbacks_module
-from keras import tree
-from keras.backend.common import standardize_dtype
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.backend.numpy.core import is_tensor
-from keras.trainers import trainer as base_trainer
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.trainers.epoch_iterator import EpochIterator
-from keras.utils import traceback_utils
+from keras.src import backend
+from keras.src import callbacks as callbacks_module
+from keras.src import tree
+from keras.src.backend.common import standardize_dtype
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.backend.numpy.core import is_tensor
+from keras.src.trainers import trainer as base_trainer
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.trainers.epoch_iterator import EpochIterator
+from keras.src.utils import traceback_utils
 
 
 class NumpyTrainer(base_trainer.Trainer):
diff --git a/keras/src/backend/tensorflow/__init__.py b/keras/src/backend/tensorflow/__init__.py
new file mode 100644
index 000000000000..c70f22ee4668
--- /dev/null
+++ b/keras/src/backend/tensorflow/__init__.py
@@ -0,0 +1,27 @@
+from keras.src.backend.tensorflow import core
+from keras.src.backend.tensorflow import distribution_lib
+from keras.src.backend.tensorflow import image
+from keras.src.backend.tensorflow import linalg
+from keras.src.backend.tensorflow import math
+from keras.src.backend.tensorflow import nn
+from keras.src.backend.tensorflow import numpy
+from keras.src.backend.tensorflow import random
+from keras.src.backend.tensorflow import tensorboard
+from keras.src.backend.tensorflow.core import SUPPORTS_SPARSE_TENSORS
+from keras.src.backend.tensorflow.core import Variable
+from keras.src.backend.tensorflow.core import cast
+from keras.src.backend.tensorflow.core import compute_output_spec
+from keras.src.backend.tensorflow.core import cond
+from keras.src.backend.tensorflow.core import convert_to_numpy
+from keras.src.backend.tensorflow.core import convert_to_tensor
+from keras.src.backend.tensorflow.core import device_scope
+from keras.src.backend.tensorflow.core import is_tensor
+from keras.src.backend.tensorflow.core import name_scope
+from keras.src.backend.tensorflow.core import scatter
+from keras.src.backend.tensorflow.core import shape
+from keras.src.backend.tensorflow.core import stop_gradient
+from keras.src.backend.tensorflow.core import vectorized_map
+from keras.src.backend.tensorflow.rnn import cudnn_ok
+from keras.src.backend.tensorflow.rnn import gru
+from keras.src.backend.tensorflow.rnn import lstm
+from keras.src.backend.tensorflow.rnn import rnn
diff --git a/keras/backend/tensorflow/core.py b/keras/src/backend/tensorflow/core.py
similarity index 93%
rename from keras/backend/tensorflow/core.py
rename to keras/src/backend/tensorflow/core.py
index 6e72539d11be..575e6dc6da26 100644
--- a/keras/backend/tensorflow/core.py
+++ b/keras/src/backend/tensorflow/core.py
@@ -2,16 +2,16 @@
 import tensorflow as tf
 from tensorflow.compiler.tf2xla.python.xla import dynamic_update_slice
 
-from keras import tree
-from keras.backend.common import KerasVariable
-from keras.backend.common import global_state
-from keras.backend.common import standardize_dtype
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.backend.common.name_scope import name_scope as base_name_scope
-from keras.backend.common.stateless_scope import StatelessScope
-from keras.backend.common.stateless_scope import in_stateless_scope
-from keras.backend.tensorflow.sparse import sparse_to_dense
-from keras.utils.naming import auto_name
+from keras.src import tree
+from keras.src.backend.common import KerasVariable
+from keras.src.backend.common import global_state
+from keras.src.backend.common import standardize_dtype
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.backend.common.name_scope import name_scope as base_name_scope
+from keras.src.backend.common.stateless_scope import StatelessScope
+from keras.src.backend.common.stateless_scope import in_stateless_scope
+from keras.src.backend.tensorflow.sparse import sparse_to_dense
+from keras.src.utils.naming import auto_name
 
 SUPPORTS_SPARSE_TENSORS = True
 
diff --git a/keras/backend/tensorflow/distribute_test.py b/keras/src/backend/tensorflow/distribute_test.py
similarity index 95%
rename from keras/backend/tensorflow/distribute_test.py
rename to keras/src/backend/tensorflow/distribute_test.py
index 413bac6f0fc4..ae07d08e6bf7 100644
--- a/keras/backend/tensorflow/distribute_test.py
+++ b/keras/src/backend/tensorflow/distribute_test.py
@@ -5,11 +5,11 @@
 import tensorflow as tf
 from tensorflow.python.eager import context
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import testing
-from keras.backend.tensorflow import trainer as tf_trainer
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
+from keras.src.backend.tensorflow import trainer as tf_trainer
 
 
 @pytest.mark.skipif(
diff --git a/keras/backend/tensorflow/distribution_lib.py b/keras/src/backend/tensorflow/distribution_lib.py
similarity index 100%
rename from keras/backend/tensorflow/distribution_lib.py
rename to keras/src/backend/tensorflow/distribution_lib.py
diff --git a/keras/backend/tensorflow/image.py b/keras/src/backend/tensorflow/image.py
similarity index 99%
rename from keras/backend/tensorflow/image.py
rename to keras/src/backend/tensorflow/image.py
index b51b738c1732..c03825dd7d16 100644
--- a/keras/backend/tensorflow/image.py
+++ b/keras/src/backend/tensorflow/image.py
@@ -4,7 +4,7 @@
 
 import tensorflow as tf
 
-from keras.backend.tensorflow.core import convert_to_tensor
+from keras.src.backend.tensorflow.core import convert_to_tensor
 
 RESIZE_INTERPOLATIONS = (
     "bilinear",
diff --git a/keras/backend/tensorflow/layer.py b/keras/src/backend/tensorflow/layer.py
similarity index 92%
rename from keras/backend/tensorflow/layer.py
rename to keras/src/backend/tensorflow/layer.py
index 7c871ba67cf8..fd1f33020132 100644
--- a/keras/backend/tensorflow/layer.py
+++ b/keras/src/backend/tensorflow/layer.py
@@ -1,9 +1,9 @@
 import tensorflow as tf
 
-from keras import tree
-from keras.backend.tensorflow.trackable import KerasAutoTrackable
-from keras.utils import tf_utils
-from keras.utils import tracking
+from keras.src import tree
+from keras.src.backend.tensorflow.trackable import KerasAutoTrackable
+from keras.src.utils import tf_utils
+from keras.src.utils import tracking
 
 
 class TFLayer(KerasAutoTrackable):
@@ -77,9 +77,9 @@ def _trackable_children(self, save_type="checkpoint", **kwargs):
     def _default_save_signature(self):
         """For SavedModel support: returns the default serving signature."""
 
-        from keras.models.functional import Functional
-        from keras.models.model import Model
-        from keras.models.sequential import Sequential
+        from keras.src.models.functional import Functional
+        from keras.src.models.model import Model
+        from keras.src.models.sequential import Sequential
 
         if not isinstance(self, Model):
             return None
diff --git a/keras/backend/tensorflow/linalg.py b/keras/src/backend/tensorflow/linalg.py
similarity index 96%
rename from keras/backend/tensorflow/linalg.py
rename to keras/src/backend/tensorflow/linalg.py
index 20b8fe5b23e7..b50a8b44e875 100644
--- a/keras/backend/tensorflow/linalg.py
+++ b/keras/src/backend/tensorflow/linalg.py
@@ -1,11 +1,11 @@
 import tensorflow as tf
 from tensorflow.experimental import numpy as tfnp
 
-from keras.backend import config
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.tensorflow.core import cast
-from keras.backend.tensorflow.core import convert_to_tensor
+from keras.src.backend import config
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.tensorflow.core import cast
+from keras.src.backend.tensorflow.core import convert_to_tensor
 
 
 def cholesky(a):
diff --git a/keras/backend/tensorflow/math.py b/keras/src/backend/tensorflow/math.py
similarity index 97%
rename from keras/backend/tensorflow/math.py
rename to keras/src/backend/tensorflow/math.py
index 9b4d4d151f83..ffc7f99f0da0 100644
--- a/keras/backend/tensorflow/math.py
+++ b/keras/src/backend/tensorflow/math.py
@@ -1,11 +1,11 @@
 import tensorflow as tf
 from tensorflow.experimental import numpy as tfnp
 
-from keras.backend import config
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.tensorflow.core import cast
-from keras.backend.tensorflow.core import convert_to_tensor
+from keras.src.backend import config
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.tensorflow.core import cast
+from keras.src.backend.tensorflow.core import convert_to_tensor
 
 
 def segment_sum(data, segment_ids, num_segments=None, sorted=False):
diff --git a/keras/backend/tensorflow/name_scope_test.py b/keras/src/backend/tensorflow/name_scope_test.py
similarity index 94%
rename from keras/backend/tensorflow/name_scope_test.py
rename to keras/src/backend/tensorflow/name_scope_test.py
index 8ec1aecb790e..f9d8eb7b8499 100644
--- a/keras/backend/tensorflow/name_scope_test.py
+++ b/keras/src/backend/tensorflow/name_scope_test.py
@@ -1,7 +1,7 @@
 import tensorflow as tf
 
-from keras.backend.tensorflow.core import name_scope
-from keras.testing import TestCase
+from keras.src.backend.tensorflow.core import name_scope
+from keras.src.testing import TestCase
 
 
 class TFNameScopeTest(TestCase):
diff --git a/keras/backend/tensorflow/nn.py b/keras/src/backend/tensorflow/nn.py
similarity index 98%
rename from keras/backend/tensorflow/nn.py
rename to keras/src/backend/tensorflow/nn.py
index 807f0206439a..2167087198f0 100644
--- a/keras/backend/tensorflow/nn.py
+++ b/keras/src/backend/tensorflow/nn.py
@@ -3,14 +3,14 @@
 
 import tensorflow as tf
 
-from keras.backend import standardize_data_format
-from keras.backend import standardize_dtype
-from keras.backend.common.backend_utils import (
+from keras.src.backend import standardize_data_format
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_output_shape,
 )
-from keras.backend.config import epsilon
-from keras.backend.tensorflow.core import cast
-from keras.backend.tensorflow.core import convert_to_tensor
+from keras.src.backend.config import epsilon
+from keras.src.backend.tensorflow.core import cast
+from keras.src.backend.tensorflow.core import convert_to_tensor
 
 
 def relu(x):
diff --git a/keras/backend/tensorflow/numpy.py b/keras/src/backend/tensorflow/numpy.py
similarity index 98%
rename from keras/backend/tensorflow/numpy.py
rename to keras/src/backend/tensorflow/numpy.py
index 1b6b754c9d71..d1a12e53a780 100644
--- a/keras/backend/tensorflow/numpy.py
+++ b/keras/src/backend/tensorflow/numpy.py
@@ -10,15 +10,15 @@
 from tensorflow.experimental import numpy as tfnp
 from tensorflow.python.ops.linalg.sparse import sparse_csr_matrix_ops
 
-from keras import tree
-from keras.backend import config
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.common.backend_utils import canonicalize_axis
-from keras.backend.common.backend_utils import to_tuple_or_list
-from keras.backend.tensorflow import sparse
-from keras.backend.tensorflow.core import cast
-from keras.backend.tensorflow.core import convert_to_tensor
+from keras.src import tree
+from keras.src.backend import config
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.common.backend_utils import canonicalize_axis
+from keras.src.backend.common.backend_utils import to_tuple_or_list
+from keras.src.backend.tensorflow import sparse
+from keras.src.backend.tensorflow.core import cast
+from keras.src.backend.tensorflow.core import convert_to_tensor
 
 
 @sparse.elementwise_binary_union(tf.sparse.add)
@@ -442,7 +442,7 @@ def sparse_dense_matmul_3d(a, b):
         )
 
     if x1_sparse or x2_sparse:
-        from keras.ops.operation_utils import compute_matmul_output_shape
+        from keras.src.ops.operation_utils import compute_matmul_output_shape
 
         output_shape = compute_matmul_output_shape(x1_shape, x2_shape)
         if x1_sparse and x2_sparse:
@@ -1022,7 +1022,9 @@ def expand_dims(x, axis):
     out_ndim = len(x.shape) + len(axis)
     axis = sorted([canonicalize_axis(a, out_ndim) for a in axis])
     if isinstance(x, tf.SparseTensor):
-        from keras.ops.operation_utils import compute_expand_dims_output_shape
+        from keras.src.ops.operation_utils import (
+            compute_expand_dims_output_shape,
+        )
 
         output_shape = compute_expand_dims_output_shape(x.shape, axis)
         for a in axis:
@@ -1607,7 +1609,7 @@ def repeat(x, repeats, axis=None):
 def reshape(x, newshape):
     x = convert_to_tensor(x)
     if isinstance(x, tf.SparseTensor):
-        from keras.ops.operation_utils import compute_reshape_output_shape
+        from keras.src.ops.operation_utils import compute_reshape_output_shape
 
         output_shape = compute_reshape_output_shape(
             x.shape, newshape, "newshape"
@@ -2011,7 +2013,7 @@ def squeeze(x, axis=None):
 
 def transpose(x, axes=None):
     if isinstance(x, tf.SparseTensor):
-        from keras.ops.operation_utils import compute_transpose_output_shape
+        from keras.src.ops.operation_utils import compute_transpose_output_shape
 
         output = tf.sparse.transpose(x, perm=axes)
         output.set_shape(compute_transpose_output_shape(x.shape, axes))
diff --git a/keras/backend/tensorflow/optimizer.py b/keras/src/backend/tensorflow/optimizer.py
similarity index 97%
rename from keras/backend/tensorflow/optimizer.py
rename to keras/src/backend/tensorflow/optimizer.py
index 9524149b7535..1887ac52cf39 100644
--- a/keras/backend/tensorflow/optimizer.py
+++ b/keras/src/backend/tensorflow/optimizer.py
@@ -2,10 +2,10 @@
 
 import tensorflow as tf
 
-from keras import backend
-from keras.backend.common import KerasVariable
-from keras.backend.tensorflow.trackable import KerasAutoTrackable
-from keras.optimizers import base_optimizer
+from keras.src import backend
+from keras.src.backend.common import KerasVariable
+from keras.src.backend.tensorflow.trackable import KerasAutoTrackable
+from keras.src.optimizers import base_optimizer
 
 
 class TFOptimizer(KerasAutoTrackable, base_optimizer.BaseOptimizer):
diff --git a/keras/backend/tensorflow/optimizer_distribute_test.py b/keras/src/backend/tensorflow/optimizer_distribute_test.py
similarity index 98%
rename from keras/backend/tensorflow/optimizer_distribute_test.py
rename to keras/src/backend/tensorflow/optimizer_distribute_test.py
index 27f46ae54f32..a4d61da6b23d 100644
--- a/keras/backend/tensorflow/optimizer_distribute_test.py
+++ b/keras/src/backend/tensorflow/optimizer_distribute_test.py
@@ -5,9 +5,9 @@
 import tensorflow as tf
 from tensorflow.python.eager import context
 
-from keras import backend
-from keras import testing
-from keras.optimizers.sgd import SGD
+from keras.src import backend
+from keras.src import testing
+from keras.src.optimizers.sgd import SGD
 
 
 @pytest.mark.skipif(
diff --git a/keras/backend/tensorflow/random.py b/keras/src/backend/tensorflow/random.py
similarity index 95%
rename from keras/backend/tensorflow/random.py
rename to keras/src/backend/tensorflow/random.py
index b366c61be8c7..eeb38a6aa523 100644
--- a/keras/backend/tensorflow/random.py
+++ b/keras/src/backend/tensorflow/random.py
@@ -1,11 +1,11 @@
 import tensorflow as tf
 from tensorflow.experimental import numpy as tfnp
 
-from keras.backend.common import standardize_dtype
-from keras.backend.config import floatx
-from keras.random.seed_generator import SeedGenerator
-from keras.random.seed_generator import draw_seed
-from keras.random.seed_generator import make_default_seed
+from keras.src.backend.common import standardize_dtype
+from keras.src.backend.config import floatx
+from keras.src.random.seed_generator import SeedGenerator
+from keras.src.random.seed_generator import draw_seed
+from keras.src.random.seed_generator import make_default_seed
 
 
 def tf_draw_seed(seed):
diff --git a/keras/backend/tensorflow/rnn.py b/keras/src/backend/tensorflow/rnn.py
similarity index 99%
rename from keras/backend/tensorflow/rnn.py
rename to keras/src/backend/tensorflow/rnn.py
index c9de498a6cf6..1911deec897e 100644
--- a/keras/backend/tensorflow/rnn.py
+++ b/keras/src/backend/tensorflow/rnn.py
@@ -1,6 +1,6 @@
 import tensorflow as tf
 
-from keras import tree
+from keras.src import tree
 
 
 def rnn(
@@ -471,7 +471,7 @@ def gru(
     if not cudnn_supported:
         raise NotImplementedError
 
-    from keras.backend.tensorflow import Variable
+    from keras.src.backend.tensorflow import Variable
 
     if isinstance(kernel, Variable):
         kernel = kernel.value
@@ -507,8 +507,8 @@ def _do_gru_arguments_support_cudnn(
     use_bias,
     reset_after,
 ):
-    from keras import activations
-    from keras import ops
+    from keras.src import activations
+    from keras.src import ops
 
     return (
         activation in (activations.tanh, tf.tanh, ops.tanh)
@@ -526,8 +526,8 @@ def _do_lstm_arguments_support_cudnn(
     unroll,
     use_bias,
 ):
-    from keras import activations
-    from keras import ops
+    from keras.src import activations
+    from keras.src import ops
 
     return (
         activation in (activations.tanh, tf.tanh, ops.tanh)
@@ -828,7 +828,7 @@ def lstm(
     if not cudnn_supported:
         raise NotImplementedError
 
-    from keras.backend.tensorflow import Variable
+    from keras.src.backend.tensorflow import Variable
 
     if isinstance(kernel, Variable):
         kernel = kernel.value
diff --git a/keras/backend/tensorflow/saved_model_test.py b/keras/src/backend/tensorflow/saved_model_test.py
similarity index 98%
rename from keras/backend/tensorflow/saved_model_test.py
rename to keras/src/backend/tensorflow/saved_model_test.py
index 02be85362fd6..2e81818be176 100644
--- a/keras/backend/tensorflow/saved_model_test.py
+++ b/keras/src/backend/tensorflow/saved_model_test.py
@@ -6,13 +6,13 @@
 import pytest
 import tensorflow as tf
 
-from keras import backend
-from keras import layers
-from keras import metrics
-from keras import models
-from keras import optimizers
-from keras import testing
-from keras.saving import object_registration
+from keras.src import backend
+from keras.src import layers
+from keras.src import metrics
+from keras.src import models
+from keras.src import optimizers
+from keras.src import testing
+from keras.src.saving import object_registration
 
 
 @object_registration.register_keras_serializable(package="my_package")
diff --git a/keras/backend/tensorflow/sparse.py b/keras/src/backend/tensorflow/sparse.py
similarity index 100%
rename from keras/backend/tensorflow/sparse.py
rename to keras/src/backend/tensorflow/sparse.py
diff --git a/keras/backend/tensorflow/tensorboard.py b/keras/src/backend/tensorflow/tensorboard.py
similarity index 100%
rename from keras/backend/tensorflow/tensorboard.py
rename to keras/src/backend/tensorflow/tensorboard.py
diff --git a/keras/backend/tensorflow/trackable.py b/keras/src/backend/tensorflow/trackable.py
similarity index 98%
rename from keras/backend/tensorflow/trackable.py
rename to keras/src/backend/tensorflow/trackable.py
index 29ed4dd48017..e14b2996af34 100644
--- a/keras/backend/tensorflow/trackable.py
+++ b/keras/src/backend/tensorflow/trackable.py
@@ -1,6 +1,6 @@
 import tensorflow as tf
 
-from keras.utils import tracking
+from keras.src.utils import tracking
 
 
 class KerasAutoTrackable(tf.__internal__.tracking.AutoTrackable):
diff --git a/keras/backend/tensorflow/trainer.py b/keras/src/backend/tensorflow/trainer.py
similarity index 98%
rename from keras/backend/tensorflow/trainer.py
rename to keras/src/backend/tensorflow/trainer.py
index e1f0afaa1cf3..5a6b4aed945d 100644
--- a/keras/backend/tensorflow/trainer.py
+++ b/keras/src/backend/tensorflow/trainer.py
@@ -5,15 +5,15 @@
 import tensorflow as tf
 from tensorflow.python.eager import context as tf_context
 
-from keras import callbacks as callbacks_module
-from keras import metrics as metrics_module
-from keras import optimizers as optimizers_module
-from keras import tree
-from keras.trainers import trainer as base_trainer
-from keras.trainers.data_adapters import array_slicing
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.trainers.epoch_iterator import EpochIterator
-from keras.utils import traceback_utils
+from keras.src import callbacks as callbacks_module
+from keras.src import metrics as metrics_module
+from keras.src import optimizers as optimizers_module
+from keras.src import tree
+from keras.src.trainers import trainer as base_trainer
+from keras.src.trainers.data_adapters import array_slicing
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.trainers.epoch_iterator import EpochIterator
+from keras.src.utils import traceback_utils
 
 
 class TensorFlowTrainer(base_trainer.Trainer):
diff --git a/keras/backend/tests/compute_output_spec_test.py b/keras/src/backend/tests/compute_output_spec_test.py
similarity index 97%
rename from keras/backend/tests/compute_output_spec_test.py
rename to keras/src/backend/tests/compute_output_spec_test.py
index 5982086124ed..b3458bcc876f 100644
--- a/keras/backend/tests/compute_output_spec_test.py
+++ b/keras/src/backend/tests/compute_output_spec_test.py
@@ -2,9 +2,9 @@
 
 import pytest
 
-from keras import backend
-from keras import ops
-from keras.backend.common.keras_tensor import KerasTensor
+from keras.src import backend
+from keras.src import ops
+from keras.src.backend.common.keras_tensor import KerasTensor
 
 
 def single_arg_test_fn(x):
diff --git a/keras/backend/tests/device_scope_test.py b/keras/src/backend/tests/device_scope_test.py
similarity index 98%
rename from keras/backend/tests/device_scope_test.py
rename to keras/src/backend/tests/device_scope_test.py
index 1a7213213303..caee6742f61d 100644
--- a/keras/backend/tests/device_scope_test.py
+++ b/keras/src/backend/tests/device_scope_test.py
@@ -1,7 +1,7 @@
 import pytest
 
-from keras import backend
-from keras import testing
+from keras.src import backend
+from keras.src import testing
 
 
 class DeviceTest(testing.TestCase):
diff --git a/keras/src/backend/torch/__init__.py b/keras/src/backend/torch/__init__.py
new file mode 100644
index 000000000000..d980ec87cfec
--- /dev/null
+++ b/keras/src/backend/torch/__init__.py
@@ -0,0 +1,41 @@
+"""Torch backend APIs.
+
+# Note on device placement
+
+Torch has a different device placement style compared to TF and JAX.
+In short, variables/tensors are not created on GPU by default,
+and the GPU cannot directly communicate with the CPU.
+To bring Torch behavior in line with TF and JAX automated device placement,
+we are doing the following to automate device placement if a GPU is available:
+
+- Variables are created on GPU.
+- Input data will be placed on GPU at the first `keras.layers.Layer` call.
+- Tensor creation happens on GPU, e.g., `zeros()` will create a tensor on GPU.
+- `convert_to_numpy` will bring the tensor to CPU before converting it to NumPy.
+"""
+
+from keras.src.backend.torch import core
+from keras.src.backend.torch import image
+from keras.src.backend.torch import linalg
+from keras.src.backend.torch import math
+from keras.src.backend.torch import nn
+from keras.src.backend.torch import numpy
+from keras.src.backend.torch import random
+from keras.src.backend.torch.core import SUPPORTS_SPARSE_TENSORS
+from keras.src.backend.torch.core import Variable
+from keras.src.backend.torch.core import cast
+from keras.src.backend.torch.core import compute_output_spec
+from keras.src.backend.torch.core import cond
+from keras.src.backend.torch.core import convert_to_numpy
+from keras.src.backend.torch.core import convert_to_tensor
+from keras.src.backend.torch.core import device_scope
+from keras.src.backend.torch.core import is_tensor
+from keras.src.backend.torch.core import scatter
+from keras.src.backend.torch.core import shape
+from keras.src.backend.torch.core import stop_gradient
+from keras.src.backend.torch.core import to_torch_dtype
+from keras.src.backend.torch.core import vectorized_map
+from keras.src.backend.torch.rnn import cudnn_ok
+from keras.src.backend.torch.rnn import gru
+from keras.src.backend.torch.rnn import lstm
+from keras.src.backend.torch.rnn import rnn
diff --git a/keras/backend/torch/core.py b/keras/src/backend/torch/core.py
similarity index 97%
rename from keras/backend/torch/core.py
rename to keras/src/backend/torch/core.py
index bb9bd98ff401..257afeeec699 100644
--- a/keras/backend/torch/core.py
+++ b/keras/src/backend/torch/core.py
@@ -5,14 +5,14 @@
 import numpy as np
 import torch
 
-from keras import tree
-from keras.backend.common import KerasVariable
-from keras.backend.common import global_state
-from keras.backend.common import standardize_dtype
-from keras.backend.common.dtypes import result_type
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.backend.common.stateless_scope import StatelessScope
-from keras.backend.config import floatx
+from keras.src import tree
+from keras.src.backend.common import KerasVariable
+from keras.src.backend.common import global_state
+from keras.src.backend.common import standardize_dtype
+from keras.src.backend.common.dtypes import result_type
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.backend.common.stateless_scope import StatelessScope
+from keras.src.backend.config import floatx
 
 SUPPORTS_SPARSE_TENSORS = False
 
diff --git a/keras/backend/torch/image.py b/keras/src/backend/torch/image.py
similarity index 99%
rename from keras/backend/torch/image.py
rename to keras/src/backend/torch/image.py
index e62162f8ed67..82f609612a78 100644
--- a/keras/backend/torch/image.py
+++ b/keras/src/backend/torch/image.py
@@ -4,7 +4,7 @@
 
 import torch
 
-from keras.backend.torch.core import convert_to_tensor
+from keras.src.backend.torch.core import convert_to_tensor
 
 RESIZE_INTERPOLATIONS = {}  # populated after torchvision import
 
diff --git a/keras/backend/torch/layer.py b/keras/src/backend/torch/layer.py
similarity index 87%
rename from keras/backend/torch/layer.py
rename to keras/src/backend/torch/layer.py
index 001925f276a1..dfb31a552ab1 100644
--- a/keras/backend/torch/layer.py
+++ b/keras/src/backend/torch/layer.py
@@ -1,7 +1,7 @@
 import torch
 
-from keras.backend.common.stateless_scope import in_stateless_scope
-from keras.ops.operation import Operation
+from keras.src.backend.common.stateless_scope import in_stateless_scope
+from keras.src.ops.operation import Operation
 
 
 class TorchLayer(torch.nn.Module):
@@ -27,14 +27,14 @@ def forward(self, *args, **kwargs):
         return Operation.__call__(self, *args, **kwargs)
 
     def _setattr_hook(self, name, value):
-        from keras.layers import Layer
+        from keras.src.layers import Layer
 
         if (
             isinstance(value, torch.nn.Module)
             and not isinstance(value, Layer)
             and not name == "torch_params"
         ):
-            from keras.utils.torch_utils import TorchModuleWrapper
+            from keras.src.utils.torch_utils import TorchModuleWrapper
 
             if not isinstance(self, TorchModuleWrapper):
                 value = TorchModuleWrapper(value)
diff --git a/keras/backend/torch/linalg.py b/keras/src/backend/torch/linalg.py
similarity index 86%
rename from keras/backend/torch/linalg.py
rename to keras/src/backend/torch/linalg.py
index 3deeaefdbe79..a9158cc64a62 100644
--- a/keras/backend/torch/linalg.py
+++ b/keras/src/backend/torch/linalg.py
@@ -1,10 +1,10 @@
 import torch
 
-from keras.backend import config
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.torch.core import cast
-from keras.backend.torch.core import convert_to_tensor
+from keras.src.backend import config
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.torch.core import cast
+from keras.src.backend.torch.core import convert_to_tensor
 
 
 def cholesky(x):
diff --git a/keras/backend/torch/math.py b/keras/src/backend/torch/math.py
similarity index 97%
rename from keras/backend/torch/math.py
rename to keras/src/backend/torch/math.py
index abcabae98c33..2d9de436d3fb 100644
--- a/keras/backend/torch/math.py
+++ b/keras/src/backend/torch/math.py
@@ -2,13 +2,13 @@
 
 import torch
 
-from keras.backend import config
-from keras.backend import standardize_dtype
-from keras.backend.common import dtypes
-from keras.backend.torch.core import cast
-from keras.backend.torch.core import convert_to_tensor
-from keras.backend.torch.core import get_device
-from keras.backend.torch.numpy import pad
+from keras.src.backend import config
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common import dtypes
+from keras.src.backend.torch.core import cast
+from keras.src.backend.torch.core import convert_to_tensor
+from keras.src.backend.torch.core import get_device
+from keras.src.backend.torch.numpy import pad
 
 
 def segment_sum(data, segment_ids, num_segments=None, **kwargs):
diff --git a/keras/backend/torch/nn.py b/keras/src/backend/torch/nn.py
similarity index 97%
rename from keras/backend/torch/nn.py
rename to keras/src/backend/torch/nn.py
index f2105b5d5e12..a5cbaab3ea47 100644
--- a/keras/backend/torch/nn.py
+++ b/keras/src/backend/torch/nn.py
@@ -1,20 +1,20 @@
 import torch
 import torch.nn.functional as tnn
 
-from keras import tree
-from keras.backend import standardize_data_format
-from keras.backend import standardize_dtype
-from keras.backend.common.backend_utils import (
+from keras.src import tree
+from keras.src.backend import standardize_data_format
+from keras.src.backend import standardize_dtype
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_padding_args_for_torch,
 )
-from keras.backend.config import epsilon
-from keras.backend.torch.core import cast
-from keras.backend.torch.core import convert_to_tensor
-from keras.backend.torch.core import get_device
-from keras.backend.torch.numpy import expand_dims
-from keras.backend.torch.numpy import maximum
-from keras.backend.torch.numpy import where
-from keras.utils.argument_validation import standardize_tuple
+from keras.src.backend.config import epsilon
+from keras.src.backend.torch.core import cast
+from keras.src.backend.torch.core import convert_to_tensor
+from keras.src.backend.torch.core import get_device
+from keras.src.backend.torch.numpy import expand_dims
+from keras.src.backend.torch.numpy import maximum
+from keras.src.backend.torch.numpy import where
+from keras.src.utils.argument_validation import standardize_tuple
 
 
 def relu(x):
diff --git a/keras/backend/torch/numpy.py b/keras/src/backend/torch/numpy.py
similarity index 98%
rename from keras/backend/torch/numpy.py
rename to keras/src/backend/torch/numpy.py
index bcf9e090f88a..13f6a47c77ac 100644
--- a/keras/backend/torch/numpy.py
+++ b/keras/src/backend/torch/numpy.py
@@ -3,17 +3,17 @@
 
 import torch
 
-from keras.backend import KerasTensor
-from keras.backend import config
-from keras.backend.common import dtypes
-from keras.backend.common.backend_utils import canonicalize_axis
-from keras.backend.common.backend_utils import to_tuple_or_list
-from keras.backend.common.variables import standardize_dtype
-from keras.backend.torch.core import cast
-from keras.backend.torch.core import convert_to_tensor
-from keras.backend.torch.core import get_device
-from keras.backend.torch.core import is_tensor
-from keras.backend.torch.core import to_torch_dtype
+from keras.src.backend import KerasTensor
+from keras.src.backend import config
+from keras.src.backend.common import dtypes
+from keras.src.backend.common.backend_utils import canonicalize_axis
+from keras.src.backend.common.backend_utils import to_tuple_or_list
+from keras.src.backend.common.variables import standardize_dtype
+from keras.src.backend.torch.core import cast
+from keras.src.backend.torch.core import convert_to_tensor
+from keras.src.backend.torch.core import get_device
+from keras.src.backend.torch.core import is_tensor
+from keras.src.backend.torch.core import to_torch_dtype
 
 TORCH_INT_TYPES = (
     torch.int8,
diff --git a/keras/src/backend/torch/optimizers/__init__.py b/keras/src/backend/torch/optimizers/__init__.py
new file mode 100644
index 000000000000..008312b04b63
--- /dev/null
+++ b/keras/src/backend/torch/optimizers/__init__.py
@@ -0,0 +1 @@
+from keras.src.backend.torch.optimizers.torch_optimizer import TorchOptimizer
diff --git a/keras/backend/torch/optimizers/torch_adadelta.py b/keras/src/backend/torch/optimizers/torch_adadelta.py
similarity index 92%
rename from keras/backend/torch/optimizers/torch_adadelta.py
rename to keras/src/backend/torch/optimizers/torch_adadelta.py
index c8a3607f9514..9e6038e7b6eb 100644
--- a/keras/backend/torch/optimizers/torch_adadelta.py
+++ b/keras/src/backend/torch/optimizers/torch_adadelta.py
@@ -1,8 +1,8 @@
 import torch
 
-from keras import ops
-from keras import optimizers
-from keras.backend.torch.optimizers import torch_parallel_optimizer
+from keras.src import ops
+from keras.src import optimizers
+from keras.src.backend.torch.optimizers import torch_parallel_optimizer
 
 
 class Adadelta(
diff --git a/keras/backend/torch/optimizers/torch_adagrad.py b/keras/src/backend/torch/optimizers/torch_adagrad.py
similarity index 87%
rename from keras/backend/torch/optimizers/torch_adagrad.py
rename to keras/src/backend/torch/optimizers/torch_adagrad.py
index 2cdaa87c1831..2a1e19f70fd6 100644
--- a/keras/backend/torch/optimizers/torch_adagrad.py
+++ b/keras/src/backend/torch/optimizers/torch_adagrad.py
@@ -1,8 +1,8 @@
 import torch
 
-from keras import ops
-from keras import optimizers
-from keras.backend.torch.optimizers import torch_parallel_optimizer
+from keras.src import ops
+from keras.src import optimizers
+from keras.src.backend.torch.optimizers import torch_parallel_optimizer
 
 
 class Adagrad(
diff --git a/keras/backend/torch/optimizers/torch_adam.py b/keras/src/backend/torch/optimizers/torch_adam.py
similarity index 93%
rename from keras/backend/torch/optimizers/torch_adam.py
rename to keras/src/backend/torch/optimizers/torch_adam.py
index 7819a0396943..3bb7db7c341c 100644
--- a/keras/backend/torch/optimizers/torch_adam.py
+++ b/keras/src/backend/torch/optimizers/torch_adam.py
@@ -1,8 +1,8 @@
 import torch
 
-from keras import ops
-from keras import optimizers
-from keras.backend.torch.optimizers import torch_parallel_optimizer
+from keras.src import ops
+from keras.src import optimizers
+from keras.src.backend.torch.optimizers import torch_parallel_optimizer
 
 
 class Adam(torch_parallel_optimizer.TorchParallelOptimizer, optimizers.Adam):
diff --git a/keras/backend/torch/optimizers/torch_adamax.py b/keras/src/backend/torch/optimizers/torch_adamax.py
similarity index 91%
rename from keras/backend/torch/optimizers/torch_adamax.py
rename to keras/src/backend/torch/optimizers/torch_adamax.py
index b9463ca0745d..9cb3c0184499 100644
--- a/keras/backend/torch/optimizers/torch_adamax.py
+++ b/keras/src/backend/torch/optimizers/torch_adamax.py
@@ -1,8 +1,8 @@
 import torch
 
-from keras import ops
-from keras import optimizers
-from keras.backend.torch.optimizers import torch_parallel_optimizer
+from keras.src import ops
+from keras.src import optimizers
+from keras.src.backend.torch.optimizers import torch_parallel_optimizer
 
 
 class Adamax(
diff --git a/keras/src/backend/torch/optimizers/torch_adamw.py b/keras/src/backend/torch/optimizers/torch_adamw.py
new file mode 100644
index 000000000000..394727cd9b59
--- /dev/null
+++ b/keras/src/backend/torch/optimizers/torch_adamw.py
@@ -0,0 +1,6 @@
+from keras.src import optimizers
+from keras.src.backend.torch.optimizers import torch_adam
+
+
+class AdamW(torch_adam.Adam, optimizers.AdamW):
+    pass
diff --git a/keras/backend/torch/optimizers/torch_lion.py b/keras/src/backend/torch/optimizers/torch_lion.py
similarity index 87%
rename from keras/backend/torch/optimizers/torch_lion.py
rename to keras/src/backend/torch/optimizers/torch_lion.py
index 9bb58d6fe328..f2022ad6e53e 100644
--- a/keras/backend/torch/optimizers/torch_lion.py
+++ b/keras/src/backend/torch/optimizers/torch_lion.py
@@ -1,8 +1,8 @@
 import torch
 
-from keras import ops
-from keras import optimizers
-from keras.backend.torch.optimizers import torch_parallel_optimizer
+from keras.src import ops
+from keras.src import optimizers
+from keras.src.backend.torch.optimizers import torch_parallel_optimizer
 
 
 class Lion(torch_parallel_optimizer.TorchParallelOptimizer, optimizers.Lion):
diff --git a/keras/backend/torch/optimizers/torch_nadam.py b/keras/src/backend/torch/optimizers/torch_nadam.py
similarity index 92%
rename from keras/backend/torch/optimizers/torch_nadam.py
rename to keras/src/backend/torch/optimizers/torch_nadam.py
index 08b73bb0c438..df82bd2c473b 100644
--- a/keras/backend/torch/optimizers/torch_nadam.py
+++ b/keras/src/backend/torch/optimizers/torch_nadam.py
@@ -1,9 +1,9 @@
 import torch
 
-from keras import ops
-from keras import optimizers
-from keras.backend.torch import core
-from keras.backend.torch.optimizers import torch_parallel_optimizer
+from keras.src import ops
+from keras.src import optimizers
+from keras.src.backend.torch import core
+from keras.src.backend.torch.optimizers import torch_parallel_optimizer
 
 
 class Nadam(torch_parallel_optimizer.TorchParallelOptimizer, optimizers.Nadam):
diff --git a/keras/backend/torch/optimizers/torch_optimizer.py b/keras/src/backend/torch/optimizers/torch_optimizer.py
similarity index 58%
rename from keras/backend/torch/optimizers/torch_optimizer.py
rename to keras/src/backend/torch/optimizers/torch_optimizer.py
index 880b6f3ee04b..85fc274c574f 100644
--- a/keras/backend/torch/optimizers/torch_optimizer.py
+++ b/keras/src/backend/torch/optimizers/torch_optimizer.py
@@ -1,22 +1,22 @@
 import torch
 
-from keras import optimizers
-from keras.optimizers.base_optimizer import BaseOptimizer
-from keras.utils import torch_utils
+from keras.src import optimizers
+from keras.src.optimizers.base_optimizer import BaseOptimizer
+from keras.src.utils import torch_utils
 
 
 class TorchOptimizer(BaseOptimizer):
     def __new__(cls, *args, **kwargs):
         # Import locally to avoid circular imports.
-        from keras.backend.torch.optimizers import torch_adadelta
-        from keras.backend.torch.optimizers import torch_adagrad
-        from keras.backend.torch.optimizers import torch_adam
-        from keras.backend.torch.optimizers import torch_adamax
-        from keras.backend.torch.optimizers import torch_adamw
-        from keras.backend.torch.optimizers import torch_lion
-        from keras.backend.torch.optimizers import torch_nadam
-        from keras.backend.torch.optimizers import torch_rmsprop
-        from keras.backend.torch.optimizers import torch_sgd
+        from keras.src.backend.torch.optimizers import torch_adadelta
+        from keras.src.backend.torch.optimizers import torch_adagrad
+        from keras.src.backend.torch.optimizers import torch_adam
+        from keras.src.backend.torch.optimizers import torch_adamax
+        from keras.src.backend.torch.optimizers import torch_adamw
+        from keras.src.backend.torch.optimizers import torch_lion
+        from keras.src.backend.torch.optimizers import torch_nadam
+        from keras.src.backend.torch.optimizers import torch_rmsprop
+        from keras.src.backend.torch.optimizers import torch_sgd
 
         OPTIMIZERS = {
             optimizers.Adadelta: torch_adadelta.Adadelta,
diff --git a/keras/backend/torch/optimizers/torch_parallel_optimizer.py b/keras/src/backend/torch/optimizers/torch_parallel_optimizer.py
similarity index 87%
rename from keras/backend/torch/optimizers/torch_parallel_optimizer.py
rename to keras/src/backend/torch/optimizers/torch_parallel_optimizer.py
index 3aa8a072a087..4fe3802af226 100644
--- a/keras/backend/torch/optimizers/torch_parallel_optimizer.py
+++ b/keras/src/backend/torch/optimizers/torch_parallel_optimizer.py
@@ -1,7 +1,7 @@
 import torch
 
-from keras.optimizers.base_optimizer import BaseOptimizer
-from keras.utils import torch_utils
+from keras.src.optimizers.base_optimizer import BaseOptimizer
+from keras.src.utils import torch_utils
 
 
 class TorchParallelOptimizer(BaseOptimizer):
diff --git a/keras/backend/torch/optimizers/torch_rmsprop.py b/keras/src/backend/torch/optimizers/torch_rmsprop.py
similarity index 93%
rename from keras/backend/torch/optimizers/torch_rmsprop.py
rename to keras/src/backend/torch/optimizers/torch_rmsprop.py
index 100c72c25cee..49c4c3916bc1 100644
--- a/keras/backend/torch/optimizers/torch_rmsprop.py
+++ b/keras/src/backend/torch/optimizers/torch_rmsprop.py
@@ -1,8 +1,8 @@
 import torch
 
-from keras import ops
-from keras import optimizers
-from keras.backend.torch.optimizers import torch_parallel_optimizer
+from keras.src import ops
+from keras.src import optimizers
+from keras.src.backend.torch.optimizers import torch_parallel_optimizer
 
 
 class RMSprop(
diff --git a/keras/backend/torch/optimizers/torch_sgd.py b/keras/src/backend/torch/optimizers/torch_sgd.py
similarity index 91%
rename from keras/backend/torch/optimizers/torch_sgd.py
rename to keras/src/backend/torch/optimizers/torch_sgd.py
index 726f102170e1..f16220d85ac3 100644
--- a/keras/backend/torch/optimizers/torch_sgd.py
+++ b/keras/src/backend/torch/optimizers/torch_sgd.py
@@ -1,7 +1,7 @@
 import torch
 
-from keras import optimizers
-from keras.backend.torch.optimizers import torch_parallel_optimizer
+from keras.src import optimizers
+from keras.src.backend.torch.optimizers import torch_parallel_optimizer
 
 
 class SGD(torch_parallel_optimizer.TorchParallelOptimizer, optimizers.SGD):
diff --git a/keras/backend/torch/random.py b/keras/src/backend/torch/random.py
similarity index 95%
rename from keras/backend/torch/random.py
rename to keras/src/backend/torch/random.py
index ab81713d1f68..e080731952e6 100644
--- a/keras/backend/torch/random.py
+++ b/keras/src/backend/torch/random.py
@@ -2,13 +2,13 @@
 import torch._dynamo as dynamo
 import torch.nn.functional as tnn
 
-from keras.backend.config import floatx
-from keras.backend.torch.core import convert_to_tensor
-from keras.backend.torch.core import get_device
-from keras.backend.torch.core import to_torch_dtype
-from keras.random.seed_generator import SeedGenerator
-from keras.random.seed_generator import draw_seed
-from keras.random.seed_generator import make_default_seed
+from keras.src.backend.config import floatx
+from keras.src.backend.torch.core import convert_to_tensor
+from keras.src.backend.torch.core import get_device
+from keras.src.backend.torch.core import to_torch_dtype
+from keras.src.random.seed_generator import SeedGenerator
+from keras.src.random.seed_generator import draw_seed
+from keras.src.random.seed_generator import make_default_seed
 
 
 # torch.Generator not supported with dynamo
diff --git a/keras/backend/torch/rnn.py b/keras/src/backend/torch/rnn.py
similarity index 99%
rename from keras/backend/torch/rnn.py
rename to keras/src/backend/torch/rnn.py
index 163f2bc26227..55604b4c77e5 100644
--- a/keras/backend/torch/rnn.py
+++ b/keras/src/backend/torch/rnn.py
@@ -1,7 +1,7 @@
 import torch
 
-from keras import tree
-from keras.backend.torch.core import convert_to_tensor
+from keras.src import tree
+from keras.src.backend.torch.core import convert_to_tensor
 
 
 def rnn(
diff --git a/keras/backend/torch/trainer.py b/keras/src/backend/torch/trainer.py
similarity index 97%
rename from keras/backend/torch/trainer.py
rename to keras/src/backend/torch/trainer.py
index f4cca60f84a4..0fb3ff529a47 100644
--- a/keras/backend/torch/trainer.py
+++ b/keras/src/backend/torch/trainer.py
@@ -4,15 +4,15 @@
 import torch
 from packaging.version import parse
 
-from keras import backend
-from keras import callbacks as callbacks_module
-from keras import optimizers as optimizers_module
-from keras import tree
-from keras.trainers import trainer as base_trainer
-from keras.trainers.data_adapters import array_slicing
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.trainers.epoch_iterator import EpochIterator
-from keras.utils import traceback_utils
+from keras.src import backend
+from keras.src import callbacks as callbacks_module
+from keras.src import optimizers as optimizers_module
+from keras.src import tree
+from keras.src.trainers import trainer as base_trainer
+from keras.src.trainers.data_adapters import array_slicing
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.trainers.epoch_iterator import EpochIterator
+from keras.src.utils import traceback_utils
 
 
 class TorchTrainer(base_trainer.Trainer):
diff --git a/keras/src/callbacks/__init__.py b/keras/src/callbacks/__init__.py
new file mode 100644
index 000000000000..d8c835a418d4
--- /dev/null
+++ b/keras/src/callbacks/__init__.py
@@ -0,0 +1,15 @@
+from keras.src.callbacks.backup_and_restore import BackupAndRestore
+from keras.src.callbacks.callback import Callback
+from keras.src.callbacks.callback_list import CallbackList
+from keras.src.callbacks.csv_logger import CSVLogger
+from keras.src.callbacks.early_stopping import EarlyStopping
+from keras.src.callbacks.history import History
+from keras.src.callbacks.lambda_callback import LambdaCallback
+from keras.src.callbacks.learning_rate_scheduler import LearningRateScheduler
+from keras.src.callbacks.model_checkpoint import ModelCheckpoint
+from keras.src.callbacks.progbar_logger import ProgbarLogger
+from keras.src.callbacks.reduce_lr_on_plateau import ReduceLROnPlateau
+from keras.src.callbacks.remote_monitor import RemoteMonitor
+from keras.src.callbacks.swap_ema_weights import SwapEMAWeights
+from keras.src.callbacks.tensorboard import TensorBoard
+from keras.src.callbacks.terminate_on_nan import TerminateOnNaN
diff --git a/keras/callbacks/backup_and_restore.py b/keras/src/callbacks/backup_and_restore.py
similarity index 98%
rename from keras/callbacks/backup_and_restore.py
rename to keras/src/callbacks/backup_and_restore.py
index 4798e8a5c5d2..36e52c15df42 100644
--- a/keras/callbacks/backup_and_restore.py
+++ b/keras/src/callbacks/backup_and_restore.py
@@ -1,8 +1,8 @@
 import json
 
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.utils import file_utils
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.utils import file_utils
 
 
 @keras_export("keras.callbacks.BackupAndRestore")
diff --git a/keras/callbacks/backup_and_restore_test.py b/keras/src/callbacks/backup_and_restore_test.py
similarity index 97%
rename from keras/callbacks/backup_and_restore_test.py
rename to keras/src/callbacks/backup_and_restore_test.py
index 814348307621..7ae5764bc5a8 100644
--- a/keras/callbacks/backup_and_restore_test.py
+++ b/keras/src/callbacks/backup_and_restore_test.py
@@ -1,11 +1,11 @@
 import numpy as np
 import pytest
 
-from keras import callbacks
-from keras import layers
-from keras import testing
-from keras.models import Sequential
-from keras.utils import file_utils
+from keras.src import callbacks
+from keras.src import layers
+from keras.src import testing
+from keras.src.models import Sequential
+from keras.src.utils import file_utils
 
 
 class InterruptingCallback(callbacks.Callback):
diff --git a/keras/callbacks/callback.py b/keras/src/callbacks/callback.py
similarity index 99%
rename from keras/callbacks/callback.py
rename to keras/src/callbacks/callback.py
index 764118655d7e..a232bd7a583f 100644
--- a/keras/callbacks/callback.py
+++ b/keras/src/callbacks/callback.py
@@ -1,5 +1,5 @@
-from keras import backend
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src.api_export import keras_export
 
 
 @keras_export("keras.callbacks.Callback")
diff --git a/keras/callbacks/callback_list.py b/keras/src/callbacks/callback_list.py
similarity index 95%
rename from keras/callbacks/callback_list.py
rename to keras/src/callbacks/callback_list.py
index 55d2567dbf35..04ea00a131f7 100644
--- a/keras/callbacks/callback_list.py
+++ b/keras/src/callbacks/callback_list.py
@@ -1,8 +1,8 @@
-from keras import tree
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.callbacks.history import History
-from keras.callbacks.progbar_logger import ProgbarLogger
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.callbacks.history import History
+from keras.src.callbacks.progbar_logger import ProgbarLogger
 
 
 @keras_export("keras.callbacks.CallbackList")
diff --git a/keras/callbacks/callback_test.py b/keras/src/callbacks/callback_test.py
similarity index 89%
rename from keras/callbacks/callback_test.py
rename to keras/src/callbacks/callback_test.py
index fcacf7eaa1da..31c77c904ceb 100644
--- a/keras/callbacks/callback_test.py
+++ b/keras/src/callbacks/callback_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import models
-from keras import testing
-from keras.callbacks.callback import Callback
+from keras.src import models
+from keras.src import testing
+from keras.src.callbacks.callback import Callback
 
 
 class CallbackTest(testing.TestCase):
diff --git a/keras/callbacks/csv_logger.py b/keras/src/callbacks/csv_logger.py
similarity index 95%
rename from keras/callbacks/csv_logger.py
rename to keras/src/callbacks/csv_logger.py
index baab82adeb51..69665eacf004 100644
--- a/keras/callbacks/csv_logger.py
+++ b/keras/src/callbacks/csv_logger.py
@@ -3,9 +3,9 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.utils import file_utils
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.utils import file_utils
 
 
 @keras_export("keras.callbacks.CSVLogger")
diff --git a/keras/callbacks/csv_logger_test.py b/keras/src/callbacks/csv_logger_test.py
similarity index 96%
rename from keras/callbacks/csv_logger_test.py
rename to keras/src/callbacks/csv_logger_test.py
index e2361b3711de..9da3be6aaa53 100644
--- a/keras/callbacks/csv_logger_test.py
+++ b/keras/src/callbacks/csv_logger_test.py
@@ -6,12 +6,12 @@
 import numpy as np
 import pytest
 
-from keras import callbacks
-from keras import initializers
-from keras import layers
-from keras import testing
-from keras.models import Sequential
-from keras.utils import numerical_utils
+from keras.src import callbacks
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
+from keras.src.models import Sequential
+from keras.src.utils import numerical_utils
 
 TRAIN_SAMPLES = 10
 TEST_SAMPLES = 10
diff --git a/keras/callbacks/early_stopping.py b/keras/src/callbacks/early_stopping.py
similarity index 97%
rename from keras/callbacks/early_stopping.py
rename to keras/src/callbacks/early_stopping.py
index 1263357f4a3a..e7c1fe9c0dc0 100644
--- a/keras/callbacks/early_stopping.py
+++ b/keras/src/callbacks/early_stopping.py
@@ -1,10 +1,10 @@
 import warnings
 
-from keras import ops
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.trainers import compile_utils
-from keras.utils import io_utils
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.trainers import compile_utils
+from keras.src.utils import io_utils
 
 
 @keras_export("keras.callbacks.EarlyStopping")
diff --git a/keras/callbacks/early_stopping_test.py b/keras/src/callbacks/early_stopping_test.py
similarity index 98%
rename from keras/callbacks/early_stopping_test.py
rename to keras/src/callbacks/early_stopping_test.py
index 176e86ef6da3..e120fe8a2b2e 100644
--- a/keras/callbacks/early_stopping_test.py
+++ b/keras/src/callbacks/early_stopping_test.py
@@ -1,12 +1,12 @@
 import numpy as np
 import pytest
 
-from keras import callbacks
-from keras import layers
-from keras import metrics
-from keras import models
-from keras import ops
-from keras import testing
+from keras.src import callbacks
+from keras.src import layers
+from keras.src import metrics
+from keras.src import models
+from keras.src import ops
+from keras.src import testing
 
 
 class EarlyStoppingTest(testing.TestCase):
diff --git a/keras/callbacks/history.py b/keras/src/callbacks/history.py
similarity index 92%
rename from keras/callbacks/history.py
rename to keras/src/callbacks/history.py
index dd2a7d488c2e..6fb3c3c86171 100644
--- a/keras/callbacks/history.py
+++ b/keras/src/callbacks/history.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
 
 
 @keras_export("keras.callbacks.History")
diff --git a/keras/callbacks/lambda_callback.py b/keras/src/callbacks/lambda_callback.py
similarity index 97%
rename from keras/callbacks/lambda_callback.py
rename to keras/src/callbacks/lambda_callback.py
index 59756aebdb78..46dfd46e560c 100644
--- a/keras/callbacks/lambda_callback.py
+++ b/keras/src/callbacks/lambda_callback.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
 
 
 @keras_export("keras.callbacks.LambdaCallback")
diff --git a/keras/callbacks/lambda_callback_test.py b/keras/src/callbacks/lambda_callback_test.py
similarity index 96%
rename from keras/callbacks/lambda_callback_test.py
rename to keras/src/callbacks/lambda_callback_test.py
index bdecdac95af2..4c8a6add2146 100644
--- a/keras/callbacks/lambda_callback_test.py
+++ b/keras/src/callbacks/lambda_callback_test.py
@@ -2,12 +2,12 @@
 import pytest
 from absl import logging
 
-from keras import callbacks
-from keras import layers
-from keras import losses
-from keras import optimizers
-from keras import testing
-from keras.models.sequential import Sequential
+from keras.src import callbacks
+from keras.src import layers
+from keras.src import losses
+from keras.src import optimizers
+from keras.src import testing
+from keras.src.models.sequential import Sequential
 
 
 class LambdaCallbackTest(testing.TestCase):
diff --git a/keras/callbacks/learning_rate_scheduler.py b/keras/src/callbacks/learning_rate_scheduler.py
similarity index 94%
rename from keras/callbacks/learning_rate_scheduler.py
rename to keras/src/callbacks/learning_rate_scheduler.py
index dfedac312a30..6ac1486e8797 100644
--- a/keras/callbacks/learning_rate_scheduler.py
+++ b/keras/src/callbacks/learning_rate_scheduler.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.utils import io_utils
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.utils import io_utils
 
 
 @keras_export("keras.callbacks.LearningRateScheduler")
diff --git a/keras/callbacks/learning_rate_scheduler_test.py b/keras/src/callbacks/learning_rate_scheduler_test.py
similarity index 92%
rename from keras/callbacks/learning_rate_scheduler_test.py
rename to keras/src/callbacks/learning_rate_scheduler_test.py
index 7276825615b5..b76bcf8cf3cf 100644
--- a/keras/callbacks/learning_rate_scheduler_test.py
+++ b/keras/src/callbacks/learning_rate_scheduler_test.py
@@ -1,13 +1,13 @@
 import pytest
 
-from keras import callbacks
-from keras import layers
-from keras import optimizers
-from keras import testing
-from keras.models import Sequential
-from keras.testing import test_utils
-from keras.utils import io_utils
-from keras.utils import numerical_utils
+from keras.src import callbacks
+from keras.src import layers
+from keras.src import optimizers
+from keras.src import testing
+from keras.src.models import Sequential
+from keras.src.testing import test_utils
+from keras.src.utils import io_utils
+from keras.src.utils import numerical_utils
 
 
 class LearningRateSchedulerTest(testing.TestCase):
diff --git a/keras/callbacks/model_checkpoint.py b/keras/src/callbacks/model_checkpoint.py
similarity index 98%
rename from keras/callbacks/model_checkpoint.py
rename to keras/src/callbacks/model_checkpoint.py
index e9d329159194..b602fe4403d3 100644
--- a/keras/callbacks/model_checkpoint.py
+++ b/keras/src/callbacks/model_checkpoint.py
@@ -4,11 +4,11 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.utils import file_utils
-from keras.utils import io_utils
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.utils import file_utils
+from keras.src.utils import io_utils
 
 
 @keras_export("keras.callbacks.ModelCheckpoint")
diff --git a/keras/callbacks/model_checkpoint_test.py b/keras/src/callbacks/model_checkpoint_test.py
similarity index 98%
rename from keras/callbacks/model_checkpoint_test.py
rename to keras/src/callbacks/model_checkpoint_test.py
index 680bb9501d74..38092e70a83f 100644
--- a/keras/callbacks/model_checkpoint_test.py
+++ b/keras/src/callbacks/model_checkpoint_test.py
@@ -3,15 +3,15 @@
 
 import pytest
 
-from keras import callbacks
-from keras import layers
-from keras import metrics
-from keras import models
-from keras import saving
-from keras import testing
-from keras.models import Sequential
-from keras.testing import test_utils
-from keras.utils import numerical_utils
+from keras.src import callbacks
+from keras.src import layers
+from keras.src import metrics
+from keras.src import models
+from keras.src import saving
+from keras.src import testing
+from keras.src.models import Sequential
+from keras.src.testing import test_utils
+from keras.src.utils import numerical_utils
 
 try:
     import h5py
diff --git a/keras/callbacks/progbar_logger.py b/keras/src/callbacks/progbar_logger.py
similarity index 94%
rename from keras/callbacks/progbar_logger.py
rename to keras/src/callbacks/progbar_logger.py
index be82f8a4f7a6..ac10d655a97c 100644
--- a/keras/callbacks/progbar_logger.py
+++ b/keras/src/callbacks/progbar_logger.py
@@ -1,7 +1,7 @@
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.utils import io_utils
-from keras.utils.progbar import Progbar
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.utils import io_utils
+from keras.src.utils.progbar import Progbar
 
 
 @keras_export("keras.callbacks.ProgbarLogger")
diff --git a/keras/callbacks/reduce_lr_on_plateau.py b/keras/src/callbacks/reduce_lr_on_plateau.py
similarity index 96%
rename from keras/callbacks/reduce_lr_on_plateau.py
rename to keras/src/callbacks/reduce_lr_on_plateau.py
index ccffb77206a5..d1ee33e34e1d 100644
--- a/keras/callbacks/reduce_lr_on_plateau.py
+++ b/keras/src/callbacks/reduce_lr_on_plateau.py
@@ -2,10 +2,10 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.utils import io_utils
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.utils import io_utils
 
 
 @keras_export("keras.callbacks.ReduceLROnPlateau")
diff --git a/keras/callbacks/reduce_lr_on_plateau_test.py b/keras/src/callbacks/reduce_lr_on_plateau_test.py
similarity index 93%
rename from keras/callbacks/reduce_lr_on_plateau_test.py
rename to keras/src/callbacks/reduce_lr_on_plateau_test.py
index 10a8b0f47aec..96ebbaab2cf2 100644
--- a/keras/callbacks/reduce_lr_on_plateau_test.py
+++ b/keras/src/callbacks/reduce_lr_on_plateau_test.py
@@ -1,13 +1,13 @@
 import pytest
 
-from keras import callbacks
-from keras import layers
-from keras import optimizers
-from keras import testing
-from keras.models import Sequential
-from keras.testing import test_utils
-from keras.utils import io_utils
-from keras.utils import numerical_utils
+from keras.src import callbacks
+from keras.src import layers
+from keras.src import optimizers
+from keras.src import testing
+from keras.src.models import Sequential
+from keras.src.testing import test_utils
+from keras.src.utils import io_utils
+from keras.src.utils import numerical_utils
 
 
 class ReduceLROnPlateauTest(testing.TestCase):
diff --git a/keras/callbacks/remote_monitor.py b/keras/src/callbacks/remote_monitor.py
similarity index 96%
rename from keras/callbacks/remote_monitor.py
rename to keras/src/callbacks/remote_monitor.py
index 8ddca56aa95f..f8605a5c1726 100644
--- a/keras/callbacks/remote_monitor.py
+++ b/keras/src/callbacks/remote_monitor.py
@@ -3,8 +3,8 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
 
 try:
     import requests
diff --git a/keras/callbacks/remote_monitor_test.py b/keras/src/callbacks/remote_monitor_test.py
similarity index 94%
rename from keras/callbacks/remote_monitor_test.py
rename to keras/src/callbacks/remote_monitor_test.py
index 3103580428e5..0660b5850975 100644
--- a/keras/callbacks/remote_monitor_test.py
+++ b/keras/src/callbacks/remote_monitor_test.py
@@ -3,12 +3,12 @@
 
 import numpy as np
 
-from keras import backend
-from keras import callbacks
-from keras import layers
-from keras import testing
-from keras.models import Sequential
-from keras.utils import numerical_utils
+from keras.src import backend
+from keras.src import callbacks
+from keras.src import layers
+from keras.src import testing
+from keras.src.models import Sequential
+from keras.src.utils import numerical_utils
 
 try:
     import requests
diff --git a/keras/callbacks/swap_ema_weights.py b/keras/src/callbacks/swap_ema_weights.py
similarity index 97%
rename from keras/callbacks/swap_ema_weights.py
rename to keras/src/callbacks/swap_ema_weights.py
index d7077c037886..9c13a90fff53 100644
--- a/keras/callbacks/swap_ema_weights.py
+++ b/keras/src/callbacks/swap_ema_weights.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
 
 
 @keras_export("keras.callbacks.SwapEMAWeights")
diff --git a/keras/callbacks/swap_ema_weights_test.py b/keras/src/callbacks/swap_ema_weights_test.py
similarity index 94%
rename from keras/callbacks/swap_ema_weights_test.py
rename to keras/src/callbacks/swap_ema_weights_test.py
index c24895d15a25..004544a27b30 100644
--- a/keras/callbacks/swap_ema_weights_test.py
+++ b/keras/src/callbacks/swap_ema_weights_test.py
@@ -4,17 +4,17 @@
 import tensorflow as tf
 from tensorflow.python.eager import context
 
-from keras import backend
-from keras import callbacks
-from keras import layers
-from keras import losses
-from keras import metrics
-from keras import optimizers
-from keras import saving
-from keras import testing
-from keras.models import Sequential
-from keras.testing import test_utils
-from keras.utils import numerical_utils
+from keras.src import backend
+from keras.src import callbacks
+from keras.src import layers
+from keras.src import losses
+from keras.src import metrics
+from keras.src import optimizers
+from keras.src import saving
+from keras.src import testing
+from keras.src.models import Sequential
+from keras.src.testing import test_utils
+from keras.src.utils import numerical_utils
 
 
 class SwapEMAWeightsTest(testing.TestCase):
diff --git a/keras/callbacks/tensorboard.py b/keras/src/callbacks/tensorboard.py
similarity index 98%
rename from keras/callbacks/tensorboard.py
rename to keras/src/callbacks/tensorboard.py
index 0a41c2b19e04..a9be2b29b816 100644
--- a/keras/callbacks/tensorboard.py
+++ b/keras/src/callbacks/tensorboard.py
@@ -4,14 +4,14 @@
 import time
 import warnings
 
-from keras import backend
-from keras import ops
-from keras import tree
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.layers import Embedding
-from keras.optimizers import Optimizer
-from keras.utils import file_utils
+from keras.src import backend
+from keras.src import ops
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.layers import Embedding
+from keras.src.optimizers import Optimizer
+from keras.src.utils import file_utils
 
 
 @keras_export("keras.callbacks.TensorBoard")
diff --git a/keras/callbacks/tensorboard_test.py b/keras/src/callbacks/tensorboard_test.py
similarity index 98%
rename from keras/callbacks/tensorboard_test.py
rename to keras/src/callbacks/tensorboard_test.py
index 598d6e26dee1..3f67532a2d08 100644
--- a/keras/callbacks/tensorboard_test.py
+++ b/keras/src/callbacks/tensorboard_test.py
@@ -9,15 +9,15 @@
 from tensorflow.core.util import event_pb2
 from tensorflow.python.lib.io import tf_record
 
-from keras import backend
-from keras import callbacks
-from keras import layers
-from keras import losses
-from keras import models
-from keras import ops
-from keras import optimizers
-from keras import testing
-from keras.optimizers import schedules
+from keras.src import backend
+from keras.src import callbacks
+from keras.src import layers
+from keras.src import losses
+from keras.src import models
+from keras.src import ops
+from keras.src import optimizers
+from keras.src import testing
+from keras.src.optimizers import schedules
 
 # Note: this file and tensorboard in general has a dependency on tensorflow
 
diff --git a/keras/callbacks/terminate_on_nan.py b/keras/src/callbacks/terminate_on_nan.py
similarity index 80%
rename from keras/callbacks/terminate_on_nan.py
rename to keras/src/callbacks/terminate_on_nan.py
index 20eb5f2b3d70..55f7e4c06ab8 100644
--- a/keras/callbacks/terminate_on_nan.py
+++ b/keras/src/callbacks/terminate_on_nan.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.callbacks.callback import Callback
-from keras.utils import io_utils
+from keras.src.api_export import keras_export
+from keras.src.callbacks.callback import Callback
+from keras.src.utils import io_utils
 
 
 @keras_export("keras.callbacks.TerminateOnNaN")
diff --git a/keras/callbacks/terminate_on_nan_test.py b/keras/src/callbacks/terminate_on_nan_test.py
similarity index 87%
rename from keras/callbacks/terminate_on_nan_test.py
rename to keras/src/callbacks/terminate_on_nan_test.py
index 39b6cba5130b..f84b1b89b6bc 100644
--- a/keras/callbacks/terminate_on_nan_test.py
+++ b/keras/src/callbacks/terminate_on_nan_test.py
@@ -1,12 +1,12 @@
 import numpy as np
 import pytest
 
-from keras import callbacks
-from keras import initializers
-from keras import layers
-from keras import testing
-from keras.models import Sequential
-from keras.utils import numerical_utils
+from keras.src import callbacks
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
+from keras.src.models import Sequential
+from keras.src.utils import numerical_utils
 
 
 class TerminateOnNaNTest(testing.TestCase):
diff --git a/keras/constraints/__init__.py b/keras/src/constraints/__init__.py
similarity index 75%
rename from keras/constraints/__init__.py
rename to keras/src/constraints/__init__.py
index 08824e716344..cfafab080cd6 100644
--- a/keras/constraints/__init__.py
+++ b/keras/src/constraints/__init__.py
@@ -1,13 +1,13 @@
 import inspect
 
-from keras.api_export import keras_export
-from keras.constraints.constraints import Constraint
-from keras.constraints.constraints import MaxNorm
-from keras.constraints.constraints import MinMaxNorm
-from keras.constraints.constraints import NonNeg
-from keras.constraints.constraints import UnitNorm
-from keras.saving import serialization_lib
-from keras.utils.naming import to_snake_case
+from keras.src.api_export import keras_export
+from keras.src.constraints.constraints import Constraint
+from keras.src.constraints.constraints import MaxNorm
+from keras.src.constraints.constraints import MinMaxNorm
+from keras.src.constraints.constraints import NonNeg
+from keras.src.constraints.constraints import UnitNorm
+from keras.src.saving import serialization_lib
+from keras.src.utils.naming import to_snake_case
 
 ALL_OBJECTS = {
     Constraint,
diff --git a/keras/constraints/constraints.py b/keras/src/constraints/constraints.py
similarity index 98%
rename from keras/constraints/constraints.py
rename to keras/src/constraints/constraints.py
index a897e900aa0b..ecba6c69c45d 100644
--- a/keras/constraints/constraints.py
+++ b/keras/src/constraints/constraints.py
@@ -1,6 +1,6 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
 
 
 @keras_export("keras.constraints.Constraint")
diff --git a/keras/constraints/constraints_test.py b/keras/src/constraints/constraints_test.py
similarity index 97%
rename from keras/constraints/constraints_test.py
rename to keras/src/constraints/constraints_test.py
index fb2168b161fa..0ebf6426e8f1 100644
--- a/keras/constraints/constraints_test.py
+++ b/keras/src/constraints/constraints_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from keras import backend
-from keras import constraints
-from keras import testing
+from keras.src import backend
+from keras.src import constraints
+from keras.src import testing
 
 
 def get_example_array():
diff --git a/keras/src/datasets/__init__.py b/keras/src/datasets/__init__.py
new file mode 100644
index 000000000000..b62b41c4e61b
--- /dev/null
+++ b/keras/src/datasets/__init__.py
@@ -0,0 +1,10 @@
+"""Small NumPy datasets for debugging/testing."""
+
+from keras.src.datasets import boston_housing
+from keras.src.datasets import california_housing
+from keras.src.datasets import cifar10
+from keras.src.datasets import cifar100
+from keras.src.datasets import fashion_mnist
+from keras.src.datasets import imdb
+from keras.src.datasets import mnist
+from keras.src.datasets import reuters
diff --git a/keras/datasets/boston_housing.py b/keras/src/datasets/boston_housing.py
similarity index 96%
rename from keras/datasets/boston_housing.py
rename to keras/src/datasets/boston_housing.py
index 40060de667ae..de6133a223d2 100644
--- a/keras/datasets/boston_housing.py
+++ b/keras/src/datasets/boston_housing.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils.file_utils import get_file
+from keras.src.api_export import keras_export
+from keras.src.utils.file_utils import get_file
 
 
 @keras_export("keras.datasets.boston_housing.load_data")
diff --git a/keras/datasets/california_housing.py b/keras/src/datasets/california_housing.py
similarity index 97%
rename from keras/datasets/california_housing.py
rename to keras/src/datasets/california_housing.py
index b32d6f0ca10b..467d196a720d 100644
--- a/keras/datasets/california_housing.py
+++ b/keras/src/datasets/california_housing.py
@@ -2,8 +2,8 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils.file_utils import get_file
+from keras.src.api_export import keras_export
+from keras.src.utils.file_utils import get_file
 
 
 @keras_export("keras.datasets.california_housing.load_data")
diff --git a/keras/datasets/cifar.py b/keras/src/datasets/cifar.py
similarity index 100%
rename from keras/datasets/cifar.py
rename to keras/src/datasets/cifar.py
diff --git a/keras/datasets/cifar10.py b/keras/src/datasets/cifar10.py
similarity index 94%
rename from keras/datasets/cifar10.py
rename to keras/src/datasets/cifar10.py
index 2010bfca0bf7..f5d8a6178660 100644
--- a/keras/datasets/cifar10.py
+++ b/keras/src/datasets/cifar10.py
@@ -4,10 +4,10 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.datasets.cifar import load_batch
-from keras.utils.file_utils import get_file
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.datasets.cifar import load_batch
+from keras.src.utils.file_utils import get_file
 
 
 @keras_export("keras.datasets.cifar10.load_data")
diff --git a/keras/datasets/cifar100.py b/keras/src/datasets/cifar100.py
similarity index 94%
rename from keras/datasets/cifar100.py
rename to keras/src/datasets/cifar100.py
index a09cc0398d7d..5d58b5b18787 100644
--- a/keras/datasets/cifar100.py
+++ b/keras/src/datasets/cifar100.py
@@ -4,10 +4,10 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.datasets.cifar import load_batch
-from keras.utils.file_utils import get_file
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.datasets.cifar import load_batch
+from keras.src.utils.file_utils import get_file
 
 
 @keras_export("keras.datasets.cifar100.load_data")
diff --git a/keras/datasets/fashion_mnist.py b/keras/src/datasets/fashion_mnist.py
similarity index 96%
rename from keras/datasets/fashion_mnist.py
rename to keras/src/datasets/fashion_mnist.py
index 286a7b18ecd5..6700490e058d 100644
--- a/keras/datasets/fashion_mnist.py
+++ b/keras/src/datasets/fashion_mnist.py
@@ -5,8 +5,8 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils.file_utils import get_file
+from keras.src.api_export import keras_export
+from keras.src.utils.file_utils import get_file
 
 
 @keras_export("keras.datasets.fashion_mnist.load_data")
diff --git a/keras/datasets/imdb.py b/keras/src/datasets/imdb.py
similarity index 97%
rename from keras/datasets/imdb.py
rename to keras/src/datasets/imdb.py
index 4b4d79b718ad..a8b5537b111f 100644
--- a/keras/datasets/imdb.py
+++ b/keras/src/datasets/imdb.py
@@ -4,9 +4,9 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils.file_utils import get_file
-from keras.utils.python_utils import remove_long_seq
+from keras.src.api_export import keras_export
+from keras.src.utils.file_utils import get_file
+from keras.src.utils.python_utils import remove_long_seq
 
 
 @keras_export("keras.datasets.imdb.load_data")
diff --git a/keras/datasets/mnist.py b/keras/src/datasets/mnist.py
similarity index 96%
rename from keras/datasets/mnist.py
rename to keras/src/datasets/mnist.py
index 74d6b0d4fac1..b7e41cb78136 100644
--- a/keras/datasets/mnist.py
+++ b/keras/src/datasets/mnist.py
@@ -2,8 +2,8 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils.file_utils import get_file
+from keras.src.api_export import keras_export
+from keras.src.utils.file_utils import get_file
 
 
 @keras_export("keras.datasets.mnist.load_data")
diff --git a/keras/datasets/reuters.py b/keras/src/datasets/reuters.py
similarity index 97%
rename from keras/datasets/reuters.py
rename to keras/src/datasets/reuters.py
index 86aa7591673c..998754d1c282 100644
--- a/keras/datasets/reuters.py
+++ b/keras/src/datasets/reuters.py
@@ -4,9 +4,9 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils.file_utils import get_file
-from keras.utils.python_utils import remove_long_seq
+from keras.src.api_export import keras_export
+from keras.src.utils.file_utils import get_file
+from keras.src.utils.python_utils import remove_long_seq
 
 
 @keras_export("keras.datasets.reuters.load_data")
diff --git a/keras/src/distribution/__init__.py b/keras/src/distribution/__init__.py
new file mode 100644
index 000000000000..04d907f35697
--- /dev/null
+++ b/keras/src/distribution/__init__.py
@@ -0,0 +1,11 @@
+from keras.src.distribution.distribution_lib import DataParallel
+from keras.src.distribution.distribution_lib import DeviceMesh
+from keras.src.distribution.distribution_lib import Distribution
+from keras.src.distribution.distribution_lib import LayoutMap
+from keras.src.distribution.distribution_lib import ModelParallel
+from keras.src.distribution.distribution_lib import TensorLayout
+from keras.src.distribution.distribution_lib import distribute_tensor
+from keras.src.distribution.distribution_lib import distribution
+from keras.src.distribution.distribution_lib import initialize
+from keras.src.distribution.distribution_lib import list_devices
+from keras.src.distribution.distribution_lib import set_distribution
diff --git a/keras/distribution/distribution_lib.py b/keras/src/distribution/distribution_lib.py
similarity index 98%
rename from keras/distribution/distribution_lib.py
rename to keras/src/distribution/distribution_lib.py
index fa2828f1f87e..817355bba7b6 100644
--- a/keras/distribution/distribution_lib.py
+++ b/keras/src/distribution/distribution_lib.py
@@ -14,10 +14,10 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.backend import distribution_lib
-from keras.backend.common import global_state
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.backend import distribution_lib
+from keras.src.backend.common import global_state
 
 DEFAULT_BATCH_DIM_NAME = "batch"
 GLOBAL_ATTRIBUTE_NAME = "distribution"
@@ -452,7 +452,7 @@ def distribute_dataset(self, dataset):
             distribute as tf_data_distribute,
         )
 
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         if not isinstance(dataset, tf.data.Dataset):
             raise ValueError(
@@ -594,7 +594,7 @@ def distribute_dataset(self, dataset):
             distribute as tf_data_distribute,
         )
 
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         if not isinstance(dataset, tf.data.Dataset):
             raise ValueError(
diff --git a/keras/distribution/distribution_lib_test.py b/keras/src/distribution/distribution_lib_test.py
similarity index 99%
rename from keras/distribution/distribution_lib_test.py
rename to keras/src/distribution/distribution_lib_test.py
index 7743f91f3944..93cadcd70f2d 100644
--- a/keras/distribution/distribution_lib_test.py
+++ b/keras/src/distribution/distribution_lib_test.py
@@ -7,10 +7,10 @@
 import pytest
 import tensorflow as tf
 
-from keras import backend
-from keras import testing
-from keras.backend import distribution_lib as backend_dlib
-from keras.distribution import distribution_lib
+from keras.src import backend
+from keras.src import testing
+from keras.src.backend import distribution_lib as backend_dlib
+from keras.src.distribution import distribution_lib
 
 
 @pytest.mark.skipif(
diff --git a/keras/dtype_policies/__init__.py b/keras/src/dtype_policies/__init__.py
similarity index 64%
rename from keras/dtype_policies/__init__.py
rename to keras/src/dtype_policies/__init__.py
index 39ccb8497ed5..ec84c2660417 100644
--- a/keras/dtype_policies/__init__.py
+++ b/keras/src/dtype_policies/__init__.py
@@ -1,16 +1,16 @@
-from keras import backend
-from keras.dtype_policies import dtype_policy
-from keras.dtype_policies.dtype_policy import QUANTIZATION_MODES
-from keras.dtype_policies.dtype_policy import FloatDTypePolicy
-from keras.dtype_policies.dtype_policy import QuantizedDTypePolicy
-from keras.dtype_policies.dtype_policy import QuantizedFloat8DTypePolicy
+from keras.src import backend
+from keras.src.dtype_policies import dtype_policy
+from keras.src.dtype_policies.dtype_policy import QUANTIZATION_MODES
+from keras.src.dtype_policies.dtype_policy import FloatDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedFloat8DTypePolicy
 
 
 def get(identifier):
-    from keras.dtype_policies.dtype_policy import (
+    from keras.src.dtype_policies.dtype_policy import (
         _get_quantized_dtype_policy_by_str,
     )
-    from keras.saving import serialization_lib
+    from keras.src.saving import serialization_lib
 
     if identifier is None:
         return dtype_policy.dtype_policy()
diff --git a/keras/dtype_policies/dtype_policy.py b/keras/src/dtype_policies/dtype_policy.py
similarity index 98%
rename from keras/dtype_policies/dtype_policy.py
rename to keras/src/dtype_policies/dtype_policy.py
index 0499a17bd3e7..75b39f075a26 100644
--- a/keras/dtype_policies/dtype_policy.py
+++ b/keras/src/dtype_policies/dtype_policy.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.backend.common import global_state
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
 
 QUANTIZATION_MODES = ("int8", "float8")
 
diff --git a/keras/dtype_policies/dtype_policy_test.py b/keras/src/dtype_policies/dtype_policy_test.py
similarity index 96%
rename from keras/dtype_policies/dtype_policy_test.py
rename to keras/src/dtype_policies/dtype_policy_test.py
index 3e4fb8f75f5b..b040663781a8 100644
--- a/keras/dtype_policies/dtype_policy_test.py
+++ b/keras/src/dtype_policies/dtype_policy_test.py
@@ -1,12 +1,12 @@
 from absl.testing import parameterized
 
-from keras.dtype_policies.dtype_policy import DTypePolicy
-from keras.dtype_policies.dtype_policy import FloatDTypePolicy
-from keras.dtype_policies.dtype_policy import QuantizedDTypePolicy
-from keras.dtype_policies.dtype_policy import QuantizedFloat8DTypePolicy
-from keras.dtype_policies.dtype_policy import dtype_policy
-from keras.dtype_policies.dtype_policy import set_dtype_policy
-from keras.testing import test_case
+from keras.src.dtype_policies.dtype_policy import DTypePolicy
+from keras.src.dtype_policies.dtype_policy import FloatDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedDTypePolicy
+from keras.src.dtype_policies.dtype_policy import QuantizedFloat8DTypePolicy
+from keras.src.dtype_policies.dtype_policy import dtype_policy
+from keras.src.dtype_policies.dtype_policy import set_dtype_policy
+from keras.src.testing import test_case
 
 
 class DTypePolicyTest(test_case.TestCase):
@@ -293,7 +293,7 @@ def test_serialization_for_float8(self):
         ("float8_from_mixed_bfloat16", "float8_from_mixed_bfloat16"),
     )
     def test_get_quantized_dtype_policy_by_str(self, name):
-        from keras.dtype_policies.dtype_policy import (
+        from keras.src.dtype_policies.dtype_policy import (
             _get_quantized_dtype_policy_by_str,
         )
 
@@ -301,7 +301,7 @@ def test_get_quantized_dtype_policy_by_str(self, name):
         self.assertEqual(policy.name, name)
 
     def test_invalid_get_quantized_dtype_policy_by_str(self):
-        from keras.dtype_policies.dtype_policy import (
+        from keras.src.dtype_policies.dtype_policy import (
             _get_quantized_dtype_policy_by_str,
         )
 
diff --git a/keras/src/export/__init__.py b/keras/src/export/__init__.py
new file mode 100644
index 000000000000..d9de43f685a0
--- /dev/null
+++ b/keras/src/export/__init__.py
@@ -0,0 +1 @@
+from keras.src.export.export_lib import ExportArchive
diff --git a/keras/export/export_lib.py b/keras/src/export/export_lib.py
similarity index 98%
rename from keras/export/export_lib.py
rename to keras/src/export/export_lib.py
index a06901a3cae0..09ec145699cf 100644
--- a/keras/export/export_lib.py
+++ b/keras/src/export/export_lib.py
@@ -6,15 +6,15 @@
 
 from absl import logging
 
-from keras import backend
-from keras import tree
-from keras.api_export import keras_export
-from keras.backend.common.stateless_scope import StatelessScope
-from keras.layers import Layer
-from keras.models import Functional
-from keras.models import Sequential
-from keras.utils import io_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.backend.common.stateless_scope import StatelessScope
+from keras.src.layers import Layer
+from keras.src.models import Functional
+from keras.src.models import Sequential
+from keras.src.utils import io_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.export.ExportArchive")
@@ -524,9 +524,9 @@ def _filter_and_track_resources(self):
         # Next, track lookup tables.
         # Hopefully, one day this will be automated at the tf.function level.
         self._tf_trackable._misc_assets = []
-        from keras.layers import IntegerLookup
-        from keras.layers import StringLookup
-        from keras.layers import TextVectorization
+        from keras.src.layers import IntegerLookup
+        from keras.src.layers import StringLookup
+        from keras.src.layers import TextVectorization
 
         if hasattr(self, "_tracked"):
             for root in self._tracked:
diff --git a/keras/export/export_lib_test.py b/keras/src/export/export_lib_test.py
similarity index 98%
rename from keras/export/export_lib_test.py
rename to keras/src/export/export_lib_test.py
index e53a84ce9a4b..dd23857df40f 100644
--- a/keras/export/export_lib_test.py
+++ b/keras/src/export/export_lib_test.py
@@ -7,17 +7,17 @@
 import tensorflow as tf
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import ops
-from keras import random
-from keras import testing
-from keras import tree
-from keras import utils
-from keras.export import export_lib
-from keras.saving import saving_lib
-from keras.testing.test_utils import named_product
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import ops
+from keras.src import random
+from keras.src import testing
+from keras.src import tree
+from keras.src import utils
+from keras.src.export import export_lib
+from keras.src.saving import saving_lib
+from keras.src.testing.test_utils import named_product
 
 
 class CustomModel(models.Model):
diff --git a/keras/initializers/__init__.py b/keras/src/initializers/__init__.py
similarity index 69%
rename from keras/initializers/__init__.py
rename to keras/src/initializers/__init__.py
index b428e259fdf1..af46b7ff9b8a 100644
--- a/keras/initializers/__init__.py
+++ b/keras/src/initializers/__init__.py
@@ -1,24 +1,24 @@
 import inspect
 
-from keras.api_export import keras_export
-from keras.initializers.constant_initializers import Constant
-from keras.initializers.constant_initializers import Identity
-from keras.initializers.constant_initializers import Ones
-from keras.initializers.constant_initializers import Zeros
-from keras.initializers.initializer import Initializer
-from keras.initializers.random_initializers import GlorotNormal
-from keras.initializers.random_initializers import GlorotUniform
-from keras.initializers.random_initializers import HeNormal
-from keras.initializers.random_initializers import HeUniform
-from keras.initializers.random_initializers import LecunNormal
-from keras.initializers.random_initializers import LecunUniform
-from keras.initializers.random_initializers import OrthogonalInitializer
-from keras.initializers.random_initializers import RandomNormal
-from keras.initializers.random_initializers import RandomUniform
-from keras.initializers.random_initializers import TruncatedNormal
-from keras.initializers.random_initializers import VarianceScaling
-from keras.saving import serialization_lib
-from keras.utils.naming import to_snake_case
+from keras.src.api_export import keras_export
+from keras.src.initializers.constant_initializers import Constant
+from keras.src.initializers.constant_initializers import Identity
+from keras.src.initializers.constant_initializers import Ones
+from keras.src.initializers.constant_initializers import Zeros
+from keras.src.initializers.initializer import Initializer
+from keras.src.initializers.random_initializers import GlorotNormal
+from keras.src.initializers.random_initializers import GlorotUniform
+from keras.src.initializers.random_initializers import HeNormal
+from keras.src.initializers.random_initializers import HeUniform
+from keras.src.initializers.random_initializers import LecunNormal
+from keras.src.initializers.random_initializers import LecunUniform
+from keras.src.initializers.random_initializers import OrthogonalInitializer
+from keras.src.initializers.random_initializers import RandomNormal
+from keras.src.initializers.random_initializers import RandomUniform
+from keras.src.initializers.random_initializers import TruncatedNormal
+from keras.src.initializers.random_initializers import VarianceScaling
+from keras.src.saving import serialization_lib
+from keras.src.utils.naming import to_snake_case
 
 ALL_OBJECTS = {
     Initializer,
diff --git a/keras/initializers/constant_initializers.py b/keras/src/initializers/constant_initializers.py
similarity index 95%
rename from keras/initializers/constant_initializers.py
rename to keras/src/initializers/constant_initializers.py
index f8d34f29d10a..c5ab6a42d6b2 100644
--- a/keras/initializers/constant_initializers.py
+++ b/keras/src/initializers/constant_initializers.py
@@ -1,8 +1,8 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.backend import standardize_dtype
-from keras.initializers.initializer import Initializer
-from keras.saving import serialization_lib
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.backend import standardize_dtype
+from keras.src.initializers.initializer import Initializer
+from keras.src.saving import serialization_lib
 
 
 @keras_export(["keras.initializers.Constant", "keras.initializers.constant"])
diff --git a/keras/initializers/constant_initializers_test.py b/keras/src/initializers/constant_initializers_test.py
similarity index 95%
rename from keras/initializers/constant_initializers_test.py
rename to keras/src/initializers/constant_initializers_test.py
index fca8b620dc99..ace475b499e1 100644
--- a/keras/initializers/constant_initializers_test.py
+++ b/keras/src/initializers/constant_initializers_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from keras import backend
-from keras import initializers
-from keras import testing
+from keras.src import backend
+from keras.src import initializers
+from keras.src import testing
 
 
 class ConstantInitializersTest(testing.TestCase):
diff --git a/keras/initializers/initializer.py b/keras/src/initializers/initializer.py
similarity index 98%
rename from keras/initializers/initializer.py
rename to keras/src/initializers/initializer.py
index 6ea8ca123427..6d870488c3f4 100644
--- a/keras/initializers/initializer.py
+++ b/keras/src/initializers/initializer.py
@@ -1,4 +1,4 @@
-from keras.api_export import keras_export
+from keras.src.api_export import keras_export
 
 
 @keras_export(["keras.Initializer", "keras.initializers.Initializer"])
diff --git a/keras/initializers/random_initializers.py b/keras/src/initializers/random_initializers.py
similarity index 99%
rename from keras/initializers/random_initializers.py
rename to keras/src/initializers/random_initializers.py
index 8c43df739aba..a25a654aa4bf 100644
--- a/keras/initializers/random_initializers.py
+++ b/keras/src/initializers/random_initializers.py
@@ -1,10 +1,10 @@
 import math
 
-from keras import ops
-from keras.api_export import keras_export
-from keras.backend import random
-from keras.initializers.initializer import Initializer
-from keras.saving import serialization_lib
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.backend import random
+from keras.src.initializers.initializer import Initializer
+from keras.src.saving import serialization_lib
 
 
 @keras_export(
diff --git a/keras/initializers/random_initializers_test.py b/keras/src/initializers/random_initializers_test.py
similarity index 98%
rename from keras/initializers/random_initializers_test.py
rename to keras/src/initializers/random_initializers_test.py
index d47d412a7515..b58cf64ba610 100644
--- a/keras/initializers/random_initializers_test.py
+++ b/keras/src/initializers/random_initializers_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from keras import backend
-from keras import initializers
-from keras import testing
-from keras import utils
+from keras.src import backend
+from keras.src import initializers
+from keras.src import testing
+from keras.src import utils
 
 
 class InitializersTest(testing.TestCase):
diff --git a/keras/src/layers/__init__.py b/keras/src/layers/__init__.py
new file mode 100644
index 000000000000..567e1c7526e1
--- /dev/null
+++ b/keras/src/layers/__init__.py
@@ -0,0 +1,175 @@
+from keras.src.api_export import keras_export
+from keras.src.layers.activations.activation import Activation
+from keras.src.layers.activations.elu import ELU
+from keras.src.layers.activations.leaky_relu import LeakyReLU
+from keras.src.layers.activations.prelu import PReLU
+from keras.src.layers.activations.relu import ReLU
+from keras.src.layers.activations.softmax import Softmax
+from keras.src.layers.attention.additive_attention import AdditiveAttention
+from keras.src.layers.attention.attention import Attention
+from keras.src.layers.attention.grouped_query_attention import (
+    GroupedQueryAttention,
+)
+from keras.src.layers.attention.multi_head_attention import MultiHeadAttention
+from keras.src.layers.convolutional.conv1d import Conv1D
+from keras.src.layers.convolutional.conv1d_transpose import Conv1DTranspose
+from keras.src.layers.convolutional.conv2d import Conv2D
+from keras.src.layers.convolutional.conv2d_transpose import Conv2DTranspose
+from keras.src.layers.convolutional.conv3d import Conv3D
+from keras.src.layers.convolutional.conv3d_transpose import Conv3DTranspose
+from keras.src.layers.convolutional.depthwise_conv1d import DepthwiseConv1D
+from keras.src.layers.convolutional.depthwise_conv2d import DepthwiseConv2D
+from keras.src.layers.convolutional.separable_conv1d import SeparableConv1D
+from keras.src.layers.convolutional.separable_conv2d import SeparableConv2D
+from keras.src.layers.core.dense import Dense
+from keras.src.layers.core.einsum_dense import EinsumDense
+from keras.src.layers.core.embedding import Embedding
+from keras.src.layers.core.identity import Identity
+from keras.src.layers.core.input_layer import Input
+from keras.src.layers.core.input_layer import InputLayer
+from keras.src.layers.core.lambda_layer import Lambda
+from keras.src.layers.core.masking import Masking
+from keras.src.layers.core.wrapper import Wrapper
+from keras.src.layers.layer import Layer
+from keras.src.layers.merging.add import Add
+from keras.src.layers.merging.add import add
+from keras.src.layers.merging.average import Average
+from keras.src.layers.merging.average import average
+from keras.src.layers.merging.concatenate import Concatenate
+from keras.src.layers.merging.concatenate import concatenate
+from keras.src.layers.merging.dot import Dot
+from keras.src.layers.merging.dot import dot
+from keras.src.layers.merging.maximum import Maximum
+from keras.src.layers.merging.maximum import maximum
+from keras.src.layers.merging.minimum import Minimum
+from keras.src.layers.merging.minimum import minimum
+from keras.src.layers.merging.multiply import Multiply
+from keras.src.layers.merging.multiply import multiply
+from keras.src.layers.merging.subtract import Subtract
+from keras.src.layers.merging.subtract import subtract
+from keras.src.layers.normalization.batch_normalization import (
+    BatchNormalization,
+)
+from keras.src.layers.normalization.group_normalization import (
+    GroupNormalization,
+)
+from keras.src.layers.normalization.layer_normalization import (
+    LayerNormalization,
+)
+from keras.src.layers.normalization.spectral_normalization import (
+    SpectralNormalization,
+)
+from keras.src.layers.normalization.unit_normalization import UnitNormalization
+from keras.src.layers.pooling.average_pooling1d import AveragePooling1D
+from keras.src.layers.pooling.average_pooling2d import AveragePooling2D
+from keras.src.layers.pooling.average_pooling3d import AveragePooling3D
+from keras.src.layers.pooling.global_average_pooling1d import (
+    GlobalAveragePooling1D,
+)
+from keras.src.layers.pooling.global_average_pooling2d import (
+    GlobalAveragePooling2D,
+)
+from keras.src.layers.pooling.global_average_pooling3d import (
+    GlobalAveragePooling3D,
+)
+from keras.src.layers.pooling.global_max_pooling1d import GlobalMaxPooling1D
+from keras.src.layers.pooling.global_max_pooling2d import GlobalMaxPooling2D
+from keras.src.layers.pooling.global_max_pooling3d import GlobalMaxPooling3D
+from keras.src.layers.pooling.max_pooling1d import MaxPooling1D
+from keras.src.layers.pooling.max_pooling2d import MaxPooling2D
+from keras.src.layers.pooling.max_pooling3d import MaxPooling3D
+from keras.src.layers.preprocessing.audio_preprocessing import MelSpectrogram
+from keras.src.layers.preprocessing.category_encoding import CategoryEncoding
+from keras.src.layers.preprocessing.center_crop import CenterCrop
+from keras.src.layers.preprocessing.discretization import Discretization
+from keras.src.layers.preprocessing.hashed_crossing import HashedCrossing
+from keras.src.layers.preprocessing.hashing import Hashing
+from keras.src.layers.preprocessing.index_lookup import IndexLookup
+from keras.src.layers.preprocessing.integer_lookup import IntegerLookup
+from keras.src.layers.preprocessing.normalization import Normalization
+from keras.src.layers.preprocessing.random_brightness import RandomBrightness
+from keras.src.layers.preprocessing.random_contrast import RandomContrast
+from keras.src.layers.preprocessing.random_crop import RandomCrop
+from keras.src.layers.preprocessing.random_flip import RandomFlip
+from keras.src.layers.preprocessing.random_rotation import RandomRotation
+from keras.src.layers.preprocessing.random_translation import RandomTranslation
+from keras.src.layers.preprocessing.random_zoom import RandomZoom
+from keras.src.layers.preprocessing.rescaling import Rescaling
+from keras.src.layers.preprocessing.resizing import Resizing
+from keras.src.layers.preprocessing.string_lookup import StringLookup
+from keras.src.layers.preprocessing.text_vectorization import TextVectorization
+from keras.src.layers.regularization.activity_regularization import (
+    ActivityRegularization,
+)
+from keras.src.layers.regularization.alpha_dropout import AlphaDropout
+from keras.src.layers.regularization.dropout import Dropout
+from keras.src.layers.regularization.gaussian_dropout import GaussianDropout
+from keras.src.layers.regularization.gaussian_noise import GaussianNoise
+from keras.src.layers.regularization.spatial_dropout import SpatialDropout1D
+from keras.src.layers.regularization.spatial_dropout import SpatialDropout2D
+from keras.src.layers.regularization.spatial_dropout import SpatialDropout3D
+from keras.src.layers.reshaping.cropping1d import Cropping1D
+from keras.src.layers.reshaping.cropping2d import Cropping2D
+from keras.src.layers.reshaping.cropping3d import Cropping3D
+from keras.src.layers.reshaping.flatten import Flatten
+from keras.src.layers.reshaping.permute import Permute
+from keras.src.layers.reshaping.repeat_vector import RepeatVector
+from keras.src.layers.reshaping.reshape import Reshape
+from keras.src.layers.reshaping.up_sampling1d import UpSampling1D
+from keras.src.layers.reshaping.up_sampling2d import UpSampling2D
+from keras.src.layers.reshaping.up_sampling3d import UpSampling3D
+from keras.src.layers.reshaping.zero_padding1d import ZeroPadding1D
+from keras.src.layers.reshaping.zero_padding2d import ZeroPadding2D
+from keras.src.layers.reshaping.zero_padding3d import ZeroPadding3D
+from keras.src.layers.rnn.bidirectional import Bidirectional
+from keras.src.layers.rnn.conv_lstm1d import ConvLSTM1D
+from keras.src.layers.rnn.conv_lstm2d import ConvLSTM2D
+from keras.src.layers.rnn.conv_lstm3d import ConvLSTM3D
+from keras.src.layers.rnn.gru import GRU
+from keras.src.layers.rnn.gru import GRUCell
+from keras.src.layers.rnn.lstm import LSTM
+from keras.src.layers.rnn.lstm import LSTMCell
+from keras.src.layers.rnn.rnn import RNN
+from keras.src.layers.rnn.simple_rnn import SimpleRNN
+from keras.src.layers.rnn.simple_rnn import SimpleRNNCell
+from keras.src.layers.rnn.stacked_rnn_cells import StackedRNNCells
+from keras.src.layers.rnn.time_distributed import TimeDistributed
+from keras.src.saving import serialization_lib
+
+
+@keras_export("keras.layers.serialize")
+def serialize(layer):
+    """Returns the layer configuration as a Python dict.
+
+    Args:
+        layer: A `keras.layers.Layer` instance to serialize.
+
+    Returns:
+        Python dict which contains the configuration of the layer.
+    """
+    return serialization_lib.serialize_keras_object(layer)
+
+
+@keras_export("keras.layers.deserialize")
+def deserialize(config, custom_objects=None):
+    """Returns a Keras layer object via its configuration.
+
+    Args:
+        config: A python dict containing a serialized layer configuration.
+        custom_objects: Optional dictionary mapping names (strings) to custom
+            objects (classes and functions) to be considered during
+            deserialization.
+
+    Returns:
+        A Keras layer instance.
+    """
+    obj = serialization_lib.deserialize_keras_object(
+        config,
+        custom_objects=custom_objects,
+    )
+    if not isinstance(obj, Layer):
+        raise ValueError(
+            "`keras.layers.deserialize` was passed a `config` object that is "
+            f"not a `keras.layers.Layer`. Received: {config}"
+        )
+    return obj
diff --git a/keras/src/layers/activations/__init__.py b/keras/src/layers/activations/__init__.py
new file mode 100644
index 000000000000..009ce976c51b
--- /dev/null
+++ b/keras/src/layers/activations/__init__.py
@@ -0,0 +1,5 @@
+from keras.src.layers.activations.elu import ELU
+from keras.src.layers.activations.leaky_relu import LeakyReLU
+from keras.src.layers.activations.prelu import PReLU
+from keras.src.layers.activations.relu import ReLU
+from keras.src.layers.activations.softmax import Softmax
diff --git a/keras/layers/activations/activation.py b/keras/src/layers/activations/activation.py
similarity index 90%
rename from keras/layers/activations/activation.py
rename to keras/src/layers/activations/activation.py
index 438bd3f28c7e..271cf1e4682e 100644
--- a/keras/layers/activations/activation.py
+++ b/keras/src/layers/activations/activation.py
@@ -1,6 +1,6 @@
-from keras import activations
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import activations
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.Activation")
diff --git a/keras/layers/activations/activation_test.py b/keras/src/layers/activations/activation_test.py
similarity index 91%
rename from keras/layers/activations/activation_test.py
rename to keras/src/layers/activations/activation_test.py
index 355f0602c14a..26d77dd44b28 100644
--- a/keras/layers/activations/activation_test.py
+++ b/keras/src/layers/activations/activation_test.py
@@ -1,8 +1,8 @@
 import pytest
 
-from keras import activations
-from keras import layers
-from keras import testing
+from keras.src import activations
+from keras.src import layers
+from keras.src import testing
 
 
 class ActivationTest(testing.TestCase):
diff --git a/keras/layers/activations/elu.py b/keras/src/layers/activations/elu.py
similarity index 85%
rename from keras/layers/activations/elu.py
rename to keras/src/layers/activations/elu.py
index ed8abdf3369e..f15f91546cf4 100644
--- a/keras/layers/activations/elu.py
+++ b/keras/src/layers/activations/elu.py
@@ -1,6 +1,6 @@
-from keras import activations
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import activations
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.ELU")
diff --git a/keras/layers/activations/elu_test.py b/keras/src/layers/activations/elu_test.py
similarity index 91%
rename from keras/layers/activations/elu_test.py
rename to keras/src/layers/activations/elu_test.py
index 1af54ffd4fb7..7dd8b3f7b799 100644
--- a/keras/layers/activations/elu_test.py
+++ b/keras/src/layers/activations/elu_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 import pytest
 
-from keras import testing
-from keras.layers.activations import elu
+from keras.src import testing
+from keras.src.layers.activations import elu
 
 
 class ELUTest(testing.TestCase):
diff --git a/keras/layers/activations/leaky_relu.py b/keras/src/layers/activations/leaky_relu.py
similarity index 93%
rename from keras/layers/activations/leaky_relu.py
rename to keras/src/layers/activations/leaky_relu.py
index 4e2783fc08f8..988c383b7450 100644
--- a/keras/layers/activations/leaky_relu.py
+++ b/keras/src/layers/activations/leaky_relu.py
@@ -1,8 +1,8 @@
 import warnings
 
-from keras import activations
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import activations
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.LeakyReLU")
diff --git a/keras/layers/activations/leaky_relu_test.py b/keras/src/layers/activations/leaky_relu_test.py
similarity index 93%
rename from keras/layers/activations/leaky_relu_test.py
rename to keras/src/layers/activations/leaky_relu_test.py
index 8665ce11926a..e42c10c9f539 100644
--- a/keras/layers/activations/leaky_relu_test.py
+++ b/keras/src/layers/activations/leaky_relu_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 import pytest
 
-from keras import testing
-from keras.layers.activations import leaky_relu
+from keras.src import testing
+from keras.src.layers.activations import leaky_relu
 
 
 class LeakyReLUTest(testing.TestCase):
diff --git a/keras/layers/activations/prelu.py b/keras/src/layers/activations/prelu.py
similarity index 92%
rename from keras/layers/activations/prelu.py
rename to keras/src/layers/activations/prelu.py
index 4f2a0a2e76e1..f46d974df824 100644
--- a/keras/layers/activations/prelu.py
+++ b/keras/src/layers/activations/prelu.py
@@ -1,10 +1,10 @@
-from keras import activations
-from keras import constraints
-from keras import initializers
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import activations
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.PReLU")
diff --git a/keras/layers/activations/prelu_test.py b/keras/src/layers/activations/prelu_test.py
similarity index 93%
rename from keras/layers/activations/prelu_test.py
rename to keras/src/layers/activations/prelu_test.py
index 82785de104a5..63b4aee20617 100644
--- a/keras/layers/activations/prelu_test.py
+++ b/keras/src/layers/activations/prelu_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 import pytest
 
-from keras import testing
-from keras.layers.activations import prelu
+from keras.src import testing
+from keras.src.layers.activations import prelu
 
 
 class PReLUTest(testing.TestCase):
diff --git a/keras/layers/activations/relu.py b/keras/src/layers/activations/relu.py
similarity index 95%
rename from keras/layers/activations/relu.py
rename to keras/src/layers/activations/relu.py
index e7efa03d7950..8467d34fa0f5 100644
--- a/keras/layers/activations/relu.py
+++ b/keras/src/layers/activations/relu.py
@@ -1,6 +1,6 @@
-from keras import activations
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import activations
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.ReLU")
diff --git a/keras/layers/activations/relu_test.py b/keras/src/layers/activations/relu_test.py
similarity index 97%
rename from keras/layers/activations/relu_test.py
rename to keras/src/layers/activations/relu_test.py
index c423f76a3f64..0c1f64d73a18 100644
--- a/keras/layers/activations/relu_test.py
+++ b/keras/src/layers/activations/relu_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 import pytest
 
-from keras import testing
-from keras.layers.activations import relu
+from keras.src import testing
+from keras.src.layers.activations import relu
 
 
 class ReLUTest(testing.TestCase):
diff --git a/keras/layers/activations/softmax.py b/keras/src/layers/activations/softmax.py
similarity index 93%
rename from keras/layers/activations/softmax.py
rename to keras/src/layers/activations/softmax.py
index e29f2ab7c755..c1fee581a89d 100644
--- a/keras/layers/activations/softmax.py
+++ b/keras/src/layers/activations/softmax.py
@@ -1,7 +1,7 @@
-from keras import activations
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import activations
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 def _large_negative_number(dtype):
diff --git a/keras/layers/activations/softmax_test.py b/keras/src/layers/activations/softmax_test.py
similarity index 95%
rename from keras/layers/activations/softmax_test.py
rename to keras/src/layers/activations/softmax_test.py
index fb3484799f50..e835a5f345d7 100644
--- a/keras/layers/activations/softmax_test.py
+++ b/keras/src/layers/activations/softmax_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 import pytest
 
-from keras import testing
-from keras.layers.activations import softmax
+from keras.src import testing
+from keras.src.layers.activations import softmax
 
 
 class SoftmaxTest(testing.TestCase):
diff --git a/keras/layers/attention/__init__.py b/keras/src/layers/attention/__init__.py
similarity index 100%
rename from keras/layers/attention/__init__.py
rename to keras/src/layers/attention/__init__.py
diff --git a/keras/layers/attention/additive_attention.py b/keras/src/layers/attention/additive_attention.py
similarity index 96%
rename from keras/layers/attention/additive_attention.py
rename to keras/src/layers/attention/additive_attention.py
index f0103673d52a..31cc7c93f296 100644
--- a/keras/layers/attention/additive_attention.py
+++ b/keras/src/layers/attention/additive_attention.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.attention.attention import Attention
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.attention.attention import Attention
 
 
 @keras_export("keras.layers.AdditiveAttention")
diff --git a/keras/layers/attention/additive_attention_test.py b/keras/src/layers/attention/additive_attention_test.py
similarity index 98%
rename from keras/layers/attention/additive_attention_test.py
rename to keras/src/layers/attention/additive_attention_test.py
index 1b37b20fca4f..51092c6c4918 100644
--- a/keras/layers/attention/additive_attention_test.py
+++ b/keras/src/layers/attention/additive_attention_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import layers
-from keras import testing
+from keras.src import layers
+from keras.src import testing
 
 
 class AdditiveAttentionTest(testing.TestCase):
diff --git a/keras/layers/attention/attention.py b/keras/src/layers/attention/attention.py
similarity index 98%
rename from keras/layers/attention/attention.py
rename to keras/src/layers/attention/attention.py
index b42b4c05634b..48c6332ff157 100644
--- a/keras/layers/attention/attention.py
+++ b/keras/src/layers/attention/attention.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.Attention")
diff --git a/keras/layers/attention/attention_test.py b/keras/src/layers/attention/attention_test.py
similarity index 99%
rename from keras/layers/attention/attention_test.py
rename to keras/src/layers/attention/attention_test.py
index 102717994ea8..de8dba643405 100644
--- a/keras/layers/attention/attention_test.py
+++ b/keras/src/layers/attention/attention_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class AttentionTest(testing.TestCase):
diff --git a/keras/layers/attention/grouped_query_attention.py b/keras/src/layers/attention/grouped_query_attention.py
similarity index 97%
rename from keras/layers/attention/grouped_query_attention.py
rename to keras/src/layers/attention/grouped_query_attention.py
index 79a59c8d7c34..fe09f0633178 100644
--- a/keras/layers/attention/grouped_query_attention.py
+++ b/keras/src/layers/attention/grouped_query_attention.py
@@ -1,12 +1,12 @@
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.activations.softmax import Softmax
-from keras.layers.core.einsum_dense import EinsumDense
-from keras.layers.layer import Layer
-from keras.layers.regularization.dropout import Dropout
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.activations.softmax import Softmax
+from keras.src.layers.core.einsum_dense import EinsumDense
+from keras.src.layers.layer import Layer
+from keras.src.layers.regularization.dropout import Dropout
 
 
 @keras_export("keras.layers.GroupQueryAttention")
diff --git a/keras/layers/attention/grouped_query_attention_test.py b/keras/src/layers/attention/grouped_query_attention_test.py
similarity index 98%
rename from keras/layers/attention/grouped_query_attention_test.py
rename to keras/src/layers/attention/grouped_query_attention_test.py
index 8a926a93bb4f..58a00dc54df5 100644
--- a/keras/layers/attention/grouped_query_attention_test.py
+++ b/keras/src/layers/attention/grouped_query_attention_test.py
@@ -2,10 +2,10 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import initializers
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
 
 
 class GroupedQueryAttentionTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/attention/multi_head_attention.py b/keras/src/layers/attention/multi_head_attention.py
similarity index 98%
rename from keras/layers/attention/multi_head_attention.py
rename to keras/src/layers/attention/multi_head_attention.py
index c8a6d32589ec..5571d05683ae 100644
--- a/keras/layers/attention/multi_head_attention.py
+++ b/keras/src/layers/attention/multi_head_attention.py
@@ -4,16 +4,16 @@
 
 import numpy as np
 
-from keras import backend
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.activations.softmax import Softmax
-from keras.layers.core.einsum_dense import EinsumDense
-from keras.layers.layer import Layer
-from keras.layers.regularization.dropout import Dropout
+from keras.src import backend
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.activations.softmax import Softmax
+from keras.src.layers.core.einsum_dense import EinsumDense
+from keras.src.layers.layer import Layer
+from keras.src.layers.regularization.dropout import Dropout
 
 
 @keras_export("keras.layers.MultiHeadAttention")
diff --git a/keras/layers/attention/multi_head_attention_test.py b/keras/src/layers/attention/multi_head_attention_test.py
similarity index 98%
rename from keras/layers/attention/multi_head_attention_test.py
rename to keras/src/layers/attention/multi_head_attention_test.py
index 361e015c17dc..6feac6086676 100644
--- a/keras/layers/attention/multi_head_attention_test.py
+++ b/keras/src/layers/attention/multi_head_attention_test.py
@@ -4,13 +4,13 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import constraints
-from keras import initializers
-from keras import layers
-from keras import models
-from keras import saving
-from keras import testing
+from keras.src import backend
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import layers
+from keras.src import models
+from keras.src import saving
+from keras.src import testing
 
 
 class MultiHeadAttentionTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/convolutional/__init__.py b/keras/src/layers/convolutional/__init__.py
similarity index 100%
rename from keras/layers/convolutional/__init__.py
rename to keras/src/layers/convolutional/__init__.py
diff --git a/keras/layers/convolutional/base_conv.py b/keras/src/layers/convolutional/base_conv.py
similarity index 97%
rename from keras/layers/convolutional/base_conv.py
rename to keras/src/layers/convolutional/base_conv.py
index 689083d94003..96a66e58e40c 100644
--- a/keras/layers/convolutional/base_conv.py
+++ b/keras/src/layers/convolutional/base_conv.py
@@ -1,16 +1,16 @@
 """Keras base class for convolution layers."""
 
-from keras import activations
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.backend import standardize_data_format
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.ops.operation_utils import compute_conv_output_shape
-from keras.utils.argument_validation import standardize_padding
-from keras.utils.argument_validation import standardize_tuple
+from keras.src import activations
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.backend import standardize_data_format
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.ops.operation_utils import compute_conv_output_shape
+from keras.src.utils.argument_validation import standardize_padding
+from keras.src.utils.argument_validation import standardize_tuple
 
 
 class BaseConv(Layer):
diff --git a/keras/layers/convolutional/base_conv_transpose.py b/keras/src/layers/convolutional/base_conv_transpose.py
similarity index 95%
rename from keras/layers/convolutional/base_conv_transpose.py
rename to keras/src/layers/convolutional/base_conv_transpose.py
index ec5ab1e2396b..af0a68e3aded 100644
--- a/keras/layers/convolutional/base_conv_transpose.py
+++ b/keras/src/layers/convolutional/base_conv_transpose.py
@@ -1,18 +1,18 @@
 """Keras base class for transpose convolution layers."""
 
-from keras import activations
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.backend import standardize_data_format
-from keras.backend.common.backend_utils import (
+from keras.src import activations
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.backend import standardize_data_format
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_output_shape,
 )
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.utils.argument_validation import standardize_padding
-from keras.utils.argument_validation import standardize_tuple
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.utils.argument_validation import standardize_padding
+from keras.src.utils.argument_validation import standardize_tuple
 
 
 class BaseConvTranspose(Layer):
diff --git a/keras/layers/convolutional/base_depthwise_conv.py b/keras/src/layers/convolutional/base_depthwise_conv.py
similarity index 95%
rename from keras/layers/convolutional/base_depthwise_conv.py
rename to keras/src/layers/convolutional/base_depthwise_conv.py
index 123acb920166..b9f5d442d22a 100644
--- a/keras/layers/convolutional/base_depthwise_conv.py
+++ b/keras/src/layers/convolutional/base_depthwise_conv.py
@@ -1,16 +1,16 @@
 """Keras base class for depthwise convolution layers."""
 
-from keras import activations
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.backend import standardize_data_format
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.ops.operation_utils import compute_conv_output_shape
-from keras.utils.argument_validation import standardize_padding
-from keras.utils.argument_validation import standardize_tuple
+from keras.src import activations
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.backend import standardize_data_format
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.ops.operation_utils import compute_conv_output_shape
+from keras.src.utils.argument_validation import standardize_padding
+from keras.src.utils.argument_validation import standardize_tuple
 
 
 class BaseDepthwiseConv(Layer):
diff --git a/keras/layers/convolutional/base_separable_conv.py b/keras/src/layers/convolutional/base_separable_conv.py
similarity index 95%
rename from keras/layers/convolutional/base_separable_conv.py
rename to keras/src/layers/convolutional/base_separable_conv.py
index 99c45afaa1d1..5073b1813dea 100644
--- a/keras/layers/convolutional/base_separable_conv.py
+++ b/keras/src/layers/convolutional/base_separable_conv.py
@@ -1,16 +1,16 @@
 """Keras abstract base layer for separable convolution."""
 
-from keras import activations
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.backend import standardize_data_format
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.ops.operation_utils import compute_conv_output_shape
-from keras.utils.argument_validation import standardize_padding
-from keras.utils.argument_validation import standardize_tuple
+from keras.src import activations
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.backend import standardize_data_format
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.ops.operation_utils import compute_conv_output_shape
+from keras.src.utils.argument_validation import standardize_padding
+from keras.src.utils.argument_validation import standardize_tuple
 
 
 class BaseSeparableConv(Layer):
diff --git a/keras/layers/convolutional/conv1d.py b/keras/src/layers/convolutional/conv1d.py
similarity index 98%
rename from keras/layers/convolutional/conv1d.py
rename to keras/src/layers/convolutional/conv1d.py
index 37509452b6ef..f88ac59e5d68 100644
--- a/keras/layers/convolutional/conv1d.py
+++ b/keras/src/layers/convolutional/conv1d.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_conv import BaseConv
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_conv import BaseConv
 
 
 @keras_export(["keras.layers.Conv1D", "keras.layers.Convolution1D"])
diff --git a/keras/layers/convolutional/conv1d_transpose.py b/keras/src/layers/convolutional/conv1d_transpose.py
similarity index 97%
rename from keras/layers/convolutional/conv1d_transpose.py
rename to keras/src/layers/convolutional/conv1d_transpose.py
index f97482af0e04..6f79ca3dafef 100644
--- a/keras/layers/convolutional/conv1d_transpose.py
+++ b/keras/src/layers/convolutional/conv1d_transpose.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_conv_transpose import BaseConvTranspose
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_conv_transpose import BaseConvTranspose
 
 
 @keras_export(
diff --git a/keras/layers/convolutional/conv2d.py b/keras/src/layers/convolutional/conv2d.py
similarity index 98%
rename from keras/layers/convolutional/conv2d.py
rename to keras/src/layers/convolutional/conv2d.py
index 77830c9225c0..791cb041fb4e 100644
--- a/keras/layers/convolutional/conv2d.py
+++ b/keras/src/layers/convolutional/conv2d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_conv import BaseConv
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_conv import BaseConv
 
 
 @keras_export(["keras.layers.Conv2D", "keras.layers.Convolution2D"])
diff --git a/keras/layers/convolutional/conv2d_transpose.py b/keras/src/layers/convolutional/conv2d_transpose.py
similarity index 97%
rename from keras/layers/convolutional/conv2d_transpose.py
rename to keras/src/layers/convolutional/conv2d_transpose.py
index a690e85f237b..cc4293c8db4e 100644
--- a/keras/layers/convolutional/conv2d_transpose.py
+++ b/keras/src/layers/convolutional/conv2d_transpose.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_conv_transpose import BaseConvTranspose
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_conv_transpose import BaseConvTranspose
 
 
 @keras_export(
diff --git a/keras/layers/convolutional/conv3d.py b/keras/src/layers/convolutional/conv3d.py
similarity index 98%
rename from keras/layers/convolutional/conv3d.py
rename to keras/src/layers/convolutional/conv3d.py
index 63171a1eb2b2..516342ddbc04 100644
--- a/keras/layers/convolutional/conv3d.py
+++ b/keras/src/layers/convolutional/conv3d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_conv import BaseConv
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_conv import BaseConv
 
 
 @keras_export(["keras.layers.Conv3D", "keras.layers.Convolution3D"])
diff --git a/keras/layers/convolutional/conv3d_transpose.py b/keras/src/layers/convolutional/conv3d_transpose.py
similarity index 97%
rename from keras/layers/convolutional/conv3d_transpose.py
rename to keras/src/layers/convolutional/conv3d_transpose.py
index f514f3322382..c0f651147fcf 100644
--- a/keras/layers/convolutional/conv3d_transpose.py
+++ b/keras/src/layers/convolutional/conv3d_transpose.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_conv_transpose import BaseConvTranspose
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_conv_transpose import BaseConvTranspose
 
 
 @keras_export(
diff --git a/keras/layers/convolutional/conv_test.py b/keras/src/layers/convolutional/conv_test.py
similarity index 99%
rename from keras/layers/convolutional/conv_test.py
rename to keras/src/layers/convolutional/conv_test.py
index 281e35a960e5..6bf9c6776dc2 100644
--- a/keras/layers/convolutional/conv_test.py
+++ b/keras/src/layers/convolutional/conv_test.py
@@ -5,12 +5,12 @@
 from absl.testing import parameterized
 from numpy.lib.stride_tricks import as_strided
 
-from keras import backend
-from keras import constraints
-from keras import layers
-from keras import models
-from keras import saving
-from keras import testing
+from keras.src import backend
+from keras.src import constraints
+from keras.src import layers
+from keras.src import models
+from keras.src import saving
+from keras.src import testing
 
 
 def _same_padding(input_size, kernel_size, stride):
diff --git a/keras/layers/convolutional/conv_transpose_test.py b/keras/src/layers/convolutional/conv_transpose_test.py
similarity index 99%
rename from keras/layers/convolutional/conv_transpose_test.py
rename to keras/src/layers/convolutional/conv_transpose_test.py
index 57252ae2fd73..1a3eb8f5f07e 100644
--- a/keras/layers/convolutional/conv_transpose_test.py
+++ b/keras/src/layers/convolutional/conv_transpose_test.py
@@ -2,16 +2,16 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import testing
-from keras.backend.common.backend_utils import (
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
+from keras.src.backend.common.backend_utils import (
     _convert_conv_tranpose_padding_args_from_keras_to_torch,
 )
-from keras.backend.common.backend_utils import (
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_output_shape,
 )
-from keras.backend.common.backend_utils import (
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_padding_args_for_jax,
 )
 
diff --git a/keras/layers/convolutional/depthwise_conv1d.py b/keras/src/layers/convolutional/depthwise_conv1d.py
similarity index 97%
rename from keras/layers/convolutional/depthwise_conv1d.py
rename to keras/src/layers/convolutional/depthwise_conv1d.py
index 2d9db92d4160..02e5cc26e366 100644
--- a/keras/layers/convolutional/depthwise_conv1d.py
+++ b/keras/src/layers/convolutional/depthwise_conv1d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_depthwise_conv import BaseDepthwiseConv
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_depthwise_conv import BaseDepthwiseConv
 
 
 @keras_export("keras.layers.DepthwiseConv1D")
diff --git a/keras/layers/convolutional/depthwise_conv2d.py b/keras/src/layers/convolutional/depthwise_conv2d.py
similarity index 97%
rename from keras/layers/convolutional/depthwise_conv2d.py
rename to keras/src/layers/convolutional/depthwise_conv2d.py
index 0fb14337c2ad..9a169af0a8ec 100644
--- a/keras/layers/convolutional/depthwise_conv2d.py
+++ b/keras/src/layers/convolutional/depthwise_conv2d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_depthwise_conv import BaseDepthwiseConv
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_depthwise_conv import BaseDepthwiseConv
 
 
 @keras_export("keras.layers.DepthwiseConv2D")
diff --git a/keras/layers/convolutional/depthwise_conv_test.py b/keras/src/layers/convolutional/depthwise_conv_test.py
similarity index 99%
rename from keras/layers/convolutional/depthwise_conv_test.py
rename to keras/src/layers/convolutional/depthwise_conv_test.py
index 6aa0b8098287..a22967141aaa 100644
--- a/keras/layers/convolutional/depthwise_conv_test.py
+++ b/keras/src/layers/convolutional/depthwise_conv_test.py
@@ -3,8 +3,8 @@
 from absl.testing import parameterized
 from numpy.lib.stride_tricks import as_strided
 
-from keras import layers
-from keras import testing
+from keras.src import layers
+from keras.src import testing
 
 
 def _same_padding(input_size, kernel_size, stride):
diff --git a/keras/layers/convolutional/separable_conv1d.py b/keras/src/layers/convolutional/separable_conv1d.py
similarity index 98%
rename from keras/layers/convolutional/separable_conv1d.py
rename to keras/src/layers/convolutional/separable_conv1d.py
index 0c8cb101a306..2f71556750be 100644
--- a/keras/layers/convolutional/separable_conv1d.py
+++ b/keras/src/layers/convolutional/separable_conv1d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_separable_conv import BaseSeparableConv
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_separable_conv import BaseSeparableConv
 
 
 @keras_export(
diff --git a/keras/layers/convolutional/separable_conv2d.py b/keras/src/layers/convolutional/separable_conv2d.py
similarity index 98%
rename from keras/layers/convolutional/separable_conv2d.py
rename to keras/src/layers/convolutional/separable_conv2d.py
index 010fe6c29e58..503d2a22b7d9 100644
--- a/keras/layers/convolutional/separable_conv2d.py
+++ b/keras/src/layers/convolutional/separable_conv2d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.convolutional.base_separable_conv import BaseSeparableConv
+from keras.src.api_export import keras_export
+from keras.src.layers.convolutional.base_separable_conv import BaseSeparableConv
 
 
 @keras_export(
diff --git a/keras/layers/convolutional/separable_conv_test.py b/keras/src/layers/convolutional/separable_conv_test.py
similarity index 96%
rename from keras/layers/convolutional/separable_conv_test.py
rename to keras/src/layers/convolutional/separable_conv_test.py
index 9d5f3e02925b..4d6fda73516d 100644
--- a/keras/layers/convolutional/separable_conv_test.py
+++ b/keras/src/layers/convolutional/separable_conv_test.py
@@ -2,12 +2,16 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import layers
-from keras import testing
-from keras.layers.convolutional.conv_test import np_conv1d
-from keras.layers.convolutional.conv_test import np_conv2d
-from keras.layers.convolutional.depthwise_conv_test import np_depthwise_conv1d
-from keras.layers.convolutional.depthwise_conv_test import np_depthwise_conv2d
+from keras.src import layers
+from keras.src import testing
+from keras.src.layers.convolutional.conv_test import np_conv1d
+from keras.src.layers.convolutional.conv_test import np_conv2d
+from keras.src.layers.convolutional.depthwise_conv_test import (
+    np_depthwise_conv1d,
+)
+from keras.src.layers.convolutional.depthwise_conv_test import (
+    np_depthwise_conv2d,
+)
 
 
 class SeparableConvBasicTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/core/__init__.py b/keras/src/layers/core/__init__.py
similarity index 100%
rename from keras/layers/core/__init__.py
rename to keras/src/layers/core/__init__.py
diff --git a/keras/layers/core/dense.py b/keras/src/layers/core/dense.py
similarity index 98%
rename from keras/layers/core/dense.py
rename to keras/src/layers/core/dense.py
index d7dffadc0548..fad22e6b755e 100644
--- a/keras/layers/core/dense.py
+++ b/keras/src/layers/core/dense.py
@@ -1,16 +1,16 @@
 import ml_dtypes
 
-from keras import activations
-from keras import backend
-from keras import constraints
-from keras import dtype_policies
-from keras import initializers
-from keras import ops
-from keras import quantizers
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import activations
+from keras.src import backend
+from keras.src import constraints
+from keras.src import dtype_policies
+from keras.src import initializers
+from keras.src import ops
+from keras.src import quantizers
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.Dense")
diff --git a/keras/layers/core/dense_test.py b/keras/src/layers/core/dense_test.py
similarity index 98%
rename from keras/layers/core/dense_test.py
rename to keras/src/layers/core/dense_test.py
index e7161f7a3921..8a959543dc0f 100644
--- a/keras/layers/core/dense_test.py
+++ b/keras/src/layers/core/dense_test.py
@@ -4,17 +4,17 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import constraints
-from keras import layers
-from keras import models
-from keras import ops
-from keras import optimizers
-from keras import random
-from keras import saving
-from keras import testing
-from keras.backend.common import keras_tensor
-from keras.export import export_lib
+from keras.src import backend
+from keras.src import constraints
+from keras.src import layers
+from keras.src import models
+from keras.src import ops
+from keras.src import optimizers
+from keras.src import random
+from keras.src import saving
+from keras.src import testing
+from keras.src.backend.common import keras_tensor
+from keras.src.export import export_lib
 
 
 class DenseTest(testing.TestCase, parameterized.TestCase):
@@ -556,7 +556,7 @@ def test_quantize_float8_dtype_argument(self):
     def test_quantize_float8(self):
         import ml_dtypes
 
-        from keras import quantizers
+        from keras.src import quantizers
 
         layer = layers.Dense(units=32)
         layer.build((None, 16))
diff --git a/keras/layers/core/einsum_dense.py b/keras/src/layers/core/einsum_dense.py
similarity index 99%
rename from keras/layers/core/einsum_dense.py
rename to keras/src/layers/core/einsum_dense.py
index 95f7b7274215..8fcecc17c9c4 100644
--- a/keras/layers/core/einsum_dense.py
+++ b/keras/src/layers/core/einsum_dense.py
@@ -4,17 +4,17 @@
 import ml_dtypes
 import numpy as np
 
-from keras import activations
-from keras import backend
-from keras import constraints
-from keras import dtype_policies
-from keras import initializers
-from keras import ops
-from keras import quantizers
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import activations
+from keras.src import backend
+from keras.src import constraints
+from keras.src import dtype_policies
+from keras.src import initializers
+from keras.src import ops
+from keras.src import quantizers
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.EinsumDense")
diff --git a/keras/layers/core/einsum_dense_test.py b/keras/src/layers/core/einsum_dense_test.py
similarity index 98%
rename from keras/layers/core/einsum_dense_test.py
rename to keras/src/layers/core/einsum_dense_test.py
index dbf782e1e607..7ce83dd75f84 100644
--- a/keras/layers/core/einsum_dense_test.py
+++ b/keras/src/layers/core/einsum_dense_test.py
@@ -4,16 +4,16 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import constraints
-from keras import layers
-from keras import models
-from keras import ops
-from keras import optimizers
-from keras import random
-from keras import saving
-from keras import testing
-from keras.export import export_lib
+from keras.src import backend
+from keras.src import constraints
+from keras.src import layers
+from keras.src import models
+from keras.src import ops
+from keras.src import optimizers
+from keras.src import random
+from keras.src import saving
+from keras.src import testing
+from keras.src.export import export_lib
 
 
 class EinsumDenseTest(testing.TestCase, parameterized.TestCase):
@@ -659,7 +659,7 @@ def test_quantize_float8_dtype_argument(self):
     def test_quantize_float8(self):
         import ml_dtypes
 
-        from keras import quantizers
+        from keras.src import quantizers
 
         layer = layers.EinsumDense(
             "ab,bc->ac",
diff --git a/keras/layers/core/embedding.py b/keras/src/layers/core/embedding.py
similarity index 98%
rename from keras/layers/core/embedding.py
rename to keras/src/layers/core/embedding.py
index d7afb529bb9e..03a9a61ee15b 100644
--- a/keras/layers/core/embedding.py
+++ b/keras/src/layers/core/embedding.py
@@ -1,14 +1,14 @@
 import warnings
 
-from keras import backend
-from keras import constraints
-from keras import dtype_policies
-from keras import initializers
-from keras import ops
-from keras import quantizers
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src import constraints
+from keras.src import dtype_policies
+from keras.src import initializers
+from keras.src import ops
+from keras.src import quantizers
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.Embedding")
diff --git a/keras/layers/core/embedding_test.py b/keras/src/layers/core/embedding_test.py
similarity index 98%
rename from keras/layers/core/embedding_test.py
rename to keras/src/layers/core/embedding_test.py
index 2663ee1fce13..6c0af85a3095 100644
--- a/keras/layers/core/embedding_test.py
+++ b/keras/src/layers/core/embedding_test.py
@@ -4,14 +4,14 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import constraints
-from keras import layers
-from keras import models
-from keras import ops
-from keras import saving
-from keras.export import export_lib
-from keras.testing import test_case
+from keras.src import backend
+from keras.src import constraints
+from keras.src import layers
+from keras.src import models
+from keras.src import ops
+from keras.src import saving
+from keras.src.export import export_lib
+from keras.src.testing import test_case
 
 
 class EmbeddingTest(test_case.TestCase, parameterized.TestCase):
diff --git a/keras/layers/core/identity.py b/keras/src/layers/core/identity.py
similarity index 80%
rename from keras/layers/core/identity.py
rename to keras/src/layers/core/identity.py
index b1e1cd50912f..1fd329c3703f 100644
--- a/keras/layers/core/identity.py
+++ b/keras/src/layers/core/identity.py
@@ -1,7 +1,7 @@
-from keras import tree
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.layers.layer import Layer
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.Identity")
diff --git a/keras/layers/core/identity_test.py b/keras/src/layers/core/identity_test.py
similarity index 91%
rename from keras/layers/core/identity_test.py
rename to keras/src/layers/core/identity_test.py
index 456a292e1b01..1be760f531d6 100644
--- a/keras/layers/core/identity_test.py
+++ b/keras/src/layers/core/identity_test.py
@@ -1,9 +1,9 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class IdentityTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/core/input_layer.py b/keras/src/layers/core/input_layer.py
similarity index 97%
rename from keras/layers/core/input_layer.py
rename to keras/src/layers/core/input_layer.py
index 974681d57a44..6b4968c0d9b2 100644
--- a/keras/layers/core/input_layer.py
+++ b/keras/src/layers/core/input_layer.py
@@ -1,9 +1,9 @@
 import warnings
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.ops.node import Node
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.ops.node import Node
 
 
 @keras_export("keras.layers.InputLayer")
diff --git a/keras/layers/core/input_layer_test.py b/keras/src/layers/core/input_layer_test.py
similarity index 96%
rename from keras/layers/core/input_layer_test.py
rename to keras/src/layers/core/input_layer_test.py
index 2823486b155f..c75ec4ac9463 100644
--- a/keras/layers/core/input_layer_test.py
+++ b/keras/src/layers/core/input_layer_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import backend
-from keras import testing
-from keras.backend import KerasTensor
-from keras.layers import InputLayer
+from keras.src import backend
+from keras.src import testing
+from keras.src.backend import KerasTensor
+from keras.src.layers import InputLayer
 
 
 class InputLayerTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/core/lambda_layer.py b/keras/src/layers/core/lambda_layer.py
similarity index 97%
rename from keras/layers/core/lambda_layer.py
rename to keras/src/layers/core/lambda_layer.py
index 6ffb16ca7782..9980c6c35799 100644
--- a/keras/layers/core/lambda_layer.py
+++ b/keras/src/layers/core/lambda_layer.py
@@ -1,12 +1,12 @@
 import inspect
 import types
 
-from keras import backend
-from keras import tree
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.saving import serialization_lib
-from keras.utils import python_utils
+from keras.src import backend
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.saving import serialization_lib
+from keras.src.utils import python_utils
 
 
 @keras_export("keras.layers.Lambda")
diff --git a/keras/layers/core/lambda_layer_test.py b/keras/src/layers/core/lambda_layer_test.py
similarity index 97%
rename from keras/layers/core/lambda_layer_test.py
rename to keras/src/layers/core/lambda_layer_test.py
index d65cf8bbaf65..1f80bcb0206b 100644
--- a/keras/layers/core/lambda_layer_test.py
+++ b/keras/src/layers/core/lambda_layer_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class LambdaTest(testing.TestCase):
diff --git a/keras/layers/core/masking.py b/keras/src/layers/core/masking.py
similarity index 94%
rename from keras/layers/core/masking.py
rename to keras/src/layers/core/masking.py
index f7a05eb48b54..8658cdb2896b 100644
--- a/keras/layers/core/masking.py
+++ b/keras/src/layers/core/masking.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.Masking")
diff --git a/keras/layers/core/masking_test.py b/keras/src/layers/core/masking_test.py
similarity index 94%
rename from keras/layers/core/masking_test.py
rename to keras/src/layers/core/masking_test.py
index 115783dbce24..2e17f047c78b 100644
--- a/keras/layers/core/masking_test.py
+++ b/keras/src/layers/core/masking_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import layers
-from keras import models
-from keras import testing
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
 
 
 class MaskingTest(testing.TestCase):
diff --git a/keras/layers/core/wrapper.py b/keras/src/layers/core/wrapper.py
similarity index 91%
rename from keras/layers/core/wrapper.py
rename to keras/src/layers/core/wrapper.py
index ee7f1347791c..ee98a70a0291 100644
--- a/keras/layers/core/wrapper.py
+++ b/keras/src/layers/core/wrapper.py
@@ -1,6 +1,6 @@
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.saving import serialization_lib
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.saving import serialization_lib
 
 
 @keras_export("keras.layers.Wrapper")
diff --git a/keras/layers/core/wrapper_test.py b/keras/src/layers/core/wrapper_test.py
similarity index 96%
rename from keras/layers/core/wrapper_test.py
rename to keras/src/layers/core/wrapper_test.py
index a01194591eec..9302ca784240 100644
--- a/keras/layers/core/wrapper_test.py
+++ b/keras/src/layers/core/wrapper_test.py
@@ -1,8 +1,8 @@
 import pytest
 
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class ExampleWrapper(layers.Wrapper):
diff --git a/keras/layers/input_spec.py b/keras/src/layers/input_spec.py
similarity index 98%
rename from keras/layers/input_spec.py
rename to keras/src/layers/input_spec.py
index 6f47bd36aa80..72084d5cbdec 100644
--- a/keras/layers/input_spec.py
+++ b/keras/src/layers/input_spec.py
@@ -1,6 +1,6 @@
-from keras import backend
-from keras import tree
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src import tree
+from keras.src.api_export import keras_export
 
 
 @keras_export(["keras.InputSpec", "keras.layers.InputSpec"])
diff --git a/keras/layers/layer.py b/keras/src/layers/layer.py
similarity index 98%
rename from keras/layers/layer.py
rename to keras/src/layers/layer.py
index db91e349b987..eb251122b930 100644
--- a/keras/layers/layer.py
+++ b/keras/src/layers/layer.py
@@ -21,34 +21,34 @@
 import warnings
 from functools import wraps
 
-from keras import backend
-from keras import constraints
-from keras import dtype_policies
-from keras import initializers
-from keras import regularizers
-from keras import tree
-from keras import utils
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.backend.common import global_state
-from keras.backend.common.name_scope import current_path
-from keras.distribution import distribution_lib
-from keras.layers import input_spec
-from keras.metrics.metric import Metric
-from keras.ops.operation import Operation
-from keras.utils import python_utils
-from keras.utils import summary_utils
-from keras.utils import traceback_utils
-from keras.utils import tracking
+from keras.src import backend
+from keras.src import constraints
+from keras.src import dtype_policies
+from keras.src import initializers
+from keras.src import regularizers
+from keras.src import tree
+from keras.src import utils
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.backend.common import global_state
+from keras.src.backend.common.name_scope import current_path
+from keras.src.distribution import distribution_lib
+from keras.src.layers import input_spec
+from keras.src.metrics.metric import Metric
+from keras.src.ops.operation import Operation
+from keras.src.utils import python_utils
+from keras.src.utils import summary_utils
+from keras.src.utils import traceback_utils
+from keras.src.utils import tracking
 
 if backend.backend() == "tensorflow":
-    from keras.backend.tensorflow.layer import TFLayer as BackendLayer
+    from keras.src.backend.tensorflow.layer import TFLayer as BackendLayer
 elif backend.backend() == "jax":
-    from keras.backend.jax.layer import JaxLayer as BackendLayer
+    from keras.src.backend.jax.layer import JaxLayer as BackendLayer
 elif backend.backend() == "torch":
-    from keras.backend.torch.layer import TorchLayer as BackendLayer
+    from keras.src.backend.torch.layer import TorchLayer as BackendLayer
 elif backend.backend() == "numpy":
-    from keras.backend.numpy.layer import NumpyLayer as BackendLayer
+    from keras.src.backend.numpy.layer import NumpyLayer as BackendLayer
 else:
     raise RuntimeError(
         f"Backend '{backend.backend()}' must implement a layer mixin class."
diff --git a/keras/layers/layer_test.py b/keras/src/layers/layer_test.py
similarity index 99%
rename from keras/layers/layer_test.py
rename to keras/src/layers/layer_test.py
index 0e8ca4548df5..ad274da84af2 100644
--- a/keras/layers/layer_test.py
+++ b/keras/src/layers/layer_test.py
@@ -1,13 +1,13 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import dtype_policies
-from keras import layers
-from keras import metrics
-from keras import models
-from keras import ops
-from keras import testing
+from keras.src import backend
+from keras.src import dtype_policies
+from keras.src import layers
+from keras.src import metrics
+from keras.src import models
+from keras.src import ops
+from keras.src import testing
 
 
 class LayerTest(testing.TestCase):
diff --git a/keras/layers/merging/__init__.py b/keras/src/layers/merging/__init__.py
similarity index 100%
rename from keras/layers/merging/__init__.py
rename to keras/src/layers/merging/__init__.py
diff --git a/keras/layers/merging/add.py b/keras/src/layers/merging/add.py
similarity index 94%
rename from keras/layers/merging/add.py
rename to keras/src/layers/merging/add.py
index 968f7f374017..bf5f1b2a6aac 100644
--- a/keras/layers/merging/add.py
+++ b/keras/src/layers/merging/add.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.merging.base_merge import Merge
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.merging.base_merge import Merge
 
 
 @keras_export("keras.layers.Add")
diff --git a/keras/layers/merging/average.py b/keras/src/layers/merging/average.py
similarity index 94%
rename from keras/layers/merging/average.py
rename to keras/src/layers/merging/average.py
index 5763c99a6dd1..f90f75beead0 100644
--- a/keras/layers/merging/average.py
+++ b/keras/src/layers/merging/average.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.merging.base_merge import Merge
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.merging.base_merge import Merge
 
 
 @keras_export("keras.layers.Average")
diff --git a/keras/layers/merging/base_merge.py b/keras/src/layers/merging/base_merge.py
similarity index 98%
rename from keras/layers/merging/base_merge.py
rename to keras/src/layers/merging/base_merge.py
index ae00f8121f62..69591e8cd074 100644
--- a/keras/layers/merging/base_merge.py
+++ b/keras/src/layers/merging/base_merge.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import ops
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src import ops
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.layers.layer import Layer
 
 
 class Merge(Layer):
diff --git a/keras/layers/merging/concatenate.py b/keras/src/layers/merging/concatenate.py
similarity index 98%
rename from keras/layers/merging/concatenate.py
rename to keras/src/layers/merging/concatenate.py
index 37f9536d8d57..9c1d26ae8d5f 100644
--- a/keras/layers/merging/concatenate.py
+++ b/keras/src/layers/merging/concatenate.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.merging.base_merge import Merge
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.merging.base_merge import Merge
 
 
 @keras_export("keras.layers.Concatenate")
diff --git a/keras/layers/merging/dot.py b/keras/src/layers/merging/dot.py
similarity index 98%
rename from keras/layers/merging/dot.py
rename to keras/src/layers/merging/dot.py
index 944ebac9ad65..e580269bef67 100644
--- a/keras/layers/merging/dot.py
+++ b/keras/src/layers/merging/dot.py
@@ -1,7 +1,7 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.merging.base_merge import Merge
-from keras.utils.numerical_utils import normalize
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.merging.base_merge import Merge
+from keras.src.utils.numerical_utils import normalize
 
 
 def batch_dot(x, y, axes=None):
diff --git a/keras/layers/merging/maximum.py b/keras/src/layers/merging/maximum.py
similarity index 94%
rename from keras/layers/merging/maximum.py
rename to keras/src/layers/merging/maximum.py
index fa71c1314ce1..47734a8470d5 100644
--- a/keras/layers/merging/maximum.py
+++ b/keras/src/layers/merging/maximum.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.merging.base_merge import Merge
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.merging.base_merge import Merge
 
 
 @keras_export("keras.layers.Maximum")
diff --git a/keras/layers/merging/merging_test.py b/keras/src/layers/merging/merging_test.py
similarity index 98%
rename from keras/layers/merging/merging_test.py
rename to keras/src/layers/merging/merging_test.py
index 1518ae23d3d7..1419dc855b83 100644
--- a/keras/layers/merging/merging_test.py
+++ b/keras/src/layers/merging/merging_test.py
@@ -2,10 +2,10 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
 
 
 def np_dot(a, b, axes):
diff --git a/keras/layers/merging/minimum.py b/keras/src/layers/merging/minimum.py
similarity index 94%
rename from keras/layers/merging/minimum.py
rename to keras/src/layers/merging/minimum.py
index bca89abd609f..19137f08a5b3 100644
--- a/keras/layers/merging/minimum.py
+++ b/keras/src/layers/merging/minimum.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.merging.base_merge import Merge
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.merging.base_merge import Merge
 
 
 @keras_export("keras.layers.Minimum")
diff --git a/keras/layers/merging/multiply.py b/keras/src/layers/merging/multiply.py
similarity index 94%
rename from keras/layers/merging/multiply.py
rename to keras/src/layers/merging/multiply.py
index 929b51191603..d908429d1c5b 100644
--- a/keras/layers/merging/multiply.py
+++ b/keras/src/layers/merging/multiply.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.merging.base_merge import Merge
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.merging.base_merge import Merge
 
 
 @keras_export("keras.layers.Multiply")
diff --git a/keras/layers/merging/subtract.py b/keras/src/layers/merging/subtract.py
similarity index 95%
rename from keras/layers/merging/subtract.py
rename to keras/src/layers/merging/subtract.py
index 4dc7839172b0..78036adaf233 100644
--- a/keras/layers/merging/subtract.py
+++ b/keras/src/layers/merging/subtract.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.merging.base_merge import Merge
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.merging.base_merge import Merge
 
 
 @keras_export("keras.layers.Subtract")
diff --git a/keras/layers/normalization/__init__.py b/keras/src/layers/normalization/__init__.py
similarity index 100%
rename from keras/layers/normalization/__init__.py
rename to keras/src/layers/normalization/__init__.py
diff --git a/keras/layers/normalization/batch_normalization.py b/keras/src/layers/normalization/batch_normalization.py
similarity index 97%
rename from keras/layers/normalization/batch_normalization.py
rename to keras/src/layers/normalization/batch_normalization.py
index d752e8d1a64f..ecbd1a453926 100644
--- a/keras/layers/normalization/batch_normalization.py
+++ b/keras/src/layers/normalization/batch_normalization.py
@@ -1,12 +1,12 @@
-from keras import backend
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.backend import standardize_dtype
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.backend import standardize_dtype
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.BatchNormalization")
diff --git a/keras/layers/normalization/batch_normalization_test.py b/keras/src/layers/normalization/batch_normalization_test.py
similarity index 97%
rename from keras/layers/normalization/batch_normalization_test.py
rename to keras/src/layers/normalization/batch_normalization_test.py
index 1a1d1b10c96d..b0ccdfd0288f 100644
--- a/keras/layers/normalization/batch_normalization_test.py
+++ b/keras/src/layers/normalization/batch_normalization_test.py
@@ -2,12 +2,12 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import ops
-from keras import testing
-from keras.losses import MeanSquaredError
-from keras.models import Model
+from keras.src import backend
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
+from keras.src.losses import MeanSquaredError
+from keras.src.models import Model
 
 
 class BatchNormalizationTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/normalization/group_normalization.py b/keras/src/layers/normalization/group_normalization.py
similarity index 96%
rename from keras/layers/normalization/group_normalization.py
rename to keras/src/layers/normalization/group_normalization.py
index a04b672c358a..f70fb69f3ed7 100644
--- a/keras/layers/normalization/group_normalization.py
+++ b/keras/src/layers/normalization/group_normalization.py
@@ -1,10 +1,10 @@
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.GroupNormalization")
diff --git a/keras/layers/normalization/group_normalization_test.py b/keras/src/layers/normalization/group_normalization_test.py
similarity index 97%
rename from keras/layers/normalization/group_normalization_test.py
rename to keras/src/layers/normalization/group_normalization_test.py
index c836b8930643..76e4eae280a8 100644
--- a/keras/layers/normalization/group_normalization_test.py
+++ b/keras/src/layers/normalization/group_normalization_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 import pytest
 
-from keras import constraints
-from keras import layers
-from keras import regularizers
-from keras import testing
+from keras.src import constraints
+from keras.src import layers
+from keras.src import regularizers
+from keras.src import testing
 
 
 class GroupNormalizationTest(testing.TestCase):
diff --git a/keras/layers/normalization/layer_normalization.py b/keras/src/layers/normalization/layer_normalization.py
similarity index 97%
rename from keras/layers/normalization/layer_normalization.py
rename to keras/src/layers/normalization/layer_normalization.py
index c26d008b0f69..854a071932b1 100644
--- a/keras/layers/normalization/layer_normalization.py
+++ b/keras/src/layers/normalization/layer_normalization.py
@@ -1,9 +1,9 @@
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.LayerNormalization")
diff --git a/keras/layers/normalization/layer_normalization_test.py b/keras/src/layers/normalization/layer_normalization_test.py
similarity index 96%
rename from keras/layers/normalization/layer_normalization_test.py
rename to keras/src/layers/normalization/layer_normalization_test.py
index 87550ff7aa3a..6afbd5435618 100644
--- a/keras/layers/normalization/layer_normalization_test.py
+++ b/keras/src/layers/normalization/layer_normalization_test.py
@@ -1,11 +1,11 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import ops
-from keras import regularizers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src import testing
 
 
 class LayerNormalizationTest(testing.TestCase):
diff --git a/keras/layers/normalization/spectral_normalization.py b/keras/src/layers/normalization/spectral_normalization.py
similarity index 94%
rename from keras/layers/normalization/spectral_normalization.py
rename to keras/src/layers/normalization/spectral_normalization.py
index 84471125b49d..727d6bb58dbd 100644
--- a/keras/layers/normalization/spectral_normalization.py
+++ b/keras/src/layers/normalization/spectral_normalization.py
@@ -1,9 +1,9 @@
-from keras import initializers
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers import Wrapper
-from keras.layers.input_spec import InputSpec
-from keras.utils.numerical_utils import normalize
+from keras.src import initializers
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers import Wrapper
+from keras.src.layers.input_spec import InputSpec
+from keras.src.utils.numerical_utils import normalize
 
 
 @keras_export("keras.layers.SpectralNormalization")
diff --git a/keras/layers/normalization/spectral_normalization_test.py b/keras/src/layers/normalization/spectral_normalization_test.py
similarity index 94%
rename from keras/layers/normalization/spectral_normalization_test.py
rename to keras/src/layers/normalization/spectral_normalization_test.py
index 632edd20ecbe..b3cc47d8d9f0 100644
--- a/keras/layers/normalization/spectral_normalization_test.py
+++ b/keras/src/layers/normalization/spectral_normalization_test.py
@@ -1,11 +1,11 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import initializers
-from keras import layers
-from keras import models
-from keras import testing
+from keras.src import backend
+from keras.src import initializers
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
 
 
 class SpectralNormalizationTest(testing.TestCase):
diff --git a/keras/layers/normalization/unit_normalization.py b/keras/src/layers/normalization/unit_normalization.py
similarity index 93%
rename from keras/layers/normalization/unit_normalization.py
rename to keras/src/layers/normalization/unit_normalization.py
index 09b5a34e2721..1dbf97c74fe1 100644
--- a/keras/layers/normalization/unit_normalization.py
+++ b/keras/src/layers/normalization/unit_normalization.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.UnitNormalization")
diff --git a/keras/layers/normalization/unit_normalization_test.py b/keras/src/layers/normalization/unit_normalization_test.py
similarity index 95%
rename from keras/layers/normalization/unit_normalization_test.py
rename to keras/src/layers/normalization/unit_normalization_test.py
index 591e03311ad2..ea9201fb7e68 100644
--- a/keras/layers/normalization/unit_normalization_test.py
+++ b/keras/src/layers/normalization/unit_normalization_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 def squared_l2_norm(x):
diff --git a/keras/layers/pooling/__init__.py b/keras/src/layers/pooling/__init__.py
similarity index 100%
rename from keras/layers/pooling/__init__.py
rename to keras/src/layers/pooling/__init__.py
diff --git a/keras/layers/pooling/average_pooling1d.py b/keras/src/layers/pooling/average_pooling1d.py
similarity index 96%
rename from keras/layers/pooling/average_pooling1d.py
rename to keras/src/layers/pooling/average_pooling1d.py
index fb5ee068bfb1..43b91f0f2ace 100644
--- a/keras/layers/pooling/average_pooling1d.py
+++ b/keras/src/layers/pooling/average_pooling1d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.pooling.base_pooling import BasePooling
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_pooling import BasePooling
 
 
 @keras_export(["keras.layers.AveragePooling1D", "keras.layers.AvgPool1D"])
diff --git a/keras/layers/pooling/average_pooling2d.py b/keras/src/layers/pooling/average_pooling2d.py
similarity index 97%
rename from keras/layers/pooling/average_pooling2d.py
rename to keras/src/layers/pooling/average_pooling2d.py
index 16bb8ee250f6..778c40191f5d 100644
--- a/keras/layers/pooling/average_pooling2d.py
+++ b/keras/src/layers/pooling/average_pooling2d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.pooling.base_pooling import BasePooling
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_pooling import BasePooling
 
 
 @keras_export(["keras.layers.AveragePooling2D", "keras.layers.AvgPool2D"])
diff --git a/keras/layers/pooling/average_pooling3d.py b/keras/src/layers/pooling/average_pooling3d.py
similarity index 96%
rename from keras/layers/pooling/average_pooling3d.py
rename to keras/src/layers/pooling/average_pooling3d.py
index 9d6da60a86e1..ed4d2269459c 100644
--- a/keras/layers/pooling/average_pooling3d.py
+++ b/keras/src/layers/pooling/average_pooling3d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.pooling.base_pooling import BasePooling
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_pooling import BasePooling
 
 
 @keras_export(["keras.layers.AveragePooling3D", "keras.layers.AvgPool3D"])
diff --git a/keras/layers/pooling/average_pooling_test.py b/keras/src/layers/pooling/average_pooling_test.py
similarity index 99%
rename from keras/layers/pooling/average_pooling_test.py
rename to keras/src/layers/pooling/average_pooling_test.py
index 6256876b6d6a..ae76d2c77f79 100644
--- a/keras/layers/pooling/average_pooling_test.py
+++ b/keras/src/layers/pooling/average_pooling_test.py
@@ -3,9 +3,9 @@
 from absl.testing import parameterized
 from numpy.lib.stride_tricks import as_strided
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 def _same_padding(input_size, pool_size, stride):
diff --git a/keras/layers/pooling/base_global_pooling.py b/keras/src/layers/pooling/base_global_pooling.py
similarity index 91%
rename from keras/layers/pooling/base_global_pooling.py
rename to keras/src/layers/pooling/base_global_pooling.py
index da7a0fcd9d42..260e1d8eba37 100644
--- a/keras/layers/pooling/base_global_pooling.py
+++ b/keras/src/layers/pooling/base_global_pooling.py
@@ -1,6 +1,6 @@
-from keras import backend
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 class BaseGlobalPooling(Layer):
diff --git a/keras/layers/pooling/base_pooling.py b/keras/src/layers/pooling/base_pooling.py
similarity index 89%
rename from keras/layers/pooling/base_pooling.py
rename to keras/src/layers/pooling/base_pooling.py
index 85751086cc96..e2c85394f731 100644
--- a/keras/layers/pooling/base_pooling.py
+++ b/keras/src/layers/pooling/base_pooling.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras import ops
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.ops.operation_utils import compute_pooling_output_shape
-from keras.utils import argument_validation
+from keras.src import backend
+from keras.src import ops
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.ops.operation_utils import compute_pooling_output_shape
+from keras.src.utils import argument_validation
 
 
 class BasePooling(Layer):
diff --git a/keras/layers/pooling/global_average_pooling1d.py b/keras/src/layers/pooling/global_average_pooling1d.py
similarity index 94%
rename from keras/layers/pooling/global_average_pooling1d.py
rename to keras/src/layers/pooling/global_average_pooling1d.py
index f5b4d0a0886c..6db5fb923c8c 100644
--- a/keras/layers/pooling/global_average_pooling1d.py
+++ b/keras/src/layers/pooling/global_average_pooling1d.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.pooling.base_global_pooling import BaseGlobalPooling
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_global_pooling import BaseGlobalPooling
 
 
 @keras_export(
diff --git a/keras/layers/pooling/global_average_pooling2d.py b/keras/src/layers/pooling/global_average_pooling2d.py
similarity index 94%
rename from keras/layers/pooling/global_average_pooling2d.py
rename to keras/src/layers/pooling/global_average_pooling2d.py
index d6147ea21f04..1536c3c302e8 100644
--- a/keras/layers/pooling/global_average_pooling2d.py
+++ b/keras/src/layers/pooling/global_average_pooling2d.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.pooling.base_global_pooling import BaseGlobalPooling
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_global_pooling import BaseGlobalPooling
 
 
 @keras_export(
diff --git a/keras/layers/pooling/global_average_pooling3d.py b/keras/src/layers/pooling/global_average_pooling3d.py
similarity index 94%
rename from keras/layers/pooling/global_average_pooling3d.py
rename to keras/src/layers/pooling/global_average_pooling3d.py
index 8fa05eea5a87..14ffc5bfc4d0 100644
--- a/keras/layers/pooling/global_average_pooling3d.py
+++ b/keras/src/layers/pooling/global_average_pooling3d.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.pooling.base_global_pooling import BaseGlobalPooling
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_global_pooling import BaseGlobalPooling
 
 
 @keras_export(
diff --git a/keras/layers/pooling/global_average_pooling_test.py b/keras/src/layers/pooling/global_average_pooling_test.py
similarity index 99%
rename from keras/layers/pooling/global_average_pooling_test.py
rename to keras/src/layers/pooling/global_average_pooling_test.py
index 4069abc75940..868601c31e65 100644
--- a/keras/layers/pooling/global_average_pooling_test.py
+++ b/keras/src/layers/pooling/global_average_pooling_test.py
@@ -2,8 +2,8 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import layers
-from keras import testing
+from keras.src import layers
+from keras.src import testing
 
 
 @pytest.mark.requires_trainable_backend
diff --git a/keras/layers/pooling/global_max_pooling1d.py b/keras/src/layers/pooling/global_max_pooling1d.py
similarity index 93%
rename from keras/layers/pooling/global_max_pooling1d.py
rename to keras/src/layers/pooling/global_max_pooling1d.py
index 2956474cb004..7c6d9ff79692 100644
--- a/keras/layers/pooling/global_max_pooling1d.py
+++ b/keras/src/layers/pooling/global_max_pooling1d.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.pooling.base_global_pooling import BaseGlobalPooling
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_global_pooling import BaseGlobalPooling
 
 
 @keras_export(
diff --git a/keras/layers/pooling/global_max_pooling2d.py b/keras/src/layers/pooling/global_max_pooling2d.py
similarity index 94%
rename from keras/layers/pooling/global_max_pooling2d.py
rename to keras/src/layers/pooling/global_max_pooling2d.py
index 66a117cd58f0..289ebe0a87d6 100644
--- a/keras/layers/pooling/global_max_pooling2d.py
+++ b/keras/src/layers/pooling/global_max_pooling2d.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.pooling.base_global_pooling import BaseGlobalPooling
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_global_pooling import BaseGlobalPooling
 
 
 @keras_export(
diff --git a/keras/layers/pooling/global_max_pooling3d.py b/keras/src/layers/pooling/global_max_pooling3d.py
similarity index 94%
rename from keras/layers/pooling/global_max_pooling3d.py
rename to keras/src/layers/pooling/global_max_pooling3d.py
index fb4598356d8f..07e1eb065bc7 100644
--- a/keras/layers/pooling/global_max_pooling3d.py
+++ b/keras/src/layers/pooling/global_max_pooling3d.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.pooling.base_global_pooling import BaseGlobalPooling
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_global_pooling import BaseGlobalPooling
 
 
 @keras_export(
diff --git a/keras/layers/pooling/global_max_pooling_test.py b/keras/src/layers/pooling/global_max_pooling_test.py
similarity index 98%
rename from keras/layers/pooling/global_max_pooling_test.py
rename to keras/src/layers/pooling/global_max_pooling_test.py
index 6b413fd17461..b2d5cb6ada39 100644
--- a/keras/layers/pooling/global_max_pooling_test.py
+++ b/keras/src/layers/pooling/global_max_pooling_test.py
@@ -2,8 +2,8 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import layers
-from keras import testing
+from keras.src import layers
+from keras.src import testing
 
 
 @pytest.mark.requires_trainable_backend
diff --git a/keras/layers/pooling/max_pooling1d.py b/keras/src/layers/pooling/max_pooling1d.py
similarity index 96%
rename from keras/layers/pooling/max_pooling1d.py
rename to keras/src/layers/pooling/max_pooling1d.py
index 74505b450e27..3636a984c764 100644
--- a/keras/layers/pooling/max_pooling1d.py
+++ b/keras/src/layers/pooling/max_pooling1d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.pooling.base_pooling import BasePooling
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_pooling import BasePooling
 
 
 @keras_export(["keras.layers.MaxPooling1D", "keras.layers.MaxPool1D"])
diff --git a/keras/layers/pooling/max_pooling2d.py b/keras/src/layers/pooling/max_pooling2d.py
similarity index 97%
rename from keras/layers/pooling/max_pooling2d.py
rename to keras/src/layers/pooling/max_pooling2d.py
index 8c0e4ee65204..d2189f9e841a 100644
--- a/keras/layers/pooling/max_pooling2d.py
+++ b/keras/src/layers/pooling/max_pooling2d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.pooling.base_pooling import BasePooling
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_pooling import BasePooling
 
 
 @keras_export(["keras.layers.MaxPooling2D", "keras.layers.MaxPool2D"])
diff --git a/keras/layers/pooling/max_pooling3d.py b/keras/src/layers/pooling/max_pooling3d.py
similarity index 96%
rename from keras/layers/pooling/max_pooling3d.py
rename to keras/src/layers/pooling/max_pooling3d.py
index 9ddbb38c0f07..225df65fb1e2 100644
--- a/keras/layers/pooling/max_pooling3d.py
+++ b/keras/src/layers/pooling/max_pooling3d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.pooling.base_pooling import BasePooling
+from keras.src.api_export import keras_export
+from keras.src.layers.pooling.base_pooling import BasePooling
 
 
 @keras_export(["keras.layers.MaxPooling3D", "keras.layers.MaxPool3D"])
diff --git a/keras/layers/pooling/max_pooling_test.py b/keras/src/layers/pooling/max_pooling_test.py
similarity index 99%
rename from keras/layers/pooling/max_pooling_test.py
rename to keras/src/layers/pooling/max_pooling_test.py
index 418a77f8327c..be1adb7ecfdb 100644
--- a/keras/layers/pooling/max_pooling_test.py
+++ b/keras/src/layers/pooling/max_pooling_test.py
@@ -3,8 +3,8 @@
 from absl.testing import parameterized
 from numpy.lib.stride_tricks import as_strided
 
-from keras import layers
-from keras import testing
+from keras.src import layers
+from keras.src import testing
 
 
 def _same_padding(input_size, pool_size, stride):
diff --git a/keras/layers/preprocessing/__init__.py b/keras/src/layers/preprocessing/__init__.py
similarity index 100%
rename from keras/layers/preprocessing/__init__.py
rename to keras/src/layers/preprocessing/__init__.py
diff --git a/keras/layers/preprocessing/audio_preprocessing.py b/keras/src/layers/preprocessing/audio_preprocessing.py
similarity index 99%
rename from keras/layers/preprocessing/audio_preprocessing.py
rename to keras/src/layers/preprocessing/audio_preprocessing.py
index 4c22977a8720..f91a4ccd8ceb 100644
--- a/keras/layers/preprocessing/audio_preprocessing.py
+++ b/keras/src/layers/preprocessing/audio_preprocessing.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
 
 # mel spectrum constants.
 _MEL_BREAK_FREQUENCY_HERTZ = 700.0
diff --git a/keras/layers/preprocessing/audio_preprocessing_test.py b/keras/src/layers/preprocessing/audio_preprocessing_test.py
similarity index 98%
rename from keras/layers/preprocessing/audio_preprocessing_test.py
rename to keras/src/layers/preprocessing/audio_preprocessing_test.py
index 3f45fcc3f1de..745794e11cd9 100644
--- a/keras/layers/preprocessing/audio_preprocessing_test.py
+++ b/keras/src/layers/preprocessing/audio_preprocessing_test.py
@@ -3,8 +3,8 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import layers
-from keras import testing
+from keras.src import layers
+from keras.src import testing
 
 
 class MelSpectrogramTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/preprocessing/category_encoding.py b/keras/src/layers/preprocessing/category_encoding.py
similarity index 97%
rename from keras/layers/preprocessing/category_encoding.py
rename to keras/src/layers/preprocessing/category_encoding.py
index 2feb929dee2c..bf30752eaedd 100644
--- a/keras/layers/preprocessing/category_encoding.py
+++ b/keras/src/layers/preprocessing/category_encoding.py
@@ -1,7 +1,7 @@
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.utils import backend_utils
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.utils import backend_utils
 
 
 @keras_export("keras.layers.CategoryEncoding")
diff --git a/keras/layers/preprocessing/category_encoding_test.py b/keras/src/layers/preprocessing/category_encoding_test.py
similarity index 99%
rename from keras/layers/preprocessing/category_encoding_test.py
rename to keras/src/layers/preprocessing/category_encoding_test.py
index da55f9d35297..5ac8ebff7f07 100644
--- a/keras/layers/preprocessing/category_encoding_test.py
+++ b/keras/src/layers/preprocessing/category_encoding_test.py
@@ -2,9 +2,9 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 TEST_CASES = [{"testcase_name": "dense", "sparse": False}]
 if backend.SUPPORTS_SPARSE_TENSORS:
diff --git a/keras/layers/preprocessing/center_crop.py b/keras/src/layers/preprocessing/center_crop.py
similarity index 96%
rename from keras/layers/preprocessing/center_crop.py
rename to keras/src/layers/preprocessing/center_crop.py
index 3a2dadfbeaec..e5fbbaa8a333 100644
--- a/keras/layers/preprocessing/center_crop.py
+++ b/keras/src/layers/preprocessing/center_crop.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.utils import image_utils
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.utils import image_utils
 
 
 @keras_export("keras.layers.CenterCrop")
diff --git a/keras/layers/preprocessing/center_crop_test.py b/keras/src/layers/preprocessing/center_crop_test.py
similarity index 98%
rename from keras/layers/preprocessing/center_crop_test.py
rename to keras/src/layers/preprocessing/center_crop_test.py
index 8fbb429b6f4c..4652f9abee16 100644
--- a/keras/layers/preprocessing/center_crop_test.py
+++ b/keras/src/layers/preprocessing/center_crop_test.py
@@ -3,9 +3,9 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class CenterCropTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/preprocessing/discretization.py b/keras/src/layers/preprocessing/discretization.py
similarity index 97%
rename from keras/layers/preprocessing/discretization.py
rename to keras/src/layers/preprocessing/discretization.py
index e8a3cbbe1405..7b40857d8371 100644
--- a/keras/layers/preprocessing/discretization.py
+++ b/keras/src/layers/preprocessing/discretization.py
@@ -1,11 +1,11 @@
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.utils import argument_validation
-from keras.utils import numerical_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.utils import argument_validation
+from keras.src.utils import numerical_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.layers.Discretization")
diff --git a/keras/layers/preprocessing/discretization_test.py b/keras/src/layers/preprocessing/discretization_test.py
similarity index 96%
rename from keras/layers/preprocessing/discretization_test.py
rename to keras/src/layers/preprocessing/discretization_test.py
index 8677282de7fc..e33dd6a706d1 100644
--- a/keras/layers/preprocessing/discretization_test.py
+++ b/keras/src/layers/preprocessing/discretization_test.py
@@ -5,11 +5,11 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import testing
-from keras.saving import saving_api
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
+from keras.src.saving import saving_api
 
 
 class DiscretizationTest(testing.TestCase, parameterized.TestCase):
@@ -169,7 +169,7 @@ def test_saving(self):
         reason="Sparse tensor only works in TensorFlow",
     )
     def test_sparse_output(self, output_mode, input_array, expected_output):
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         x = np.array(input_array)
         layer = layers.Discretization(
diff --git a/keras/layers/preprocessing/feature_space.py b/keras/src/layers/preprocessing/feature_space.py
similarity index 98%
rename from keras/layers/preprocessing/feature_space.py
rename to keras/src/layers/preprocessing/feature_space.py
index c2b0a9b15581..f66b0328f4c1 100644
--- a/keras/layers/preprocessing/feature_space.py
+++ b/keras/src/layers/preprocessing/feature_space.py
@@ -1,13 +1,13 @@
-from keras import backend
-from keras import layers
-from keras import tree
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.saving import saving_lib
-from keras.saving import serialization_lib
-from keras.utils import backend_utils
-from keras.utils.module_utils import tensorflow as tf
-from keras.utils.naming import auto_name
+from keras.src import backend
+from keras.src import layers
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.saving import saving_lib
+from keras.src.saving import serialization_lib
+from keras.src.utils import backend_utils
+from keras.src.utils.module_utils import tensorflow as tf
+from keras.src.utils.naming import auto_name
 
 
 class Cross:
@@ -277,7 +277,7 @@ def feature(cls, dtype, preprocessor, output_mode):
 
     @classmethod
     def float(cls, name=None):
-        from keras.layers.core import identity
+        from keras.src.layers.core import identity
 
         name = name or auto_name("float")
         preprocessor = identity.Identity(
diff --git a/keras/layers/preprocessing/feature_space_test.py b/keras/src/layers/preprocessing/feature_space_test.py
similarity index 98%
rename from keras/layers/preprocessing/feature_space_test.py
rename to keras/src/layers/preprocessing/feature_space_test.py
index 84738520e0ab..475ad09b319d 100644
--- a/keras/layers/preprocessing/feature_space_test.py
+++ b/keras/src/layers/preprocessing/feature_space_test.py
@@ -3,13 +3,13 @@
 import pytest
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import ops
-from keras import testing
-from keras.layers.preprocessing import feature_space
-from keras.saving import saving_api
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import ops
+from keras.src import testing
+from keras.src.layers.preprocessing import feature_space
+from keras.src.saving import saving_api
 
 
 class FeatureSpaceTest(testing.TestCase):
diff --git a/keras/layers/preprocessing/hashed_crossing.py b/keras/src/layers/preprocessing/hashed_crossing.py
similarity index 96%
rename from keras/layers/preprocessing/hashed_crossing.py
rename to keras/src/layers/preprocessing/hashed_crossing.py
index 1daebf8059fb..f2182bcd898b 100644
--- a/keras/layers/preprocessing/hashed_crossing.py
+++ b/keras/src/layers/preprocessing/hashed_crossing.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
-from keras.utils import backend_utils
-from keras.utils import tf_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
+from keras.src.utils import backend_utils
+from keras.src.utils import tf_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.layers.HashedCrossing")
diff --git a/keras/layers/preprocessing/hashed_crossing_test.py b/keras/src/layers/preprocessing/hashed_crossing_test.py
similarity index 98%
rename from keras/layers/preprocessing/hashed_crossing_test.py
rename to keras/src/layers/preprocessing/hashed_crossing_test.py
index 53a4c0390c29..d599e4a1c60d 100644
--- a/keras/layers/preprocessing/hashed_crossing_test.py
+++ b/keras/src/layers/preprocessing/hashed_crossing_test.py
@@ -2,9 +2,9 @@
 import pytest
 import tensorflow as tf
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class HashedCrossingTest(testing.TestCase):
diff --git a/keras/layers/preprocessing/hashing.py b/keras/src/layers/preprocessing/hashing.py
similarity index 97%
rename from keras/layers/preprocessing/hashing.py
rename to keras/src/layers/preprocessing/hashing.py
index 832dd234fbab..3a05b11ed418 100644
--- a/keras/layers/preprocessing/hashing.py
+++ b/keras/src/layers/preprocessing/hashing.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.utils import backend_utils
-from keras.utils import tf_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.utils import backend_utils
+from keras.src.utils import tf_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.layers.Hashing")
diff --git a/keras/layers/preprocessing/hashing_test.py b/keras/src/layers/preprocessing/hashing_test.py
similarity index 99%
rename from keras/layers/preprocessing/hashing_test.py
rename to keras/src/layers/preprocessing/hashing_test.py
index cabd567aa6bb..d5836d9741ac 100644
--- a/keras/layers/preprocessing/hashing_test.py
+++ b/keras/src/layers/preprocessing/hashing_test.py
@@ -5,11 +5,11 @@
 import tensorflow as tf
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import testing
-from keras.saving import load_model
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
+from keras.src.saving import load_model
 
 
 class ArrayLike:
diff --git a/keras/layers/preprocessing/index_lookup.py b/keras/src/layers/preprocessing/index_lookup.py
similarity index 99%
rename from keras/layers/preprocessing/index_lookup.py
rename to keras/src/layers/preprocessing/index_lookup.py
index a99651f62ea7..91436fce49d3 100644
--- a/keras/layers/preprocessing/index_lookup.py
+++ b/keras/src/layers/preprocessing/index_lookup.py
@@ -2,11 +2,11 @@
 
 import numpy as np
 
-from keras import backend
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
-from keras.utils import tf_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
+from keras.src.utils import tf_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 class IndexLookup(Layer):
diff --git a/keras/layers/preprocessing/index_lookup_test.py b/keras/src/layers/preprocessing/index_lookup_test.py
similarity index 99%
rename from keras/layers/preprocessing/index_lookup_test.py
rename to keras/src/layers/preprocessing/index_lookup_test.py
index 1a0ef9428beb..1cdda22c8c00 100644
--- a/keras/layers/preprocessing/index_lookup_test.py
+++ b/keras/src/layers/preprocessing/index_lookup_test.py
@@ -5,11 +5,11 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import testing
-from keras.saving import saving_api
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
+from keras.src.saving import saving_api
 
 
 @pytest.mark.skipif(
diff --git a/keras/layers/preprocessing/integer_lookup.py b/keras/src/layers/preprocessing/integer_lookup.py
similarity index 98%
rename from keras/layers/preprocessing/integer_lookup.py
rename to keras/src/layers/preprocessing/integer_lookup.py
index 121eedf45061..bf357552e57e 100644
--- a/keras/layers/preprocessing/integer_lookup.py
+++ b/keras/src/layers/preprocessing/integer_lookup.py
@@ -1,10 +1,10 @@
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.index_lookup import IndexLookup
-from keras.utils import backend_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.index_lookup import IndexLookup
+from keras.src.utils import backend_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.layers.IntegerLookup")
diff --git a/keras/layers/preprocessing/integer_lookup_test.py b/keras/src/layers/preprocessing/integer_lookup_test.py
similarity index 97%
rename from keras/layers/preprocessing/integer_lookup_test.py
rename to keras/src/layers/preprocessing/integer_lookup_test.py
index ede05bedf29a..d1c6a732cbe9 100644
--- a/keras/layers/preprocessing/integer_lookup_test.py
+++ b/keras/src/layers/preprocessing/integer_lookup_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class IntegerLookupTest(testing.TestCase):
diff --git a/keras/layers/preprocessing/normalization.py b/keras/src/layers/preprocessing/normalization.py
similarity index 98%
rename from keras/layers/preprocessing/normalization.py
rename to keras/src/layers/preprocessing/normalization.py
index 76a4c37972d2..5ace2f5e76cd 100644
--- a/keras/layers/preprocessing/normalization.py
+++ b/keras/src/layers/preprocessing/normalization.py
@@ -2,11 +2,11 @@
 
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.layers.Normalization")
diff --git a/keras/layers/preprocessing/normalization_test.py b/keras/src/layers/preprocessing/normalization_test.py
similarity index 97%
rename from keras/layers/preprocessing/normalization_test.py
rename to keras/src/layers/preprocessing/normalization_test.py
index c2db784f95c9..2c480c701e61 100644
--- a/keras/layers/preprocessing/normalization_test.py
+++ b/keras/src/layers/preprocessing/normalization_test.py
@@ -3,9 +3,9 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class NormalizationTest(testing.TestCase, parameterized.TestCase):
@@ -96,7 +96,7 @@ def test_normalization_adapt(self, input_type):
         reason="Test symbolic call for torch meta device.",
     )
     def test_call_on_meta_device_after_built(self):
-        from keras.backend.torch import core
+        from keras.src.backend.torch import core
 
         layer = layers.Normalization()
         data = np.random.random((32, 4))
diff --git a/keras/layers/preprocessing/random_brightness.py b/keras/src/layers/preprocessing/random_brightness.py
similarity index 97%
rename from keras/layers/preprocessing/random_brightness.py
rename to keras/src/layers/preprocessing/random_brightness.py
index 16816c66d544..8ba25e39cd16 100644
--- a/keras/layers/preprocessing/random_brightness.py
+++ b/keras/src/layers/preprocessing/random_brightness.py
@@ -1,6 +1,6 @@
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.random.seed_generator import SeedGenerator
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.random.seed_generator import SeedGenerator
 
 
 @keras_export("keras.layers.RandomBrightness")
diff --git a/keras/layers/preprocessing/random_brightness_test.py b/keras/src/layers/preprocessing/random_brightness_test.py
similarity index 97%
rename from keras/layers/preprocessing/random_brightness_test.py
rename to keras/src/layers/preprocessing/random_brightness_test.py
index 129ddd946642..547d3dc265e0 100644
--- a/keras/layers/preprocessing/random_brightness_test.py
+++ b/keras/src/layers/preprocessing/random_brightness_test.py
@@ -2,9 +2,9 @@
 import pytest
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class RandomBrightnessTest(testing.TestCase):
diff --git a/keras/layers/preprocessing/random_contrast.py b/keras/src/layers/preprocessing/random_contrast.py
similarity index 95%
rename from keras/layers/preprocessing/random_contrast.py
rename to keras/src/layers/preprocessing/random_contrast.py
index c9d52727b6d2..d29f9fba3a80 100644
--- a/keras/layers/preprocessing/random_contrast.py
+++ b/keras/src/layers/preprocessing/random_contrast.py
@@ -1,6 +1,6 @@
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.random.seed_generator import SeedGenerator
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.random.seed_generator import SeedGenerator
 
 
 @keras_export("keras.layers.RandomContrast")
diff --git a/keras/layers/preprocessing/random_contrast_test.py b/keras/src/layers/preprocessing/random_contrast_test.py
similarity index 94%
rename from keras/layers/preprocessing/random_contrast_test.py
rename to keras/src/layers/preprocessing/random_contrast_test.py
index 95a9d1d85ce2..48eac8ec89aa 100644
--- a/keras/layers/preprocessing/random_contrast_test.py
+++ b/keras/src/layers/preprocessing/random_contrast_test.py
@@ -2,9 +2,9 @@
 import pytest
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class RandomContrastTest(testing.TestCase):
diff --git a/keras/layers/preprocessing/random_crop.py b/keras/src/layers/preprocessing/random_crop.py
similarity index 96%
rename from keras/layers/preprocessing/random_crop.py
rename to keras/src/layers/preprocessing/random_crop.py
index b9b6bd8a883a..4eec8ae077e3 100644
--- a/keras/layers/preprocessing/random_crop.py
+++ b/keras/src/layers/preprocessing/random_crop.py
@@ -1,8 +1,8 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.random.seed_generator import SeedGenerator
-from keras.utils import image_utils
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.random.seed_generator import SeedGenerator
+from keras.src.utils import image_utils
 
 
 @keras_export("keras.layers.RandomCrop")
diff --git a/keras/layers/preprocessing/random_crop_test.py b/keras/src/layers/preprocessing/random_crop_test.py
similarity index 97%
rename from keras/layers/preprocessing/random_crop_test.py
rename to keras/src/layers/preprocessing/random_crop_test.py
index 9ba94ae2ad87..53b88265a974 100644
--- a/keras/layers/preprocessing/random_crop_test.py
+++ b/keras/src/layers/preprocessing/random_crop_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class RandomCropTest(testing.TestCase):
diff --git a/keras/layers/preprocessing/random_flip.py b/keras/src/layers/preprocessing/random_flip.py
similarity index 95%
rename from keras/layers/preprocessing/random_flip.py
rename to keras/src/layers/preprocessing/random_flip.py
index df0127432295..040a3dcb6c63 100644
--- a/keras/layers/preprocessing/random_flip.py
+++ b/keras/src/layers/preprocessing/random_flip.py
@@ -1,6 +1,6 @@
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.random.seed_generator import SeedGenerator
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.random.seed_generator import SeedGenerator
 
 HORIZONTAL = "horizontal"
 VERTICAL = "vertical"
diff --git a/keras/layers/preprocessing/random_flip_test.py b/keras/src/layers/preprocessing/random_flip_test.py
similarity index 97%
rename from keras/layers/preprocessing/random_flip_test.py
rename to keras/src/layers/preprocessing/random_flip_test.py
index b143979aa309..8a938c507093 100644
--- a/keras/layers/preprocessing/random_flip_test.py
+++ b/keras/src/layers/preprocessing/random_flip_test.py
@@ -4,10 +4,10 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
-from keras import utils
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
+from keras.src import utils
 
 
 class MockedRandomFlip(layers.RandomFlip):
diff --git a/keras/layers/preprocessing/random_rotation.py b/keras/src/layers/preprocessing/random_rotation.py
similarity index 97%
rename from keras/layers/preprocessing/random_rotation.py
rename to keras/src/layers/preprocessing/random_rotation.py
index 308fa40b8ec6..c52acbcbc76d 100644
--- a/keras/layers/preprocessing/random_rotation.py
+++ b/keras/src/layers/preprocessing/random_rotation.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.random.seed_generator import SeedGenerator
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.random.seed_generator import SeedGenerator
 
 
 @keras_export("keras.layers.RandomRotation")
diff --git a/keras/layers/preprocessing/random_rotation_test.py b/keras/src/layers/preprocessing/random_rotation_test.py
similarity index 96%
rename from keras/layers/preprocessing/random_rotation_test.py
rename to keras/src/layers/preprocessing/random_rotation_test.py
index 4def62a640e8..b5c6da7fbc45 100644
--- a/keras/layers/preprocessing/random_rotation_test.py
+++ b/keras/src/layers/preprocessing/random_rotation_test.py
@@ -2,9 +2,9 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class RandomRotationTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/preprocessing/random_translation.py b/keras/src/layers/preprocessing/random_translation.py
similarity index 98%
rename from keras/layers/preprocessing/random_translation.py
rename to keras/src/layers/preprocessing/random_translation.py
index ae2db36a551a..695bc31519ef 100644
--- a/keras/layers/preprocessing/random_translation.py
+++ b/keras/src/layers/preprocessing/random_translation.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.random.seed_generator import SeedGenerator
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.random.seed_generator import SeedGenerator
 
 
 @keras_export("keras.layers.RandomTranslation")
diff --git a/keras/layers/preprocessing/random_translation_test.py b/keras/src/layers/preprocessing/random_translation_test.py
similarity index 99%
rename from keras/layers/preprocessing/random_translation_test.py
rename to keras/src/layers/preprocessing/random_translation_test.py
index 7545dd96ff3f..0f926ec3ede7 100644
--- a/keras/layers/preprocessing/random_translation_test.py
+++ b/keras/src/layers/preprocessing/random_translation_test.py
@@ -2,9 +2,9 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class RandomTranslationTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/preprocessing/random_zoom.py b/keras/src/layers/preprocessing/random_zoom.py
similarity index 98%
rename from keras/layers/preprocessing/random_zoom.py
rename to keras/src/layers/preprocessing/random_zoom.py
index db8ab5fcbb3e..332da8e0abaa 100644
--- a/keras/layers/preprocessing/random_zoom.py
+++ b/keras/src/layers/preprocessing/random_zoom.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
-from keras.random.seed_generator import SeedGenerator
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src.random.seed_generator import SeedGenerator
 
 
 @keras_export("keras.layers.RandomZoom")
diff --git a/keras/layers/preprocessing/random_zoom_test.py b/keras/src/layers/preprocessing/random_zoom_test.py
similarity index 97%
rename from keras/layers/preprocessing/random_zoom_test.py
rename to keras/src/layers/preprocessing/random_zoom_test.py
index 926f1951242e..fe5ca61710ae 100644
--- a/keras/layers/preprocessing/random_zoom_test.py
+++ b/keras/src/layers/preprocessing/random_zoom_test.py
@@ -3,10 +3,10 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
 
 
 class RandomZoomTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/preprocessing/rescaling.py b/keras/src/layers/preprocessing/rescaling.py
similarity index 93%
rename from keras/layers/preprocessing/rescaling.py
rename to keras/src/layers/preprocessing/rescaling.py
index 78046fde9f28..a7131eaabd56 100644
--- a/keras/layers/preprocessing/rescaling.py
+++ b/keras/src/layers/preprocessing/rescaling.py
@@ -1,6 +1,6 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
 
 
 @keras_export("keras.layers.Rescaling")
diff --git a/keras/layers/preprocessing/rescaling_test.py b/keras/src/layers/preprocessing/rescaling_test.py
similarity index 97%
rename from keras/layers/preprocessing/rescaling_test.py
rename to keras/src/layers/preprocessing/rescaling_test.py
index 34ae51714031..83a55e1f8a15 100644
--- a/keras/layers/preprocessing/rescaling_test.py
+++ b/keras/src/layers/preprocessing/rescaling_test.py
@@ -2,9 +2,9 @@
 import pytest
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class RescalingTest(testing.TestCase):
diff --git a/keras/layers/preprocessing/resizing.py b/keras/src/layers/preprocessing/resizing.py
similarity index 96%
rename from keras/layers/preprocessing/resizing.py
rename to keras/src/layers/preprocessing/resizing.py
index 44425c435798..6a6c5bab6a8c 100644
--- a/keras/layers/preprocessing/resizing.py
+++ b/keras/src/layers/preprocessing/resizing.py
@@ -1,6 +1,6 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.tf_data_layer import TFDataLayer
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.tf_data_layer import TFDataLayer
 
 
 @keras_export("keras.layers.Resizing")
diff --git a/keras/layers/preprocessing/resizing_test.py b/keras/src/layers/preprocessing/resizing_test.py
similarity index 98%
rename from keras/layers/preprocessing/resizing_test.py
rename to keras/src/layers/preprocessing/resizing_test.py
index afb71af3f0a2..d5b9a718d376 100644
--- a/keras/layers/preprocessing/resizing_test.py
+++ b/keras/src/layers/preprocessing/resizing_test.py
@@ -3,10 +3,10 @@
 from absl.testing import parameterized
 from tensorflow import data as tf_data
 
-from keras import Sequential
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import Sequential
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class ResizingTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/preprocessing/string_lookup.py b/keras/src/layers/preprocessing/string_lookup.py
similarity index 98%
rename from keras/layers/preprocessing/string_lookup.py
rename to keras/src/layers/preprocessing/string_lookup.py
index 63cf54db7084..ff4fa9074806 100644
--- a/keras/layers/preprocessing/string_lookup.py
+++ b/keras/src/layers/preprocessing/string_lookup.py
@@ -1,10 +1,10 @@
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.preprocessing.index_lookup import IndexLookup
-from keras.utils import backend_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.preprocessing.index_lookup import IndexLookup
+from keras.src.utils import backend_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.layers.StringLookup")
diff --git a/keras/layers/preprocessing/string_lookup_test.py b/keras/src/layers/preprocessing/string_lookup_test.py
similarity index 95%
rename from keras/layers/preprocessing/string_lookup_test.py
rename to keras/src/layers/preprocessing/string_lookup_test.py
index 0f33f3d3b1cc..be6c3e56be8a 100644
--- a/keras/layers/preprocessing/string_lookup_test.py
+++ b/keras/src/layers/preprocessing/string_lookup_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 from tensorflow import data as tf_data
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class StringLookupTest(testing.TestCase):
diff --git a/keras/layers/preprocessing/text_vectorization.py b/keras/src/layers/preprocessing/text_vectorization.py
similarity index 98%
rename from keras/layers/preprocessing/text_vectorization.py
rename to keras/src/layers/preprocessing/text_vectorization.py
index 7ddc0e24fed8..ebe828a34ab5 100644
--- a/keras/layers/preprocessing/text_vectorization.py
+++ b/keras/src/layers/preprocessing/text_vectorization.py
@@ -1,15 +1,15 @@
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.layers.preprocessing.index_lookup import listify_tensors
-from keras.layers.preprocessing.string_lookup import StringLookup
-from keras.saving import serialization_lib
-from keras.utils import argument_validation
-from keras.utils import backend_utils
-from keras.utils import tf_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.layers.preprocessing.index_lookup import listify_tensors
+from keras.src.layers.preprocessing.string_lookup import StringLookup
+from keras.src.saving import serialization_lib
+from keras.src.utils import argument_validation
+from keras.src.utils import backend_utils
+from keras.src.utils import tf_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.layers.TextVectorization")
diff --git a/keras/layers/preprocessing/text_vectorization_test.py b/keras/src/layers/preprocessing/text_vectorization_test.py
similarity index 96%
rename from keras/layers/preprocessing/text_vectorization_test.py
rename to keras/src/layers/preprocessing/text_vectorization_test.py
index 633013adc6e5..1f641e5a92de 100644
--- a/keras/layers/preprocessing/text_vectorization_test.py
+++ b/keras/src/layers/preprocessing/text_vectorization_test.py
@@ -5,12 +5,12 @@
 import tensorflow as tf
 from tensorflow import data as tf_data
 
-from keras import Sequential
-from keras import backend
-from keras import layers
-from keras import models
-from keras import saving
-from keras import testing
+from keras.src import Sequential
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import saving
+from keras.src import testing
 
 
 class TextVectorizationTest(testing.TestCase):
diff --git a/keras/layers/preprocessing/tf_data_layer.py b/keras/src/layers/preprocessing/tf_data_layer.py
similarity index 89%
rename from keras/layers/preprocessing/tf_data_layer.py
rename to keras/src/layers/preprocessing/tf_data_layer.py
index 74cf6515ce3c..f91b84ad9049 100644
--- a/keras/layers/preprocessing/tf_data_layer.py
+++ b/keras/src/layers/preprocessing/tf_data_layer.py
@@ -1,9 +1,9 @@
-import keras.backend
-from keras import tree
-from keras.layers.layer import Layer
-from keras.random.seed_generator import SeedGenerator
-from keras.utils import backend_utils
-from keras.utils import tracking
+import keras.src.backend
+from keras.src import tree
+from keras.src.layers.layer import Layer
+from keras.src.random.seed_generator import SeedGenerator
+from keras.src.utils import backend_utils
+from keras.src.utils import tracking
 
 
 class TFDataLayer(Layer):
diff --git a/keras/layers/regularization/__init__.py b/keras/src/layers/regularization/__init__.py
similarity index 100%
rename from keras/layers/regularization/__init__.py
rename to keras/src/layers/regularization/__init__.py
diff --git a/keras/layers/regularization/activity_regularization.py b/keras/src/layers/regularization/activity_regularization.py
similarity index 89%
rename from keras/layers/regularization/activity_regularization.py
rename to keras/src/layers/regularization/activity_regularization.py
index c3908ec74f55..66e724963ca3 100644
--- a/keras/layers/regularization/activity_regularization.py
+++ b/keras/src/layers/regularization/activity_regularization.py
@@ -1,6 +1,6 @@
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.ActivityRegularization")
diff --git a/keras/layers/regularization/activity_regularization_test.py b/keras/src/layers/regularization/activity_regularization_test.py
similarity index 92%
rename from keras/layers/regularization/activity_regularization_test.py
rename to keras/src/layers/regularization/activity_regularization_test.py
index bc92635596de..b3334dadd42a 100644
--- a/keras/layers/regularization/activity_regularization_test.py
+++ b/keras/src/layers/regularization/activity_regularization_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 import pytest
 
-from keras import layers
-from keras.testing import test_case
+from keras.src import layers
+from keras.src.testing import test_case
 
 
 class ActivityRegularizationTest(test_case.TestCase):
diff --git a/keras/layers/regularization/alpha_dropout.py b/keras/src/layers/regularization/alpha_dropout.py
similarity index 96%
rename from keras/layers/regularization/alpha_dropout.py
rename to keras/src/layers/regularization/alpha_dropout.py
index 55b55f7d89b4..9bb7ac7afc80 100644
--- a/keras/layers/regularization/alpha_dropout.py
+++ b/keras/src/layers/regularization/alpha_dropout.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.AlphaDropout")
diff --git a/keras/layers/regularization/alpha_dropout_test.py b/keras/src/layers/regularization/alpha_dropout_test.py
similarity index 95%
rename from keras/layers/regularization/alpha_dropout_test.py
rename to keras/src/layers/regularization/alpha_dropout_test.py
index bcde257818c4..56d2362d8eef 100644
--- a/keras/layers/regularization/alpha_dropout_test.py
+++ b/keras/src/layers/regularization/alpha_dropout_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class AlphaDropoutTest(testing.TestCase):
diff --git a/keras/layers/regularization/dropout.py b/keras/src/layers/regularization/dropout.py
similarity index 96%
rename from keras/layers/regularization/dropout.py
rename to keras/src/layers/regularization/dropout.py
index 677a545a2c69..8db64b3a539c 100644
--- a/keras/layers/regularization/dropout.py
+++ b/keras/src/layers/regularization/dropout.py
@@ -1,6 +1,6 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.Dropout")
diff --git a/keras/layers/regularization/dropout_test.py b/keras/src/layers/regularization/dropout_test.py
similarity index 95%
rename from keras/layers/regularization/dropout_test.py
rename to keras/src/layers/regularization/dropout_test.py
index 5cff84f7f0f4..90f5cbeaa058 100644
--- a/keras/layers/regularization/dropout_test.py
+++ b/keras/src/layers/regularization/dropout_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class DropoutTest(testing.TestCase):
diff --git a/keras/layers/regularization/gaussian_dropout.py b/keras/src/layers/regularization/gaussian_dropout.py
similarity index 93%
rename from keras/layers/regularization/gaussian_dropout.py
rename to keras/src/layers/regularization/gaussian_dropout.py
index 2450960e5fcf..e7e8ea3467ed 100644
--- a/keras/layers/regularization/gaussian_dropout.py
+++ b/keras/src/layers/regularization/gaussian_dropout.py
@@ -1,9 +1,9 @@
 import math
 
-from keras import backend
-from keras import layers
-from keras import ops
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src import layers
+from keras.src import ops
+from keras.src.api_export import keras_export
 
 
 @keras_export("keras.layers.GaussianDropout")
diff --git a/keras/layers/regularization/gaussian_dropout_test.py b/keras/src/layers/regularization/gaussian_dropout_test.py
similarity index 91%
rename from keras/layers/regularization/gaussian_dropout_test.py
rename to keras/src/layers/regularization/gaussian_dropout_test.py
index 1d01281ee369..33f6b3759b95 100644
--- a/keras/layers/regularization/gaussian_dropout_test.py
+++ b/keras/src/layers/regularization/gaussian_dropout_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class GaussianDropoutTest(testing.TestCase):
diff --git a/keras/layers/regularization/gaussian_noise.py b/keras/src/layers/regularization/gaussian_noise.py
similarity index 93%
rename from keras/layers/regularization/gaussian_noise.py
rename to keras/src/layers/regularization/gaussian_noise.py
index e5eaaba71a09..89ab962f6df6 100644
--- a/keras/layers/regularization/gaussian_noise.py
+++ b/keras/src/layers/regularization/gaussian_noise.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import layers
-from keras import ops
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src import layers
+from keras.src import ops
+from keras.src.api_export import keras_export
 
 
 @keras_export("keras.layers.GaussianNoise")
diff --git a/keras/layers/regularization/gaussian_noise_test.py b/keras/src/layers/regularization/gaussian_noise_test.py
similarity index 91%
rename from keras/layers/regularization/gaussian_noise_test.py
rename to keras/src/layers/regularization/gaussian_noise_test.py
index d23a78f2483e..4aa2784dc05c 100644
--- a/keras/layers/regularization/gaussian_noise_test.py
+++ b/keras/src/layers/regularization/gaussian_noise_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class GaussianNoiseTest(testing.TestCase):
diff --git a/keras/layers/regularization/spatial_dropout.py b/keras/src/layers/regularization/spatial_dropout.py
similarity index 97%
rename from keras/layers/regularization/spatial_dropout.py
rename to keras/src/layers/regularization/spatial_dropout.py
index c7ac9a3d0c14..5f440164f40d 100644
--- a/keras/layers/regularization/spatial_dropout.py
+++ b/keras/src/layers/regularization/spatial_dropout.py
@@ -1,8 +1,8 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.regularization.dropout import Dropout
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.regularization.dropout import Dropout
 
 
 class BaseSpatialDropout(Dropout):
diff --git a/keras/layers/regularization/spatial_dropout_test.py b/keras/src/layers/regularization/spatial_dropout_test.py
similarity index 97%
rename from keras/layers/regularization/spatial_dropout_test.py
rename to keras/src/layers/regularization/spatial_dropout_test.py
index 09ef67fca5b4..cc0581072cfd 100644
--- a/keras/layers/regularization/spatial_dropout_test.py
+++ b/keras/src/layers/regularization/spatial_dropout_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras.testing import test_case
+from keras.src import backend
+from keras.src import layers
+from keras.src.testing import test_case
 
 
 class SpatialDropoutTest(test_case.TestCase):
diff --git a/keras/layers/reshaping/__init__.py b/keras/src/layers/reshaping/__init__.py
similarity index 100%
rename from keras/layers/reshaping/__init__.py
rename to keras/src/layers/reshaping/__init__.py
diff --git a/keras/layers/reshaping/cropping1d.py b/keras/src/layers/reshaping/cropping1d.py
similarity index 93%
rename from keras/layers/reshaping/cropping1d.py
rename to keras/src/layers/reshaping/cropping1d.py
index f5a99da9cf11..abce618dff65 100644
--- a/keras/layers/reshaping/cropping1d.py
+++ b/keras/src/layers/reshaping/cropping1d.py
@@ -1,7 +1,7 @@
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
 
 
 @keras_export("keras.layers.Cropping1D")
diff --git a/keras/layers/reshaping/cropping1d_test.py b/keras/src/layers/reshaping/cropping1d_test.py
similarity index 97%
rename from keras/layers/reshaping/cropping1d_test.py
rename to keras/src/layers/reshaping/cropping1d_test.py
index 085466b0412e..cceb5922d92e 100644
--- a/keras/layers/reshaping/cropping1d_test.py
+++ b/keras/src/layers/reshaping/cropping1d_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class Cropping1DTest(testing.TestCase):
diff --git a/keras/layers/reshaping/cropping2d.py b/keras/src/layers/reshaping/cropping2d.py
similarity index 97%
rename from keras/layers/reshaping/cropping2d.py
rename to keras/src/layers/reshaping/cropping2d.py
index 9194f565a233..aec6813a861f 100644
--- a/keras/layers/reshaping/cropping2d.py
+++ b/keras/src/layers/reshaping/cropping2d.py
@@ -1,8 +1,8 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
 
 
 @keras_export("keras.layers.Cropping2D")
diff --git a/keras/layers/reshaping/cropping2d_test.py b/keras/src/layers/reshaping/cropping2d_test.py
similarity index 97%
rename from keras/layers/reshaping/cropping2d_test.py
rename to keras/src/layers/reshaping/cropping2d_test.py
index fbf88695fd8f..001f1a466f11 100644
--- a/keras/layers/reshaping/cropping2d_test.py
+++ b/keras/src/layers/reshaping/cropping2d_test.py
@@ -2,10 +2,10 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class Cropping2DTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/reshaping/cropping3d.py b/keras/src/layers/reshaping/cropping3d.py
similarity index 98%
rename from keras/layers/reshaping/cropping3d.py
rename to keras/src/layers/reshaping/cropping3d.py
index 569432004087..724d0cf72635 100644
--- a/keras/layers/reshaping/cropping3d.py
+++ b/keras/src/layers/reshaping/cropping3d.py
@@ -1,8 +1,8 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
 
 
 @keras_export("keras.layers.Cropping3D")
diff --git a/keras/layers/reshaping/cropping3d_test.py b/keras/src/layers/reshaping/cropping3d_test.py
similarity index 98%
rename from keras/layers/reshaping/cropping3d_test.py
rename to keras/src/layers/reshaping/cropping3d_test.py
index 93aeaabe8447..90569711b412 100644
--- a/keras/layers/reshaping/cropping3d_test.py
+++ b/keras/src/layers/reshaping/cropping3d_test.py
@@ -2,10 +2,10 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class Cropping3DTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/reshaping/flatten.py b/keras/src/layers/reshaping/flatten.py
similarity index 91%
rename from keras/layers/reshaping/flatten.py
rename to keras/src/layers/reshaping/flatten.py
index 0923f33da4b8..84aad840246c 100644
--- a/keras/layers/reshaping/flatten.py
+++ b/keras/src/layers/reshaping/flatten.py
@@ -1,11 +1,11 @@
 import math
 
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.Flatten")
diff --git a/keras/layers/reshaping/flatten_test.py b/keras/src/layers/reshaping/flatten_test.py
similarity index 97%
rename from keras/layers/reshaping/flatten_test.py
rename to keras/src/layers/reshaping/flatten_test.py
index 921db5906ac7..00208bedaebf 100644
--- a/keras/layers/reshaping/flatten_test.py
+++ b/keras/src/layers/reshaping/flatten_test.py
@@ -2,10 +2,10 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class FlattenTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/reshaping/permute.py b/keras/src/layers/reshaping/permute.py
similarity index 89%
rename from keras/layers/reshaping/permute.py
rename to keras/src/layers/reshaping/permute.py
index 30d52e4a7403..fce4eb2d328e 100644
--- a/keras/layers/reshaping/permute.py
+++ b/keras/src/layers/reshaping/permute.py
@@ -1,8 +1,8 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.Permute")
diff --git a/keras/layers/reshaping/permute_test.py b/keras/src/layers/reshaping/permute_test.py
similarity index 95%
rename from keras/layers/reshaping/permute_test.py
rename to keras/src/layers/reshaping/permute_test.py
index d01c63a99a2a..f165fbbf8a86 100644
--- a/keras/layers/reshaping/permute_test.py
+++ b/keras/src/layers/reshaping/permute_test.py
@@ -2,10 +2,10 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class PermuteTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/reshaping/repeat_vector.py b/keras/src/layers/reshaping/repeat_vector.py
similarity index 87%
rename from keras/layers/reshaping/repeat_vector.py
rename to keras/src/layers/reshaping/repeat_vector.py
index 0e9507e10d38..d8914d10fce7 100644
--- a/keras/layers/reshaping/repeat_vector.py
+++ b/keras/src/layers/reshaping/repeat_vector.py
@@ -1,7 +1,7 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.RepeatVector")
diff --git a/keras/layers/reshaping/repeat_vector_test.py b/keras/src/layers/reshaping/repeat_vector_test.py
similarity index 94%
rename from keras/layers/reshaping/repeat_vector_test.py
rename to keras/src/layers/reshaping/repeat_vector_test.py
index 3baf10517211..3d1d1a59624a 100644
--- a/keras/layers/reshaping/repeat_vector_test.py
+++ b/keras/src/layers/reshaping/repeat_vector_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class FlattenTest(testing.TestCase):
diff --git a/keras/layers/reshaping/reshape.py b/keras/src/layers/reshaping/reshape.py
similarity index 90%
rename from keras/layers/reshaping/reshape.py
rename to keras/src/layers/reshaping/reshape.py
index e052957534b8..c87e4bd7381b 100644
--- a/keras/layers/reshaping/reshape.py
+++ b/keras/src/layers/reshaping/reshape.py
@@ -1,8 +1,8 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.layers.layer import Layer
-from keras.ops import operation_utils
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.layers.layer import Layer
+from keras.src.ops import operation_utils
 
 
 @keras_export("keras.layers.Reshape")
diff --git a/keras/layers/reshaping/reshape_test.py b/keras/src/layers/reshaping/reshape_test.py
similarity index 96%
rename from keras/layers/reshaping/reshape_test.py
rename to keras/src/layers/reshaping/reshape_test.py
index 9e508f84dc96..453b13d84fb2 100644
--- a/keras/layers/reshaping/reshape_test.py
+++ b/keras/src/layers/reshaping/reshape_test.py
@@ -1,10 +1,10 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import testing
-from keras.backend.common.keras_tensor import KerasTensor
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
+from keras.src.backend.common.keras_tensor import KerasTensor
 
 
 class ReshapeTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/reshaping/up_sampling1d.py b/keras/src/layers/reshaping/up_sampling1d.py
similarity index 89%
rename from keras/layers/reshaping/up_sampling1d.py
rename to keras/src/layers/reshaping/up_sampling1d.py
index 480ab7b5a336..bbb7657efe91 100644
--- a/keras/layers/reshaping/up_sampling1d.py
+++ b/keras/src/layers/reshaping/up_sampling1d.py
@@ -1,7 +1,7 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.UpSampling1D")
diff --git a/keras/layers/reshaping/up_sampling1d_test.py b/keras/src/layers/reshaping/up_sampling1d_test.py
similarity index 94%
rename from keras/layers/reshaping/up_sampling1d_test.py
rename to keras/src/layers/reshaping/up_sampling1d_test.py
index aa5f8c0dee43..978401fd7157 100644
--- a/keras/layers/reshaping/up_sampling1d_test.py
+++ b/keras/src/layers/reshaping/up_sampling1d_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import layers
-from keras import testing
-from keras.backend.common.keras_tensor import KerasTensor
+from keras.src import layers
+from keras.src import testing
+from keras.src.backend.common.keras_tensor import KerasTensor
 
 
 class UpSamplingTest(testing.TestCase):
diff --git a/keras/layers/reshaping/up_sampling2d.py b/keras/src/layers/reshaping/up_sampling2d.py
similarity index 95%
rename from keras/layers/reshaping/up_sampling2d.py
rename to keras/src/layers/reshaping/up_sampling2d.py
index 7ecc5c6a49e4..d9f5fa21c49c 100644
--- a/keras/layers/reshaping/up_sampling2d.py
+++ b/keras/src/layers/reshaping/up_sampling2d.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
 
 
 @keras_export("keras.layers.UpSampling2D")
diff --git a/keras/layers/reshaping/up_sampling2d_test.py b/keras/src/layers/reshaping/up_sampling2d_test.py
similarity index 98%
rename from keras/layers/reshaping/up_sampling2d_test.py
rename to keras/src/layers/reshaping/up_sampling2d_test.py
index feaefe3af931..680f9eac68f5 100644
--- a/keras/layers/reshaping/up_sampling2d_test.py
+++ b/keras/src/layers/reshaping/up_sampling2d_test.py
@@ -3,9 +3,9 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class UpSampling2dTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/reshaping/up_sampling3d.py b/keras/src/layers/reshaping/up_sampling3d.py
similarity index 95%
rename from keras/layers/reshaping/up_sampling3d.py
rename to keras/src/layers/reshaping/up_sampling3d.py
index f0f7aa6e5889..3b642e48ef6a 100644
--- a/keras/layers/reshaping/up_sampling3d.py
+++ b/keras/src/layers/reshaping/up_sampling3d.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
 
 
 @keras_export("keras.layers.UpSampling3D")
diff --git a/keras/layers/reshaping/up_sampling3d_test.py b/keras/src/layers/reshaping/up_sampling3d_test.py
similarity index 98%
rename from keras/layers/reshaping/up_sampling3d_test.py
rename to keras/src/layers/reshaping/up_sampling3d_test.py
index c14d2179452f..f2d6bc2d0eaf 100644
--- a/keras/layers/reshaping/up_sampling3d_test.py
+++ b/keras/src/layers/reshaping/up_sampling3d_test.py
@@ -2,9 +2,9 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class UpSampling3dTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/reshaping/zero_padding1d.py b/keras/src/layers/reshaping/zero_padding1d.py
similarity index 89%
rename from keras/layers/reshaping/zero_padding1d.py
rename to keras/src/layers/reshaping/zero_padding1d.py
index 9bc444763d69..2777423b7921 100644
--- a/keras/layers/reshaping/zero_padding1d.py
+++ b/keras/src/layers/reshaping/zero_padding1d.py
@@ -1,8 +1,8 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
 
 
 @keras_export("keras.layers.ZeroPadding1D")
diff --git a/keras/layers/reshaping/zero_padding1d_test.py b/keras/src/layers/reshaping/zero_padding1d_test.py
similarity index 96%
rename from keras/layers/reshaping/zero_padding1d_test.py
rename to keras/src/layers/reshaping/zero_padding1d_test.py
index bf2e3d4e5cbe..918cd133a777 100644
--- a/keras/layers/reshaping/zero_padding1d_test.py
+++ b/keras/src/layers/reshaping/zero_padding1d_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import layers
-from keras import testing
+from keras.src import layers
+from keras.src import testing
 
 
 class ZeroPadding1DTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/reshaping/zero_padding2d.py b/keras/src/layers/reshaping/zero_padding2d.py
similarity index 94%
rename from keras/layers/reshaping/zero_padding2d.py
rename to keras/src/layers/reshaping/zero_padding2d.py
index 557b02f270e7..e5d88d16d76d 100644
--- a/keras/layers/reshaping/zero_padding2d.py
+++ b/keras/src/layers/reshaping/zero_padding2d.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
 
 
 @keras_export("keras.layers.ZeroPadding2D")
diff --git a/keras/layers/reshaping/zero_padding2d_test.py b/keras/src/layers/reshaping/zero_padding2d_test.py
similarity index 97%
rename from keras/layers/reshaping/zero_padding2d_test.py
rename to keras/src/layers/reshaping/zero_padding2d_test.py
index 391dd30d2325..404ee9b4b4e4 100644
--- a/keras/layers/reshaping/zero_padding2d_test.py
+++ b/keras/src/layers/reshaping/zero_padding2d_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class ZeroPadding2DTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/reshaping/zero_padding3d.py b/keras/src/layers/reshaping/zero_padding3d.py
similarity index 95%
rename from keras/layers/reshaping/zero_padding3d.py
rename to keras/src/layers/reshaping/zero_padding3d.py
index 5b0191d0a102..87e39bf00060 100644
--- a/keras/layers/reshaping/zero_padding3d.py
+++ b/keras/src/layers/reshaping/zero_padding3d.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.utils import argument_validation
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.utils import argument_validation
 
 
 @keras_export("keras.layers.ZeroPadding3D")
diff --git a/keras/layers/reshaping/zero_padding3d_test.py b/keras/src/layers/reshaping/zero_padding3d_test.py
similarity index 97%
rename from keras/layers/reshaping/zero_padding3d_test.py
rename to keras/src/layers/reshaping/zero_padding3d_test.py
index 7a1f919586b8..bf6cd80c1153 100644
--- a/keras/layers/reshaping/zero_padding3d_test.py
+++ b/keras/src/layers/reshaping/zero_padding3d_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
 
 
 class ZeroPadding3DTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/rnn/__init__.py b/keras/src/layers/rnn/__init__.py
similarity index 100%
rename from keras/layers/rnn/__init__.py
rename to keras/src/layers/rnn/__init__.py
diff --git a/keras/layers/rnn/bidirectional.py b/keras/src/layers/rnn/bidirectional.py
similarity index 98%
rename from keras/layers/rnn/bidirectional.py
rename to keras/src/layers/rnn/bidirectional.py
index 9a2569fa1591..9d9d29d24602 100644
--- a/keras/layers/rnn/bidirectional.py
+++ b/keras/src/layers/rnn/bidirectional.py
@@ -1,11 +1,11 @@
 import copy
 
-from keras import ops
-from keras import utils
-from keras.api_export import keras_export
-from keras.layers.core.wrapper import Wrapper
-from keras.layers.layer import Layer
-from keras.saving import serialization_lib
+from keras.src import ops
+from keras.src import utils
+from keras.src.api_export import keras_export
+from keras.src.layers.core.wrapper import Wrapper
+from keras.src.layers.layer import Layer
+from keras.src.saving import serialization_lib
 
 
 @keras_export("keras.layers.Bidirectional")
diff --git a/keras/layers/rnn/bidirectional_test.py b/keras/src/layers/rnn/bidirectional_test.py
similarity index 98%
rename from keras/layers/rnn/bidirectional_test.py
rename to keras/src/layers/rnn/bidirectional_test.py
index 6391abdace2d..476965f935f6 100644
--- a/keras/layers/rnn/bidirectional_test.py
+++ b/keras/src/layers/rnn/bidirectional_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import initializers
-from keras import layers
-from keras import testing
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
 
 
 class SimpleRNNTest(testing.TestCase):
diff --git a/keras/layers/rnn/conv_lstm.py b/keras/src/layers/rnn/conv_lstm.py
similarity index 98%
rename from keras/layers/rnn/conv_lstm.py
rename to keras/src/layers/rnn/conv_lstm.py
index e8e3ee3ffebe..d6a30b5b353e 100644
--- a/keras/layers/rnn/conv_lstm.py
+++ b/keras/src/layers/rnn/conv_lstm.py
@@ -1,16 +1,16 @@
-from keras import activations
-from keras import backend
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras import tree
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.layers.rnn.dropout_rnn_cell import DropoutRNNCell
-from keras.layers.rnn.rnn import RNN
-from keras.ops import operation_utils
-from keras.utils import argument_validation
+from keras.src import activations
+from keras.src import backend
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src import tree
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.layers.rnn.dropout_rnn_cell import DropoutRNNCell
+from keras.src.layers.rnn.rnn import RNN
+from keras.src.ops import operation_utils
+from keras.src.utils import argument_validation
 
 
 class ConvLSTMCell(Layer, DropoutRNNCell):
diff --git a/keras/layers/rnn/conv_lstm1d.py b/keras/src/layers/rnn/conv_lstm1d.py
similarity index 98%
rename from keras/layers/rnn/conv_lstm1d.py
rename to keras/src/layers/rnn/conv_lstm1d.py
index a96cdbe778e6..d0ad56b5ce26 100644
--- a/keras/layers/rnn/conv_lstm1d.py
+++ b/keras/src/layers/rnn/conv_lstm1d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.rnn.conv_lstm import ConvLSTM
+from keras.src.api_export import keras_export
+from keras.src.layers.rnn.conv_lstm import ConvLSTM
 
 
 @keras_export("keras.layers.ConvLSTM1D")
diff --git a/keras/layers/rnn/conv_lstm1d_test.py b/keras/src/layers/rnn/conv_lstm1d_test.py
similarity index 95%
rename from keras/layers/rnn/conv_lstm1d_test.py
rename to keras/src/layers/rnn/conv_lstm1d_test.py
index 89bec5a6b2db..b69cbf8b55aa 100644
--- a/keras/layers/rnn/conv_lstm1d_test.py
+++ b/keras/src/layers/rnn/conv_lstm1d_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import initializers
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
 
 
 class ConvLSTM1DTest(testing.TestCase):
diff --git a/keras/layers/rnn/conv_lstm2d.py b/keras/src/layers/rnn/conv_lstm2d.py
similarity index 98%
rename from keras/layers/rnn/conv_lstm2d.py
rename to keras/src/layers/rnn/conv_lstm2d.py
index 1819e5a9ba32..6837eea99298 100644
--- a/keras/layers/rnn/conv_lstm2d.py
+++ b/keras/src/layers/rnn/conv_lstm2d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.rnn.conv_lstm import ConvLSTM
+from keras.src.api_export import keras_export
+from keras.src.layers.rnn.conv_lstm import ConvLSTM
 
 
 @keras_export("keras.layers.ConvLSTM2D")
diff --git a/keras/layers/rnn/conv_lstm2d_test.py b/keras/src/layers/rnn/conv_lstm2d_test.py
similarity index 96%
rename from keras/layers/rnn/conv_lstm2d_test.py
rename to keras/src/layers/rnn/conv_lstm2d_test.py
index 5c2bb6c0855c..b3846b64058c 100644
--- a/keras/layers/rnn/conv_lstm2d_test.py
+++ b/keras/src/layers/rnn/conv_lstm2d_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import initializers
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
 
 
 class ConvLSTM2DTest(testing.TestCase):
diff --git a/keras/layers/rnn/conv_lstm3d.py b/keras/src/layers/rnn/conv_lstm3d.py
similarity index 98%
rename from keras/layers/rnn/conv_lstm3d.py
rename to keras/src/layers/rnn/conv_lstm3d.py
index e22bb2cc6cab..534750abebef 100644
--- a/keras/layers/rnn/conv_lstm3d.py
+++ b/keras/src/layers/rnn/conv_lstm3d.py
@@ -1,5 +1,5 @@
-from keras.api_export import keras_export
-from keras.layers.rnn.conv_lstm import ConvLSTM
+from keras.src.api_export import keras_export
+from keras.src.layers.rnn.conv_lstm import ConvLSTM
 
 
 @keras_export("keras.layers.ConvLSTM3D")
diff --git a/keras/layers/rnn/conv_lstm3d_test.py b/keras/src/layers/rnn/conv_lstm3d_test.py
similarity index 96%
rename from keras/layers/rnn/conv_lstm3d_test.py
rename to keras/src/layers/rnn/conv_lstm3d_test.py
index e0008bbc3b45..b6c23326539f 100644
--- a/keras/layers/rnn/conv_lstm3d_test.py
+++ b/keras/src/layers/rnn/conv_lstm3d_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import initializers
-from keras import layers
-from keras import testing
+from keras.src import backend
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
 
 
 class ConvLSTM1DTest(testing.TestCase):
diff --git a/keras/layers/rnn/conv_lstm_test.py b/keras/src/layers/rnn/conv_lstm_test.py
similarity index 91%
rename from keras/layers/rnn/conv_lstm_test.py
rename to keras/src/layers/rnn/conv_lstm_test.py
index 76123a8cd0f1..e66fed91b62c 100644
--- a/keras/layers/rnn/conv_lstm_test.py
+++ b/keras/src/layers/rnn/conv_lstm_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 
-from keras import backend
-from keras import initializers
-from keras import testing
-from keras.layers.rnn.conv_lstm import ConvLSTM
-from keras.layers.rnn.conv_lstm import ConvLSTMCell
+from keras.src import backend
+from keras.src import initializers
+from keras.src import testing
+from keras.src.layers.rnn.conv_lstm import ConvLSTM
+from keras.src.layers.rnn.conv_lstm import ConvLSTMCell
 
 
 class ConvLSTMCellTest(testing.TestCase):
diff --git a/keras/layers/rnn/dropout_rnn_cell.py b/keras/src/layers/rnn/dropout_rnn_cell.py
similarity index 97%
rename from keras/layers/rnn/dropout_rnn_cell.py
rename to keras/src/layers/rnn/dropout_rnn_cell.py
index a4d4d69fa552..33a522224c7e 100644
--- a/keras/layers/rnn/dropout_rnn_cell.py
+++ b/keras/src/layers/rnn/dropout_rnn_cell.py
@@ -1,5 +1,5 @@
-from keras import backend
-from keras import ops
+from keras.src import backend
+from keras.src import ops
 
 
 class DropoutRNNCell:
diff --git a/keras/layers/rnn/dropout_rnn_cell_test.py b/keras/src/layers/rnn/dropout_rnn_cell_test.py
similarity index 94%
rename from keras/layers/rnn/dropout_rnn_cell_test.py
rename to keras/src/layers/rnn/dropout_rnn_cell_test.py
index 2f4e5a658c02..01f3d2e00acf 100644
--- a/keras/layers/rnn/dropout_rnn_cell_test.py
+++ b/keras/src/layers/rnn/dropout_rnn_cell_test.py
@@ -1,10 +1,10 @@
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import ops
-from keras import testing
-from keras.layers.rnn.dropout_rnn_cell import DropoutRNNCell
+from keras.src import backend
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
+from keras.src.layers.rnn.dropout_rnn_cell import DropoutRNNCell
 
 
 class RNNCellWithDropout(layers.Layer, DropoutRNNCell):
diff --git a/keras/layers/rnn/gru.py b/keras/src/layers/rnn/gru.py
similarity index 98%
rename from keras/layers/rnn/gru.py
rename to keras/src/layers/rnn/gru.py
index d1b03e256cb0..f489bd6638fc 100644
--- a/keras/layers/rnn/gru.py
+++ b/keras/src/layers/rnn/gru.py
@@ -1,15 +1,15 @@
-from keras import activations
-from keras import backend
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras import tree
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.layers.rnn.dropout_rnn_cell import DropoutRNNCell
-from keras.layers.rnn.rnn import RNN
+from keras.src import activations
+from keras.src import backend
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.layers.rnn.dropout_rnn_cell import DropoutRNNCell
+from keras.src.layers.rnn.rnn import RNN
 
 
 @keras_export("keras.layers.GRUCell")
diff --git a/keras/layers/rnn/gru_test.py b/keras/src/layers/rnn/gru_test.py
similarity index 99%
rename from keras/layers/rnn/gru_test.py
rename to keras/src/layers/rnn/gru_test.py
index 14f5248d78b0..529220803ddf 100644
--- a/keras/layers/rnn/gru_test.py
+++ b/keras/src/layers/rnn/gru_test.py
@@ -2,9 +2,9 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import initializers
-from keras import layers
-from keras import testing
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
 
 
 class GRUTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/rnn/lstm.py b/keras/src/layers/rnn/lstm.py
similarity index 98%
rename from keras/layers/rnn/lstm.py
rename to keras/src/layers/rnn/lstm.py
index 13c32278418f..33055fd197ec 100644
--- a/keras/layers/rnn/lstm.py
+++ b/keras/src/layers/rnn/lstm.py
@@ -1,15 +1,15 @@
-from keras import activations
-from keras import backend
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras import tree
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.layers.rnn.dropout_rnn_cell import DropoutRNNCell
-from keras.layers.rnn.rnn import RNN
+from keras.src import activations
+from keras.src import backend
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.layers.rnn.dropout_rnn_cell import DropoutRNNCell
+from keras.src.layers.rnn.rnn import RNN
 
 
 @keras_export("keras.layers.LSTMCell")
diff --git a/keras/layers/rnn/lstm_test.py b/keras/src/layers/rnn/lstm_test.py
similarity index 99%
rename from keras/layers/rnn/lstm_test.py
rename to keras/src/layers/rnn/lstm_test.py
index 8811cc760160..bdf262d66ac4 100644
--- a/keras/layers/rnn/lstm_test.py
+++ b/keras/src/layers/rnn/lstm_test.py
@@ -2,9 +2,9 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import initializers
-from keras import layers
-from keras import testing
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
 
 
 class LSTMTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/layers/rnn/rnn.py b/keras/src/layers/rnn/rnn.py
similarity index 97%
rename from keras/layers/rnn/rnn.py
rename to keras/src/layers/rnn/rnn.py
index 6880ab26488a..a8a55718f0d7 100644
--- a/keras/layers/rnn/rnn.py
+++ b/keras/src/layers/rnn/rnn.py
@@ -1,12 +1,12 @@
-from keras import backend
-from keras import ops
-from keras import tree
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.layers.rnn.dropout_rnn_cell import DropoutRNNCell
-from keras.layers.rnn.stacked_rnn_cells import StackedRNNCells
-from keras.saving import serialization_lib
-from keras.utils import tracking
+from keras.src import backend
+from keras.src import ops
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.layers.rnn.dropout_rnn_cell import DropoutRNNCell
+from keras.src.layers.rnn.stacked_rnn_cells import StackedRNNCells
+from keras.src.saving import serialization_lib
+from keras.src.utils import tracking
 
 
 @keras_export("keras.layers.RNN")
@@ -133,8 +133,8 @@ class RNN(Layer):
     Examples:
 
     ```python
-    from keras.layers import RNN
-    from keras import ops
+    from keras.src.layers import RNN
+    from keras.src import ops
 
     # First, let's define a RNN Cell, as a layer subclass.
     class MinimalRNNCell(keras.layers.Layer):
diff --git a/keras/layers/rnn/rnn_test.py b/keras/src/layers/rnn/rnn_test.py
similarity index 99%
rename from keras/layers/rnn/rnn_test.py
rename to keras/src/layers/rnn/rnn_test.py
index dcfa075d75ff..f5e5a34efabe 100644
--- a/keras/layers/rnn/rnn_test.py
+++ b/keras/src/layers/rnn/rnn_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class OneStateRNNCell(layers.Layer):
diff --git a/keras/layers/rnn/simple_rnn.py b/keras/src/layers/rnn/simple_rnn.py
similarity index 97%
rename from keras/layers/rnn/simple_rnn.py
rename to keras/src/layers/rnn/simple_rnn.py
index a3e263069fda..79105f1539ea 100644
--- a/keras/layers/rnn/simple_rnn.py
+++ b/keras/src/layers/rnn/simple_rnn.py
@@ -1,14 +1,14 @@
-from keras import activations
-from keras import backend
-from keras import constraints
-from keras import initializers
-from keras import ops
-from keras import regularizers
-from keras.api_export import keras_export
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.layers.rnn.dropout_rnn_cell import DropoutRNNCell
-from keras.layers.rnn.rnn import RNN
+from keras.src import activations
+from keras.src import backend
+from keras.src import constraints
+from keras.src import initializers
+from keras.src import ops
+from keras.src import regularizers
+from keras.src.api_export import keras_export
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.layers.rnn.dropout_rnn_cell import DropoutRNNCell
+from keras.src.layers.rnn.rnn import RNN
 
 
 @keras_export("keras.layers.SimpleRNNCell")
diff --git a/keras/layers/rnn/simple_rnn_test.py b/keras/src/layers/rnn/simple_rnn_test.py
similarity index 98%
rename from keras/layers/rnn/simple_rnn_test.py
rename to keras/src/layers/rnn/simple_rnn_test.py
index 19bf67d3275e..8493bdbee8a8 100644
--- a/keras/layers/rnn/simple_rnn_test.py
+++ b/keras/src/layers/rnn/simple_rnn_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import initializers
-from keras import layers
-from keras import testing
+from keras.src import initializers
+from keras.src import layers
+from keras.src import testing
 
 
 class SimpleRNNTest(testing.TestCase):
diff --git a/keras/layers/rnn/stacked_rnn_cells.py b/keras/src/layers/rnn/stacked_rnn_cells.py
similarity index 96%
rename from keras/layers/rnn/stacked_rnn_cells.py
rename to keras/src/layers/rnn/stacked_rnn_cells.py
index 20502d4655c7..a3e1b601d4c7 100644
--- a/keras/layers/rnn/stacked_rnn_cells.py
+++ b/keras/src/layers/rnn/stacked_rnn_cells.py
@@ -1,8 +1,8 @@
-from keras import ops
-from keras import tree
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.saving import serialization_lib
+from keras.src import ops
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.saving import serialization_lib
 
 
 @keras_export("keras.layers.StackedRNNCells")
diff --git a/keras/layers/rnn/stacked_rnn_cells_test.py b/keras/src/layers/rnn/stacked_rnn_cells_test.py
similarity index 98%
rename from keras/layers/rnn/stacked_rnn_cells_test.py
rename to keras/src/layers/rnn/stacked_rnn_cells_test.py
index c3eff69b82ac..15d2d1d6054c 100644
--- a/keras/layers/rnn/stacked_rnn_cells_test.py
+++ b/keras/src/layers/rnn/stacked_rnn_cells_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 import pytest
 
-from keras import layers
-from keras import testing
-from keras.layers.rnn.rnn_test import OneStateRNNCell
-from keras.layers.rnn.rnn_test import TwoStatesRNNCell
+from keras.src import layers
+from keras.src import testing
+from keras.src.layers.rnn.rnn_test import OneStateRNNCell
+from keras.src.layers.rnn.rnn_test import TwoStatesRNNCell
 
 
 class StackedRNNTest(testing.TestCase):
diff --git a/keras/layers/rnn/time_distributed.py b/keras/src/layers/rnn/time_distributed.py
similarity index 95%
rename from keras/layers/rnn/time_distributed.py
rename to keras/src/layers/rnn/time_distributed.py
index d1cc613ebd73..cac954a4f11b 100644
--- a/keras/layers/rnn/time_distributed.py
+++ b/keras/src/layers/rnn/time_distributed.py
@@ -1,10 +1,10 @@
 """Wrapper layer to apply every temporal slice of an input."""
 
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.layers.core.wrapper import Wrapper
-from keras.layers.layer import Layer
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.layers.core.wrapper import Wrapper
+from keras.src.layers.layer import Layer
 
 
 @keras_export("keras.layers.TimeDistributed")
diff --git a/keras/layers/rnn/time_distributed_test.py b/keras/src/layers/rnn/time_distributed_test.py
similarity index 94%
rename from keras/layers/rnn/time_distributed_test.py
rename to keras/src/layers/rnn/time_distributed_test.py
index cf0793bb7f84..f2ad37e9d110 100644
--- a/keras/layers/rnn/time_distributed_test.py
+++ b/keras/src/layers/rnn/time_distributed_test.py
@@ -1,11 +1,11 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import initializers
-from keras import layers
-from keras import ops
-from keras import testing
+from keras.src import backend
+from keras.src import initializers
+from keras.src import layers
+from keras.src import ops
+from keras.src import testing
 
 
 class TimeDistributedTest(testing.TestCase):
diff --git a/keras/legacy/__init__.py b/keras/src/legacy/__init__.py
similarity index 100%
rename from keras/legacy/__init__.py
rename to keras/src/legacy/__init__.py
diff --git a/keras/legacy/backend.py b/keras/src/legacy/backend.py
similarity index 99%
rename from keras/legacy/backend.py
rename to keras/src/legacy/backend.py
index a6256be0b852..dbb933112ad4 100644
--- a/keras/legacy/backend.py
+++ b/keras/src/legacy/backend.py
@@ -4,9 +4,9 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.utils.module_utils import tensorflow as tf
 
 py_any = any
 py_all = all
diff --git a/keras/legacy/layers.py b/keras/src/legacy/layers.py
similarity index 97%
rename from keras/legacy/layers.py
rename to keras/src/legacy/layers.py
index 2ceaa151f6fc..97a369cb6480 100644
--- a/keras/legacy/layers.py
+++ b/keras/src/legacy/layers.py
@@ -6,10 +6,10 @@
 ThresholdedReLU
 """
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras._legacy.layers.AlphaDropout")
diff --git a/keras/legacy/losses.py b/keras/src/legacy/losses.py
similarity index 91%
rename from keras/legacy/losses.py
rename to keras/src/legacy/losses.py
index f0cd872bca55..a84284bfc38d 100644
--- a/keras/legacy/losses.py
+++ b/keras/src/legacy/losses.py
@@ -1,4 +1,4 @@
-from keras.api_export import keras_export
+from keras.src.api_export import keras_export
 
 
 @keras_export("keras._legacy.losses.Reduction")
diff --git a/keras/legacy/preprocessing/__init__.py b/keras/src/legacy/preprocessing/__init__.py
similarity index 100%
rename from keras/legacy/preprocessing/__init__.py
rename to keras/src/legacy/preprocessing/__init__.py
diff --git a/keras/legacy/preprocessing/image.py b/keras/src/legacy/preprocessing/image.py
similarity index 99%
rename from keras/legacy/preprocessing/image.py
rename to keras/src/legacy/preprocessing/image.py
index 4e9f74eef3d5..4a0e8b44d395 100644
--- a/keras/legacy/preprocessing/image.py
+++ b/keras/src/legacy/preprocessing/image.py
@@ -8,12 +8,12 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.trainers.data_adapters.py_dataset_adapter import PyDataset
-from keras.utils import image_utils
-from keras.utils import io_utils
-from keras.utils.module_utils import scipy
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.trainers.data_adapters.py_dataset_adapter import PyDataset
+from keras.src.utils import image_utils
+from keras.src.utils import io_utils
+from keras.src.utils.module_utils import scipy
 
 
 @keras_export("keras._legacy.preprocessing.image.Iterator")
diff --git a/keras/legacy/preprocessing/sequence.py b/keras/src/legacy/preprocessing/sequence.py
similarity index 98%
rename from keras/legacy/preprocessing/sequence.py
rename to keras/src/legacy/preprocessing/sequence.py
index f9f52fa802f2..1d0f360c50c7 100644
--- a/keras/legacy/preprocessing/sequence.py
+++ b/keras/src/legacy/preprocessing/sequence.py
@@ -5,8 +5,8 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.trainers.data_adapters.py_dataset_adapter import PyDataset
+from keras.src.api_export import keras_export
+from keras.src.trainers.data_adapters.py_dataset_adapter import PyDataset
 
 
 @keras_export("keras._legacy.preprocessing.sequence.TimeseriesGenerator")
diff --git a/keras/legacy/preprocessing/text.py b/keras/src/legacy/preprocessing/text.py
similarity index 99%
rename from keras/legacy/preprocessing/text.py
rename to keras/src/legacy/preprocessing/text.py
index 8f8a31bfa4fc..83946bfc03e1 100644
--- a/keras/legacy/preprocessing/text.py
+++ b/keras/src/legacy/preprocessing/text.py
@@ -7,7 +7,7 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
+from keras.src.api_export import keras_export
 
 
 @keras_export("keras._legacy.preprocessing.text.text_to_word_sequence")
diff --git a/keras/legacy/saving/__init__.py b/keras/src/legacy/saving/__init__.py
similarity index 100%
rename from keras/legacy/saving/__init__.py
rename to keras/src/legacy/saving/__init__.py
diff --git a/keras/legacy/saving/json_utils.py b/keras/src/legacy/saving/json_utils.py
similarity index 97%
rename from keras/legacy/saving/json_utils.py
rename to keras/src/legacy/saving/json_utils.py
index 0a7f6254fdc5..0dbc578d25ab 100644
--- a/keras/legacy/saving/json_utils.py
+++ b/keras/src/legacy/saving/json_utils.py
@@ -7,9 +7,9 @@
 
 import numpy as np
 
-from keras.legacy.saving import serialization
-from keras.saving import serialization_lib
-from keras.utils.module_utils import tensorflow as tf
+from keras.src.legacy.saving import serialization
+from keras.src.saving import serialization_lib
+from keras.src.utils.module_utils import tensorflow as tf
 
 _EXTENSION_TYPE_SPEC = "_EXTENSION_TYPE_SPEC"
 
diff --git a/keras/legacy/saving/json_utils_test.py b/keras/src/legacy/saving/json_utils_test.py
similarity index 96%
rename from keras/legacy/saving/json_utils_test.py
rename to keras/src/legacy/saving/json_utils_test.py
index 8d82f52a40f7..3eca485bedc0 100644
--- a/keras/legacy/saving/json_utils_test.py
+++ b/keras/src/legacy/saving/json_utils_test.py
@@ -2,9 +2,9 @@
 
 import pytest
 
-from keras import backend
-from keras import testing
-from keras.legacy.saving import json_utils
+from keras.src import backend
+from keras.src import testing
+from keras.src.legacy.saving import json_utils
 
 if backend.backend() == "tensorflow":
     import tensorflow as tf
diff --git a/keras/legacy/saving/legacy_h5_format.py b/keras/src/legacy/saving/legacy_h5_format.py
similarity index 98%
rename from keras/legacy/saving/legacy_h5_format.py
rename to keras/src/legacy/saving/legacy_h5_format.py
index 1c4e897a42ea..05f7ceca22be 100644
--- a/keras/legacy/saving/legacy_h5_format.py
+++ b/keras/src/legacy/saving/legacy_h5_format.py
@@ -5,14 +5,14 @@
 import numpy as np
 from absl import logging
 
-from keras import backend
-from keras import optimizers
-from keras.backend.common import global_state
-from keras.legacy.saving import json_utils
-from keras.legacy.saving import saving_options
-from keras.legacy.saving import saving_utils
-from keras.saving import object_registration
-from keras.utils import io_utils
+from keras.src import backend
+from keras.src import optimizers
+from keras.src.backend.common import global_state
+from keras.src.legacy.saving import json_utils
+from keras.src.legacy.saving import saving_options
+from keras.src.legacy.saving import saving_utils
+from keras.src.saving import object_registration
+from keras.src.utils import io_utils
 
 try:
     import h5py
@@ -200,7 +200,7 @@ def save_weights_to_hdf5_group(f, model):
         f: HDF5 group.
         model: Model instance.
     """
-    from keras import __version__ as keras_version
+    from keras.src import __version__ as keras_version
 
     save_attributes_to_hdf5_group(
         f, "layer_names", [layer.name.encode("utf8") for layer in model.layers]
diff --git a/keras/legacy/saving/legacy_h5_format_test.py b/keras/src/legacy/saving/legacy_h5_format_test.py
similarity index 98%
rename from keras/legacy/saving/legacy_h5_format_test.py
rename to keras/src/legacy/saving/legacy_h5_format_test.py
index c4e48e5eb07d..225b06f9ba44 100644
--- a/keras/legacy/saving/legacy_h5_format_test.py
+++ b/keras/src/legacy/saving/legacy_h5_format_test.py
@@ -4,13 +4,13 @@
 import pytest
 
 import keras
-from keras import layers
-from keras import models
-from keras import ops
-from keras import testing
-from keras.legacy.saving import legacy_h5_format
-from keras.saving import object_registration
-from keras.saving import serialization_lib
+from keras.src import layers
+from keras.src import models
+from keras.src import ops
+from keras.src import testing
+from keras.src.legacy.saving import legacy_h5_format
+from keras.src.saving import object_registration
+from keras.src.saving import serialization_lib
 
 # TODO: more thorough testing. Correctness depends
 # on exact weight ordering for each layer, so we need
@@ -233,7 +233,7 @@ class RegisteredSubLayer(layers.Layer):
         )
         model = models.Sequential([layer])
         with self.subTest("test_JSON"):
-            from keras.models.model import model_from_json
+            from keras.src.models.model import model_from_json
 
             model_json = model.to_json()
             self.assertIn("Foo>RegisteredSubLayer", model_json)
diff --git a/keras/legacy/saving/saving_options.py b/keras/src/legacy/saving/saving_options.py
similarity index 89%
rename from keras/legacy/saving/saving_options.py
rename to keras/src/legacy/saving/saving_options.py
index 30ba5fb464e1..6f270fb23290 100644
--- a/keras/legacy/saving/saving_options.py
+++ b/keras/src/legacy/saving/saving_options.py
@@ -1,6 +1,6 @@
 import contextlib
 
-from keras.backend.common import global_state
+from keras.src.backend.common import global_state
 
 
 @contextlib.contextmanager
diff --git a/keras/legacy/saving/saving_utils.py b/keras/src/legacy/saving/saving_utils.py
similarity index 95%
rename from keras/legacy/saving/saving_utils.py
rename to keras/src/legacy/saving/saving_utils.py
index 69e3553bdf15..aec107802138 100644
--- a/keras/legacy/saving/saving_utils.py
+++ b/keras/src/legacy/saving/saving_utils.py
@@ -3,15 +3,15 @@
 
 from absl import logging
 
-from keras import backend
-from keras import layers
-from keras import losses
-from keras import metrics as metrics_module
-from keras import models
-from keras import optimizers
-from keras import tree
-from keras.legacy.saving import serialization
-from keras.saving import object_registration
+from keras.src import backend
+from keras.src import layers
+from keras.src import losses
+from keras.src import metrics as metrics_module
+from keras.src import models
+from keras.src import optimizers
+from keras.src import tree
+from keras.src.legacy.saving import serialization
+from keras.src.saving import object_registration
 
 MODULE_OBJECTS = threading.local()
 
@@ -92,7 +92,7 @@ def model_from_config(config, custom_objects=None):
 
 def model_metadata(model, include_optimizer=True, require_config=True):
     """Returns a dictionary containing the model metadata."""
-    from keras import __version__ as keras_version
+    from keras.src import __version__ as keras_version
 
     model_config = {"class_name": model.__class__.__name__}
     try:
diff --git a/keras/legacy/saving/serialization.py b/keras/src/legacy/saving/serialization.py
similarity index 99%
rename from keras/legacy/saving/serialization.py
rename to keras/src/legacy/saving/serialization.py
index 98640c68ff59..7fa7eb44c507 100644
--- a/keras/legacy/saving/serialization.py
+++ b/keras/src/legacy/saving/serialization.py
@@ -7,8 +7,8 @@
 import weakref
 
 # isort: off
-from keras.api_export import keras_export
-from keras.saving import object_registration
+from keras.src.api_export import keras_export
+from keras.src.saving import object_registration
 
 # Flag that determines whether to skip the NotImplementedError when calling
 # get_config in custom models and layers. This is only enabled when saving to
diff --git a/keras/losses/__init__.py b/keras/src/losses/__init__.py
similarity index 64%
rename from keras/losses/__init__.py
rename to keras/src/losses/__init__.py
index e2cc81d49cef..9652ceb057bf 100644
--- a/keras/losses/__init__.py
+++ b/keras/src/losses/__init__.py
@@ -1,48 +1,48 @@
 import inspect
 
-from keras.api_export import keras_export
-from keras.losses.loss import Loss
-from keras.losses.losses import BinaryCrossentropy
-from keras.losses.losses import BinaryFocalCrossentropy
-from keras.losses.losses import CategoricalCrossentropy
-from keras.losses.losses import CategoricalFocalCrossentropy
-from keras.losses.losses import CategoricalHinge
-from keras.losses.losses import CosineSimilarity
-from keras.losses.losses import Dice
-from keras.losses.losses import Hinge
-from keras.losses.losses import Huber
-from keras.losses.losses import KLDivergence
-from keras.losses.losses import LogCosh
-from keras.losses.losses import LossFunctionWrapper
-from keras.losses.losses import MeanAbsoluteError
-from keras.losses.losses import MeanAbsolutePercentageError
-from keras.losses.losses import MeanSquaredError
-from keras.losses.losses import MeanSquaredLogarithmicError
-from keras.losses.losses import Poisson
-from keras.losses.losses import SparseCategoricalCrossentropy
-from keras.losses.losses import SquaredHinge
-from keras.losses.losses import Tversky
-from keras.losses.losses import binary_crossentropy
-from keras.losses.losses import binary_focal_crossentropy
-from keras.losses.losses import categorical_crossentropy
-from keras.losses.losses import categorical_focal_crossentropy
-from keras.losses.losses import categorical_hinge
-from keras.losses.losses import cosine_similarity
-from keras.losses.losses import ctc
-from keras.losses.losses import dice
-from keras.losses.losses import hinge
-from keras.losses.losses import huber
-from keras.losses.losses import kl_divergence
-from keras.losses.losses import log_cosh
-from keras.losses.losses import mean_absolute_error
-from keras.losses.losses import mean_absolute_percentage_error
-from keras.losses.losses import mean_squared_error
-from keras.losses.losses import mean_squared_logarithmic_error
-from keras.losses.losses import poisson
-from keras.losses.losses import sparse_categorical_crossentropy
-from keras.losses.losses import squared_hinge
-from keras.losses.losses import tversky
-from keras.saving import serialization_lib
+from keras.src.api_export import keras_export
+from keras.src.losses.loss import Loss
+from keras.src.losses.losses import BinaryCrossentropy
+from keras.src.losses.losses import BinaryFocalCrossentropy
+from keras.src.losses.losses import CategoricalCrossentropy
+from keras.src.losses.losses import CategoricalFocalCrossentropy
+from keras.src.losses.losses import CategoricalHinge
+from keras.src.losses.losses import CosineSimilarity
+from keras.src.losses.losses import Dice
+from keras.src.losses.losses import Hinge
+from keras.src.losses.losses import Huber
+from keras.src.losses.losses import KLDivergence
+from keras.src.losses.losses import LogCosh
+from keras.src.losses.losses import LossFunctionWrapper
+from keras.src.losses.losses import MeanAbsoluteError
+from keras.src.losses.losses import MeanAbsolutePercentageError
+from keras.src.losses.losses import MeanSquaredError
+from keras.src.losses.losses import MeanSquaredLogarithmicError
+from keras.src.losses.losses import Poisson
+from keras.src.losses.losses import SparseCategoricalCrossentropy
+from keras.src.losses.losses import SquaredHinge
+from keras.src.losses.losses import Tversky
+from keras.src.losses.losses import binary_crossentropy
+from keras.src.losses.losses import binary_focal_crossentropy
+from keras.src.losses.losses import categorical_crossentropy
+from keras.src.losses.losses import categorical_focal_crossentropy
+from keras.src.losses.losses import categorical_hinge
+from keras.src.losses.losses import cosine_similarity
+from keras.src.losses.losses import ctc
+from keras.src.losses.losses import dice
+from keras.src.losses.losses import hinge
+from keras.src.losses.losses import huber
+from keras.src.losses.losses import kl_divergence
+from keras.src.losses.losses import log_cosh
+from keras.src.losses.losses import mean_absolute_error
+from keras.src.losses.losses import mean_absolute_percentage_error
+from keras.src.losses.losses import mean_squared_error
+from keras.src.losses.losses import mean_squared_logarithmic_error
+from keras.src.losses.losses import poisson
+from keras.src.losses.losses import sparse_categorical_crossentropy
+from keras.src.losses.losses import squared_hinge
+from keras.src.losses.losses import tversky
+from keras.src.saving import serialization_lib
 
 ALL_OBJECTS = {
     # Base
diff --git a/keras/losses/loss.py b/keras/src/losses/loss.py
similarity index 97%
rename from keras/losses/loss.py
rename to keras/src/losses/loss.py
index ad432e62dc37..ba4c78ebc5a5 100644
--- a/keras/losses/loss.py
+++ b/keras/src/losses/loss.py
@@ -1,8 +1,8 @@
-from keras import backend
-from keras import ops
-from keras import tree
-from keras.api_export import keras_export
-from keras.utils.naming import auto_name
+from keras.src import backend
+from keras.src import ops
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.utils.naming import auto_name
 
 
 @keras_export(["keras.Loss", "keras.losses.Loss"])
diff --git a/keras/losses/loss_test.py b/keras/src/losses/loss_test.py
similarity index 97%
rename from keras/losses/loss_test.py
rename to keras/src/losses/loss_test.py
index 929785fcc420..1d5725ffd3a1 100644
--- a/keras/losses/loss_test.py
+++ b/keras/src/losses/loss_test.py
@@ -1,12 +1,12 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import losses as losses_module
-from keras import ops
-from keras import testing
-from keras.losses.loss import Loss
-from keras.losses.loss import squeeze_or_expand_to_same_rank
+from keras.src import backend
+from keras.src import losses as losses_module
+from keras.src import ops
+from keras.src import testing
+from keras.src.losses.loss import Loss
+from keras.src.losses.loss import squeeze_or_expand_to_same_rank
 
 
 class ExampleLoss(Loss):
diff --git a/keras/losses/losses.py b/keras/src/losses/losses.py
similarity index 99%
rename from keras/losses/losses.py
rename to keras/src/losses/losses.py
index ef0a2229dafc..f3f997616a00 100644
--- a/keras/losses/losses.py
+++ b/keras/src/losses/losses.py
@@ -1,12 +1,12 @@
 import warnings
 
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.losses.loss import Loss
-from keras.losses.loss import squeeze_or_expand_to_same_rank
-from keras.saving import serialization_lib
-from keras.utils.numerical_utils import normalize
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.losses.loss import Loss
+from keras.src.losses.loss import squeeze_or_expand_to_same_rank
+from keras.src.saving import serialization_lib
+from keras.src.utils.numerical_utils import normalize
 
 
 class LossFunctionWrapper(Loss):
diff --git a/keras/losses/losses_test.py b/keras/src/losses/losses_test.py
similarity index 99%
rename from keras/losses/losses_test.py
rename to keras/src/losses/losses_test.py
index 59af6abf9c1e..b97a8a253c3e 100644
--- a/keras/losses/losses_test.py
+++ b/keras/src/losses/losses_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import testing
-from keras.losses import losses
+from keras.src import backend
+from keras.src import testing
+from keras.src.losses import losses
 
 
 class MeanSquaredErrorTest(testing.TestCase):
diff --git a/keras/metrics/__init__.py b/keras/src/metrics/__init__.py
similarity index 59%
rename from keras/metrics/__init__.py
rename to keras/src/metrics/__init__.py
index 02e0f76dfcbe..fd5e89069770 100644
--- a/keras/metrics/__init__.py
+++ b/keras/src/metrics/__init__.py
@@ -1,52 +1,54 @@
 import inspect
 
-from keras.api_export import keras_export
-from keras.metrics.accuracy_metrics import Accuracy
-from keras.metrics.accuracy_metrics import BinaryAccuracy
-from keras.metrics.accuracy_metrics import CategoricalAccuracy
-from keras.metrics.accuracy_metrics import SparseCategoricalAccuracy
-from keras.metrics.accuracy_metrics import SparseTopKCategoricalAccuracy
-from keras.metrics.accuracy_metrics import TopKCategoricalAccuracy
-from keras.metrics.confusion_metrics import AUC
-from keras.metrics.confusion_metrics import FalseNegatives
-from keras.metrics.confusion_metrics import FalsePositives
-from keras.metrics.confusion_metrics import Precision
-from keras.metrics.confusion_metrics import PrecisionAtRecall
-from keras.metrics.confusion_metrics import Recall
-from keras.metrics.confusion_metrics import RecallAtPrecision
-from keras.metrics.confusion_metrics import SensitivityAtSpecificity
-from keras.metrics.confusion_metrics import SpecificityAtSensitivity
-from keras.metrics.confusion_metrics import TrueNegatives
-from keras.metrics.confusion_metrics import TruePositives
-from keras.metrics.f_score_metrics import F1Score
-from keras.metrics.f_score_metrics import FBetaScore
-from keras.metrics.hinge_metrics import CategoricalHinge
-from keras.metrics.hinge_metrics import Hinge
-from keras.metrics.hinge_metrics import SquaredHinge
-from keras.metrics.iou_metrics import BinaryIoU
-from keras.metrics.iou_metrics import IoU
-from keras.metrics.iou_metrics import MeanIoU
-from keras.metrics.iou_metrics import OneHotIoU
-from keras.metrics.iou_metrics import OneHotMeanIoU
-from keras.metrics.metric import Metric
-from keras.metrics.probabilistic_metrics import BinaryCrossentropy
-from keras.metrics.probabilistic_metrics import CategoricalCrossentropy
-from keras.metrics.probabilistic_metrics import KLDivergence
-from keras.metrics.probabilistic_metrics import Poisson
-from keras.metrics.probabilistic_metrics import SparseCategoricalCrossentropy
-from keras.metrics.reduction_metrics import Mean
-from keras.metrics.reduction_metrics import MeanMetricWrapper
-from keras.metrics.reduction_metrics import Sum
-from keras.metrics.regression_metrics import CosineSimilarity
-from keras.metrics.regression_metrics import LogCoshError
-from keras.metrics.regression_metrics import MeanAbsoluteError
-from keras.metrics.regression_metrics import MeanAbsolutePercentageError
-from keras.metrics.regression_metrics import MeanSquaredError
-from keras.metrics.regression_metrics import MeanSquaredLogarithmicError
-from keras.metrics.regression_metrics import R2Score
-from keras.metrics.regression_metrics import RootMeanSquaredError
-from keras.saving import serialization_lib
-from keras.utils.naming import to_snake_case
+from keras.src.api_export import keras_export
+from keras.src.metrics.accuracy_metrics import Accuracy
+from keras.src.metrics.accuracy_metrics import BinaryAccuracy
+from keras.src.metrics.accuracy_metrics import CategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import SparseCategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import SparseTopKCategoricalAccuracy
+from keras.src.metrics.accuracy_metrics import TopKCategoricalAccuracy
+from keras.src.metrics.confusion_metrics import AUC
+from keras.src.metrics.confusion_metrics import FalseNegatives
+from keras.src.metrics.confusion_metrics import FalsePositives
+from keras.src.metrics.confusion_metrics import Precision
+from keras.src.metrics.confusion_metrics import PrecisionAtRecall
+from keras.src.metrics.confusion_metrics import Recall
+from keras.src.metrics.confusion_metrics import RecallAtPrecision
+from keras.src.metrics.confusion_metrics import SensitivityAtSpecificity
+from keras.src.metrics.confusion_metrics import SpecificityAtSensitivity
+from keras.src.metrics.confusion_metrics import TrueNegatives
+from keras.src.metrics.confusion_metrics import TruePositives
+from keras.src.metrics.f_score_metrics import F1Score
+from keras.src.metrics.f_score_metrics import FBetaScore
+from keras.src.metrics.hinge_metrics import CategoricalHinge
+from keras.src.metrics.hinge_metrics import Hinge
+from keras.src.metrics.hinge_metrics import SquaredHinge
+from keras.src.metrics.iou_metrics import BinaryIoU
+from keras.src.metrics.iou_metrics import IoU
+from keras.src.metrics.iou_metrics import MeanIoU
+from keras.src.metrics.iou_metrics import OneHotIoU
+from keras.src.metrics.iou_metrics import OneHotMeanIoU
+from keras.src.metrics.metric import Metric
+from keras.src.metrics.probabilistic_metrics import BinaryCrossentropy
+from keras.src.metrics.probabilistic_metrics import CategoricalCrossentropy
+from keras.src.metrics.probabilistic_metrics import KLDivergence
+from keras.src.metrics.probabilistic_metrics import Poisson
+from keras.src.metrics.probabilistic_metrics import (
+    SparseCategoricalCrossentropy,
+)
+from keras.src.metrics.reduction_metrics import Mean
+from keras.src.metrics.reduction_metrics import MeanMetricWrapper
+from keras.src.metrics.reduction_metrics import Sum
+from keras.src.metrics.regression_metrics import CosineSimilarity
+from keras.src.metrics.regression_metrics import LogCoshError
+from keras.src.metrics.regression_metrics import MeanAbsoluteError
+from keras.src.metrics.regression_metrics import MeanAbsolutePercentageError
+from keras.src.metrics.regression_metrics import MeanSquaredError
+from keras.src.metrics.regression_metrics import MeanSquaredLogarithmicError
+from keras.src.metrics.regression_metrics import R2Score
+from keras.src.metrics.regression_metrics import RootMeanSquaredError
+from keras.src.saving import serialization_lib
+from keras.src.utils.naming import to_snake_case
 
 ALL_OBJECTS = {
     # Base
diff --git a/keras/metrics/accuracy_metrics.py b/keras/src/metrics/accuracy_metrics.py
similarity index 98%
rename from keras/metrics/accuracy_metrics.py
rename to keras/src/metrics/accuracy_metrics.py
index 330c09ce775e..53a9b207cfdf 100644
--- a/keras/metrics/accuracy_metrics.py
+++ b/keras/src/metrics/accuracy_metrics.py
@@ -1,8 +1,8 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.losses.loss import squeeze_or_expand_to_same_rank
-from keras.metrics import reduction_metrics
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.losses.loss import squeeze_or_expand_to_same_rank
+from keras.src.metrics import reduction_metrics
 
 
 def accuracy(y_true, y_pred):
diff --git a/keras/metrics/accuracy_metrics_test.py b/keras/src/metrics/accuracy_metrics_test.py
similarity index 99%
rename from keras/metrics/accuracy_metrics_test.py
rename to keras/src/metrics/accuracy_metrics_test.py
index 06207e3e8114..a2adc1d4f23b 100644
--- a/keras/metrics/accuracy_metrics_test.py
+++ b/keras/src/metrics/accuracy_metrics_test.py
@@ -2,8 +2,8 @@
 
 import numpy as np
 
-from keras import testing
-from keras.metrics import accuracy_metrics
+from keras.src import testing
+from keras.src.metrics import accuracy_metrics
 
 
 class AccuracyTest(testing.TestCase):
diff --git a/keras/metrics/confusion_metrics.py b/keras/src/metrics/confusion_metrics.py
similarity index 99%
rename from keras/metrics/confusion_metrics.py
rename to keras/src/metrics/confusion_metrics.py
index 18791977d463..175932e47127 100644
--- a/keras/metrics/confusion_metrics.py
+++ b/keras/src/metrics/confusion_metrics.py
@@ -1,13 +1,13 @@
 import numpy as np
 
-from keras import activations
-from keras import backend
-from keras import initializers
-from keras import ops
-from keras.api_export import keras_export
-from keras.metrics import metrics_utils
-from keras.metrics.metric import Metric
-from keras.utils.python_utils import to_list
+from keras.src import activations
+from keras.src import backend
+from keras.src import initializers
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.metrics import metrics_utils
+from keras.src.metrics.metric import Metric
+from keras.src.utils.python_utils import to_list
 
 
 class _ConfusionMatrixConditionCount(Metric):
diff --git a/keras/metrics/confusion_metrics_test.py b/keras/src/metrics/confusion_metrics_test.py
similarity index 99%
rename from keras/metrics/confusion_metrics_test.py
rename to keras/src/metrics/confusion_metrics_test.py
index 849aef9d6a2b..ba5934cc342f 100644
--- a/keras/metrics/confusion_metrics_test.py
+++ b/keras/src/metrics/confusion_metrics_test.py
@@ -5,12 +5,12 @@
 from absl import logging
 from absl.testing import parameterized
 
-from keras import layers
-from keras import metrics
-from keras import models
-from keras import ops
-from keras import testing
-from keras.metrics import metrics_utils
+from keras.src import layers
+from keras.src import metrics
+from keras.src import models
+from keras.src import ops
+from keras.src import testing
+from keras.src.metrics import metrics_utils
 
 
 class FalsePositivesTest(testing.TestCase):
diff --git a/keras/metrics/f_score_metrics.py b/keras/src/metrics/f_score_metrics.py
similarity index 98%
rename from keras/metrics/f_score_metrics.py
rename to keras/src/metrics/f_score_metrics.py
index eda9c2576593..a51119cb48e4 100644
--- a/keras/metrics/f_score_metrics.py
+++ b/keras/src/metrics/f_score_metrics.py
@@ -1,8 +1,8 @@
-from keras import backend
-from keras import initializers
-from keras import ops
-from keras.api_export import keras_export
-from keras.metrics.metric import Metric
+from keras.src import backend
+from keras.src import initializers
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.metrics.metric import Metric
 
 
 @keras_export("keras.metrics.FBetaScore")
diff --git a/keras/metrics/f_score_metrics_test.py b/keras/src/metrics/f_score_metrics_test.py
similarity index 99%
rename from keras/metrics/f_score_metrics_test.py
rename to keras/src/metrics/f_score_metrics_test.py
index c5b700664cdf..baf7acced00b 100644
--- a/keras/metrics/f_score_metrics_test.py
+++ b/keras/src/metrics/f_score_metrics_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import testing
-from keras.metrics import f_score_metrics
+from keras.src import testing
+from keras.src.metrics import f_score_metrics
 
 
 class FBetaScoreTest(parameterized.TestCase, testing.TestCase):
diff --git a/keras/metrics/hinge_metrics.py b/keras/src/metrics/hinge_metrics.py
similarity index 92%
rename from keras/metrics/hinge_metrics.py
rename to keras/src/metrics/hinge_metrics.py
index 8ca0530ce2e7..4678b3fa1718 100644
--- a/keras/metrics/hinge_metrics.py
+++ b/keras/src/metrics/hinge_metrics.py
@@ -1,8 +1,8 @@
-from keras.api_export import keras_export
-from keras.losses.losses import categorical_hinge
-from keras.losses.losses import hinge
-from keras.losses.losses import squared_hinge
-from keras.metrics import reduction_metrics
+from keras.src.api_export import keras_export
+from keras.src.losses.losses import categorical_hinge
+from keras.src.losses.losses import hinge
+from keras.src.losses.losses import squared_hinge
+from keras.src.metrics import reduction_metrics
 
 
 @keras_export("keras.metrics.Hinge")
diff --git a/keras/metrics/hinge_metrics_test.py b/keras/src/metrics/hinge_metrics_test.py
similarity index 98%
rename from keras/metrics/hinge_metrics_test.py
rename to keras/src/metrics/hinge_metrics_test.py
index 6e217d33ea35..26d67b98ee6d 100644
--- a/keras/metrics/hinge_metrics_test.py
+++ b/keras/src/metrics/hinge_metrics_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import testing
-from keras.metrics import hinge_metrics
+from keras.src import testing
+from keras.src.metrics import hinge_metrics
 
 
 class HingeTest(testing.TestCase):
diff --git a/keras/metrics/iou_metrics.py b/keras/src/metrics/iou_metrics.py
similarity index 99%
rename from keras/metrics/iou_metrics.py
rename to keras/src/metrics/iou_metrics.py
index e8dd9594b5d7..f39222ede85c 100644
--- a/keras/metrics/iou_metrics.py
+++ b/keras/src/metrics/iou_metrics.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras import initializers
-from keras import ops
-from keras.api_export import keras_export
-from keras.metrics.metric import Metric
-from keras.metrics.metrics_utils import confusion_matrix
+from keras.src import backend
+from keras.src import initializers
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.metrics.metric import Metric
+from keras.src.metrics.metrics_utils import confusion_matrix
 
 
 class _IoUBase(Metric):
diff --git a/keras/metrics/iou_metrics_test.py b/keras/src/metrics/iou_metrics_test.py
similarity index 99%
rename from keras/metrics/iou_metrics_test.py
rename to keras/src/metrics/iou_metrics_test.py
index 907af12ceac7..76887dfc0655 100644
--- a/keras/metrics/iou_metrics_test.py
+++ b/keras/src/metrics/iou_metrics_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 import pytest
 
-from keras import layers
-from keras import models
-from keras import testing
-from keras.metrics import iou_metrics as metrics
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
+from keras.src.metrics import iou_metrics as metrics
 
 
 class IoUTest(testing.TestCase):
diff --git a/keras/metrics/metric.py b/keras/src/metrics/metric.py
similarity index 97%
rename from keras/metrics/metric.py
rename to keras/src/metrics/metric.py
index c4c43f8549f1..27f39f94d799 100644
--- a/keras/metrics/metric.py
+++ b/keras/src/metrics/metric.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras import initializers
-from keras import ops
-from keras.api_export import keras_export
-from keras.utils.naming import auto_name
-from keras.utils.tracking import Tracker
+from keras.src import backend
+from keras.src import initializers
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.utils.naming import auto_name
+from keras.src.utils.tracking import Tracker
 
 
 @keras_export(["keras.Metric", "keras.metrics.Metric"])
diff --git a/keras/metrics/metric_test.py b/keras/src/metrics/metric_test.py
similarity index 96%
rename from keras/metrics/metric_test.py
rename to keras/src/metrics/metric_test.py
index 56d3737e597f..346e6140c89b 100644
--- a/keras/metrics/metric_test.py
+++ b/keras/src/metrics/metric_test.py
@@ -1,11 +1,11 @@
 import numpy as np
 
-from keras import backend
-from keras import initializers
-from keras import metrics as metrics_module
-from keras import ops
-from keras import testing
-from keras.metrics.metric import Metric
+from keras.src import backend
+from keras.src import initializers
+from keras.src import metrics as metrics_module
+from keras.src import ops
+from keras.src import testing
+from keras.src.metrics.metric import Metric
 
 
 class ExampleMetric(Metric):
diff --git a/keras/metrics/metrics_utils.py b/keras/src/metrics/metrics_utils.py
similarity index 99%
rename from keras/metrics/metrics_utils.py
rename to keras/src/metrics/metrics_utils.py
index 8018363277e3..32f02bbb3ccb 100644
--- a/keras/metrics/metrics_utils.py
+++ b/keras/src/metrics/metrics_utils.py
@@ -2,10 +2,10 @@
 
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras.losses.loss import squeeze_or_expand_to_same_rank
-from keras.utils.python_utils import to_list
+from keras.src import backend
+from keras.src import ops
+from keras.src.losses.loss import squeeze_or_expand_to_same_rank
+from keras.src.utils.python_utils import to_list
 
 NEG_INF = -1e10
 
diff --git a/keras/metrics/probabilistic_metrics.py b/keras/src/metrics/probabilistic_metrics.py
similarity index 96%
rename from keras/metrics/probabilistic_metrics.py
rename to keras/src/metrics/probabilistic_metrics.py
index b6f4551e0796..1abcd55623fc 100644
--- a/keras/metrics/probabilistic_metrics.py
+++ b/keras/src/metrics/probabilistic_metrics.py
@@ -1,10 +1,10 @@
-from keras.api_export import keras_export
-from keras.losses.losses import binary_crossentropy
-from keras.losses.losses import categorical_crossentropy
-from keras.losses.losses import kl_divergence
-from keras.losses.losses import poisson
-from keras.losses.losses import sparse_categorical_crossentropy
-from keras.metrics import reduction_metrics
+from keras.src.api_export import keras_export
+from keras.src.losses.losses import binary_crossentropy
+from keras.src.losses.losses import categorical_crossentropy
+from keras.src.losses.losses import kl_divergence
+from keras.src.losses.losses import poisson
+from keras.src.losses.losses import sparse_categorical_crossentropy
+from keras.src.metrics import reduction_metrics
 
 
 @keras_export("keras.metrics.KLDivergence")
diff --git a/keras/metrics/probabilistic_metrics_test.py b/keras/src/metrics/probabilistic_metrics_test.py
similarity index 99%
rename from keras/metrics/probabilistic_metrics_test.py
rename to keras/src/metrics/probabilistic_metrics_test.py
index 1ff76a846f99..0950b277893b 100644
--- a/keras/metrics/probabilistic_metrics_test.py
+++ b/keras/src/metrics/probabilistic_metrics_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import metrics
-from keras import testing
+from keras.src import metrics
+from keras.src import testing
 
 
 class KLDivergenceTest(testing.TestCase):
diff --git a/keras/metrics/reduction_metrics.py b/keras/src/metrics/reduction_metrics.py
similarity index 96%
rename from keras/metrics/reduction_metrics.py
rename to keras/src/metrics/reduction_metrics.py
index 88c6af118e5a..90f45c008d96 100644
--- a/keras/metrics/reduction_metrics.py
+++ b/keras/src/metrics/reduction_metrics.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras import initializers
-from keras import losses
-from keras import ops
-from keras.api_export import keras_export
-from keras.metrics.metric import Metric
-from keras.saving import serialization_lib
+from keras.src import backend
+from keras.src import initializers
+from keras.src import losses
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.metrics.metric import Metric
+from keras.src.saving import serialization_lib
 
 
 def reduce_to_samplewise_values(values, sample_weight, reduce_fn, dtype):
diff --git a/keras/metrics/reduction_metrics_test.py b/keras/src/metrics/reduction_metrics_test.py
similarity index 97%
rename from keras/metrics/reduction_metrics_test.py
rename to keras/src/metrics/reduction_metrics_test.py
index 7f56fde5f04b..eb0443a6d85c 100644
--- a/keras/metrics/reduction_metrics_test.py
+++ b/keras/src/metrics/reduction_metrics_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from keras import testing
-from keras.metrics import reduction_metrics
-from keras.saving import register_keras_serializable
+from keras.src import testing
+from keras.src.metrics import reduction_metrics
+from keras.src.saving import register_keras_serializable
 
 
 class SumTest(testing.TestCase):
diff --git a/keras/metrics/regression_metrics.py b/keras/src/metrics/regression_metrics.py
similarity index 97%
rename from keras/metrics/regression_metrics.py
rename to keras/src/metrics/regression_metrics.py
index 7997be11d901..220e87c20929 100644
--- a/keras/metrics/regression_metrics.py
+++ b/keras/src/metrics/regression_metrics.py
@@ -1,16 +1,16 @@
 import warnings
 
-from keras import initializers
-from keras import ops
-from keras.api_export import keras_export
-from keras.losses.loss import squeeze_or_expand_to_same_rank
-from keras.losses.losses import log_cosh
-from keras.losses.losses import mean_absolute_error
-from keras.losses.losses import mean_absolute_percentage_error
-from keras.losses.losses import mean_squared_error
-from keras.losses.losses import mean_squared_logarithmic_error
-from keras.metrics import reduction_metrics
-from keras.utils.numerical_utils import normalize
+from keras.src import initializers
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.losses.loss import squeeze_or_expand_to_same_rank
+from keras.src.losses.losses import log_cosh
+from keras.src.losses.losses import mean_absolute_error
+from keras.src.losses.losses import mean_absolute_percentage_error
+from keras.src.losses.losses import mean_squared_error
+from keras.src.losses.losses import mean_squared_logarithmic_error
+from keras.src.metrics import reduction_metrics
+from keras.src.utils.numerical_utils import normalize
 
 
 @keras_export("keras.metrics.MeanSquaredError")
diff --git a/keras/metrics/regression_metrics_test.py b/keras/src/metrics/regression_metrics_test.py
similarity index 99%
rename from keras/metrics/regression_metrics_test.py
rename to keras/src/metrics/regression_metrics_test.py
index 7a3dbc5b5cbe..e7276f58c70e 100644
--- a/keras/metrics/regression_metrics_test.py
+++ b/keras/src/metrics/regression_metrics_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import testing
-from keras.metrics import regression_metrics as metrics
+from keras.src import testing
+from keras.src.metrics import regression_metrics as metrics
 
 
 class MeanSquaredErrorTest(testing.TestCase):
diff --git a/keras/src/models/__init__.py b/keras/src/models/__init__.py
new file mode 100644
index 000000000000..1f3f73c99961
--- /dev/null
+++ b/keras/src/models/__init__.py
@@ -0,0 +1,3 @@
+from keras.src.models.functional import Functional
+from keras.src.models.model import Model
+from keras.src.models.sequential import Sequential
diff --git a/keras/models/cloning.py b/keras/src/models/cloning.py
similarity index 96%
rename from keras/models/cloning.py
rename to keras/src/models/cloning.py
index e17655dc582e..3875b3522a6e 100644
--- a/keras/models/cloning.py
+++ b/keras/src/models/cloning.py
@@ -1,13 +1,13 @@
-from keras import backend
-from keras import tree
-from keras import utils
-from keras.api_export import keras_export
-from keras.layers import Input
-from keras.layers import InputLayer
-from keras.models.functional import Functional
-from keras.models.functional import functional_like_constructor
-from keras.models.sequential import Sequential
-from keras.saving import serialization_lib
+from keras.src import backend
+from keras.src import tree
+from keras.src import utils
+from keras.src.api_export import keras_export
+from keras.src.layers import Input
+from keras.src.layers import InputLayer
+from keras.src.models.functional import Functional
+from keras.src.models.functional import functional_like_constructor
+from keras.src.models.sequential import Sequential
+from keras.src.saving import serialization_lib
 
 
 @keras_export("keras.models.clone_model")
diff --git a/keras/models/cloning_test.py b/keras/src/models/cloning_test.py
similarity index 96%
rename from keras/models/cloning_test.py
rename to keras/src/models/cloning_test.py
index 340856f33a89..d9a46ac29cfa 100644
--- a/keras/models/cloning_test.py
+++ b/keras/src/models/cloning_test.py
@@ -2,11 +2,11 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import layers
-from keras import models
-from keras import testing
-from keras import tree
-from keras.models.cloning import clone_model
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
+from keras.src import tree
+from keras.src.models.cloning import clone_model
 
 
 def get_mlp_functional_model(shared_layers=False):
diff --git a/keras/models/functional.py b/keras/src/models/functional.py
similarity index 97%
rename from keras/models/functional.py
rename to keras/src/models/functional.py
index de6c8d82a5f1..20e2266e00e6 100644
--- a/keras/models/functional.py
+++ b/keras/src/models/functional.py
@@ -3,24 +3,24 @@
 import typing
 import warnings
 
-from keras import backend
-from keras import ops
-from keras import tree
-from keras.backend.common import global_state
-from keras.layers.core.input_layer import Input
-from keras.layers.core.input_layer import InputLayer
-from keras.layers.input_spec import InputSpec
-from keras.layers.layer import Layer
-from keras.legacy.saving import saving_utils
-from keras.legacy.saving import serialization as legacy_serialization
-from keras.models.model import Model
-from keras.ops.function import Function
-from keras.ops.function import _build_map
-from keras.ops.function import make_node_key
-from keras.ops.node import KerasHistory
-from keras.ops.node import Node
-from keras.saving import serialization_lib
-from keras.utils import tracking
+from keras.src import backend
+from keras.src import ops
+from keras.src import tree
+from keras.src.backend.common import global_state
+from keras.src.layers.core.input_layer import Input
+from keras.src.layers.core.input_layer import InputLayer
+from keras.src.layers.input_spec import InputSpec
+from keras.src.layers.layer import Layer
+from keras.src.legacy.saving import saving_utils
+from keras.src.legacy.saving import serialization as legacy_serialization
+from keras.src.models.model import Model
+from keras.src.ops.function import Function
+from keras.src.ops.function import _build_map
+from keras.src.ops.function import make_node_key
+from keras.src.ops.node import KerasHistory
+from keras.src.ops.node import Node
+from keras.src.saving import serialization_lib
+from keras.src.utils import tracking
 
 
 class Functional(Function, Model):
diff --git a/keras/models/functional_test.py b/keras/src/models/functional_test.py
similarity index 98%
rename from keras/models/functional_test.py
rename to keras/src/models/functional_test.py
index 432cc3273772..d8acbcae4f3c 100644
--- a/keras/models/functional_test.py
+++ b/keras/src/models/functional_test.py
@@ -3,13 +3,13 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import testing
-from keras.layers.core.input_layer import Input
-from keras.layers.input_spec import InputSpec
-from keras.models import Functional
-from keras.models import Model
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
+from keras.src.layers.core.input_layer import Input
+from keras.src.layers.input_spec import InputSpec
+from keras.src.models import Functional
+from keras.src.models import Model
 
 
 class FunctionalTest(testing.TestCase):
diff --git a/keras/models/model.py b/keras/src/models/model.py
similarity index 94%
rename from keras/models/model.py
rename to keras/src/models/model.py
index 65d915cba7bd..5678f34c6828 100644
--- a/keras/models/model.py
+++ b/keras/src/models/model.py
@@ -3,24 +3,26 @@
 import typing
 import warnings
 
-from keras import backend
-from keras import utils
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.models.variable_mapping import map_trackable_variables
-from keras.saving import saving_api
-from keras.trainers import trainer as base_trainer
-from keras.utils import summary_utils
-from keras.utils import traceback_utils
+from keras.src import backend
+from keras.src import utils
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.models.variable_mapping import map_trackable_variables
+from keras.src.saving import saving_api
+from keras.src.trainers import trainer as base_trainer
+from keras.src.utils import summary_utils
+from keras.src.utils import traceback_utils
 
 if backend.backend() == "tensorflow":
-    from keras.backend.tensorflow.trainer import TensorFlowTrainer as Trainer
+    from keras.src.backend.tensorflow.trainer import (
+        TensorFlowTrainer as Trainer,
+    )
 elif backend.backend() == "jax":
-    from keras.backend.jax.trainer import JAXTrainer as Trainer
+    from keras.src.backend.jax.trainer import JAXTrainer as Trainer
 elif backend.backend() == "torch":
-    from keras.backend.torch.trainer import TorchTrainer as Trainer
+    from keras.src.backend.torch.trainer import TorchTrainer as Trainer
 elif backend.backend() == "numpy":
-    from keras.backend.numpy.trainer import NumpyTrainer as Trainer
+    from keras.src.backend.numpy.trainer import NumpyTrainer as Trainer
 else:
     raise RuntimeError(
         f"Backend '{backend.backend()}' must implement the Trainer class."
@@ -136,14 +138,14 @@ def call(self, inputs, training=False):
     def __new__(cls, *args, **kwargs):
         # Signature detection for usage of `Model` as a `Functional`
         if functional_init_arguments(args, kwargs) and cls == Model:
-            from keras.models import functional
+            from keras.src.models import functional
 
             return functional.Functional(*args, **kwargs)
         return typing.cast(Model, super().__new__(cls))
 
     def __init__(self, *args, **kwargs):
         Trainer.__init__(self)
-        from keras.models import functional
+        from keras.src.models import functional
 
         # Signature detection for usage of a `Model` subclass
         # as a `Functional` subclass
@@ -357,7 +359,7 @@ def quantize(self, mode):
             mode: The mode of the quantization. Only 'int8' is supported at this
                 time.
         """
-        from keras.dtype_policies import QUANTIZATION_MODES
+        from keras.src.dtype_policies import QUANTIZATION_MODES
 
         if not self.built:
             raise ValueError(
@@ -442,7 +444,7 @@ def to_json(self, **kwargs):
         Returns:
             A JSON string.
         """
-        from keras.saving import serialization_lib
+        from keras.src.saving import serialization_lib
 
         model_config = serialization_lib.serialize_keras_object(self)
         return json.dumps(model_config, **kwargs)
@@ -481,13 +483,13 @@ def export(self, filepath, format="tf_saved_model"):
         use the lower-level `keras.export.ExportArchive` class. The
         `export()` method relies on `ExportArchive` internally.
         """
-        from keras.export import export_lib
+        from keras.src.export import export_lib
 
         export_lib.export_model(self, filepath)
 
     @classmethod
     def from_config(cls, config, custom_objects=None):
-        from keras.models.functional import Functional
+        from keras.src.models.functional import Functional
 
         functional_config_keys = [
             "name",
@@ -510,7 +512,7 @@ def from_config(cls, config, custom_objects=None):
         if is_functional_config and revivable_as_functional:
             # Revive Functional model
             # (but not Functional subclasses with a custom __init__)
-            from keras.models.functional import functional_from_config
+            from keras.src.models.functional import functional_from_config
 
             return functional_from_config(
                 cls, config, custom_objects=custom_objects
@@ -567,7 +569,7 @@ def model_from_json(json_string, custom_objects=None):
     Returns:
         A Keras model instance (uncompiled).
     """
-    from keras.saving import serialization_lib
+    from keras.src.saving import serialization_lib
 
     model_config = json.loads(json_string)
     return serialization_lib.deserialize_keras_object(
@@ -585,7 +587,7 @@ def functional_init_arguments(args, kwargs):
 
 def inject_functional_model_class(cls):
     """Inject `Functional` into the hierarchy of this class if needed."""
-    from keras.models import functional
+    from keras.src.models import functional
 
     if cls == Model:
         return functional.Functional
diff --git a/keras/models/model_test.py b/keras/src/models/model_test.py
similarity index 98%
rename from keras/models/model_test.py
rename to keras/src/models/model_test.py
index 23f647b7d067..871fc4bff19e 100644
--- a/keras/models/model_test.py
+++ b/keras/src/models/model_test.py
@@ -2,13 +2,13 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import testing
-from keras.layers.core.input_layer import Input
-from keras.models.functional import Functional
-from keras.models.model import Model
-from keras.models.model import model_from_json
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
+from keras.src.layers.core.input_layer import Input
+from keras.src.models.functional import Functional
+from keras.src.models.model import Model
+from keras.src.models.model import model_from_json
 
 
 def _get_model():
diff --git a/keras/models/sequential.py b/keras/src/models/sequential.py
similarity index 96%
rename from keras/models/sequential.py
rename to keras/src/models/sequential.py
index e094a5df5eee..ecdaa4058e8d 100644
--- a/keras/models/sequential.py
+++ b/keras/src/models/sequential.py
@@ -2,16 +2,16 @@
 import inspect
 import typing
 
-from keras import tree
-from keras.api_export import keras_export
-from keras.backend.common import global_state
-from keras.layers.core.input_layer import InputLayer
-from keras.layers.layer import Layer
-from keras.legacy.saving import saving_utils
-from keras.legacy.saving import serialization as legacy_serialization
-from keras.models.functional import Functional
-from keras.models.model import Model
-from keras.saving import serialization_lib
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
+from keras.src.layers.core.input_layer import InputLayer
+from keras.src.layers.layer import Layer
+from keras.src.legacy.saving import saving_utils
+from keras.src.legacy.saving import serialization as legacy_serialization
+from keras.src.models.functional import Functional
+from keras.src.models.model import Model
+from keras.src.saving import serialization_lib
 
 
 @keras_export(["keras.Sequential", "keras.models.Sequential"])
diff --git a/keras/models/sequential_test.py b/keras/src/models/sequential_test.py
similarity index 97%
rename from keras/models/sequential_test.py
rename to keras/src/models/sequential_test.py
index 0df2d64cd925..12c0703ab45a 100644
--- a/keras/models/sequential_test.py
+++ b/keras/src/models/sequential_test.py
@@ -1,12 +1,12 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import testing
-from keras.layers.core.input_layer import Input
-from keras.models.functional import Functional
-from keras.models.sequential import Sequential
+from keras.src import backend
+from keras.src import layers
+from keras.src import testing
+from keras.src.layers.core.input_layer import Input
+from keras.src.models.functional import Functional
+from keras.src.models.sequential import Sequential
 
 
 @pytest.mark.requires_trainable_backend
diff --git a/keras/models/variable_mapping.py b/keras/src/models/variable_mapping.py
similarity index 91%
rename from keras/models/variable_mapping.py
rename to keras/src/models/variable_mapping.py
index ec04015a74b2..ed9deb7340ec 100644
--- a/keras/models/variable_mapping.py
+++ b/keras/src/models/variable_mapping.py
@@ -1,7 +1,7 @@
-from keras.layers.layer import Layer
-from keras.metrics.metric import Metric
-from keras.optimizers.optimizer import Optimizer
-from keras.saving import saving_lib
+from keras.src.layers.layer import Layer
+from keras.src.metrics.metric import Metric
+from keras.src.optimizers.optimizer import Optimizer
+from keras.src.saving import saving_lib
 
 
 def map_trackable_variables(trackable, store, visited_trackables):
diff --git a/keras/models/variable_mapping_test.py b/keras/src/models/variable_mapping_test.py
similarity index 94%
rename from keras/models/variable_mapping_test.py
rename to keras/src/models/variable_mapping_test.py
index 6eadce71bade..652e578289ce 100644
--- a/keras/models/variable_mapping_test.py
+++ b/keras/src/models/variable_mapping_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import testing
-from keras.saving import saving_lib_test
+from keras.src import testing
+from keras.src.saving import saving_lib_test
 
 
 class VariableMappingTest(testing.TestCase):
diff --git a/keras/src/ops/__init__.py b/keras/src/ops/__init__.py
new file mode 100644
index 000000000000..754923c9fea5
--- /dev/null
+++ b/keras/src/ops/__init__.py
@@ -0,0 +1,16 @@
+# from keras.src.ops.numpy import Matmul, matmul
+# from keras.src.ops.numpy import Add, add
+# from keras.src.ops.numpy import Multiply, multiply
+
+from keras.src.backend import cast
+from keras.src.backend import cond
+from keras.src.backend import is_tensor
+from keras.src.backend import name_scope
+from keras.src.backend import random
+from keras.src.ops import image
+from keras.src.ops import operation_utils
+from keras.src.ops.core import *  # noqa: F403
+from keras.src.ops.linalg import *  # noqa: F403
+from keras.src.ops.math import *  # noqa: F403
+from keras.src.ops.nn import *  # noqa: F403
+from keras.src.ops.numpy import *  # noqa: F403
diff --git a/keras/ops/core.py b/keras/src/ops/core.py
similarity index 98%
rename from keras/ops/core.py
rename to keras/src/ops/core.py
index c542f79f8847..5f581fa8678f 100644
--- a/keras/ops/core.py
+++ b/keras/src/ops/core.py
@@ -16,13 +16,13 @@
 
 import numpy as np
 
-from keras import backend
-from keras import tree
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.backend import any_symbolic_tensors
-from keras.ops.operation import Operation
-from keras.utils import traceback_utils
+from keras.src import backend
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.backend import any_symbolic_tensors
+from keras.src.ops.operation import Operation
+from keras.src.utils import traceback_utils
 
 
 class Scatter(Operation):
diff --git a/keras/ops/core_test.py b/keras/src/ops/core_test.py
similarity index 98%
rename from keras/ops/core_test.py
rename to keras/src/ops/core_test.py
index fe1284d1252b..31d553853b63 100644
--- a/keras/ops/core_test.py
+++ b/keras/src/ops/core_test.py
@@ -5,17 +5,17 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import losses
-from keras import models
-from keras import ops
-from keras import optimizers
-from keras import testing
-from keras import tree
-from keras.backend.common import dtypes
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.ops import core
+from keras.src import backend
+from keras.src import layers
+from keras.src import losses
+from keras.src import models
+from keras.src import ops
+from keras.src import optimizers
+from keras.src import testing
+from keras.src import tree
+from keras.src.backend.common import dtypes
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.ops import core
 
 
 class CoreOpsStaticShapeTest(testing.TestCase):
diff --git a/keras/ops/function.py b/keras/src/ops/function.py
similarity index 98%
rename from keras/ops/function.py
rename to keras/src/ops/function.py
index 7ae8244c77c2..8b6930ac12ab 100644
--- a/keras/ops/function.py
+++ b/keras/src/ops/function.py
@@ -1,10 +1,10 @@
 import collections
 
-from keras import tree
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.backend.config import backend
-from keras.ops.operation import Operation
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.backend.config import backend
+from keras.src.ops.operation import Operation
 
 
 @keras_export("keras.Function")
diff --git a/keras/ops/function_test.py b/keras/src/ops/function_test.py
similarity index 94%
rename from keras/ops/function_test.py
rename to keras/src/ops/function_test.py
index 34de13c814e7..d1ebc838d314 100644
--- a/keras/ops/function_test.py
+++ b/keras/src/ops/function_test.py
@@ -2,13 +2,13 @@
 
 import numpy as np
 
-from keras import testing
-from keras.backend.common import keras_tensor
-from keras.layers import Dense
-from keras.layers import Input
-from keras.models import Model
-from keras.ops import function
-from keras.ops import numpy as knp
+from keras.src import testing
+from keras.src.backend.common import keras_tensor
+from keras.src.layers import Dense
+from keras.src.layers import Input
+from keras.src.models import Model
+from keras.src.ops import function
+from keras.src.ops import numpy as knp
 
 
 class FunctionTest(testing.TestCase):
diff --git a/keras/ops/image.py b/keras/src/ops/image.py
similarity index 99%
rename from keras/ops/image.py
rename to keras/src/ops/image.py
index 960290500729..398defe615a4 100644
--- a/keras/ops/image.py
+++ b/keras/src/ops/image.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.backend import any_symbolic_tensors
-from keras.ops.operation import Operation
-from keras.ops.operation_utils import compute_conv_output_shape
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.backend import any_symbolic_tensors
+from keras.src.ops.operation import Operation
+from keras.src.ops.operation_utils import compute_conv_output_shape
 
 
 class RGBToGrayscale(Operation):
@@ -78,7 +78,7 @@ def rgb_to_grayscale(
     Examples:
 
     >>> import numpy as np
-    >>> from keras import ops
+    >>> from keras.src import ops
     >>> x = np.random.random((2, 4, 4, 3))
     >>> y = ops.image.rgb_to_grayscale(x)
     >>> y.shape
diff --git a/keras/ops/image_test.py b/keras/src/ops/image_test.py
similarity index 99%
rename from keras/ops/image_test.py
rename to keras/src/ops/image_test.py
index 2f8b24a3e1ec..1f3fb7938063 100644
--- a/keras/ops/image_test.py
+++ b/keras/src/ops/image_test.py
@@ -6,10 +6,10 @@
 import tensorflow as tf
 from absl.testing import parameterized
 
-from keras import backend
-from keras import testing
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.ops import image as kimage
+from keras.src import backend
+from keras.src import testing
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.ops import image as kimage
 
 
 class ImageOpsDynamicShapeTest(testing.TestCase):
diff --git a/keras/ops/linalg.py b/keras/src/ops/linalg.py
similarity index 98%
rename from keras/ops/linalg.py
rename to keras/src/ops/linalg.py
index 0636b185cc85..cd2ac98c7090 100644
--- a/keras/ops/linalg.py
+++ b/keras/src/ops/linalg.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.backend import any_symbolic_tensors
-from keras.ops.operation import Operation
-from keras.ops.operation_utils import reduce_shape
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.backend import any_symbolic_tensors
+from keras.src.ops.operation import Operation
+from keras.src.ops.operation_utils import reduce_shape
 
 
 class Cholesky(Operation):
diff --git a/keras/ops/linalg_test.py b/keras/src/ops/linalg_test.py
similarity index 98%
rename from keras/ops/linalg_test.py
rename to keras/src/ops/linalg_test.py
index 30f7368cef8f..36ab32b202d9 100644
--- a/keras/ops/linalg_test.py
+++ b/keras/src/ops/linalg_test.py
@@ -1,12 +1,12 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.ops import linalg
-from keras.testing.test_utils import named_product
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.ops import linalg
+from keras.src.testing.test_utils import named_product
 
 
 class LinalgOpsDynamicShapeTest(testing.TestCase):
diff --git a/keras/ops/math.py b/keras/src/ops/math.py
similarity index 99%
rename from keras/ops/math.py
rename to keras/src/ops/math.py
index 5d81eed75770..15ecad5acb0e 100644
--- a/keras/ops/math.py
+++ b/keras/src/ops/math.py
@@ -1,11 +1,11 @@
 """Commonly used math operations not included in NumPy."""
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.backend import any_symbolic_tensors
-from keras.ops.operation import Operation
-from keras.ops.operation_utils import reduce_shape
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.backend import any_symbolic_tensors
+from keras.src.ops.operation import Operation
+from keras.src.ops.operation_utils import reduce_shape
 
 
 class SegmentSum(Operation):
diff --git a/keras/ops/math_test.py b/keras/src/ops/math_test.py
similarity index 99%
rename from keras/ops/math_test.py
rename to keras/src/ops/math_test.py
index 5fdebb5f63d7..60db9fc70f6c 100644
--- a/keras/ops/math_test.py
+++ b/keras/src/ops/math_test.py
@@ -5,11 +5,11 @@
 import scipy.signal
 from absl.testing import parameterized
 
-from keras import backend
-from keras import testing
-from keras.backend.common import dtypes
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.ops import math as kmath
+from keras.src import backend
+from keras.src import testing
+from keras.src.backend.common import dtypes
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.ops import math as kmath
 
 
 def _stft(
diff --git a/keras/ops/nn.py b/keras/src/ops/nn.py
similarity index 99%
rename from keras/ops/nn.py
rename to keras/src/ops/nn.py
index d1a724d94070..4ec642b018a6 100644
--- a/keras/ops/nn.py
+++ b/keras/src/ops/nn.py
@@ -2,17 +2,17 @@
 
 import warnings
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.backend import any_symbolic_tensors
-from keras.backend import standardize_data_format
-from keras.backend.common.backend_utils import (
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.backend import any_symbolic_tensors
+from keras.src.backend import standardize_data_format
+from keras.src.backend.common.backend_utils import (
     compute_conv_transpose_output_shape,
 )
-from keras.ops import operation_utils
-from keras.ops.operation import Operation
-from keras.ops.operation_utils import reduce_shape
+from keras.src.ops import operation_utils
+from keras.src.ops.operation import Operation
+from keras.src.ops.operation_utils import reduce_shape
 
 
 class Relu(Operation):
diff --git a/keras/ops/nn_test.py b/keras/src/ops/nn_test.py
similarity index 98%
rename from keras/ops/nn_test.py
rename to keras/src/ops/nn_test.py
index 43c95af174fd..0e13aac7163a 100644
--- a/keras/ops/nn_test.py
+++ b/keras/src/ops/nn_test.py
@@ -3,28 +3,34 @@
 from absl.testing import parameterized
 
 import keras
-from keras import backend
-from keras import layers
-from keras import losses
-from keras import models
-from keras import ops
-from keras import testing
-from keras.backend.common import dtypes
-from keras.backend.common import standardize_dtype
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.layers.convolutional.conv_test import np_conv1d
-from keras.layers.convolutional.conv_test import np_conv2d
-from keras.layers.convolutional.conv_test import np_conv3d
-from keras.layers.convolutional.conv_transpose_test import np_conv1d_transpose
-from keras.layers.convolutional.conv_transpose_test import np_conv2d_transpose
-from keras.layers.convolutional.depthwise_conv_test import np_depthwise_conv2d
-from keras.layers.pooling.average_pooling_test import np_avgpool1d
-from keras.layers.pooling.average_pooling_test import np_avgpool2d
-from keras.layers.pooling.max_pooling_test import np_maxpool1d
-from keras.layers.pooling.max_pooling_test import np_maxpool2d
-from keras.ops import nn as knn
-from keras.ops import numpy as knp
-from keras.testing.test_utils import named_product
+from keras.src import backend
+from keras.src import layers
+from keras.src import losses
+from keras.src import models
+from keras.src import ops
+from keras.src import testing
+from keras.src.backend.common import dtypes
+from keras.src.backend.common import standardize_dtype
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.layers.convolutional.conv_test import np_conv1d
+from keras.src.layers.convolutional.conv_test import np_conv2d
+from keras.src.layers.convolutional.conv_test import np_conv3d
+from keras.src.layers.convolutional.conv_transpose_test import (
+    np_conv1d_transpose,
+)
+from keras.src.layers.convolutional.conv_transpose_test import (
+    np_conv2d_transpose,
+)
+from keras.src.layers.convolutional.depthwise_conv_test import (
+    np_depthwise_conv2d,
+)
+from keras.src.layers.pooling.average_pooling_test import np_avgpool1d
+from keras.src.layers.pooling.average_pooling_test import np_avgpool2d
+from keras.src.layers.pooling.max_pooling_test import np_maxpool1d
+from keras.src.layers.pooling.max_pooling_test import np_maxpool2d
+from keras.src.ops import nn as knn
+from keras.src.ops import numpy as knp
+from keras.src.testing.test_utils import named_product
 
 
 class NNOpsDynamicShapeTest(testing.TestCase, parameterized.TestCase):
@@ -1809,7 +1815,7 @@ def test_moments_sync(self):
         reason="synchronized=True only implemented for TF backend",
     )
     def test_moments_sync_with_distribution_strategy(self, dtype):
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         # Config 2 CPUs for testing.
         logical_cpus = tf.config.list_logical_devices("CPU")
diff --git a/keras/ops/node.py b/keras/src/ops/node.py
similarity index 97%
rename from keras/ops/node.py
rename to keras/src/ops/node.py
index dc775920c0f9..7e05de88fcf5 100644
--- a/keras/ops/node.py
+++ b/keras/src/ops/node.py
@@ -1,8 +1,8 @@
 import collections
 
-from keras import tree
-from keras.backend import KerasTensor
-from keras.ops.symbolic_arguments import SymbolicArguments
+from keras.src import tree
+from keras.src.backend import KerasTensor
+from keras.src.ops.symbolic_arguments import SymbolicArguments
 
 
 class Node:
diff --git a/keras/ops/node_test.py b/keras/src/ops/node_test.py
similarity index 93%
rename from keras/ops/node_test.py
rename to keras/src/ops/node_test.py
index b00781f5f9c2..7ed8227b3c2f 100644
--- a/keras/ops/node_test.py
+++ b/keras/src/ops/node_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from keras import Layer
-from keras import testing
-from keras.backend import KerasTensor
-from keras.ops.node import Node
+from keras.src import Layer
+from keras.src import testing
+from keras.src.backend import KerasTensor
+from keras.src.ops.node import Node
 
 
 class DummyLayer(Layer):
diff --git a/keras/ops/numpy.py b/keras/src/ops/numpy.py
similarity index 99%
rename from keras/ops/numpy.py
rename to keras/src/ops/numpy.py
index 94306eaa702d..266eb3047024 100644
--- a/keras/ops/numpy.py
+++ b/keras/src/ops/numpy.py
@@ -147,17 +147,17 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.backend import KerasTensor
-from keras.backend import any_symbolic_tensors
-from keras.backend.common import dtypes
-from keras.backend.common.backend_utils import canonicalize_axis
-from keras.backend.common.backend_utils import to_tuple_or_list
-from keras.ops import operation_utils
-from keras.ops.operation import Operation
-from keras.ops.operation_utils import broadcast_shapes
-from keras.ops.operation_utils import reduce_shape
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.backend import KerasTensor
+from keras.src.backend import any_symbolic_tensors
+from keras.src.backend.common import dtypes
+from keras.src.backend.common.backend_utils import canonicalize_axis
+from keras.src.backend.common.backend_utils import to_tuple_or_list
+from keras.src.ops import operation_utils
+from keras.src.ops.operation import Operation
+from keras.src.ops.operation_utils import broadcast_shapes
+from keras.src.ops.operation_utils import reduce_shape
 
 
 def shape_equal(shape1, shape2, axis=None, allow_none=True):
@@ -1884,7 +1884,7 @@ def diag(x, k=0):
         The extracted diagonal or constructed diagonal tensor.
 
     Examples:
-    >>> from keras import ops
+    >>> from keras.src import ops
     >>> x = ops.arange(9).reshape((3, 3))
     >>> x
     array([[0, 1, 2],
@@ -1978,7 +1978,7 @@ def diagonal(x, offset=0, axis1=0, axis2=1):
         Tensor of diagonals.
 
     Examples:
-    >>> from keras import ops
+    >>> from keras.src import ops
     >>> x = ops.arange(4).reshape((2, 2))
     >>> x
     array([[0, 1],
@@ -2047,7 +2047,7 @@ def diff(a, n=1, axis=-1):
         Tensor of diagonals.
 
     Examples:
-    >>> from keras import ops
+    >>> from keras.src import ops
     >>> x = ops.convert_to_tensor([1, 2, 4, 7, 0])
     >>> ops.diff(x)
     array([ 1,  2,  3, -7])
@@ -2366,7 +2366,7 @@ def einsum(subscripts, *operands):
         The calculation based on the Einstein summation convention.
 
     Example:
-    >>> from keras import ops
+    >>> from keras.src import ops
     >>> a = ops.arange(25).reshape(5, 5)
     >>> b = ops.arange(5)
     >>> c = ops.arange(6).reshape(2, 3)
@@ -3748,7 +3748,7 @@ def meshgrid(*x, indexing="xy"):
         Sequence of N tensors.
 
     Example:
-    >>> from keras import ops
+    >>> from keras.src import ops
     >>> x = ops.array([1, 2, 3])
     >>> y = ops.array([4, 5, 6])
 
diff --git a/keras/ops/numpy_test.py b/keras/src/ops/numpy_test.py
similarity index 99%
rename from keras/ops/numpy_test.py
rename to keras/src/ops/numpy_test.py
index 5f8ed2fc0856..6cea9ef86066 100644
--- a/keras/ops/numpy_test.py
+++ b/keras/src/ops/numpy_test.py
@@ -9,13 +9,13 @@
 from absl.testing import parameterized
 
 import keras
-from keras import backend
-from keras import testing
-from keras.backend.common import dtypes
-from keras.backend.common import standardize_dtype
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.ops import numpy as knp
-from keras.testing.test_utils import named_product
+from keras.src import backend
+from keras.src import testing
+from keras.src.backend.common import dtypes
+from keras.src.backend.common import standardize_dtype
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.ops import numpy as knp
+from keras.src.testing.test_utils import named_product
 
 
 class NumpyTwoInputOpsDynamicShapeTest(testing.TestCase):
diff --git a/keras/ops/operation.py b/keras/src/ops/operation.py
similarity index 95%
rename from keras/ops/operation.py
rename to keras/src/ops/operation.py
index 547e8f3f387d..10b79d591406 100644
--- a/keras/ops/operation.py
+++ b/keras/src/ops/operation.py
@@ -1,15 +1,15 @@
 import inspect
 import textwrap
 
-from keras import backend
-from keras import dtype_policies
-from keras import tree
-from keras.api_export import keras_export
-from keras.backend.common.keras_tensor import any_symbolic_tensors
-from keras.ops.node import Node
-from keras.utils import python_utils
-from keras.utils import traceback_utils
-from keras.utils.naming import auto_name
+from keras.src import backend
+from keras.src import dtype_policies
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.backend.common.keras_tensor import any_symbolic_tensors
+from keras.src.ops.node import Node
+from keras.src.utils import python_utils
+from keras.src.utils import traceback_utils
+from keras.src.utils.naming import auto_name
 
 
 @keras_export("keras.Operation")
@@ -120,7 +120,7 @@ def __new__(cls, *args, **kwargs):
         try:
             instance._lock = False
             if auto_config:
-                from keras.saving import serialization_lib
+                from keras.src.saving import serialization_lib
 
                 instance._auto_config = serialization_lib.SerializableDict(
                     **kwargs
diff --git a/keras/ops/operation_test.py b/keras/src/ops/operation_test.py
similarity index 96%
rename from keras/ops/operation_test.py
rename to keras/src/ops/operation_test.py
index e01ef075e3cb..63183759fecb 100644
--- a/keras/ops/operation_test.py
+++ b/keras/src/ops/operation_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 
-from keras import backend
-from keras import testing
-from keras.backend.common import keras_tensor
-from keras.ops import numpy as knp
-from keras.ops import operation
+from keras.src import backend
+from keras.src import testing
+from keras.src.backend.common import keras_tensor
+from keras.src.ops import numpy as knp
+from keras.src.ops import operation
 
 
 class OpWithMultipleInputs(operation.Operation):
diff --git a/keras/ops/operation_utils.py b/keras/src/ops/operation_utils.py
similarity index 98%
rename from keras/ops/operation_utils.py
rename to keras/src/ops/operation_utils.py
index e8d335bb286a..ac0961da4854 100644
--- a/keras/ops/operation_utils.py
+++ b/keras/src/ops/operation_utils.py
@@ -2,10 +2,10 @@
 
 import numpy as np
 
-from keras import tree
-from keras.api_export import keras_export
-from keras.backend.common.backend_utils import canonicalize_axis
-from keras.backend.common.backend_utils import to_tuple_or_list
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.backend.common.backend_utils import canonicalize_axis
+from keras.src.backend.common.backend_utils import to_tuple_or_list
 
 
 def broadcast_shapes(shape1, shape2):
diff --git a/keras/ops/operation_utils_test.py b/keras/src/ops/operation_utils_test.py
similarity index 97%
rename from keras/ops/operation_utils_test.py
rename to keras/src/ops/operation_utils_test.py
index 20c140c02b5a..b5acf9d29260 100644
--- a/keras/ops/operation_utils_test.py
+++ b/keras/src/ops/operation_utils_test.py
@@ -1,8 +1,8 @@
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.layers.core import input_layer
-from keras.ops import operation_utils
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.layers.core import input_layer
+from keras.src.ops import operation_utils
 
 
 class OperationUtilsTest(testing.TestCase):
diff --git a/keras/ops/symbolic_arguments.py b/keras/src/ops/symbolic_arguments.py
similarity index 95%
rename from keras/ops/symbolic_arguments.py
rename to keras/src/ops/symbolic_arguments.py
index 33ec86998672..b5ff9b9687f8 100644
--- a/keras/ops/symbolic_arguments.py
+++ b/keras/src/ops/symbolic_arguments.py
@@ -1,5 +1,5 @@
-from keras import tree
-from keras.backend import KerasTensor
+from keras.src import tree
+from keras.src.backend import KerasTensor
 
 
 class SymbolicArguments:
diff --git a/keras/ops/symbolic_arguments_test.py b/keras/src/ops/symbolic_arguments_test.py
similarity index 95%
rename from keras/ops/symbolic_arguments_test.py
rename to keras/src/ops/symbolic_arguments_test.py
index 3fda859e6c58..b212032154ec 100644
--- a/keras/ops/symbolic_arguments_test.py
+++ b/keras/src/ops/symbolic_arguments_test.py
@@ -1,7 +1,7 @@
-from keras import testing
-from keras import tree
-from keras.backend import KerasTensor
-from keras.ops.symbolic_arguments import SymbolicArguments
+from keras.src import testing
+from keras.src import tree
+from keras.src.backend import KerasTensor
+from keras.src.ops.symbolic_arguments import SymbolicArguments
 
 
 class SymbolicArgumentsTest(testing.TestCase):
diff --git a/keras/optimizers/__init__.py b/keras/src/optimizers/__init__.py
similarity index 81%
rename from keras/optimizers/__init__.py
rename to keras/src/optimizers/__init__.py
index 6d94932a530b..d00c96d98954 100644
--- a/keras/optimizers/__init__.py
+++ b/keras/src/optimizers/__init__.py
@@ -1,18 +1,18 @@
-from keras.api_export import keras_export
-from keras.optimizers.adadelta import Adadelta
-from keras.optimizers.adafactor import Adafactor
-from keras.optimizers.adagrad import Adagrad
-from keras.optimizers.adam import Adam
-from keras.optimizers.adamax import Adamax
-from keras.optimizers.adamw import AdamW
-from keras.optimizers.ftrl import Ftrl
-from keras.optimizers.lion import Lion
-from keras.optimizers.loss_scale_optimizer import LossScaleOptimizer
-from keras.optimizers.nadam import Nadam
-from keras.optimizers.optimizer import Optimizer
-from keras.optimizers.rmsprop import RMSprop
-from keras.optimizers.sgd import SGD
-from keras.saving import serialization_lib
+from keras.src.api_export import keras_export
+from keras.src.optimizers.adadelta import Adadelta
+from keras.src.optimizers.adafactor import Adafactor
+from keras.src.optimizers.adagrad import Adagrad
+from keras.src.optimizers.adam import Adam
+from keras.src.optimizers.adamax import Adamax
+from keras.src.optimizers.adamw import AdamW
+from keras.src.optimizers.ftrl import Ftrl
+from keras.src.optimizers.lion import Lion
+from keras.src.optimizers.loss_scale_optimizer import LossScaleOptimizer
+from keras.src.optimizers.nadam import Nadam
+from keras.src.optimizers.optimizer import Optimizer
+from keras.src.optimizers.rmsprop import RMSprop
+from keras.src.optimizers.sgd import SGD
+from keras.src.saving import serialization_lib
 
 ALL_OBJECTS = {
     Optimizer,
diff --git a/keras/optimizers/adadelta.py b/keras/src/optimizers/adadelta.py
similarity index 97%
rename from keras/optimizers/adadelta.py
rename to keras/src/optimizers/adadelta.py
index fa56ee5b4b70..1f2f3835aec4 100644
--- a/keras/optimizers/adadelta.py
+++ b/keras/src/optimizers/adadelta.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.Adadelta"])
diff --git a/keras/optimizers/adadelta_test.py b/keras/src/optimizers/adadelta_test.py
similarity index 95%
rename from keras/optimizers/adadelta_test.py
rename to keras/src/optimizers/adadelta_test.py
index c7c9dd7d32bf..9da72612fc87 100644
--- a/keras/optimizers/adadelta_test.py
+++ b/keras/src/optimizers/adadelta_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.adadelta import Adadelta
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.adadelta import Adadelta
 
 
 class AdadeltaTest(testing.TestCase):
diff --git a/keras/optimizers/adafactor.py b/keras/src/optimizers/adafactor.py
similarity index 98%
rename from keras/optimizers/adafactor.py
rename to keras/src/optimizers/adafactor.py
index 7782f35e66ea..8635f1d9d8c0 100644
--- a/keras/optimizers/adafactor.py
+++ b/keras/src/optimizers/adafactor.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.Adafactor"])
diff --git a/keras/optimizers/adafactor_test.py b/keras/src/optimizers/adafactor_test.py
similarity index 97%
rename from keras/optimizers/adafactor_test.py
rename to keras/src/optimizers/adafactor_test.py
index b5621963f15b..b928400c34e4 100644
--- a/keras/optimizers/adafactor_test.py
+++ b/keras/src/optimizers/adafactor_test.py
@@ -3,9 +3,9 @@
 
 import numpy as np
 
-from keras import backend
-from keras import testing
-from keras.optimizers.adafactor import Adafactor
+from keras.src import backend
+from keras.src import testing
+from keras.src.optimizers.adafactor import Adafactor
 
 
 class AdafactorTest(testing.TestCase):
diff --git a/keras/optimizers/adagrad.py b/keras/src/optimizers/adagrad.py
similarity index 95%
rename from keras/optimizers/adagrad.py
rename to keras/src/optimizers/adagrad.py
index 9e28644f9951..836356ba13c2 100644
--- a/keras/optimizers/adagrad.py
+++ b/keras/src/optimizers/adagrad.py
@@ -1,7 +1,7 @@
-from keras import initializers
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import initializers
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.Adagrad"])
diff --git a/keras/optimizers/adagrad_test.py b/keras/src/optimizers/adagrad_test.py
similarity index 95%
rename from keras/optimizers/adagrad_test.py
rename to keras/src/optimizers/adagrad_test.py
index a724540fad16..43d2bcbd7afa 100644
--- a/keras/optimizers/adagrad_test.py
+++ b/keras/src/optimizers/adagrad_test.py
@@ -3,10 +3,10 @@
 
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.adagrad import Adagrad
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.adagrad import Adagrad
 
 
 class AdagradTest(testing.TestCase):
diff --git a/keras/optimizers/adam.py b/keras/src/optimizers/adam.py
similarity index 97%
rename from keras/optimizers/adam.py
rename to keras/src/optimizers/adam.py
index f1db87ff9b77..585819322404 100644
--- a/keras/optimizers/adam.py
+++ b/keras/src/optimizers/adam.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.Adam"])
diff --git a/keras/optimizers/adam_test.py b/keras/src/optimizers/adam_test.py
similarity index 96%
rename from keras/optimizers/adam_test.py
rename to keras/src/optimizers/adam_test.py
index 1dcc876a1ddc..6f8430d3c75d 100644
--- a/keras/optimizers/adam_test.py
+++ b/keras/src/optimizers/adam_test.py
@@ -2,10 +2,10 @@
 import pytest
 
 import keras
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.adam import Adam
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.adam import Adam
 
 
 class AdamTest(testing.TestCase):
diff --git a/keras/optimizers/adamax.py b/keras/src/optimizers/adamax.py
similarity index 97%
rename from keras/optimizers/adamax.py
rename to keras/src/optimizers/adamax.py
index 870dfc0aeeab..338afcc5735c 100644
--- a/keras/optimizers/adamax.py
+++ b/keras/src/optimizers/adamax.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.Adamax"])
diff --git a/keras/optimizers/adamax_test.py b/keras/src/optimizers/adamax_test.py
similarity index 95%
rename from keras/optimizers/adamax_test.py
rename to keras/src/optimizers/adamax_test.py
index f040d508b6a2..4084ade7450d 100644
--- a/keras/optimizers/adamax_test.py
+++ b/keras/src/optimizers/adamax_test.py
@@ -3,10 +3,10 @@
 
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.adamax import Adamax
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.adamax import Adamax
 
 
 class AdamaxTest(testing.TestCase):
diff --git a/keras/optimizers/adamw.py b/keras/src/optimizers/adamw.py
similarity index 96%
rename from keras/optimizers/adamw.py
rename to keras/src/optimizers/adamw.py
index cda4e5bd4558..e52d3b7188a1 100644
--- a/keras/optimizers/adamw.py
+++ b/keras/src/optimizers/adamw.py
@@ -1,6 +1,6 @@
-from keras.api_export import keras_export
-from keras.optimizers import adam
-from keras.optimizers import optimizer
+from keras.src.api_export import keras_export
+from keras.src.optimizers import adam
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.AdamW"])
diff --git a/keras/optimizers/adamw_test.py b/keras/src/optimizers/adamw_test.py
similarity index 95%
rename from keras/optimizers/adamw_test.py
rename to keras/src/optimizers/adamw_test.py
index 37ee3865a27c..efe71ef87e38 100644
--- a/keras/optimizers/adamw_test.py
+++ b/keras/src/optimizers/adamw_test.py
@@ -3,10 +3,10 @@
 
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.adamw import AdamW
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.adamw import AdamW
 
 
 class AdamWTest(testing.TestCase):
diff --git a/keras/optimizers/base_optimizer.py b/keras/src/optimizers/base_optimizer.py
similarity index 99%
rename from keras/optimizers/base_optimizer.py
rename to keras/src/optimizers/base_optimizer.py
index 8da8ffaf52a3..b368a203bebf 100644
--- a/keras/optimizers/base_optimizer.py
+++ b/keras/src/optimizers/base_optimizer.py
@@ -3,13 +3,13 @@
 
 import numpy as np
 
-from keras import backend
-from keras import initializers
-from keras import ops
-from keras.optimizers.schedules import learning_rate_schedule
-from keras.saving import serialization_lib
-from keras.utils import tracking
-from keras.utils.naming import auto_name
+from keras.src import backend
+from keras.src import initializers
+from keras.src import ops
+from keras.src.optimizers.schedules import learning_rate_schedule
+from keras.src.saving import serialization_lib
+from keras.src.utils import tracking
+from keras.src.utils.naming import auto_name
 
 
 class BaseOptimizer:
diff --git a/keras/optimizers/ftrl.py b/keras/src/optimizers/ftrl.py
similarity index 98%
rename from keras/optimizers/ftrl.py
rename to keras/src/optimizers/ftrl.py
index 05930db69fac..1bb56518dc9d 100644
--- a/keras/optimizers/ftrl.py
+++ b/keras/src/optimizers/ftrl.py
@@ -1,7 +1,7 @@
-from keras import initializers
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import initializers
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.Ftrl"])
diff --git a/keras/optimizers/ftrl_test.py b/keras/src/optimizers/ftrl_test.py
similarity index 96%
rename from keras/optimizers/ftrl_test.py
rename to keras/src/optimizers/ftrl_test.py
index c1688b8c2bef..4e27f25d0ff3 100644
--- a/keras/optimizers/ftrl_test.py
+++ b/keras/src/optimizers/ftrl_test.py
@@ -3,9 +3,9 @@
 
 import numpy as np
 
-from keras import backend
-from keras import testing
-from keras.optimizers.ftrl import Ftrl
+from keras.src import backend
+from keras.src import testing
+from keras.src.optimizers.ftrl import Ftrl
 
 
 class FtrlTest(testing.TestCase):
diff --git a/keras/optimizers/lion.py b/keras/src/optimizers/lion.py
similarity index 97%
rename from keras/optimizers/lion.py
rename to keras/src/optimizers/lion.py
index 49fb7f309d22..d63e736266b9 100644
--- a/keras/optimizers/lion.py
+++ b/keras/src/optimizers/lion.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.Lion"])
diff --git a/keras/optimizers/lion_test.py b/keras/src/optimizers/lion_test.py
similarity index 95%
rename from keras/optimizers/lion_test.py
rename to keras/src/optimizers/lion_test.py
index b9cf8f1263cd..b62773a426f2 100644
--- a/keras/optimizers/lion_test.py
+++ b/keras/src/optimizers/lion_test.py
@@ -2,10 +2,10 @@
 import pytest
 
 import keras
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.lion import Lion
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.lion import Lion
 
 
 class LionTest(testing.TestCase):
diff --git a/keras/optimizers/loss_scale_optimizer.py b/keras/src/optimizers/loss_scale_optimizer.py
similarity index 97%
rename from keras/optimizers/loss_scale_optimizer.py
rename to keras/src/optimizers/loss_scale_optimizer.py
index e032ca6c0412..42306685eee1 100644
--- a/keras/optimizers/loss_scale_optimizer.py
+++ b/keras/src/optimizers/loss_scale_optimizer.py
@@ -1,10 +1,10 @@
-from keras import backend
-from keras import initializers
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
-from keras.saving import serialization_lib
-from keras.utils import tracking
+from keras.src import backend
+from keras.src import initializers
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
+from keras.src.saving import serialization_lib
+from keras.src.utils import tracking
 
 
 @keras_export(
@@ -207,7 +207,7 @@ def _common_apply(self, grads, trainable_variables=None):
 
     def _tf_apply(self, grads, trainable_variables=None):
         """Tensorflow specific logic for apply, which handles distribution."""
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         if tf.distribute.in_cross_replica_context():
             raise ValueError("apply() must be called in a replica context.")
diff --git a/keras/optimizers/loss_scale_optimizer_test.py b/keras/src/optimizers/loss_scale_optimizer_test.py
similarity index 95%
rename from keras/optimizers/loss_scale_optimizer_test.py
rename to keras/src/optimizers/loss_scale_optimizer_test.py
index 28a81ea8c0f9..ace067f1ab1d 100644
--- a/keras/optimizers/loss_scale_optimizer_test.py
+++ b/keras/src/optimizers/loss_scale_optimizer_test.py
@@ -1,11 +1,11 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.loss_scale_optimizer import LossScaleOptimizer
-from keras.optimizers.sgd import SGD
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.loss_scale_optimizer import LossScaleOptimizer
+from keras.src.optimizers.sgd import SGD
 
 
 class LossScaleOptimizerTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/optimizers/nadam.py b/keras/src/optimizers/nadam.py
similarity index 97%
rename from keras/optimizers/nadam.py
rename to keras/src/optimizers/nadam.py
index d9b74d9d1942..77454e9f94f9 100644
--- a/keras/optimizers/nadam.py
+++ b/keras/src/optimizers/nadam.py
@@ -1,7 +1,7 @@
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.Nadam"])
diff --git a/keras/optimizers/nadam_test.py b/keras/src/optimizers/nadam_test.py
similarity index 96%
rename from keras/optimizers/nadam_test.py
rename to keras/src/optimizers/nadam_test.py
index c50d070b8ca3..8a6c85034472 100644
--- a/keras/optimizers/nadam_test.py
+++ b/keras/src/optimizers/nadam_test.py
@@ -3,10 +3,10 @@
 
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.nadam import Nadam
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.nadam import Nadam
 
 
 class NadamTest(testing.TestCase):
diff --git a/keras/optimizers/optimizer.py b/keras/src/optimizers/optimizer.py
similarity index 61%
rename from keras/optimizers/optimizer.py
rename to keras/src/optimizers/optimizer.py
index 7fafbdf1bbeb..cd9c29cfba29 100644
--- a/keras/optimizers/optimizer.py
+++ b/keras/src/optimizers/optimizer.py
@@ -1,17 +1,17 @@
-from keras import backend
-from keras.api_export import keras_export
-from keras.optimizers import base_optimizer
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.optimizers import base_optimizer
 
 if backend.backend() == "tensorflow":
-    from keras.backend.tensorflow.optimizer import (
+    from keras.src.backend.tensorflow.optimizer import (
         TFOptimizer as BackendOptimizer,
     )
 elif backend.backend() == "torch":
-    from keras.backend.torch.optimizers import (
+    from keras.src.backend.torch.optimizers import (
         TorchOptimizer as BackendOptimizer,
     )
 elif backend.backend() == "jax":
-    from keras.backend.jax.optimizer import JaxOptimizer as BackendOptimizer
+    from keras.src.backend.jax.optimizer import JaxOptimizer as BackendOptimizer
 else:
 
     class BackendOptimizer(base_optimizer.BaseOptimizer):
diff --git a/keras/optimizers/optimizer_sparse_test.py b/keras/src/optimizers/optimizer_sparse_test.py
similarity index 98%
rename from keras/optimizers/optimizer_sparse_test.py
rename to keras/src/optimizers/optimizer_sparse_test.py
index a398c53009f8..c06dbd52d6bb 100644
--- a/keras/optimizers/optimizer_sparse_test.py
+++ b/keras/src/optimizers/optimizer_sparse_test.py
@@ -3,10 +3,10 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import backend
-from keras import ops
-from keras import optimizers
-from keras import testing
+from keras.src import backend
+from keras.src import ops
+from keras.src import optimizers
+from keras.src import testing
 
 
 class ScatterUpdateOptimizer(optimizers.Optimizer):
diff --git a/keras/optimizers/optimizer_test.py b/keras/src/optimizers/optimizer_test.py
similarity index 98%
rename from keras/optimizers/optimizer_test.py
rename to keras/src/optimizers/optimizer_test.py
index 2f8ef0c85151..23d47477907c 100644
--- a/keras/optimizers/optimizer_test.py
+++ b/keras/src/optimizers/optimizer_test.py
@@ -3,12 +3,12 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import constraints
-from keras import layers
-from keras import models
-from keras import optimizers
-from keras import testing
+from keras.src import backend
+from keras.src import constraints
+from keras.src import layers
+from keras.src import models
+from keras.src import optimizers
+from keras.src import testing
 
 
 class OptimizerTest(testing.TestCase):
diff --git a/keras/optimizers/rmsprop.py b/keras/src/optimizers/rmsprop.py
similarity index 98%
rename from keras/optimizers/rmsprop.py
rename to keras/src/optimizers/rmsprop.py
index bf7b13eea244..ad7c4a079c4d 100644
--- a/keras/optimizers/rmsprop.py
+++ b/keras/src/optimizers/rmsprop.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export(["keras.optimizers.RMSprop"])
diff --git a/keras/optimizers/rmsprop_test.py b/keras/src/optimizers/rmsprop_test.py
similarity index 95%
rename from keras/optimizers/rmsprop_test.py
rename to keras/src/optimizers/rmsprop_test.py
index 862e0b8687dc..f22dc82801bc 100644
--- a/keras/optimizers/rmsprop_test.py
+++ b/keras/src/optimizers/rmsprop_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.rmsprop import RMSprop
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.rmsprop import RMSprop
 
 
 class RMSpropTest(testing.TestCase):
diff --git a/keras/src/optimizers/schedules/__init__.py b/keras/src/optimizers/schedules/__init__.py
new file mode 100644
index 000000000000..a6812ebb0827
--- /dev/null
+++ b/keras/src/optimizers/schedules/__init__.py
@@ -0,0 +1,16 @@
+from keras.src.optimizers.schedules.learning_rate_schedule import CosineDecay
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    CosineDecayRestarts,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    ExponentialDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    InverseTimeDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    PiecewiseConstantDecay,
+)
+from keras.src.optimizers.schedules.learning_rate_schedule import (
+    PolynomialDecay,
+)
diff --git a/keras/optimizers/schedules/learning_rate_schedule.py b/keras/src/optimizers/schedules/learning_rate_schedule.py
similarity index 99%
rename from keras/optimizers/schedules/learning_rate_schedule.py
rename to keras/src/optimizers/schedules/learning_rate_schedule.py
index 3b95bf59ea0c..74c13aafbe53 100644
--- a/keras/optimizers/schedules/learning_rate_schedule.py
+++ b/keras/src/optimizers/schedules/learning_rate_schedule.py
@@ -2,9 +2,9 @@
 
 import math
 
-from keras import ops
-from keras.api_export import keras_export
-from keras.saving import serialization_lib
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.saving import serialization_lib
 
 
 @keras_export("keras.optimizers.schedules.LearningRateSchedule")
diff --git a/keras/optimizers/schedules/learning_rate_schedule_test.py b/keras/src/optimizers/schedules/learning_rate_schedule_test.py
similarity index 98%
rename from keras/optimizers/schedules/learning_rate_schedule_test.py
rename to keras/src/optimizers/schedules/learning_rate_schedule_test.py
index 56e0c2d3c28f..052db9e93945 100644
--- a/keras/optimizers/schedules/learning_rate_schedule_test.py
+++ b/keras/src/optimizers/schedules/learning_rate_schedule_test.py
@@ -5,12 +5,12 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import layers
-from keras import optimizers
-from keras import testing
-from keras.models import Sequential
-from keras.optimizers import schedules
+from keras.src import backend
+from keras.src import layers
+from keras.src import optimizers
+from keras.src import testing
+from keras.src.models import Sequential
+from keras.src.optimizers import schedules
 
 
 class TestFitLRSchedulesFlow(testing.TestCase):
diff --git a/keras/optimizers/sgd.py b/keras/src/optimizers/sgd.py
similarity index 97%
rename from keras/optimizers/sgd.py
rename to keras/src/optimizers/sgd.py
index 3880bb7caa2d..85a8c8647445 100644
--- a/keras/optimizers/sgd.py
+++ b/keras/src/optimizers/sgd.py
@@ -1,6 +1,6 @@
-from keras import ops
-from keras.api_export import keras_export
-from keras.optimizers import optimizer
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.optimizers import optimizer
 
 
 @keras_export("keras.optimizers.SGD")
diff --git a/keras/optimizers/sgd_test.py b/keras/src/optimizers/sgd_test.py
similarity index 96%
rename from keras/optimizers/sgd_test.py
rename to keras/src/optimizers/sgd_test.py
index b8eaeaff7d53..a0fc2d46c53b 100644
--- a/keras/optimizers/sgd_test.py
+++ b/keras/src/optimizers/sgd_test.py
@@ -2,10 +2,10 @@
 
 import numpy as np
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.optimizers.sgd import SGD
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.optimizers.sgd import SGD
 
 
 class SGDTest(testing.TestCase):
diff --git a/keras/quantizers/__init__.py b/keras/src/quantizers/__init__.py
similarity index 70%
rename from keras/quantizers/__init__.py
rename to keras/src/quantizers/__init__.py
index 1cecf1902d15..b12d5cc84d70 100644
--- a/keras/quantizers/__init__.py
+++ b/keras/src/quantizers/__init__.py
@@ -1,14 +1,14 @@
 import inspect
 
-from keras.api_export import keras_export
-from keras.quantizers.quantizers import AbsMaxQuantizer
-from keras.quantizers.quantizers import Quantizer
-from keras.quantizers.quantizers import abs_max_quantize
-from keras.quantizers.quantizers import compute_float8_amax_history
-from keras.quantizers.quantizers import compute_float8_scale
-from keras.quantizers.quantizers import quantize_and_dequantize
-from keras.saving import serialization_lib
-from keras.utils.naming import to_snake_case
+from keras.src.api_export import keras_export
+from keras.src.quantizers.quantizers import AbsMaxQuantizer
+from keras.src.quantizers.quantizers import Quantizer
+from keras.src.quantizers.quantizers import abs_max_quantize
+from keras.src.quantizers.quantizers import compute_float8_amax_history
+from keras.src.quantizers.quantizers import compute_float8_scale
+from keras.src.quantizers.quantizers import quantize_and_dequantize
+from keras.src.saving import serialization_lib
+from keras.src.utils.naming import to_snake_case
 
 ALL_OBJECTS = {Quantizer, AbsMaxQuantizer}
 ALL_OBJECTS_DICT = {cls.__name__: cls for cls in ALL_OBJECTS}
diff --git a/keras/quantizers/quantizers.py b/keras/src/quantizers/quantizers.py
similarity index 97%
rename from keras/quantizers/quantizers.py
rename to keras/src/quantizers/quantizers.py
index 5c8a4425cbad..ccf7cc42de06 100644
--- a/keras/quantizers/quantizers.py
+++ b/keras/src/quantizers/quantizers.py
@@ -1,8 +1,8 @@
 import ml_dtypes
 
-from keras import backend
-from keras import ops
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src import ops
+from keras.src.api_export import keras_export
 
 """Int8-related classes and methods"""
 
diff --git a/keras/quantizers/quantizers_test.py b/keras/src/quantizers/quantizers_test.py
similarity index 96%
rename from keras/quantizers/quantizers_test.py
rename to keras/src/quantizers/quantizers_test.py
index bf68fd36fbd1..83702bc20f56 100644
--- a/keras/quantizers/quantizers_test.py
+++ b/keras/src/quantizers/quantizers_test.py
@@ -1,7 +1,7 @@
-from keras import ops
-from keras import quantizers
-from keras import random
-from keras import testing
+from keras.src import ops
+from keras.src import quantizers
+from keras.src import random
+from keras.src import testing
 
 
 class QuantizersTest(testing.TestCase):
diff --git a/keras/src/random/__init__.py b/keras/src/random/__init__.py
new file mode 100644
index 000000000000..4ba54c78837c
--- /dev/null
+++ b/keras/src/random/__init__.py
@@ -0,0 +1,9 @@
+from keras.src.random.random import categorical
+from keras.src.random.random import dropout
+from keras.src.random.random import gamma
+from keras.src.random.random import normal
+from keras.src.random.random import randint
+from keras.src.random.random import shuffle
+from keras.src.random.random import truncated_normal
+from keras.src.random.random import uniform
+from keras.src.random.seed_generator import SeedGenerator
diff --git a/keras/random/random.py b/keras/src/random/random.py
similarity index 99%
rename from keras/random/random.py
rename to keras/src/random/random.py
index 5e874f9e46db..72282921de7b 100644
--- a/keras/random/random.py
+++ b/keras/src/random/random.py
@@ -1,5 +1,5 @@
-from keras import backend
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src.api_export import keras_export
 
 
 @keras_export("keras.random.normal")
diff --git a/keras/random/random_test.py b/keras/src/random/random_test.py
similarity index 97%
rename from keras/random/random_test.py
rename to keras/src/random/random_test.py
index 95fdfe831121..a7358edbc253 100644
--- a/keras/random/random_test.py
+++ b/keras/src/random/random_test.py
@@ -3,15 +3,15 @@
 from absl.testing import parameterized
 
 import keras
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.backend.common import dtypes
-from keras.backend.common import standardize_dtype
-from keras.random import random
-from keras.random import seed_generator
-from keras.testing.test_utils import named_product
-from keras.utils.rng_utils import set_random_seed
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.backend.common import dtypes
+from keras.src.backend.common import standardize_dtype
+from keras.src.random import random
+from keras.src.random import seed_generator
+from keras.src.testing.test_utils import named_product
+from keras.src.utils.rng_utils import set_random_seed
 
 
 class RandomTest(testing.TestCase, parameterized.TestCase):
@@ -129,7 +129,7 @@ def test_dropout_jax_jit_stateless(self):
 
         @jax.jit
         def train_step(x):
-            with keras.backend.StatelessScope():
+            with keras.src.backend.StatelessScope():
                 x = keras.layers.Dropout(rate=0.1)(x, training=True)
             return x
 
diff --git a/keras/random/seed_generator.py b/keras/src/random/seed_generator.py
similarity index 94%
rename from keras/random/seed_generator.py
rename to keras/src/random/seed_generator.py
index ce4e4b1880a2..3dfcd5615640 100644
--- a/keras/random/seed_generator.py
+++ b/keras/src/random/seed_generator.py
@@ -2,11 +2,11 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.backend.common import global_state
-from keras.utils import jax_utils
-from keras.utils.naming import auto_name
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
+from keras.src.utils import jax_utils
+from keras.src.utils.naming import auto_name
 
 
 @keras_export("keras.random.SeedGenerator")
@@ -132,7 +132,7 @@ def make_default_seed():
 
 
 def draw_seed(seed):
-    from keras.backend import convert_to_tensor
+    from keras.src.backend import convert_to_tensor
 
     if isinstance(seed, SeedGenerator):
         return seed.next()
diff --git a/keras/random/seed_generator_test.py b/keras/src/random/seed_generator_test.py
similarity index 95%
rename from keras/random/seed_generator_test.py
rename to keras/src/random/seed_generator_test.py
index f0a6dd179f57..9ab5c132fdd0 100644
--- a/keras/random/seed_generator_test.py
+++ b/keras/src/random/seed_generator_test.py
@@ -1,10 +1,10 @@
 import numpy as np
 import pytest
 
-from keras import backend
-from keras import ops
-from keras import testing
-from keras.random import seed_generator
+from keras.src import backend
+from keras.src import ops
+from keras.src import testing
+from keras.src.random import seed_generator
 
 
 class SeedGeneratorTest(testing.TestCase):
diff --git a/keras/regularizers/__init__.py b/keras/src/regularizers/__init__.py
similarity index 75%
rename from keras/regularizers/__init__.py
rename to keras/src/regularizers/__init__.py
index b31d1904bfe3..64ffad22a6e4 100644
--- a/keras/regularizers/__init__.py
+++ b/keras/src/regularizers/__init__.py
@@ -1,13 +1,13 @@
 import inspect
 
-from keras.api_export import keras_export
-from keras.regularizers.regularizers import L1
-from keras.regularizers.regularizers import L1L2
-from keras.regularizers.regularizers import L2
-from keras.regularizers.regularizers import OrthogonalRegularizer
-from keras.regularizers.regularizers import Regularizer
-from keras.saving import serialization_lib
-from keras.utils.naming import to_snake_case
+from keras.src.api_export import keras_export
+from keras.src.regularizers.regularizers import L1
+from keras.src.regularizers.regularizers import L1L2
+from keras.src.regularizers.regularizers import L2
+from keras.src.regularizers.regularizers import OrthogonalRegularizer
+from keras.src.regularizers.regularizers import Regularizer
+from keras.src.saving import serialization_lib
+from keras.src.utils.naming import to_snake_case
 
 ALL_OBJECTS = {
     Regularizer,
diff --git a/keras/regularizers/regularizers.py b/keras/src/regularizers/regularizers.py
similarity index 98%
rename from keras/regularizers/regularizers.py
rename to keras/src/regularizers/regularizers.py
index 56d3ec6d09b8..99459fe32fb7 100644
--- a/keras/regularizers/regularizers.py
+++ b/keras/src/regularizers/regularizers.py
@@ -1,8 +1,8 @@
 import math
 
-from keras import ops
-from keras.api_export import keras_export
-from keras.utils.numerical_utils import normalize
+from keras.src import ops
+from keras.src.api_export import keras_export
+from keras.src.utils.numerical_utils import normalize
 
 
 @keras_export(["keras.Regularizer", "keras.regularizers.Regularizer"])
diff --git a/keras/regularizers/regularizers_test.py b/keras/src/regularizers/regularizers_test.py
similarity index 97%
rename from keras/regularizers/regularizers_test.py
rename to keras/src/regularizers/regularizers_test.py
index c728f3fefa3c..288f494ede2f 100644
--- a/keras/regularizers/regularizers_test.py
+++ b/keras/src/regularizers/regularizers_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from keras import backend
-from keras import regularizers
-from keras import testing
-from keras.regularizers.regularizers import validate_float_arg
+from keras.src import backend
+from keras.src import regularizers
+from keras.src import testing
+from keras.src.regularizers.regularizers import validate_float_arg
 
 
 class RegularizersTest(testing.TestCase):
diff --git a/keras/src/saving/__init__.py b/keras/src/saving/__init__.py
new file mode 100644
index 000000000000..3af25ce633af
--- /dev/null
+++ b/keras/src/saving/__init__.py
@@ -0,0 +1,9 @@
+from keras.src.saving.object_registration import CustomObjectScope
+from keras.src.saving.object_registration import custom_object_scope
+from keras.src.saving.object_registration import get_custom_objects
+from keras.src.saving.object_registration import get_registered_name
+from keras.src.saving.object_registration import get_registered_object
+from keras.src.saving.object_registration import register_keras_serializable
+from keras.src.saving.saving_api import load_model
+from keras.src.saving.serialization_lib import deserialize_keras_object
+from keras.src.saving.serialization_lib import serialize_keras_object
diff --git a/keras/saving/object_registration.py b/keras/src/saving/object_registration.py
similarity index 98%
rename from keras/saving/object_registration.py
rename to keras/src/saving/object_registration.py
index ee910ed954b7..978e4f762a67 100644
--- a/keras/saving/object_registration.py
+++ b/keras/src/saving/object_registration.py
@@ -1,7 +1,7 @@
 import inspect
 
-from keras.api_export import keras_export
-from keras.backend.common import global_state
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
 
 GLOBAL_CUSTOM_OBJECTS = {}
 GLOBAL_CUSTOM_NAMES = {}
diff --git a/keras/saving/object_registration_test.py b/keras/src/saving/object_registration_test.py
similarity index 97%
rename from keras/saving/object_registration_test.py
rename to keras/src/saving/object_registration_test.py
index 4da7606dd454..ece59e7e208a 100644
--- a/keras/saving/object_registration_test.py
+++ b/keras/src/saving/object_registration_test.py
@@ -1,7 +1,7 @@
 import keras
-from keras import testing
-from keras.saving import object_registration
-from keras.saving import serialization_lib
+from keras.src import testing
+from keras.src.saving import object_registration
+from keras.src.saving import serialization_lib
 
 
 class TestObjectRegistration(testing.TestCase):
diff --git a/keras/saving/saving_api.py b/keras/src/saving/saving_api.py
similarity index 97%
rename from keras/saving/saving_api.py
rename to keras/src/saving/saving_api.py
index cec7c3e793ee..a99ddae8008d 100644
--- a/keras/saving/saving_api.py
+++ b/keras/src/saving/saving_api.py
@@ -3,11 +3,11 @@
 
 from absl import logging
 
-from keras.api_export import keras_export
-from keras.legacy.saving import legacy_h5_format
-from keras.saving import saving_lib
-from keras.utils import file_utils
-from keras.utils import io_utils
+from keras.src.api_export import keras_export
+from keras.src.legacy.saving import legacy_h5_format
+from keras.src.saving import saving_lib
+from keras.src.utils import file_utils
+from keras.src.utils import io_utils
 
 try:
     import h5py
diff --git a/keras/saving/saving_api_test.py b/keras/src/saving/saving_api_test.py
similarity index 97%
rename from keras/saving/saving_api_test.py
rename to keras/src/saving/saving_api_test.py
index 8201c3e0a57a..024fae99678d 100644
--- a/keras/saving/saving_api_test.py
+++ b/keras/src/saving/saving_api_test.py
@@ -5,11 +5,11 @@
 from absl import logging
 from absl.testing import parameterized
 
-from keras import layers
-from keras.models import Sequential
-from keras.saving import saving_api
-from keras.testing import test_case
-from keras.testing.test_utils import named_product
+from keras.src import layers
+from keras.src.models import Sequential
+from keras.src.saving import saving_api
+from keras.src.testing import test_case
+from keras.src.testing.test_utils import named_product
 
 
 class SaveModelTests(test_case.TestCase):
diff --git a/keras/saving/saving_lib.py b/keras/src/saving/saving_lib.py
similarity index 97%
rename from keras/saving/saving_lib.py
rename to keras/src/saving/saving_lib.py
index 187e58aa9dea..7de68802e91c 100644
--- a/keras/saving/saving_lib.py
+++ b/keras/src/saving/saving_lib.py
@@ -10,19 +10,19 @@
 import ml_dtypes
 import numpy as np
 
-from keras import backend
-from keras.backend.common import global_state
-from keras.layers.layer import Layer
-from keras.losses.loss import Loss
-from keras.metrics.metric import Metric
-from keras.optimizers.optimizer import Optimizer
-from keras.saving.serialization_lib import ObjectSharingScope
-from keras.saving.serialization_lib import deserialize_keras_object
-from keras.saving.serialization_lib import serialize_keras_object
-from keras.trainers.compile_utils import CompileMetrics
-from keras.utils import file_utils
-from keras.utils import naming
-from keras.version import __version__ as keras_version
+from keras.src import backend
+from keras.src.backend.common import global_state
+from keras.src.layers.layer import Layer
+from keras.src.losses.loss import Loss
+from keras.src.metrics.metric import Metric
+from keras.src.optimizers.optimizer import Optimizer
+from keras.src.saving.serialization_lib import ObjectSharingScope
+from keras.src.saving.serialization_lib import deserialize_keras_object
+from keras.src.saving.serialization_lib import serialize_keras_object
+from keras.src.trainers.compile_utils import CompileMetrics
+from keras.src.utils import file_utils
+from keras.src.utils import naming
+from keras.src.version import __version__ as keras_version
 
 try:
     import h5py
@@ -319,8 +319,8 @@ def _name_key(name):
 
 
 def _walk_trackable(trackable):
-    from keras.models import Functional
-    from keras.models import Sequential
+    from keras.src.models import Functional
+    from keras.src.models import Sequential
 
     if isinstance(trackable, Sequential):
         obj_type = "Sequential"
diff --git a/keras/saving/saving_lib_test.py b/keras/src/saving/saving_lib_test.py
similarity index 99%
rename from keras/saving/saving_lib_test.py
rename to keras/src/saving/saving_lib_test.py
index 5b3ee214824f..6b2d483d7591 100644
--- a/keras/saving/saving_lib_test.py
+++ b/keras/src/saving/saving_lib_test.py
@@ -12,9 +12,9 @@
 import pytest
 
 import keras
-from keras import ops
-from keras import testing
-from keras.saving import saving_lib
+from keras.src import ops
+from keras.src import testing
+from keras.src.saving import saving_lib
 
 
 @keras.saving.register_keras_serializable(package="my_custom_package")
@@ -614,7 +614,7 @@ def test_save_to_fileobj(self) -> None:
 @pytest.mark.requires_trainable_backend
 class SavingAPITest(testing.TestCase):
     def test_saving_api_errors(self):
-        from keras.saving import saving_api
+        from keras.src.saving import saving_api
 
         model = _get_basic_functional_model()
 
diff --git a/keras/saving/serialization_lib.py b/keras/src/saving/serialization_lib.py
similarity index 98%
rename from keras/saving/serialization_lib.py
rename to keras/src/saving/serialization_lib.py
index 327cefcc0949..40125572809b 100644
--- a/keras/saving/serialization_lib.py
+++ b/keras/src/saving/serialization_lib.py
@@ -7,13 +7,13 @@
 
 import numpy as np
 
-from keras import api_export
-from keras import backend
-from keras.api_export import keras_export
-from keras.backend.common import global_state
-from keras.saving import object_registration
-from keras.utils import python_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import api_export
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
+from keras.src.saving import object_registration
+from keras.src.utils import python_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 PLAIN_TYPES = (str, int, float, bool)
 
diff --git a/keras/saving/serialization_lib_test.py b/keras/src/saving/serialization_lib_test.py
similarity index 99%
rename from keras/saving/serialization_lib_test.py
rename to keras/src/saving/serialization_lib_test.py
index 701a903d661f..06ed6ac7198f 100644
--- a/keras/saving/serialization_lib_test.py
+++ b/keras/src/saving/serialization_lib_test.py
@@ -6,9 +6,9 @@
 import pytest
 
 import keras
-from keras import ops
-from keras import testing
-from keras.saving import serialization_lib
+from keras.src import ops
+from keras.src import testing
+from keras.src.saving import serialization_lib
 
 
 def custom_fn(x):
diff --git a/keras/src/testing/__init__.py b/keras/src/testing/__init__.py
new file mode 100644
index 000000000000..ae554ff85857
--- /dev/null
+++ b/keras/src/testing/__init__.py
@@ -0,0 +1,5 @@
+from keras.src.testing.test_case import TestCase
+from keras.src.testing.test_case import jax_uses_gpu
+from keras.src.testing.test_case import tensorflow_uses_gpu
+from keras.src.testing.test_case import torch_uses_gpu
+from keras.src.testing.test_case import uses_gpu
diff --git a/keras/testing/test_case.py b/keras/src/testing/test_case.py
similarity index 97%
rename from keras/testing/test_case.py
rename to keras/src/testing/test_case.py
index 74656e6f0efb..0b6fd9d40f3f 100644
--- a/keras/testing/test_case.py
+++ b/keras/src/testing/test_case.py
@@ -5,17 +5,17 @@
 
 import numpy as np
 
-from keras import backend
-from keras import distribution
-from keras import ops
-from keras import tree
-from keras import utils
-from keras.backend.common import is_float_dtype
-from keras.backend.common import standardize_dtype
-from keras.backend.common.global_state import clear_session
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.models import Model
-from keras.utils import traceback_utils
+from keras.src import backend
+from keras.src import distribution
+from keras.src import ops
+from keras.src import tree
+from keras.src import utils
+from keras.src.backend.common import is_float_dtype
+from keras.src.backend.common import standardize_dtype
+from keras.src.backend.common.global_state import clear_session
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.models import Model
+from keras.src.utils import traceback_utils
 
 
 class TestCase(unittest.TestCase):
@@ -100,9 +100,9 @@ def assertSparse(self, x, sparse=True):
             )
 
     def run_class_serialization_test(self, instance, custom_objects=None):
-        from keras.saving import custom_object_scope
-        from keras.saving import deserialize_keras_object
-        from keras.saving import serialize_keras_object
+        from keras.src.saving import custom_object_scope
+        from keras.src.saving import deserialize_keras_object
+        from keras.src.saving import serialize_keras_object
 
         # get_config roundtrip
         cls = instance.__class__
@@ -599,7 +599,7 @@ def create_keras_tensors(input_shape, dtype, sparse):
 
 
 def create_eager_tensors(input_shape, dtype, sparse):
-    from keras.backend import random
+    from keras.src.backend import random
 
     if set(tree.flatten(dtype)).difference(
         ["float16", "float32", "float64", "int16", "int32", "int64"]
diff --git a/keras/testing/test_utils.py b/keras/src/testing/test_utils.py
similarity index 100%
rename from keras/testing/test_utils.py
rename to keras/src/testing/test_utils.py
diff --git a/keras/testing/test_utils_test.py b/keras/src/testing/test_utils_test.py
similarity index 99%
rename from keras/testing/test_utils_test.py
rename to keras/src/testing/test_utils_test.py
index c7bb9b6a86e2..f0b6591c79de 100644
--- a/keras/testing/test_utils_test.py
+++ b/keras/src/testing/test_utils_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras.testing import test_case
-from keras.testing import test_utils
+from keras.src.testing import test_case
+from keras.src.testing import test_utils
 
 
 class GetTestDataTest(test_case.TestCase):
diff --git a/keras/trainers/__init__.py b/keras/src/trainers/__init__.py
similarity index 100%
rename from keras/trainers/__init__.py
rename to keras/src/trainers/__init__.py
diff --git a/keras/trainers/compile_utils.py b/keras/src/trainers/compile_utils.py
similarity index 99%
rename from keras/trainers/compile_utils.py
rename to keras/src/trainers/compile_utils.py
index 2049d4b8546b..729c26921336 100644
--- a/keras/trainers/compile_utils.py
+++ b/keras/src/trainers/compile_utils.py
@@ -1,9 +1,9 @@
-from keras import backend
-from keras import losses as losses_module
-from keras import metrics as metrics_module
-from keras import ops
-from keras import tree
-from keras.utils.naming import get_object_name
+from keras.src import backend
+from keras.src import losses as losses_module
+from keras.src import metrics as metrics_module
+from keras.src import ops
+from keras.src import tree
+from keras.src.utils.naming import get_object_name
 
 
 class MetricsList(metrics_module.Metric):
diff --git a/keras/trainers/compile_utils_test.py b/keras/src/trainers/compile_utils_test.py
similarity index 97%
rename from keras/trainers/compile_utils_test.py
rename to keras/src/trainers/compile_utils_test.py
index 0d53dcacc352..122a9f357f69 100644
--- a/keras/trainers/compile_utils_test.py
+++ b/keras/src/trainers/compile_utils_test.py
@@ -1,13 +1,13 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import backend
-from keras import metrics as losses_module
-from keras import metrics as metrics_module
-from keras import ops
-from keras import testing
-from keras.trainers.compile_utils import CompileLoss
-from keras.trainers.compile_utils import CompileMetrics
+from keras.src import backend
+from keras.src import metrics as losses_module
+from keras.src import metrics as metrics_module
+from keras.src import ops
+from keras.src import testing
+from keras.src.trainers.compile_utils import CompileLoss
+from keras.src.trainers.compile_utils import CompileMetrics
 
 
 class TestCompileMetrics(testing.TestCase):
diff --git a/keras/trainers/data_adapters/__init__.py b/keras/src/trainers/data_adapters/__init__.py
similarity index 89%
rename from keras/trainers/data_adapters/__init__.py
rename to keras/src/trainers/data_adapters/__init__.py
index 84088342895d..41f2a91f11a0 100644
--- a/keras/trainers/data_adapters/__init__.py
+++ b/keras/src/trainers/data_adapters/__init__.py
@@ -1,15 +1,15 @@
 import types
 
-from keras.distribution import distribution_lib
-from keras.trainers.data_adapters import array_data_adapter
-from keras.trainers.data_adapters import py_dataset_adapter
-from keras.trainers.data_adapters.array_data_adapter import ArrayDataAdapter
-from keras.trainers.data_adapters.generator_data_adapter import (
+from keras.src.distribution import distribution_lib
+from keras.src.trainers.data_adapters import array_data_adapter
+from keras.src.trainers.data_adapters import py_dataset_adapter
+from keras.src.trainers.data_adapters.array_data_adapter import ArrayDataAdapter
+from keras.src.trainers.data_adapters.generator_data_adapter import (
     GeneratorDataAdapter,
 )
-from keras.trainers.data_adapters.py_dataset_adapter import PyDatasetAdapter
-from keras.trainers.data_adapters.tf_dataset_adapter import TFDatasetAdapter
-from keras.trainers.data_adapters.torch_data_loader_adapter import (
+from keras.src.trainers.data_adapters.py_dataset_adapter import PyDatasetAdapter
+from keras.src.trainers.data_adapters.tf_dataset_adapter import TFDatasetAdapter
+from keras.src.trainers.data_adapters.torch_data_loader_adapter import (
     TorchDataLoaderAdapter,
 )
 
diff --git a/keras/trainers/data_adapters/array_data_adapter.py b/keras/src/trainers/data_adapters/array_data_adapter.py
similarity index 97%
rename from keras/trainers/data_adapters/array_data_adapter.py
rename to keras/src/trainers/data_adapters/array_data_adapter.py
index 26cc77e609e2..3832d8e553ae 100644
--- a/keras/trainers/data_adapters/array_data_adapter.py
+++ b/keras/src/trainers/data_adapters/array_data_adapter.py
@@ -3,10 +3,10 @@
 
 import numpy as np
 
-from keras import tree
-from keras.trainers.data_adapters import array_slicing
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.trainers.data_adapters.data_adapter import DataAdapter
+from keras.src import tree
+from keras.src.trainers.data_adapters import array_slicing
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.trainers.data_adapters.data_adapter import DataAdapter
 
 
 class ArrayDataAdapter(DataAdapter):
@@ -103,7 +103,7 @@ def slice_and_convert_to_numpy(sliceable, indices=None):
         return self._get_iterator(slice_and_convert_to_numpy, inputs)
 
     def get_tf_dataset(self):
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         shuffle = self._shuffle
         batch_size = self._batch_size
@@ -243,7 +243,7 @@ def grab_one(x):
         return dataset.prefetch(tf.data.AUTOTUNE)
 
     def get_jax_iterator(self):
-        from keras.backend.jax.core import convert_to_tensor
+        from keras.src.backend.jax.core import convert_to_tensor
 
         inputs = array_slicing.convert_to_sliceable(
             self._inputs, target_backend="jax"
@@ -260,7 +260,7 @@ def slice_and_convert_to_jax(sliceable, indices=None):
     def get_torch_dataloader(self):
         import torch
 
-        from keras.backend.torch.core import convert_to_tensor
+        from keras.src.backend.torch.core import convert_to_tensor
 
         class ArrayDataset(torch.utils.data.Dataset):
             def __init__(self, array):
diff --git a/keras/trainers/data_adapters/array_data_adapter_test.py b/keras/src/trainers/data_adapters/array_data_adapter_test.py
similarity index 98%
rename from keras/trainers/data_adapters/array_data_adapter_test.py
rename to keras/src/trainers/data_adapters/array_data_adapter_test.py
index c1eccc6c290b..46eb4fcc194e 100644
--- a/keras/trainers/data_adapters/array_data_adapter_test.py
+++ b/keras/src/trainers/data_adapters/array_data_adapter_test.py
@@ -7,10 +7,10 @@
 import torch
 from absl.testing import parameterized
 
-from keras import backend
-from keras import testing
-from keras.testing.test_utils import named_product
-from keras.trainers.data_adapters import array_data_adapter
+from keras.src import backend
+from keras.src import testing
+from keras.src.testing.test_utils import named_product
+from keras.src.trainers.data_adapters import array_data_adapter
 
 
 class TestArrayDataAdapter(testing.TestCase, parameterized.TestCase):
diff --git a/keras/trainers/data_adapters/array_slicing.py b/keras/src/trainers/data_adapters/array_slicing.py
similarity index 95%
rename from keras/trainers/data_adapters/array_slicing.py
rename to keras/src/trainers/data_adapters/array_slicing.py
index eab94fa3ed5b..50279aa11087 100644
--- a/keras/trainers/data_adapters/array_slicing.py
+++ b/keras/src/trainers/data_adapters/array_slicing.py
@@ -3,9 +3,9 @@
 
 import numpy as np
 
-from keras import backend
-from keras import tree
-from keras.trainers.data_adapters import data_adapter_utils
+from keras.src import backend
+from keras.src import tree
+from keras.src.trainers.data_adapters import data_adapter_utils
 
 try:
     import pandas
@@ -124,7 +124,7 @@ class NumpySliceable(Sliceable):
 
 class TensorflowSliceable(Sliceable):
     def __getitem__(self, indices):
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         if isinstance(indices, slice):
             return self.array[indices]
@@ -133,13 +133,13 @@ def __getitem__(self, indices):
 
     @classmethod
     def cast(cls, x, dtype):
-        from keras.backend.tensorflow.core import cast
+        from keras.src.backend.tensorflow.core import cast
 
         return cast(x, dtype)
 
     @classmethod
     def convert_to_numpy(cls, x):
-        from keras.backend.tensorflow.core import convert_to_numpy
+        from keras.src.backend.tensorflow.core import convert_to_numpy
 
         return convert_to_numpy(x)
 
@@ -175,7 +175,7 @@ def convert_to_jax_compatible(cls, x):
 
     @classmethod
     def convert_to_torch_compatible(cls, x):
-        from keras.backend.tensorflow import sparse as tf_sparse
+        from keras.src.backend.tensorflow import sparse as tf_sparse
 
         return tf_sparse.sparse_to_dense(x)
 
@@ -186,7 +186,7 @@ def __getitem__(self, indices):
 
     @classmethod
     def convert_to_numpy(cls, x):
-        from keras.backend.jax.core import convert_to_numpy
+        from keras.src.backend.jax.core import convert_to_numpy
 
         return convert_to_numpy(x)
 
@@ -206,13 +206,13 @@ def convert_to_torch_compatible(cls, x):
 class TorchSliceable(Sliceable):
     @classmethod
     def cast(cls, x, dtype):
-        from keras.backend.torch.core import cast
+        from keras.src.backend.torch.core import cast
 
         return cast(x, dtype)
 
     @classmethod
     def convert_to_numpy(cls, x):
-        from keras.backend.torch.core import convert_to_numpy
+        from keras.src.backend.torch.core import convert_to_numpy
 
         return convert_to_numpy(x)
 
@@ -293,7 +293,7 @@ def convert_to_torch_compatible(cls, x):
 
 
 def to_tensorflow_sparse_wrapper(sparse):
-    from keras.utils.module_utils import tensorflow as tf
+    from keras.src.utils.module_utils import tensorflow as tf
 
     row_ids = sparse.indices[:, 0]
     row_splits = tf.experimental.RowPartition.from_value_rowids(
@@ -308,7 +308,7 @@ def to_tensorflow_sparse_wrapper(sparse):
 
 
 def slice_tensorflow_sparse_wrapper(sparse_wrapper, indices):
-    from keras.utils.module_utils import tensorflow as tf
+    from keras.src.utils.module_utils import tensorflow as tf
 
     if isinstance(indices, slice):
         sparse_indices = sparse_wrapper.ragged_indices[indices]
diff --git a/keras/trainers/data_adapters/data_adapter.py b/keras/src/trainers/data_adapters/data_adapter.py
similarity index 100%
rename from keras/trainers/data_adapters/data_adapter.py
rename to keras/src/trainers/data_adapters/data_adapter.py
diff --git a/keras/trainers/data_adapters/data_adapter_utils.py b/keras/src/trainers/data_adapters/data_adapter_utils.py
similarity index 95%
rename from keras/trainers/data_adapters/data_adapter_utils.py
rename to keras/src/trainers/data_adapters/data_adapter_utils.py
index 7768c9295e24..83dae01e146d 100644
--- a/keras/trainers/data_adapters/data_adapter_utils.py
+++ b/keras/src/trainers/data_adapters/data_adapter_utils.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from keras import backend
-from keras import tree
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src import tree
+from keras.src.api_export import keras_export
 
 NUM_BATCHES_FOR_TENSOR_SPEC = 2
 
@@ -135,7 +135,7 @@ def get_tensor_spec(batches):
             identical, but the shape at each leaf may be different.
     Returns: the common tensor spec for all the batches.
     """
-    from keras.utils.module_utils import tensorflow as tf
+    from keras.src.utils.module_utils import tensorflow as tf
 
     def get_single_tensor_spec(*tensors):
         x = tensors[0]
@@ -176,7 +176,7 @@ def get_single_tensor_spec(*tensors):
 
 
 def get_jax_iterator(iterable):
-    from keras.backend.jax.core import convert_to_tensor
+    from keras.src.backend.jax.core import convert_to_tensor
 
     for batch in iterable:
         yield tree.map_structure(convert_to_tensor, batch)
@@ -201,7 +201,7 @@ def convert_to_numpy(x):
 def get_torch_dataloader(iterable):
     import torch.utils.data as torch_data
 
-    from keras.backend.torch.core import convert_to_tensor
+    from keras.src.backend.torch.core import convert_to_tensor
 
     class ConverterIterableDataset(torch_data.IterableDataset):
         def __init__(self, iterable):
@@ -279,7 +279,7 @@ def is_scipy_sparse(x):
 
 
 def scipy_sparse_to_tf_sparse(x):
-    from keras.utils.module_utils import tensorflow as tf
+    from keras.src.utils.module_utils import tensorflow as tf
 
     coo = x.tocoo()
     indices = np.concatenate(
@@ -303,6 +303,6 @@ def tf_sparse_to_jax_sparse(x):
 
 
 def jax_sparse_to_tf_sparse(x):
-    from keras.utils.module_utils import tensorflow as tf
+    from keras.src.utils.module_utils import tensorflow as tf
 
     return tf.SparseTensor(x.indices, x.data, x.shape)
diff --git a/keras/trainers/data_adapters/generator_data_adapter.py b/keras/src/trainers/data_adapters/generator_data_adapter.py
similarity index 89%
rename from keras/trainers/data_adapters/generator_data_adapter.py
rename to keras/src/trainers/data_adapters/generator_data_adapter.py
index 6e26c9585ccd..0cbf3d64cf49 100644
--- a/keras/trainers/data_adapters/generator_data_adapter.py
+++ b/keras/src/trainers/data_adapters/generator_data_adapter.py
@@ -1,8 +1,8 @@
 import itertools
 
-from keras import tree
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.trainers.data_adapters.data_adapter import DataAdapter
+from keras.src import tree
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.trainers.data_adapters.data_adapter import DataAdapter
 
 
 class GeneratorDataAdapter(DataAdapter):
@@ -26,7 +26,7 @@ def get_numpy_iterator(self):
         return data_adapter_utils.get_numpy_iterator(self.generator)
 
     def get_jax_iterator(self):
-        from keras.backend.jax.core import convert_to_tensor
+        from keras.src.backend.jax.core import convert_to_tensor
 
         def convert_to_jax(x):
             if data_adapter_utils.is_scipy_sparse(x):
@@ -39,7 +39,7 @@ def convert_to_jax(x):
             yield tree.map_structure(convert_to_jax, batch)
 
     def get_tf_dataset(self):
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         def convert_to_tf(x):
             if data_adapter_utils.is_scipy_sparse(x):
diff --git a/keras/trainers/data_adapters/generator_data_adapter_test.py b/keras/src/trainers/data_adapters/generator_data_adapter_test.py
similarity index 97%
rename from keras/trainers/data_adapters/generator_data_adapter_test.py
rename to keras/src/trainers/data_adapters/generator_data_adapter_test.py
index f06e79610429..4d6ebdc5597c 100644
--- a/keras/trainers/data_adapters/generator_data_adapter_test.py
+++ b/keras/src/trainers/data_adapters/generator_data_adapter_test.py
@@ -9,9 +9,9 @@
 from absl.testing import parameterized
 from jax import numpy as jnp
 
-from keras import testing
-from keras.testing.test_utils import named_product
-from keras.trainers.data_adapters import generator_data_adapter
+from keras.src import testing
+from keras.src.testing.test_utils import named_product
+from keras.src.trainers.data_adapters import generator_data_adapter
 
 
 def example_generator(x, y, sample_weight=None, batch_size=32):
diff --git a/keras/trainers/data_adapters/py_dataset_adapter.py b/keras/src/trainers/data_adapters/py_dataset_adapter.py
similarity index 98%
rename from keras/trainers/data_adapters/py_dataset_adapter.py
rename to keras/src/trainers/data_adapters/py_dataset_adapter.py
index 451d8aa50c0d..71ab2a67736a 100644
--- a/keras/trainers/data_adapters/py_dataset_adapter.py
+++ b/keras/src/trainers/data_adapters/py_dataset_adapter.py
@@ -9,9 +9,9 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.trainers.data_adapters.data_adapter import DataAdapter
+from keras.src.api_export import keras_export
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.trainers.data_adapters.data_adapter import DataAdapter
 
 
 @keras_export(["keras.utils.PyDataset", "keras.utils.Sequence"])
@@ -260,7 +260,7 @@ def get_jax_iterator(self):
         return data_adapter_utils.get_jax_iterator(self._get_iterator())
 
     def get_tf_dataset(self):
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         if self._output_signature is None:
             num_samples = min(
diff --git a/keras/trainers/data_adapters/py_dataset_adapter_test.py b/keras/src/trainers/data_adapters/py_dataset_adapter_test.py
similarity index 97%
rename from keras/trainers/data_adapters/py_dataset_adapter_test.py
rename to keras/src/trainers/data_adapters/py_dataset_adapter_test.py
index cc88631853dd..b1be7002ac54 100644
--- a/keras/trainers/data_adapters/py_dataset_adapter_test.py
+++ b/keras/src/trainers/data_adapters/py_dataset_adapter_test.py
@@ -7,10 +7,10 @@
 import torch
 from absl.testing import parameterized
 
-from keras import testing
-from keras.testing.test_utils import named_product
-from keras.trainers.data_adapters import py_dataset_adapter
-from keras.utils.rng_utils import set_random_seed
+from keras.src import testing
+from keras.src.testing.test_utils import named_product
+from keras.src.trainers.data_adapters import py_dataset_adapter
+from keras.src.utils.rng_utils import set_random_seed
 
 
 class ExamplePyDataset(py_dataset_adapter.PyDataset):
diff --git a/keras/trainers/data_adapters/tf_dataset_adapter.py b/keras/src/trainers/data_adapters/tf_dataset_adapter.py
similarity index 89%
rename from keras/trainers/data_adapters/tf_dataset_adapter.py
rename to keras/src/trainers/data_adapters/tf_dataset_adapter.py
index 6f2362dc9b4d..fcd4c9893852 100644
--- a/keras/trainers/data_adapters/tf_dataset_adapter.py
+++ b/keras/src/trainers/data_adapters/tf_dataset_adapter.py
@@ -1,6 +1,6 @@
-from keras import tree
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.trainers.data_adapters.data_adapter import DataAdapter
+from keras.src import tree
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.trainers.data_adapters.data_adapter import DataAdapter
 
 
 class TFDatasetAdapter(DataAdapter):
@@ -17,7 +17,7 @@ def __init__(self, dataset, class_weight=None, distribution=None):
                 shard the input dataset into per worker/process dataset
                 instance.
         """
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         if not isinstance(
             dataset, (tf.data.Dataset, tf.distribute.DistributedDataset)
@@ -35,7 +35,7 @@ def __init__(self, dataset, class_weight=None, distribution=None):
         self._dataset = dataset
 
     def get_numpy_iterator(self):
-        from keras.backend.tensorflow.core import convert_to_numpy
+        from keras.src.backend.tensorflow.core import convert_to_numpy
 
         for batch in self._dataset:
             yield tree.map_structure(convert_to_numpy, batch)
@@ -43,9 +43,9 @@ def get_numpy_iterator(self):
     def get_jax_iterator(self):
         import jax.experimental.sparse as jax_sparse
 
-        from keras.backend.jax.core import convert_to_tensor
-        from keras.backend.tensorflow.core import convert_to_numpy
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.backend.jax.core import convert_to_tensor
+        from keras.src.backend.tensorflow.core import convert_to_numpy
+        from keras.src.utils.module_utils import tensorflow as tf
 
         def convert_to_jax(x):
             # We use numpy as an intermediary because the conversion
@@ -107,7 +107,7 @@ def make_class_weight_map_fn(class_weight):
         A function that can be used with `tf.data.Dataset.map` to apply class
         weighting.
     """
-    from keras.utils.module_utils import tensorflow as tf
+    from keras.src.utils.module_utils import tensorflow as tf
 
     class_weight_tensor = tf.convert_to_tensor(
         [
diff --git a/keras/trainers/data_adapters/tf_dataset_adapter_test.py b/keras/src/trainers/data_adapters/tf_dataset_adapter_test.py
similarity index 98%
rename from keras/trainers/data_adapters/tf_dataset_adapter_test.py
rename to keras/src/trainers/data_adapters/tf_dataset_adapter_test.py
index 5d4a7576f45b..ad48c2d3c241 100644
--- a/keras/trainers/data_adapters/tf_dataset_adapter_test.py
+++ b/keras/src/trainers/data_adapters/tf_dataset_adapter_test.py
@@ -6,9 +6,9 @@
 import torch
 from absl.testing import parameterized
 
-from keras import testing
-from keras.testing.test_utils import named_product
-from keras.trainers.data_adapters import tf_dataset_adapter
+from keras.src import testing
+from keras.src.testing.test_utils import named_product
+from keras.src.trainers.data_adapters import tf_dataset_adapter
 
 
 class TestTFDatasetAdapter(testing.TestCase, parameterized.TestCase):
diff --git a/keras/trainers/data_adapters/torch_data_loader_adapter.py b/keras/src/trainers/data_adapters/torch_data_loader_adapter.py
similarity index 91%
rename from keras/trainers/data_adapters/torch_data_loader_adapter.py
rename to keras/src/trainers/data_adapters/torch_data_loader_adapter.py
index 78df412c68f3..59a89050c5ce 100644
--- a/keras/trainers/data_adapters/torch_data_loader_adapter.py
+++ b/keras/src/trainers/data_adapters/torch_data_loader_adapter.py
@@ -2,9 +2,9 @@
 
 import numpy as np
 
-from keras import tree
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.trainers.data_adapters.data_adapter import DataAdapter
+from keras.src import tree
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.trainers.data_adapters.data_adapter import DataAdapter
 
 
 class TorchDataLoaderAdapter(DataAdapter):
@@ -44,7 +44,7 @@ def get_jax_iterator(self):
         return data_adapter_utils.get_jax_iterator(self.get_numpy_iterator())
 
     def get_tf_dataset(self):
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         if self._output_signature is None:
             batches = list(
diff --git a/keras/trainers/data_adapters/torch_data_loader_adapter_test.py b/keras/src/trainers/data_adapters/torch_data_loader_adapter_test.py
similarity index 97%
rename from keras/trainers/data_adapters/torch_data_loader_adapter_test.py
rename to keras/src/trainers/data_adapters/torch_data_loader_adapter_test.py
index 9922667cecc3..e86f570d6925 100644
--- a/keras/trainers/data_adapters/torch_data_loader_adapter_test.py
+++ b/keras/src/trainers/data_adapters/torch_data_loader_adapter_test.py
@@ -6,9 +6,9 @@
 import torch
 from absl.testing import parameterized
 
-from keras import testing
-from keras.testing.test_utils import named_product
-from keras.trainers.data_adapters.torch_data_loader_adapter import (
+from keras.src import testing
+from keras.src.testing.test_utils import named_product
+from keras.src.trainers.data_adapters.torch_data_loader_adapter import (
     TorchDataLoaderAdapter,
 )
 
diff --git a/keras/trainers/epoch_iterator.py b/keras/src/trainers/epoch_iterator.py
similarity index 98%
rename from keras/trainers/epoch_iterator.py
rename to keras/src/trainers/epoch_iterator.py
index 9711a6cfa12d..fa55d78d864f 100644
--- a/keras/trainers/epoch_iterator.py
+++ b/keras/src/trainers/epoch_iterator.py
@@ -41,7 +41,7 @@
 
 import warnings
 
-from keras.trainers import data_adapters
+from keras.src.trainers import data_adapters
 
 
 class EpochIterator:
diff --git a/keras/trainers/epoch_iterator_test.py b/keras/src/trainers/epoch_iterator_test.py
similarity index 97%
rename from keras/trainers/epoch_iterator_test.py
rename to keras/src/trainers/epoch_iterator_test.py
index 0c731b0bc79b..832520e19fc3 100644
--- a/keras/trainers/epoch_iterator_test.py
+++ b/keras/src/trainers/epoch_iterator_test.py
@@ -2,10 +2,10 @@
 import pytest
 import tensorflow as tf
 
-from keras import backend
-from keras import testing
-from keras.trainers import data_adapters
-from keras.trainers import epoch_iterator
+from keras.src import backend
+from keras.src import testing
+from keras.src.trainers import data_adapters
+from keras.src.trainers import epoch_iterator
 
 
 class TestEpochIterator(testing.TestCase):
diff --git a/keras/trainers/trainer.py b/keras/src/trainers/trainer.py
similarity index 98%
rename from keras/trainers/trainer.py
rename to keras/src/trainers/trainer.py
index 0ee156f9c5e2..0d8fdb85cd6d 100644
--- a/keras/trainers/trainer.py
+++ b/keras/src/trainers/trainer.py
@@ -1,18 +1,18 @@
 import platform
 import warnings
 
-from keras import backend
-from keras import metrics as metrics_module
-from keras import ops
-from keras import optimizers
-from keras import tree
-from keras.optimizers.loss_scale_optimizer import LossScaleOptimizer
-from keras.saving import serialization_lib
-from keras.trainers.compile_utils import CompileLoss
-from keras.trainers.compile_utils import CompileMetrics
-from keras.trainers.data_adapters import data_adapter_utils
-from keras.utils import traceback_utils
-from keras.utils import tracking
+from keras.src import backend
+from keras.src import metrics as metrics_module
+from keras.src import ops
+from keras.src import optimizers
+from keras.src import tree
+from keras.src.optimizers.loss_scale_optimizer import LossScaleOptimizer
+from keras.src.saving import serialization_lib
+from keras.src.trainers.compile_utils import CompileLoss
+from keras.src.trainers.compile_utils import CompileMetrics
+from keras.src.trainers.data_adapters import data_adapter_utils
+from keras.src.utils import traceback_utils
+from keras.src.utils import tracking
 
 
 class Trainer:
@@ -995,7 +995,7 @@ def model_supports_jit(model):
     # XLA not supported with TF on MacOS GPU
     if platform.system() == "Darwin" and "arm" in platform.processor().lower():
         if backend.backend() == "tensorflow":
-            from keras.utils.module_utils import tensorflow as tf
+            from keras.src.utils.module_utils import tensorflow as tf
 
             if tf.config.list_physical_devices("GPU"):
                 return False
diff --git a/keras/trainers/trainer_test.py b/keras/src/trainers/trainer_test.py
similarity index 98%
rename from keras/trainers/trainer_test.py
rename to keras/src/trainers/trainer_test.py
index cf02da6b558a..6e125a31cf07 100644
--- a/keras/trainers/trainer_test.py
+++ b/keras/src/trainers/trainer_test.py
@@ -5,27 +5,29 @@
 from absl.testing import parameterized
 
 import keras
-from keras import backend
-from keras import initializers
-from keras import layers
-from keras import losses
-from keras import metrics
-from keras import models
-from keras import ops
-from keras import optimizers
-from keras import testing
-from keras.callbacks.callback import Callback
-from keras.optimizers.rmsprop import RMSprop
-from keras.testing.test_utils import named_product
+from keras.src import backend
+from keras.src import initializers
+from keras.src import layers
+from keras.src import losses
+from keras.src import metrics
+from keras.src import models
+from keras.src import ops
+from keras.src import optimizers
+from keras.src import testing
+from keras.src.callbacks.callback import Callback
+from keras.src.optimizers.rmsprop import RMSprop
+from keras.src.testing.test_utils import named_product
 
 if backend.backend() == "jax":
-    from keras.backend.jax.trainer import JAXTrainer as Trainer
+    from keras.src.backend.jax.trainer import JAXTrainer as Trainer
 elif backend.backend() == "torch":
-    from keras.backend.torch.trainer import TorchTrainer as Trainer
+    from keras.src.backend.torch.trainer import TorchTrainer as Trainer
 elif backend.backend() == "tensorflow":
-    from keras.backend.tensorflow.trainer import TensorFlowTrainer as Trainer
+    from keras.src.backend.tensorflow.trainer import (
+        TensorFlowTrainer as Trainer,
+    )
 elif backend.backend() == "numpy":
-    from keras.backend.numpy.trainer import NumpyTrainer as Trainer
+    from keras.src.backend.numpy.trainer import NumpyTrainer as Trainer
 else:
     raise ImportError(f"Invalid backend: {backend.backend()}")
 
@@ -966,7 +968,7 @@ def call(self, x):
     def get_functional(self):
         ExampleLayer = self.get_layer()
 
-        class ExampleFunctional(keras.Functional):
+        class ExampleFunctional(keras.src.Functional):
             def __init__(self, input_shape=(None,)):
                 inputs = keras.Input(input_shape)
                 outputs = ExampleLayer()(inputs)
@@ -996,7 +998,7 @@ def __init__(self, input_shape=(None,)):
         reason="Only tensorflow supports raggeds",
     )
     def test_trainer_with_raggeds(self, model_class):
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         def loss_fn(y, y_pred, sample_weight=None):
             return 0
diff --git a/keras/src/tree/__init__.py b/keras/src/tree/__init__.py
new file mode 100644
index 000000000000..ba755043cb9b
--- /dev/null
+++ b/keras/src/tree/__init__.py
@@ -0,0 +1,10 @@
+from keras.src.tree.tree_api import assert_same_structure
+from keras.src.tree.tree_api import flatten
+from keras.src.tree.tree_api import is_nested
+from keras.src.tree.tree_api import lists_to_tuples
+from keras.src.tree.tree_api import map_shape_structure
+from keras.src.tree.tree_api import map_structure
+from keras.src.tree.tree_api import map_structure_up_to
+from keras.src.tree.tree_api import pack_sequence_as
+from keras.src.tree.tree_api import register_tree_node_class
+from keras.src.tree.tree_api import traverse
diff --git a/keras/tree/dmtree_impl.py b/keras/src/tree/dmtree_impl.py
similarity index 99%
rename from keras/tree/dmtree_impl.py
rename to keras/src/tree/dmtree_impl.py
index 916fb35b257b..441e84a35073 100644
--- a/keras/tree/dmtree_impl.py
+++ b/keras/src/tree/dmtree_impl.py
@@ -1,4 +1,4 @@
-from keras.utils.module_utils import dmtree
+from keras.src.utils.module_utils import dmtree
 
 
 def register_tree_node_class(cls):
diff --git a/keras/tree/optree_impl.py b/keras/src/tree/optree_impl.py
similarity index 99%
rename from keras/tree/optree_impl.py
rename to keras/src/tree/optree_impl.py
index c823381b56f3..8ada42b0fb24 100644
--- a/keras/tree/optree_impl.py
+++ b/keras/src/tree/optree_impl.py
@@ -5,7 +5,7 @@
 import optree
 import optree.utils
 
-from keras.backend.config import backend
+from keras.src.backend.config import backend
 
 
 def register_tree_node_class(cls):
diff --git a/keras/tree/tree_api.py b/keras/src/tree/tree_api.py
similarity index 97%
rename from keras/tree/tree_api.py
rename to keras/src/tree/tree_api.py
index 09a99daa10e9..1bd833c8d0ab 100644
--- a/keras/tree/tree_api.py
+++ b/keras/src/tree/tree_api.py
@@ -1,11 +1,11 @@
-from keras.api_export import keras_export
-from keras.utils.module_utils import dmtree
-from keras.utils.module_utils import optree
+from keras.src.api_export import keras_export
+from keras.src.utils.module_utils import dmtree
+from keras.src.utils.module_utils import optree
 
 if optree.available:
-    from keras.tree import optree_impl as tree_impl
+    from keras.src.tree import optree_impl as tree_impl
 elif dmtree.available:
-    from keras.tree import dmtree_impl as tree_impl
+    from keras.src.tree import dmtree_impl as tree_impl
 else:
     raise ImportError(
         "To use Keras, you need to have `optree` installed. "
diff --git a/keras/tree/tree_test.py b/keras/src/tree/tree_test.py
similarity index 99%
rename from keras/tree/tree_test.py
rename to keras/src/tree/tree_test.py
index 7335b7d3f377..24ddbe5ce0fa 100644
--- a/keras/tree/tree_test.py
+++ b/keras/src/tree/tree_test.py
@@ -2,9 +2,9 @@
 
 import numpy as np
 
-from keras import ops
-from keras import testing
-from keras import tree
+from keras.src import ops
+from keras.src import testing
+from keras.src import tree
 
 STRUCTURE1 = (((1, 2), 3), 4, (5, 6))
 STRUCTURE2 = ((("foo1", "foo2"), "foo3"), "foo4", ("foo5", "foo6"))
diff --git a/keras/src/utils/__init__.py b/keras/src/utils/__init__.py
new file mode 100644
index 000000000000..c503a2043776
--- /dev/null
+++ b/keras/src/utils/__init__.py
@@ -0,0 +1,26 @@
+from keras.src.utils.audio_dataset_utils import audio_dataset_from_directory
+from keras.src.utils.dataset_utils import split_dataset
+from keras.src.utils.file_utils import get_file
+from keras.src.utils.image_dataset_utils import image_dataset_from_directory
+from keras.src.utils.image_utils import array_to_img
+from keras.src.utils.image_utils import img_to_array
+from keras.src.utils.image_utils import load_img
+from keras.src.utils.image_utils import save_img
+from keras.src.utils.io_utils import disable_interactive_logging
+from keras.src.utils.io_utils import enable_interactive_logging
+from keras.src.utils.io_utils import is_interactive_logging_enabled
+from keras.src.utils.model_visualization import model_to_dot
+from keras.src.utils.model_visualization import plot_model
+from keras.src.utils.numerical_utils import normalize
+from keras.src.utils.numerical_utils import to_categorical
+from keras.src.utils.progbar import Progbar
+from keras.src.utils.python_utils import default
+from keras.src.utils.python_utils import is_default
+from keras.src.utils.python_utils import removeprefix
+from keras.src.utils.python_utils import removesuffix
+from keras.src.utils.rng_utils import set_random_seed
+from keras.src.utils.sequence_utils import pad_sequences
+from keras.src.utils.text_dataset_utils import text_dataset_from_directory
+from keras.src.utils.timeseries_dataset_utils import (
+    timeseries_dataset_from_array,
+)
diff --git a/keras/utils/argument_validation.py b/keras/src/utils/argument_validation.py
similarity index 100%
rename from keras/utils/argument_validation.py
rename to keras/src/utils/argument_validation.py
diff --git a/keras/utils/audio_dataset_utils.py b/keras/src/utils/audio_dataset_utils.py
similarity index 98%
rename from keras/utils/audio_dataset_utils.py
rename to keras/src/utils/audio_dataset_utils.py
index 3927b3aa383d..ac1bab223b82 100644
--- a/keras/utils/audio_dataset_utils.py
+++ b/keras/src/utils/audio_dataset_utils.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils import dataset_utils
-from keras.utils.module_utils import tensorflow as tf
-from keras.utils.module_utils import tensorflow_io as tfio
+from keras.src.api_export import keras_export
+from keras.src.utils import dataset_utils
+from keras.src.utils.module_utils import tensorflow as tf
+from keras.src.utils.module_utils import tensorflow_io as tfio
 
 ALLOWED_FORMATS = (".wav",)
 
diff --git a/keras/utils/audio_dataset_utils_test.py b/keras/src/utils/audio_dataset_utils_test.py
similarity index 99%
rename from keras/utils/audio_dataset_utils_test.py
rename to keras/src/utils/audio_dataset_utils_test.py
index 668465f53c44..f382a24c14b7 100644
--- a/keras/utils/audio_dataset_utils_test.py
+++ b/keras/src/utils/audio_dataset_utils_test.py
@@ -2,9 +2,9 @@
 
 import numpy as np
 
-from keras import testing
-from keras.utils import audio_dataset_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import testing
+from keras.src.utils import audio_dataset_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 class AudioDatasetFromDirectoryTest(testing.TestCase):
diff --git a/keras/utils/backend_utils.py b/keras/src/utils/backend_utils.py
similarity index 86%
rename from keras/utils/backend_utils.py
rename to keras/src/utils/backend_utils.py
index 9d358354f3a7..9a82fd464eb2 100644
--- a/keras/utils/backend_utils.py
+++ b/keras/src/utils/backend_utils.py
@@ -3,9 +3,9 @@
 import os
 import sys
 
-from keras import backend as backend_module
-from keras.api_export import keras_export
-from keras.backend.common import global_state
+from keras.src import backend as backend_module
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
 
 
 def in_tf_graph():
@@ -13,7 +13,7 @@ def in_tf_graph():
         return True
 
     if "tensorflow" in sys.modules:
-        from keras.utils.module_utils import tensorflow as tf
+        from keras.src.utils.module_utils import tensorflow as tf
 
         return not tf.executing_eagerly()
     return False
@@ -67,23 +67,23 @@ def reset(self):
 
     def __getattr__(self, name):
         if self._backend == "tensorflow":
-            from keras.backend import tensorflow as tf_backend
+            from keras.src.backend import tensorflow as tf_backend
 
             return getattr(tf_backend, name)
         if self._backend == "jax":
-            from keras.backend import jax as jax_backend
+            from keras.src.backend import jax as jax_backend
 
             return getattr(jax_backend, name)
         if self._backend == "torch":
-            from keras.backend import torch as torch_backend
+            from keras.src.backend import torch as torch_backend
 
             return getattr(torch_backend, name)
         if self._backend == "numpy":
             # TODO (ariG23498):
-            # The import `from keras.backend import numpy as numpy_backend`
+            # The import `from keras.src.backend import numpy as numpy_backend`
             # is not working. This is a temporary fix.
             # The import is redirected to `keras.backend.numpy.numpy.py`
-            from keras import backend as numpy_backend
+            from keras.src import backend as numpy_backend
 
             return getattr(numpy_backend, name)
 
diff --git a/keras/utils/code_stats.py b/keras/src/utils/code_stats.py
similarity index 100%
rename from keras/utils/code_stats.py
rename to keras/src/utils/code_stats.py
diff --git a/keras/utils/code_stats_test.py b/keras/src/utils/code_stats_test.py
similarity index 98%
rename from keras/utils/code_stats_test.py
rename to keras/src/utils/code_stats_test.py
index bc1ccec8fc56..c1639ca9f907 100644
--- a/keras/utils/code_stats_test.py
+++ b/keras/src/utils/code_stats_test.py
@@ -2,8 +2,8 @@
 import sys
 from io import StringIO
 
-from keras.testing import test_case
-from keras.utils.code_stats import count_loc
+from keras.src.testing import test_case
+from keras.src.utils.code_stats import count_loc
 
 
 class TestCountLoc(test_case.TestCase):
diff --git a/keras/utils/dataset_utils.py b/keras/src/utils/dataset_utils.py
similarity index 99%
rename from keras/utils/dataset_utils.py
rename to keras/src/utils/dataset_utils.py
index 22dda610ff8d..ff27552278f4 100644
--- a/keras/utils/dataset_utils.py
+++ b/keras/src/utils/dataset_utils.py
@@ -6,9 +6,9 @@
 
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils import io_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src.api_export import keras_export
+from keras.src.utils import io_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.utils.split_dataset")
@@ -248,7 +248,9 @@ def _get_next_sample(
     Yields:
         data_sample: The next sample.
     """
-    from keras.trainers.data_adapters.data_adapter_utils import is_torch_tensor
+    from keras.src.trainers.data_adapters.data_adapter_utils import (
+        is_torch_tensor,
+    )
 
     try:
         dataset_iterator = iter(dataset_iterator)
diff --git a/keras/utils/dataset_utils_test.py b/keras/src/utils/dataset_utils_test.py
similarity index 98%
rename from keras/utils/dataset_utils_test.py
rename to keras/src/utils/dataset_utils_test.py
index 9d044b1920b6..11cb275ff815 100644
--- a/keras/utils/dataset_utils_test.py
+++ b/keras/src/utils/dataset_utils_test.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from keras.testing import test_case
-from keras.utils.dataset_utils import split_dataset
-from keras.utils.module_utils import tensorflow as tf
+from keras.src.testing import test_case
+from keras.src.utils.dataset_utils import split_dataset
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 class DatasetUtilsTest(test_case.TestCase):
diff --git a/keras/utils/dtype_utils.py b/keras/src/utils/dtype_utils.py
similarity index 96%
rename from keras/utils/dtype_utils.py
rename to keras/src/utils/dtype_utils.py
index cf6f54891b53..44ac7d4f65a3 100644
--- a/keras/utils/dtype_utils.py
+++ b/keras/src/utils/dtype_utils.py
@@ -1,5 +1,5 @@
-from keras import backend
-from keras import ops
+from keras.src import backend
+from keras.src import ops
 
 DTYPE_TO_SIZE = {
     **{f"float{i}": i for i in (16, 32, 64)},
diff --git a/keras/utils/dtype_utils_test.py b/keras/src/utils/dtype_utils_test.py
similarity index 97%
rename from keras/utils/dtype_utils_test.py
rename to keras/src/utils/dtype_utils_test.py
index 29f2ef984203..390db6fd72d7 100644
--- a/keras/utils/dtype_utils_test.py
+++ b/keras/src/utils/dtype_utils_test.py
@@ -1,6 +1,6 @@
-from keras.backend.common.keras_tensor import KerasTensor
-from keras.testing import test_case
-from keras.utils import dtype_utils
+from keras.src.backend.common.keras_tensor import KerasTensor
+from keras.src.testing import test_case
+from keras.src.utils import dtype_utils
 
 
 class DtypeSizeTests(test_case.TestCase):
diff --git a/keras/utils/file_utils.py b/keras/src/utils/file_utils.py
similarity index 98%
rename from keras/utils/file_utils.py
rename to keras/src/utils/file_utils.py
index 36623d088361..e625a9f131ce 100644
--- a/keras/utils/file_utils.py
+++ b/keras/src/utils/file_utils.py
@@ -9,11 +9,11 @@
 import zipfile
 from urllib.request import urlretrieve
 
-from keras.api_export import keras_export
-from keras.backend import config
-from keras.utils import io_utils
-from keras.utils.module_utils import gfile
-from keras.utils.progbar import Progbar
+from keras.src.api_export import keras_export
+from keras.src.backend import config
+from keras.src.utils import io_utils
+from keras.src.utils.module_utils import gfile
+from keras.src.utils.progbar import Progbar
 
 
 def path_to_string(path):
diff --git a/keras/utils/file_utils_test.py b/keras/src/utils/file_utils_test.py
similarity index 99%
rename from keras/utils/file_utils_test.py
rename to keras/src/utils/file_utils_test.py
index 852adbca3dd3..c09f47acd1aa 100644
--- a/keras/utils/file_utils_test.py
+++ b/keras/src/utils/file_utils_test.py
@@ -8,8 +8,8 @@
 import zipfile
 from unittest.mock import patch
 
-from keras.testing import test_case
-from keras.utils import file_utils
+from keras.src.testing import test_case
+from keras.src.utils import file_utils
 
 
 class PathToStringTest(test_case.TestCase):
diff --git a/keras/utils/image_dataset_utils.py b/keras/src/utils/image_dataset_utils.py
similarity index 98%
rename from keras/utils/image_dataset_utils.py
rename to keras/src/utils/image_dataset_utils.py
index 9f340301023c..30317c96780b 100755
--- a/keras/utils/image_dataset_utils.py
+++ b/keras/src/utils/image_dataset_utils.py
@@ -1,10 +1,10 @@
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.backend.config import standardize_data_format
-from keras.utils import dataset_utils
-from keras.utils import image_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src.api_export import keras_export
+from keras.src.backend.config import standardize_data_format
+from keras.src.utils import dataset_utils
+from keras.src.utils import image_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 ALLOWLIST_FORMATS = (".bmp", ".gif", ".jpeg", ".jpg", ".png")
 
@@ -415,7 +415,7 @@ def load_image(
         )
 
     if crop_to_aspect_ratio:
-        from keras.backend import tensorflow as tf_backend
+        from keras.src.backend import tensorflow as tf_backend
 
         if data_format == "channels_first":
             img = tf.transpose(img, (2, 0, 1))
diff --git a/keras/utils/image_dataset_utils_test.py b/keras/src/utils/image_dataset_utils_test.py
similarity index 98%
rename from keras/utils/image_dataset_utils_test.py
rename to keras/src/utils/image_dataset_utils_test.py
index f2b2981cabe8..e6d006ab7c0e 100644
--- a/keras/utils/image_dataset_utils_test.py
+++ b/keras/src/utils/image_dataset_utils_test.py
@@ -2,11 +2,11 @@
 
 import numpy as np
 
-from keras import backend
-from keras import testing
-from keras.utils import image_dataset_utils
-from keras.utils import image_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src import testing
+from keras.src.utils import image_dataset_utils
+from keras.src.utils import image_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 class ImageDatasetFromDirectoryTest(testing.TestCase):
diff --git a/keras/utils/image_utils.py b/keras/src/utils/image_utils.py
similarity index 99%
rename from keras/utils/image_utils.py
rename to keras/src/utils/image_utils.py
index 59722afbfe97..8f5e805c5f75 100644
--- a/keras/utils/image_utils.py
+++ b/keras/src/utils/image_utils.py
@@ -6,8 +6,8 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src.api_export import keras_export
 
 try:
     from PIL import Image as pil_image
diff --git a/keras/utils/io_utils.py b/keras/src/utils/io_utils.py
similarity index 97%
rename from keras/utils/io_utils.py
rename to keras/src/utils/io_utils.py
index b2308230117c..32322f405c33 100644
--- a/keras/utils/io_utils.py
+++ b/keras/src/utils/io_utils.py
@@ -2,8 +2,8 @@
 
 from absl import logging
 
-from keras.api_export import keras_export
-from keras.backend.common import global_state
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
 
 
 @keras_export(
diff --git a/keras/utils/io_utils_test.py b/keras/src/utils/io_utils_test.py
similarity index 96%
rename from keras/utils/io_utils_test.py
rename to keras/src/utils/io_utils_test.py
index 20eb2add559a..235314de3016 100644
--- a/keras/utils/io_utils_test.py
+++ b/keras/src/utils/io_utils_test.py
@@ -1,7 +1,7 @@
 from unittest.mock import patch
 
-from keras.testing import test_case
-from keras.utils import io_utils
+from keras.src.testing import test_case
+from keras.src.utils import io_utils
 
 
 class TestIoUtils(test_case.TestCase):
diff --git a/keras/utils/jax_layer.py b/keras/src/utils/jax_layer.py
similarity index 98%
rename from keras/utils/jax_layer.py
rename to keras/src/utils/jax_layer.py
index 83786b0b74f6..9c97f0ac28d4 100644
--- a/keras/utils/jax_layer.py
+++ b/keras/src/utils/jax_layer.py
@@ -2,14 +2,14 @@
 
 import numpy as np
 
-from keras import backend
-from keras import tree
-from keras.api_export import keras_export
-from keras.layers.layer import Layer
-from keras.saving import serialization_lib
-from keras.utils import jax_utils
-from keras.utils import tracking
-from keras.utils.module_utils import jax
+from keras.src import backend
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.layers.layer import Layer
+from keras.src.saving import serialization_lib
+from keras.src.utils import jax_utils
+from keras.src.utils import tracking
+from keras.src.utils.module_utils import jax
 
 
 @keras_export("keras.layers.JaxLayer")
diff --git a/keras/utils/jax_layer_test.py b/keras/src/utils/jax_layer_test.py
similarity index 98%
rename from keras/utils/jax_layer_test.py
rename to keras/src/utils/jax_layer_test.py
index ba7104946b04..e3b088c78849 100644
--- a/keras/utils/jax_layer_test.py
+++ b/keras/src/utils/jax_layer_test.py
@@ -7,18 +7,18 @@
 import tensorflow as tf
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import metrics
-from keras import models
-from keras import saving
-from keras import testing
-from keras import tree
-from keras import utils
-from keras.export import export_lib
-from keras.saving import object_registration
-from keras.utils.jax_layer import FlaxLayer
-from keras.utils.jax_layer import JaxLayer
+from keras.src import backend
+from keras.src import layers
+from keras.src import metrics
+from keras.src import models
+from keras.src import saving
+from keras.src import testing
+from keras.src import tree
+from keras.src import utils
+from keras.src.export import export_lib
+from keras.src.saving import object_registration
+from keras.src.utils.jax_layer import FlaxLayer
+from keras.src.utils.jax_layer import JaxLayer
 
 try:
     import flax
diff --git a/keras/utils/jax_utils.py b/keras/src/utils/jax_utils.py
similarity index 88%
rename from keras/utils/jax_utils.py
rename to keras/src/utils/jax_utils.py
index 35e26697914c..2ac944eb967d 100644
--- a/keras/utils/jax_utils.py
+++ b/keras/src/utils/jax_utils.py
@@ -1,4 +1,4 @@
-from keras import backend
+from keras.src import backend
 
 
 def is_in_jax_tracing_scope(x=None):
diff --git a/keras/utils/model_visualization.py b/keras/src/utils/model_visualization.py
similarity index 98%
rename from keras/utils/model_visualization.py
rename to keras/src/utils/model_visualization.py
index 332eb6d97cc6..ee0a47bfaa39 100644
--- a/keras/utils/model_visualization.py
+++ b/keras/src/utils/model_visualization.py
@@ -3,9 +3,9 @@
 import os
 import sys
 
-from keras import tree
-from keras.api_export import keras_export
-from keras.utils import io_utils
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.utils import io_utils
 
 try:
     # pydot-ng is a fork of pydot that is better maintained.
@@ -202,7 +202,7 @@ def model_to_dot(
         a `pydot.Cluster` instance representing nested model if
         `subgraph=True`.
     """
-    from keras.ops.function import make_node_key
+    from keras.src.ops.function import make_node_key
 
     if not model.built:
         raise ValueError(
@@ -211,10 +211,10 @@ def model_to_dot(
             "the model on a batch of data."
         )
 
-    from keras.models import functional
-    from keras.models import sequential
+    from keras.src.models import functional
+    from keras.src.models import sequential
 
-    # from keras.layers import Wrapper
+    # from keras.src.layers import Wrapper
 
     if not check_pydot():
         raise ImportError(
diff --git a/keras/utils/module_utils.py b/keras/src/utils/module_utils.py
similarity index 100%
rename from keras/utils/module_utils.py
rename to keras/src/utils/module_utils.py
diff --git a/keras/utils/naming.py b/keras/src/utils/naming.py
similarity index 94%
rename from keras/utils/naming.py
rename to keras/src/utils/naming.py
index b16f429fcd06..28107f0f30f4 100644
--- a/keras/utils/naming.py
+++ b/keras/src/utils/naming.py
@@ -1,8 +1,8 @@
 import collections
 import re
 
-from keras.api_export import keras_export
-from keras.backend.common import global_state
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
 
 
 def auto_name(prefix):
diff --git a/keras/utils/naming_test.py b/keras/src/utils/naming_test.py
similarity index 98%
rename from keras/utils/naming_test.py
rename to keras/src/utils/naming_test.py
index 6be61fdbefe3..00e3f6bdda30 100644
--- a/keras/utils/naming_test.py
+++ b/keras/src/utils/naming_test.py
@@ -1,5 +1,5 @@
-from keras.testing import test_case
-from keras.utils import naming
+from keras.src.testing import test_case
+from keras.src.utils import naming
 
 
 class NamingUtilsTest(test_case.TestCase):
diff --git a/keras/utils/numerical_utils.py b/keras/src/utils/numerical_utils.py
similarity index 97%
rename from keras/utils/numerical_utils.py
rename to keras/src/utils/numerical_utils.py
index db922c4f07ef..05fb82abc522 100644
--- a/keras/utils/numerical_utils.py
+++ b/keras/src/utils/numerical_utils.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
+from keras.src import backend
+from keras.src.api_export import keras_export
 
 
 @keras_export("keras.utils.normalize")
@@ -19,7 +19,7 @@ def normalize(x, axis=-1, order=2):
     Returns:
         A normalized copy of the array.
     """
-    from keras import ops
+    from keras.src import ops
 
     if isinstance(x, np.ndarray):
         # NumPy input
diff --git a/keras/utils/numerical_utils_test.py b/keras/src/utils/numerical_utils_test.py
similarity index 96%
rename from keras/utils/numerical_utils_test.py
rename to keras/src/utils/numerical_utils_test.py
index d4cc7de575ad..2cb8c4c5e782 100644
--- a/keras/utils/numerical_utils_test.py
+++ b/keras/src/utils/numerical_utils_test.py
@@ -1,9 +1,9 @@
 import numpy as np
 from absl.testing import parameterized
 
-from keras import backend
-from keras import testing
-from keras.utils import numerical_utils
+from keras.src import backend
+from keras.src import testing
+from keras.src.utils import numerical_utils
 
 NUM_CLASSES = 5
 
diff --git a/keras/utils/progbar.py b/keras/src/utils/progbar.py
similarity index 98%
rename from keras/utils/progbar.py
rename to keras/src/utils/progbar.py
index 1f60b1818e3d..e2b61a041b02 100644
--- a/keras/utils/progbar.py
+++ b/keras/src/utils/progbar.py
@@ -3,9 +3,9 @@
 import sys
 import time
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.utils import io_utils
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.utils import io_utils
 
 
 @keras_export("keras.utils.Progbar")
diff --git a/keras/utils/python_utils.py b/keras/src/utils/python_utils.py
similarity index 100%
rename from keras/utils/python_utils.py
rename to keras/src/utils/python_utils.py
diff --git a/keras/utils/python_utils_test.py b/keras/src/utils/python_utils_test.py
similarity index 97%
rename from keras/utils/python_utils_test.py
rename to keras/src/utils/python_utils_test.py
index 33d7e72e3d1a..2ca2a72d341c 100644
--- a/keras/utils/python_utils_test.py
+++ b/keras/src/utils/python_utils_test.py
@@ -1,8 +1,8 @@
 import base64
 import marshal
 
-from keras import testing
-from keras.utils import python_utils
+from keras.src import testing
+from keras.src.utils import python_utils
 
 
 class PythonUtilsTest(testing.TestCase):
diff --git a/keras/utils/rng_utils.py b/keras/src/utils/rng_utils.py
similarity index 92%
rename from keras/utils/rng_utils.py
rename to keras/src/utils/rng_utils.py
index be438d587bcd..15804d0e43e6 100644
--- a/keras/utils/rng_utils.py
+++ b/keras/src/utils/rng_utils.py
@@ -2,9 +2,9 @@
 
 import numpy as np
 
-from keras import backend
-from keras.api_export import keras_export
-from keras.utils.module_utils import tensorflow as tf
+from keras.src import backend
+from keras.src.api_export import keras_export
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export("keras.utils.set_random_seed")
diff --git a/keras/utils/rng_utils_test.py b/keras/src/utils/rng_utils_test.py
similarity index 89%
rename from keras/utils/rng_utils_test.py
rename to keras/src/utils/rng_utils_test.py
index f6ec741c496c..aef96ddacc43 100644
--- a/keras/utils/rng_utils_test.py
+++ b/keras/src/utils/rng_utils_test.py
@@ -3,9 +3,9 @@
 import tensorflow as tf
 
 import keras
-from keras import backend
-from keras.testing import test_case
-from keras.utils import rng_utils
+from keras.src import backend
+from keras.src.testing import test_case
+from keras.src.utils import rng_utils
 
 
 class TestRandomSeedSetting(test_case.TestCase):
diff --git a/keras/utils/sequence_utils.py b/keras/src/utils/sequence_utils.py
similarity index 99%
rename from keras/utils/sequence_utils.py
rename to keras/src/utils/sequence_utils.py
index 5ba2903fe1ac..8d0c67a08e08 100644
--- a/keras/utils/sequence_utils.py
+++ b/keras/src/utils/sequence_utils.py
@@ -1,6 +1,6 @@
 import numpy as np
 
-from keras.api_export import keras_export
+from keras.src.api_export import keras_export
 
 
 @keras_export(
diff --git a/keras/utils/sequence_utils_test.py b/keras/src/utils/sequence_utils_test.py
similarity index 98%
rename from keras/utils/sequence_utils_test.py
rename to keras/src/utils/sequence_utils_test.py
index 7051331fd9d0..0714bd469a92 100644
--- a/keras/utils/sequence_utils_test.py
+++ b/keras/src/utils/sequence_utils_test.py
@@ -1,5 +1,5 @@
-from keras import testing
-from keras.utils import sequence_utils
+from keras.src import testing
+from keras.src.utils import sequence_utils
 
 
 class PadSequencesTest(testing.TestCase):
diff --git a/keras/utils/summary_utils.py b/keras/src/utils/summary_utils.py
similarity index 98%
rename from keras/utils/summary_utils.py
rename to keras/src/utils/summary_utils.py
index 18e3ac539cb3..94c82af7ff84 100644
--- a/keras/utils/summary_utils.py
+++ b/keras/src/utils/summary_utils.py
@@ -10,10 +10,10 @@
 # for below imports
 import rich.table
 
-from keras import backend
-from keras import tree
-from keras.utils import dtype_utils
-from keras.utils import io_utils
+from keras.src import backend
+from keras.src import tree
+from keras.src.utils import dtype_utils
+from keras.src.utils import io_utils
 
 
 def count_params(weights):
@@ -131,8 +131,8 @@ def print_summary(
             matches `layer_range[1]`. By default (`None`) all
             layers in the model are included in the summary.
     """
-    from keras.models import Functional
-    from keras.models import Sequential
+    from keras.src.models import Functional
+    from keras.src.models import Sequential
 
     if not print_fn and not io_utils.is_interactive_logging_enabled():
         print_fn = io_utils.print_msg
diff --git a/keras/utils/summary_utils_test.py b/keras/src/utils/summary_utils_test.py
similarity index 92%
rename from keras/utils/summary_utils_test.py
rename to keras/src/utils/summary_utils_test.py
index 51f764a74a40..7b917da4f848 100644
--- a/keras/utils/summary_utils_test.py
+++ b/keras/src/utils/summary_utils_test.py
@@ -2,10 +2,10 @@
 import pytest
 from absl.testing import parameterized
 
-from keras import layers
-from keras import models
-from keras import testing
-from keras.utils import summary_utils
+from keras.src import layers
+from keras.src import models
+from keras.src import testing
+from keras.src.utils import summary_utils
 
 
 class SummaryUtilsTest(testing.TestCase, parameterized.TestCase):
diff --git a/keras/utils/text_dataset_utils.py b/keras/src/utils/text_dataset_utils.py
similarity index 98%
rename from keras/utils/text_dataset_utils.py
rename to keras/src/utils/text_dataset_utils.py
index 12d2aacd1dc0..d8e5ece971c5 100644
--- a/keras/utils/text_dataset_utils.py
+++ b/keras/src/utils/text_dataset_utils.py
@@ -1,8 +1,8 @@
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils import dataset_utils
-from keras.utils.module_utils import tensorflow as tf
+from keras.src.api_export import keras_export
+from keras.src.utils import dataset_utils
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export(
diff --git a/keras/utils/text_dataset_utils_test.py b/keras/src/utils/text_dataset_utils_test.py
similarity index 99%
rename from keras/utils/text_dataset_utils_test.py
rename to keras/src/utils/text_dataset_utils_test.py
index 023c8f6c7345..6e59b1bb67a3 100644
--- a/keras/utils/text_dataset_utils_test.py
+++ b/keras/src/utils/text_dataset_utils_test.py
@@ -2,8 +2,8 @@
 import random
 import string
 
-from keras import testing
-from keras.utils import text_dataset_utils
+from keras.src import testing
+from keras.src.utils import text_dataset_utils
 
 
 class TextDatasetFromDirectoryTest(testing.TestCase):
diff --git a/keras/utils/tf_utils.py b/keras/src/utils/tf_utils.py
similarity index 98%
rename from keras/utils/tf_utils.py
rename to keras/src/utils/tf_utils.py
index 5a622a3a0efe..ea8e45aaf7c7 100644
--- a/keras/utils/tf_utils.py
+++ b/keras/src/utils/tf_utils.py
@@ -1,4 +1,4 @@
-from keras.utils.module_utils import tensorflow as tf
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 def expand_dims(inputs, axis):
diff --git a/keras/utils/timeseries_dataset_utils.py b/keras/src/utils/timeseries_dataset_utils.py
similarity index 98%
rename from keras/utils/timeseries_dataset_utils.py
rename to keras/src/utils/timeseries_dataset_utils.py
index c0a60482fb32..bf0997b98bbe 100644
--- a/keras/utils/timeseries_dataset_utils.py
+++ b/keras/src/utils/timeseries_dataset_utils.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras.api_export import keras_export
-from keras.utils.module_utils import tensorflow as tf
+from keras.src.api_export import keras_export
+from keras.src.utils.module_utils import tensorflow as tf
 
 
 @keras_export(
diff --git a/keras/utils/timeseries_dataset_utils_test.py b/keras/src/utils/timeseries_dataset_utils_test.py
similarity index 98%
rename from keras/utils/timeseries_dataset_utils_test.py
rename to keras/src/utils/timeseries_dataset_utils_test.py
index a68ee36ae216..98c75a425e3c 100644
--- a/keras/utils/timeseries_dataset_utils_test.py
+++ b/keras/src/utils/timeseries_dataset_utils_test.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from keras import testing
-from keras.utils import timeseries_dataset_utils
+from keras.src import testing
+from keras.src.utils import timeseries_dataset_utils
 
 
 class TimeseriesDatasetTest(testing.TestCase):
diff --git a/keras/utils/torch_utils.py b/keras/src/utils/torch_utils.py
similarity index 93%
rename from keras/utils/torch_utils.py
rename to keras/src/utils/torch_utils.py
index 60d0f7642b65..11cc136f508f 100644
--- a/keras/utils/torch_utils.py
+++ b/keras/src/utils/torch_utils.py
@@ -2,10 +2,10 @@
 
 from packaging.version import parse
 
-from keras.api_export import keras_export
-from keras.layers import Layer
-from keras.ops import convert_to_numpy
-from keras.ops import convert_to_tensor
+from keras.src.api_export import keras_export
+from keras.src.layers import Layer
+from keras.src.ops import convert_to_numpy
+from keras.src.ops import convert_to_tensor
 
 
 @keras_export("keras.layers.TorchModuleWrapper")
@@ -33,7 +33,7 @@ class TorchModuleWrapper(Layer):
     import torch.nn.functional as F
 
     import keras
-    from keras.layers import TorchModuleWrapper
+    from keras.src.layers import TorchModuleWrapper
 
     class Classifier(keras.Model):
         def __init__(self, **kwargs):
@@ -79,7 +79,7 @@ def __init__(self, module, name=None, **kwargs):
         super().__init__(name=name, **kwargs)
         import torch.nn as nn
 
-        from keras.backend.torch.core import get_device
+        from keras.src.backend.torch.core import get_device
 
         if (
             isinstance(module, nn.modules.lazy.LazyModuleMixin)
@@ -98,7 +98,7 @@ def parameters(self, recurse=True):
         return self.module.parameters(recurse=recurse)
 
     def _track_module_parameters(self):
-        from keras.backend.torch import Variable
+        from keras.src.backend.torch import Variable
 
         for param in self.module.parameters():
             # The Variable will reuse the raw `param`
diff --git a/keras/utils/torch_utils_test.py b/keras/src/utils/torch_utils_test.py
similarity index 97%
rename from keras/utils/torch_utils_test.py
rename to keras/src/utils/torch_utils_test.py
index 9b8ff31d7fd8..7e972f5b1b56 100644
--- a/keras/utils/torch_utils_test.py
+++ b/keras/src/utils/torch_utils_test.py
@@ -5,12 +5,12 @@
 import torch
 from absl.testing import parameterized
 
-from keras import backend
-from keras import layers
-from keras import models
-from keras import saving
-from keras import testing
-from keras.utils.torch_utils import TorchModuleWrapper
+from keras.src import backend
+from keras.src import layers
+from keras.src import models
+from keras.src import saving
+from keras.src import testing
+from keras.src.utils.torch_utils import TorchModuleWrapper
 
 
 class Classifier(models.Model):
diff --git a/keras/utils/traceback_utils.py b/keras/src/utils/traceback_utils.py
similarity index 98%
rename from keras/utils/traceback_utils.py
rename to keras/src/utils/traceback_utils.py
index 2b0bddefad46..88c3e9ac0ba2 100644
--- a/keras/utils/traceback_utils.py
+++ b/keras/src/utils/traceback_utils.py
@@ -4,10 +4,10 @@
 import types
 from functools import wraps
 
-from keras import backend
-from keras import tree
-from keras.api_export import keras_export
-from keras.backend.common import global_state
+from keras.src import backend
+from keras.src import tree
+from keras.src.api_export import keras_export
+from keras.src.backend.common import global_state
 
 _EXCLUDED_PATHS = (
     os.path.abspath(os.path.join(__file__, "..", "..")),
diff --git a/keras/utils/tracking.py b/keras/src/utils/tracking.py
similarity index 96%
rename from keras/utils/tracking.py
rename to keras/src/utils/tracking.py
index 4a3a76c15d6c..02678de336a0 100644
--- a/keras/utils/tracking.py
+++ b/keras/src/utils/tracking.py
@@ -1,9 +1,9 @@
 from functools import wraps
 
-from keras import tree
-from keras.backend.common.global_state import get_global_attribute
-from keras.backend.common.global_state import set_global_attribute
-from keras.utils import python_utils
+from keras.src import tree
+from keras.src.backend.common.global_state import get_global_attribute
+from keras.src.backend.common.global_state import set_global_attribute
+from keras.src.utils import python_utils
 
 
 class DotNotTrackScope:
@@ -234,7 +234,7 @@ def clear(self):
         super().clear()
 
     def tree_flatten(self):
-        from keras.utils.module_utils import optree
+        from keras.src.utils.module_utils import optree
 
         # For optree
         keys, values = optree.utils.unzip2(
@@ -244,7 +244,7 @@ def tree_flatten(self):
 
     @classmethod
     def tree_unflatten(cls, keys, values):
-        from keras.utils.module_utils import optree
+        from keras.src.utils.module_utils import optree
 
         # For optree
         return cls(optree.utils.safe_zip(keys, values))
diff --git a/keras/utils/tracking_test.py b/keras/src/utils/tracking_test.py
similarity index 96%
rename from keras/utils/tracking_test.py
rename to keras/src/utils/tracking_test.py
index e05379a8971c..dd5e9fc90037 100644
--- a/keras/utils/tracking_test.py
+++ b/keras/src/utils/tracking_test.py
@@ -1,8 +1,8 @@
 import collections
 
-from keras import backend
-from keras import testing
-from keras.utils import tracking
+from keras.src import backend
+from keras.src import testing
+from keras.src.utils import tracking
 
 
 class TrackingTest(testing.TestCase):
diff --git a/keras/version.py b/keras/src/version.py
similarity index 75%
rename from keras/version.py
rename to keras/src/version.py
index 6d3cb0e144eb..3e7f01c4e942 100644
--- a/keras/version.py
+++ b/keras/src/version.py
@@ -1,4 +1,4 @@
-from keras.api_export import keras_export
+from keras.src.api_export import keras_export
 
 # Unique source of truth for the version number.
 __version__ = "3.2.1"
diff --git a/keras/testing/__init__.py b/keras/testing/__init__.py
deleted file mode 100644
index 34dab7c0c52d..000000000000
--- a/keras/testing/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from keras.testing.test_case import TestCase
-from keras.testing.test_case import jax_uses_gpu
-from keras.testing.test_case import tensorflow_uses_gpu
-from keras.testing.test_case import torch_uses_gpu
-from keras.testing.test_case import uses_gpu
diff --git a/keras/tree/__init__.py b/keras/tree/__init__.py
deleted file mode 100644
index fc6a783879de..000000000000
--- a/keras/tree/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from keras.tree.tree_api import assert_same_structure
-from keras.tree.tree_api import flatten
-from keras.tree.tree_api import is_nested
-from keras.tree.tree_api import lists_to_tuples
-from keras.tree.tree_api import map_shape_structure
-from keras.tree.tree_api import map_structure
-from keras.tree.tree_api import map_structure_up_to
-from keras.tree.tree_api import pack_sequence_as
-from keras.tree.tree_api import register_tree_node_class
-from keras.tree.tree_api import traverse
diff --git a/keras/utils/__init__.py b/keras/utils/__init__.py
deleted file mode 100644
index d02fc32c066d..000000000000
--- a/keras/utils/__init__.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from keras.utils.audio_dataset_utils import audio_dataset_from_directory
-from keras.utils.dataset_utils import split_dataset
-from keras.utils.file_utils import get_file
-from keras.utils.image_dataset_utils import image_dataset_from_directory
-from keras.utils.image_utils import array_to_img
-from keras.utils.image_utils import img_to_array
-from keras.utils.image_utils import load_img
-from keras.utils.image_utils import save_img
-from keras.utils.io_utils import disable_interactive_logging
-from keras.utils.io_utils import enable_interactive_logging
-from keras.utils.io_utils import is_interactive_logging_enabled
-from keras.utils.model_visualization import model_to_dot
-from keras.utils.model_visualization import plot_model
-from keras.utils.numerical_utils import normalize
-from keras.utils.numerical_utils import to_categorical
-from keras.utils.progbar import Progbar
-from keras.utils.python_utils import default
-from keras.utils.python_utils import is_default
-from keras.utils.python_utils import removeprefix
-from keras.utils.python_utils import removesuffix
-from keras.utils.rng_utils import set_random_seed
-from keras.utils.sequence_utils import pad_sequences
-from keras.utils.text_dataset_utils import text_dataset_from_directory
-from keras.utils.timeseries_dataset_utils import timeseries_dataset_from_array
diff --git a/pip_build.py b/pip_build.py
index 2e3cb7f13e99..887c7119e269 100644
--- a/pip_build.py
+++ b/pip_build.py
@@ -20,10 +20,9 @@
 import glob
 import os
 import pathlib
+import re
 import shutil
 
-import namex
-
 # Needed because importing torch after TF causes the runtime to crash
 import torch  # noqa: F401
 
@@ -33,112 +32,6 @@
 to_copy = ["setup.py", "README.md"]
 
 
-def ignore_files(_, filenames):
-    return [f for f in filenames if f.endswith("_test.py")]
-
-
-def copy_source_to_build_directory(root_path):
-    # Copy sources (`keras/` directory and setup files) to build
-    # directory
-    os.chdir(root_path)
-    os.mkdir(build_directory)
-    shutil.copytree(
-        package, os.path.join(build_directory, package), ignore=ignore_files
-    )
-    for fname in to_copy:
-        shutil.copy(fname, os.path.join(f"{build_directory}", fname))
-    os.chdir(build_directory)
-
-
-def run_namex_conversion():
-    # Restructure the codebase so that source files live in `keras/src`
-    namex.convert_codebase(package, code_directory="src")
-
-    # Generate API __init__.py files in `keras/`
-    namex.generate_api_files(package, code_directory="src", verbose=True)
-
-
-def create_legacy_directory():
-    # Make keras/_tf_keras/ by copying keras/
-    tf_keras_dirpath_parent = os.path.join(package, "_tf_keras")
-    tf_keras_dirpath = os.path.join(tf_keras_dirpath_parent, "keras")
-    os.makedirs(tf_keras_dirpath)
-    with open(os.path.join(tf_keras_dirpath_parent, "__init__.py"), "w") as f:
-        f.write("from keras._tf_keras import keras\n")
-    with open(os.path.join(package, "__init__.py")) as f:
-        init_file = f.read()
-        init_file = init_file.replace(
-            "from keras import _legacy",
-            "from keras import _tf_keras",
-        )
-    with open(os.path.join(package, "__init__.py"), "w") as f:
-        f.write(init_file)
-    with open(os.path.join(tf_keras_dirpath, "__init__.py"), "w") as f:
-        f.write(init_file)
-    for dirname in os.listdir(package):
-        dirpath = os.path.join(package, dirname)
-        if os.path.isdir(dirpath) and dirname not in (
-            "_legacy",
-            "_tf_keras",
-            "src",
-        ):
-            shutil.copytree(
-                dirpath,
-                os.path.join(tf_keras_dirpath, dirname),
-                ignore=ignore_files,
-            )
-
-    # Copy keras/_legacy/ file contents to keras/_tf_keras/keras
-    legacy_submodules = [
-        path[:-3]
-        for path in os.listdir(os.path.join(package, "src", "legacy"))
-        if path.endswith(".py")
-    ]
-    legacy_submodules += [
-        path
-        for path in os.listdir(os.path.join(package, "src", "legacy"))
-        if os.path.isdir(os.path.join(package, "src", "legacy", path))
-    ]
-
-    for root, _, fnames in os.walk(os.path.join(package, "_legacy")):
-        for fname in fnames:
-            if fname.endswith(".py"):
-                legacy_fpath = os.path.join(root, fname)
-                tf_keras_root = root.replace("/_legacy", "/_tf_keras/keras")
-                core_api_fpath = os.path.join(
-                    root.replace("/_legacy", ""), fname
-                )
-                if not os.path.exists(tf_keras_root):
-                    os.makedirs(tf_keras_root)
-                tf_keras_fpath = os.path.join(tf_keras_root, fname)
-                with open(legacy_fpath) as f:
-                    legacy_contents = f.read()
-                    legacy_contents = legacy_contents.replace(
-                        "keras._legacy", "keras._tf_keras.keras"
-                    )
-                if os.path.exists(core_api_fpath):
-                    with open(core_api_fpath) as f:
-                        core_api_contents = f.read()
-                    core_api_contents = core_api_contents.replace(
-                        "from keras import _tf_keras\n", ""
-                    )
-                    for legacy_submodule in legacy_submodules:
-                        core_api_contents = core_api_contents.replace(
-                            f"from keras import {legacy_submodule}\n",
-                            "",
-                        )
-                        core_api_contents = core_api_contents.replace(
-                            f"keras.{legacy_submodule}",
-                            f"keras._tf_keras.keras.{legacy_submodule}",
-                        )
-                    legacy_contents = core_api_contents + "\n" + legacy_contents
-                with open(tf_keras_fpath, "w") as f:
-                    f.write(legacy_contents)
-
-    # Delete keras/_legacy/
-    shutil.rmtree(os.path.join(package, "_legacy"))
-
-
 def export_version_string(version, is_nightly=False, rc_index=None):
     """Export Version and Package Name."""
     if is_nightly:
@@ -156,10 +49,15 @@ def export_version_string(version, is_nightly=False, rc_index=None):
         version += "rc" + str(rc_index)
 
     # Make sure to export the __version__ string
-    with open(os.path.join(package, "__init__.py")) as f:
+    with open(os.path.join(package, "src", "version.py")) as f:
         init_contents = f.read()
-    with open(os.path.join(package, "__init__.py"), "w") as f:
-        f.write(init_contents + "\n\n" + f'__version__ = "{version}"\n')
+    with open(os.path.join(package, "src", "version.py"), "w") as f:
+        init_contents = re.sub(
+            "\n__version__ = .*\n",
+            f'\n__version__ = "{version}"\n',
+            init_contents,
+        )
+        f.write(init_contents)
 
 
 def build_and_save_output(root_path, __version__):
@@ -188,20 +86,10 @@ def build_and_save_output(root_path, __version__):
 
 
 def build(root_path, is_nightly=False, rc_index=None):
-    if os.path.exists(build_directory):
-        raise ValueError(f"Directory already exists: {build_directory}")
-
-    try:
-        copy_source_to_build_directory(root_path)
-        run_namex_conversion()
-        create_legacy_directory()
-        from keras.src.version import __version__  # noqa: E402
-
-        export_version_string(__version__, is_nightly, rc_index)
-        return build_and_save_output(root_path, __version__)
-    finally:
-        # Clean up: remove the build directory (no longer needed)
-        shutil.rmtree(build_directory)
+    from keras.src.version import __version__  # noqa: E402
+
+    export_version_string(__version__, is_nightly, rc_index)
+    return build_and_save_output(root_path, __version__)
 
 
 def install_whl(whl_fpath):
diff --git a/setup.py b/setup.py
index 1a3fbf43e8b7..a78f07dda269 100644
--- a/setup.py
+++ b/setup.py
@@ -23,10 +23,7 @@ def get_version(rel_path):
 
 HERE = pathlib.Path(__file__).parent
 README = (HERE / "README.md").read_text()
-if os.path.exists("keras/version.py"):
-    VERSION = get_version("keras/version.py")
-else:
-    VERSION = get_version("keras/__init__.py")
+VERSION = get_version("keras/src/version.py")
 
 setup(
     name="keras",
diff --git a/shell/api_gen.sh b/shell/api_gen.sh
new file mode 100755
index 000000000000..92cf6c7c2471
--- /dev/null
+++ b/shell/api_gen.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -Eeuo pipefail
+
+base_dir=$(dirname $(dirname $0))
+
+echo "Generating api directory with public APIs..."
+# Generate API Files
+python3 "${base_dir}"/api_gen.py
+
+echo "Formatting api directory..."
+# Format API Files
+bash "${base_dir}"/shell/format.sh > /dev/null 2>&1