{"id":15293041,"url":"https://github.com/franneck94/tensorcross","last_synced_at":"2025-04-13T12:20:46.805Z","repository":{"id":56049779,"uuid":"313390642","full_name":"franneck94/TensorCross","owner":"franneck94","description":"Cross Validation, Grid Search and Random Search for TensorFlow 2 Datasets","archived":false,"fork":false,"pushed_at":"2024-05-20T18:54:02.000Z","size":752,"stargazers_count":15,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-27T03:22:31.739Z","etag":null,"topics":["cross-validation","dataset","grid-search","gridsearch","gridsearchcv","python","random-search","tensorflow","tensorflow-datasets","tensorflow2","validation"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/franneck94.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-11-16T18:23:35.000Z","updated_at":"2024-05-25T15:17:06.000Z","dependencies_parsed_at":"2022-08-15T12:10:43.293Z","dependency_job_id":"17a513e2-430b-4cc5-a72f-b275facbc579","html_url":"https://github.com/franneck94/TensorCross","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franneck94%2FTensorCross","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franneck94%2FTensorCross/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franneck94%2FTensorCross/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franneck94%2FTensorCross/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/franneck94","download_url":"https://codeload.github.com/franneck94/TensorCross/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248711136,"owners_count":21149297,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cross-validation","dataset","grid-search","gridsearch","gridsearchcv","python","random-search","tensorflow","tensorflow-datasets","tensorflow2","validation"],"created_at":"2024-09-30T16:38:43.738Z","updated_at":"2025-04-13T12:20:46.770Z","avatar_url":"https://github.com/franneck94.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TensorCross\n\n![Python](https://img.shields.io/badge/python-%203.9+-blue)\n[![License](https://camo.githubusercontent.com/890acbdcb87868b382af9a4b1fac507b9659d9bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667)](https://github.com/franneck94/TensorCross/blob/main/LICENSE)\n[![Build](https://github.com/franneck94/TensorCross/workflows/Test/badge.svg)](https://github.com/franneck94/TensorCross/actions?query=workflow%3A%22Test+and+Coverage%22)\n[![codecov](https://codecov.io/gh/franneck94/TensorCross/branch/main/graph/badge.svg)](https://codecov.io/gh/franneck94/TensorCross)\n[![Documentation](https://img.shields.io/badge/ref-Documentation-blue)](https://franneck94.github.io/TensorCross/index.html)\n\n```bash\npip install tensorcross\n```\n\nGrid Search and Random Search with optionally CrossValidation for tf.data.Datasets in TensorFlow (Keras) 2.8+ and Python 3.9+.\n\n## Motivation\n\nThere was the tf.keras.wrapper.KerasClassifier/KerasRegressor class,\nwhich can be used to transform your tf.keras model into a sklearn estimator.  \nHowever, this approach is only applicable if your dataset is a numpy.ndarray\nfor your x and y data and it was also removed from newer versions.  \nIf you want to use the new tf.data.Dataset class, you cannot use the sklearn\nwrappers.  \nThis python package aims to help with this use-case.\n\n## API\n\n- [GridSearch](#GridSearch-Example)\n- [GridSearchCV](#GridSearchCV-Example)\n- For more examples see: [here](examples/)\n\n### Dataset and TensorFlow Model for the Examples\n\n```python\n    import tensorflow as tf\n\n    dataset = tf.data.Dataset.from_tensor_slices(\n        (np.array([1, 2, 3]).reshape(-1, 1),  # x\n         np.array([-1, -2, -3]).reshape(-1, 1))  # y\n    )\n\n    def build_model(\n        optimizer: tf.keras.optimizers.Optimizer,\n        learning_rate: float\n    ) -\u003e tf.keras.models.Model:\n        x_input = tf.keras.layers.Input(shape=2)\n        y_pred = tf.keras.layers.Dense(units=1)(x_input)\n        model = tf.keras.models.Model(inputs=[x_input], outputs=[y_pred])\n\n        opt = optimizer(learning_rate=learning_rate)\n\n        model.compile(\n            loss=\"mse\", optimizer=opt, metrics=[\"mse\"]\n        )\n\n        return model\n```\n\nThe dataset must be a tf.data.Dataset object and you have to define a\nfunction/callable that returns a compiled tf.keras.models.Model object.\nThis object will then be trained in e.g. the GridSearch.\n\n### GridSearch Example\n\nAssuming you have a tf.data.Dataset object and a build_model function,\ndefined as above. You can run a GridSearch as below:\n\n``` python\n    from tensorcross.model_selection import GridSearch\n\n    train_dataset, val_dataset = dataset_split(\n        dataset=dataset,\n        split_fraction=(1 / 3)\n    )\n\n    param_grid = {\n        \"optimizer\": [\n            tf.keras.optimizers.Adam,\n            tf.keras.optimizers.RMSprop\n        ],\n        \"learning_rate\": [0.001, 0.0001]\n    }\n\n    grid_search = GridSearch(\n        model_fn=build_model,\n        param_grid=param_grid,\n        verbose=1,\n    )\n\n    grid_search.fit(\n        train_dataset=train_dataset,\n        val_dataset=val_dataset,\n        epochs=1,\n        verbose=1\n    )\n\n    grid_search.summary()\n```\n\nThis would result in the following console output:\n\n```console\n    --------------------------------------------------\n    Best score: 1.1800532341003418 using params: {\n        'learning_rate': 0.001, 'optimizer': 'RMSprop'\n    }\n    --------------------------------------------------\n    Idx: 0 - Score: 0.2754371166229248 with param: {\n        'learning_rate': 0.001, 'optimizer': 'Adam'\n    }\n    Idx: 1 - Score: 1.1800532341003418 with param: {\n        'learning_rate': 0.001, 'optimizer': 'RMSprop'\n    }\n    Idx: 2 - Score: 0.055416107177734375 with param: {\n        learning_rate': 0.0001, 'optimizer': 'Adam'\n    }\n    Idx: 3 - Score: 0.12417340278625488 with param: {\n        'learning_rate': 0.0001, 'optimizer': 'RMSprop'\n    }\n    --------------------------------------------------\n```\n\n### GridSearchCV Example\n\nAssuming you have a tf.data.Dataset object and a build_model function,\ndefined as above. You can run a GridSearchCV as below:\n\n```python\n    from tensorcross.model_selection import GridSearchCV\n\n    param_grid = {\n        \"optimizer\": [\n            tf.keras.optimizers.Adam,\n            tf.keras.optimizers.RMSprop\n        ],\n        \"learning_rate\": [0.001, 0.0001]\n    }\n\n    grid_search_cv = GridSearchCV(\n        model_fn=build_model,\n        param_grid=param_grid,\n        n_folds=2,\n        verbose=1,\n    )\n\n    grid_search_cv.fit(\n        dataset=dataset,\n        epochs=1,\n        verbose=1\n    )\n\n    grid_search_cv.summary()\n```\n\nThis would result in the following console output:\n\n```console\n    --------------------------------------------------\n    Best score: 1.1800532341003418 using params: {\n        'learning_rate': 0.001, 'optimizer': 'RMSprop'\n    }\n    --------------------------------------------------\n    Idx: 0 - Score: 0.2754371166229248 with param: {\n        'learning_rate': 0.001, 'optimizer': 'Adam'\n    }\n    Idx: 1 - Score: 1.1800532341003418 with param: {\n        'learning_rate': 0.001, 'optimizer': 'RMSprop'\n    }\n    Idx: 2 - Score: 0.055416107177734375 with param: {\n        learning_rate': 0.0001, 'optimizer': 'Adam'\n    }\n    Idx: 3 - Score: 0.12417340278625488 with param: {\n        'learning_rate': 0.0001, 'optimizer': 'RMSprop'\n    }\n    --------------------------------------------------\n```\n\n### Callabcks\n\nAdding Callbacks like TensorBoard is easy.\nJust pass the callbacks list to the .fit mehtod like you would do with a normal keras Model.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranneck94%2Ftensorcross","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffranneck94%2Ftensorcross","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranneck94%2Ftensorcross/lists"}