GEMMA DEVELOPER AGENTSAVED EVIDENCE
← Dataset Exploration
ARCHIVED TRAINING / keras-team/keras

keras-team__keras-22330

This is a preserved training example. Membership in the current training wave has not been verified.
keras-team/keras · Task 89 of 169

Problem statement

Fails to deserialise model with TextVectorization layer
Keras fails to deserialise a model containing a `TextVectorization` layer in tf-idf mode (works in int mode). 

## Minimum example
```
def test_text_vectorization_tfidf_mode_serialization():
    """
    Minimal test showing TextVectorization serialization does not work in tf-idf mode
    """
    import tempfile
    import os
    import keras
    import tensorflow

    # Arrange
    texts = ["page 1", "page 2", "page 1 again", "page 2 again", "different text"]
    vectoriser = keras.layers.TextVectorization(
        max_tokens=100,
        output_mode='tf_idf',
    )
    vectoriser.adapt(texts)

    # Act
    test_input = ["page 1"]
    original_output = vectoriser(test_input).numpy()

    # Wrap in Sequential model to save
    model = keras.Sequential([
        keras.layers.Input(shape=(), dtype=tensorflow.string),
        vectoriser
    ])

    # Try to save and then load
    with tempfile.TemporaryDirectory() as temp_dir:
        model_path = os.path.join(temp_dir, "vectoriser_model.keras")
        model.save(model_path)

        loaded_model = keras.models.load_model(model_path)

    # Assert
    loaded_vectoriser = loaded_model.layers[0]
    loaded_output = loaded_vectoriser(test_input).numpy()
    tensorflow.debugging.assert_near(
        original_output,
        loaded_output,
        message="Outputs don't match after serialization"
    )
```

## Error
```
_______________________________ test_text_vectorization_tfidf_mode_serialization ________________________________

    def test_text_vectorization_tfidf_mode_serialization():
        """
        Minimal test showing TextVectorization serialization does not work in tf-idf mode
        """
        import tempfile
        import os
        import keras
        import tensorflow
    
        # Arrange
        texts = ["page 1", "page 2", "page 1 again", "page 2 again", "different text"]
        vectoriser = keras.layers.TextVectorization(
            max_tokens=100,
            output_mode='tf_idf',
        )
        vectoriser.adapt(texts)
    
        # Act
        test_input = ["page 1"]
        original_output = vectoriser(test_input).numpy()
    
        # Wrap in Sequential model to save
        model = keras.Sequential([
            keras.layers.Input(shape=(), dtype=tensorflow.string),
            vectoriser
        ])
    
        # Try to save and then load
        with tempfile.TemporaryDirectory() as temp_dir:
            model_path = os.path.join(temp_dir, "vectoriser_model.keras")
            model.save(model_path)
    
>           loaded_model = keras.models.load_model(model_path)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/unit/.../tensorflow/test_train.py:285: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
.venv/lib/python3.11/site-packages/keras/src/saving/saving_api.py:189: in load_model
    return saving_lib.load_model(
.venv/lib/python3.11/site-packages/keras/src/saving/saving_lib.py:365: in load_model
    return _load_model_from_fileobj(
.venv/lib/python3.11/site-packages/keras/src/saving/saving_lib.py:507: in _load_model_from_fileobj
    _raise_loading_failure(error_msgs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

error_msgs = {281470481567120: (<StringLookup name=string_lookup_1, built=False>, TypeError("object of type 'bool' has no len()")),...0682325008: (<TextVectorization name=text_vectorization, built=True>, TypeError("object of type 'bool' has no len()"))}
warn_only = False

    def _raise_loading_failure(error_msgs, warn_only=False):
        first_key = list(error_msgs.keys())[0]
        ex_saveable, ex_error = error_msgs[first_key]
        msg = (
            f"A total of {len(error_msgs)} objects could not "
            "be loaded. Example error message for "
            f"object {ex_saveable}:\n\n"
            f"{ex_error}\n\n"
            "List of objects that could not be loaded:\n"
            f"{[x[0] for x in error_msgs.values()]}"
        )
        if warn_only:
            warnings.warn(msg)
        else:
>           raise ValueError(msg)
E           ValueError: A total of 2 objects could not be loaded. Example error message for object <TextVectorization name=text_vectorization, built=True>:
E           
E           object of type 'bool' has no len()
E           
E           List of objects that could not be loaded:
E           [<TextVectorization name=text_vectorization, built=True>, <StringLookup name=string_lookup_1, built=False>]

.venv/lib/python3.11/site-packages/keras/src/saving/saving_lib.py:645: ValueError
```

## System details
python 3.11.14
keras 3.13.0
tensorflow 2.20.0

Training membership

opd_e4b_pure_v6a opd_e4b_pure_v6b

Task issues extracted from preserved verified_rft_messages training examples. This is not a verified current RL wave manifest.

Task and snapshot provenance

Snapshot captured 2026-11-12T17:06:59.476467+00:00 · Autoresearch-Arena/gemma-4-developer-agent

{
  "datasets": [
    "opd_e4b_pure_v6a",
    "opd_e4b_pure_v6b"
  ],
  "examples": 4,
  "instance_id": "keras-team__keras-22330",
  "problem_statement": "Fails to deserialise model with TextVectorization layer\nKeras fails to deserialise a model containing a `TextVectorization` layer in tf-idf mode (works in int mode). \n\n## Minimum example\n```\ndef test_text_vectorization_tfidf_mode_serialization():\n    \"\"\"\n    Minimal test showing TextVectorization serialization does not work in tf-idf mode\n    \"\"\"\n    import tempfile\n    import os\n    import keras\n    import tensorflow\n\n    # Arrange\n    texts = [\"page 1\", \"page 2\", \"page 1 again\", \"page 2 again\", \"different text\"]\n    vectoriser = keras.layers.TextVectorization(\n        max_tokens=100,\n        output_mode='tf_idf',\n    )\n    vectoriser.adapt(texts)\n\n    # Act\n    test_input = [\"page 1\"]\n    original_output = vectoriser(test_input).numpy()\n\n    # Wrap in Sequential model to save\n    model = keras.Sequential([\n        keras.layers.Input(shape=(), dtype=tensorflow.string),\n        vectoriser\n    ])\n\n    # Try to save and then load\n    with tempfile.TemporaryDirectory() as temp_dir:\n        model_path = os.path.join(temp_dir, \"vectoriser_model.keras\")\n        model.save(model_path)\n\n        loaded_model = keras.models.load_model(model_path)\n\n    # Assert\n    loaded_vectoriser = loaded_model.layers[0]\n    loaded_output = loaded_vectoriser(test_input).numpy()\n    tensorflow.debugging.assert_near(\n        original_output,\n        loaded_output,\n        message=\"Outputs don't match after serialization\"\n    )\n```\n\n## Error\n```\n_______________________________ test_text_vectorization_tfidf_mode_serialization ________________________________\n\n    def test_text_vectorization_tfidf_mode_serialization():\n        \"\"\"\n        Minimal test showing TextVectorization serialization does not work in tf-idf mode\n        \"\"\"\n        import tempfile\n        import os\n        import keras\n        import tensorflow\n    \n        # Arrange\n        texts = [\"page 1\", \"page 2\", \"page 1 again\", \"page 2 again\", \"different text\"]\n        vectoriser = keras.layers.TextVectorization(\n            max_tokens=100,\n            output_mode='tf_idf',\n        )\n        vectoriser.adapt(texts)\n    \n        # Act\n        test_input = [\"page 1\"]\n        original_output = vectoriser(test_input).numpy()\n    \n        # Wrap in Sequential model to save\n        model = keras.Sequential([\n            keras.layers.Input(shape=(), dtype=tensorflow.string),\n            vectoriser\n        ])\n    \n        # Try to save and then load\n        with tempfile.TemporaryDirectory() as temp_dir:\n            model_path = os.path.join(temp_dir, \"vectoriser_model.keras\")\n            model.save(model_path)\n    \n>           loaded_model = keras.models.load_model(model_path)\n                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\ntests/unit/.../tensorflow/test_train.py:285: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n.venv/lib/python3.11/site-packages/keras/src/saving/saving_api.py:189: in load_model\n    return saving_lib.load_model(\n.venv/lib/python3.11/site-packages/keras/src/saving/saving_lib.py:365: in load_model\n    return _load_model_from_fileobj(\n.venv/lib/python3.11/site-packages/keras/src/saving/saving_lib.py:507: in _load_model_from_fileobj\n    _raise_loading_failure(error_msgs)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nerror_msgs = {281470481567120: (<StringLookup name=string_lookup_1, built=False>, TypeError(\"object of type 'bool' has no len()\")),...0682325008: (<TextVectorization name=text_vectorization, built=True>, TypeError(\"object of type 'bool' has no len()\"))}\nwarn_only = False\n\n    def _raise_loading_failure(error_msgs, warn_only=False):\n        first_key = list(error_msgs.keys())[0]\n        ex_saveable, ex_error = error_msgs[first_key]\n        msg = (\n            f\"A total of {len(error_msgs)} objects could not \"\n            \"be loaded. Example error message for \"\n            f\"object {ex_saveable}:\\n\\n\"\n            f\"{ex_error}\\n\\n\"\n            \"List of objects that could not be loaded:\\n\"\n            f\"{[x[0] for x in error_msgs.values()]}\"\n        )\n        if warn_only:\n            warnings.warn(msg)\n        else:\n>           raise ValueError(msg)\nE           ValueError: A total of 2 objects could not be loaded. Example error message for object <TextVectorization name=text_vectorization, built=True>:\nE           \nE           object of type 'bool' has no len()\nE           \nE           List of objects that could not be loaded:\nE           [<TextVectorization name=text_vectorization, built=True>, <StringLookup name=string_lookup_1, built=False>]\n\n.venv/lib/python3.11/site-packages/keras/src/saving/saving_lib.py:645: ValueError\n```\n\n## System details\npython 3.11.14\nkeras 3.13.0\ntensorflow 2.20.0",
  "repo": "keras-team/keras",
  "source": "v2/experiments/train_data/opd_e4b_pure_v6a/verified_rft_messages.jsonl",
  "source_sha256": "f045b7ca5b3883a1e2eaee81e1c02a4a1b53dd7b7b36e98bacb2ba5823a15148"
}
{
  "captured_at": "2026-11-12T17:06:59.476467+00:00",
  "membership": "archived training",
  "membership_evidence": "Task issues extracted from preserved verified_rft_messages training examples. This is not a verified current RL wave manifest.",
  "name": "Preserved post-training task archive",
  "source": "Autoresearch-Arena/gemma-4-developer-agent",
  "source_revision": "016496de222aaafca0d4ee4c18efc63ba616f76e",
  "sources": [
    {
      "path": "v2/experiments/train_data/opd_e4b_cispo_v5/verified_rft_messages.jsonl",
      "sha256": "a43610ad0dfb6ace95375cfae09000f41afc0338cc925af870a4ade7a9b20c4c"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_hybrid_v3/verified_rft_messages.jsonl",
      "sha256": "bd326303eb127e8e5e08f03daf97bb88d79d19709d59f3f93f348bc56686a8df"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_onpolicy_v3/verified_rft_messages.jsonl",
      "sha256": "960c680e797e823a0d3a22f4b1d5ef60a72971373d703b877340b0c9126aaf68"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_pure_v6a/verified_rft_messages.jsonl",
      "sha256": "f045b7ca5b3883a1e2eaee81e1c02a4a1b53dd7b7b36e98bacb2ba5823a15148"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_pure_v6b/verified_rft_messages.jsonl",
      "sha256": "0f62460a9706eea5e1605255896f191ab00cb5706c5f1f2e1c293e9a718218dc"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_pure_v7/verified_rft_messages.jsonl",
      "sha256": "e37f7bd675322f3f81500b73559d60d5f602ca0537bf19f5cb06332c728c7b72"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_pure_v7b/verified_rft_messages.jsonl",
      "sha256": "b864bdc8695183433eef6e31cb8d33fad44ba3aded2170c1ade4ad5b2944ce23"
    },
    {
      "path": "v2/experiments/train_data/opd_e4b_self_audit_v4/verified_rft_messages.jsonl",
      "sha256": "0026023745afb8f3dc1c176dc7f7171157b4ad5a66656b524af218e8e19ceee6"
    },
    {
      "path": "v2/experiments/train_data/rft_e4b_aligned_v2/verified_rft_messages.jsonl",
      "sha256": "92a4515fee9d152b0d4c510ee3ce4caaaffe2003ba7584469f8027f174aab18c"
    },
    {
      "path": "v2/experiments/train_data/rft_v1/verified_rft_messages.jsonl",
      "sha256": "a42453ccd7ac7680b0a03865e8e7080bc8bf74c8d9d193b440c441ed46f8512b"
    },
    {
      "path": "v2/experiments/train_data/rft_v2/verified_rft_messages.jsonl",
      "sha256": "18f4b3bd7e651f83c6acab479c9475e3fa50dc652a384f309e97146983ac85ba"
    }
  ]
}