--- language: en license: apache-2.0 base_model: google/gemma-4-E2B datasets: - seantrott/cs_norms pipeline_tag: text-classification tags: - gemma4 - peft - lora - multi-label-classification - text-only - research-prototype --- # open-sensations: Gemma 4 E2B text classifier Separate Gemma-based Open classifier with the same task labels and per-window JSON contract as its RoBERTa counterpart. **Adapter + classifier head download, not standalone base weights.** Run with `gemma_classifier.py`; a generic chat/generation pipeline does not implement this classifier. Selected Gemma held-out test micro/macro F1: **0.7821 / 0.7556**. RoBERTa reference on the same split: **0.5772 / 0.5530**. These are classification F1 scores, not accuracy or a general intelligence rating. Different adaptation budgets and model sizes limit architecture-only conclusions. Pinned base: `google/gemma-4-E2B` at `d29ff6b45f081a49ee2733a859c9c9c2d95d1a6f`. The loader reads only text-backbone tensors; no vision/audio encoders, generative head, tools or chat outputs. Actual parameters including adapters/head: 4,629,917,958; trainable: 1,348,614. E2B is Google's effective-size designation, not the full parameter count. BF16 backbone; FP32 head and trainable adapters. Default root is the **synthetic** arm. The human baseline and both continuations are also separate ZIP downloads. Labels in exact order: vision, hearing, smell, taste, touch, interoception. Input format: Target: WORD Context: SENTENCE. For sensations, the target word must be identified: `Target: WORD` followed by newline and `Context: SENTENCE`. This remains a small target-word sensory association prototype, not a general sentence-level sensation detector. ## Training, hardware and reproducibility ASUS ROG Flow Z13 2025 GZ302EA; Ryzen AI Max+395; Radeon8060S; 128GB unified RAM; Ubuntu24.04 WSL2. One local GPU; no cloud training. Settings: `{"seed": 20261004, "epochs": 10, "microbatch_size": 8, "gradient_accumulation_steps": 4, "effective_batch_size": 32, "max_length": 128, "lora_rank": 8, "lora_alpha": 16, "lora_dropout": 0.05, "lora_targets": ["q_proj", "v_proj"], "learning_rate": 0.0001, "head_learning_rate": 0.001, "continuation_epochs": 1, "continuation_learning_rate": 5e-05, "continuation_head_learning_rate": 0.0005, "precision": "BF16 frozen backbone; FP32 adapters/head", "optimizer": "AdamW", "weight_decay": 0.01, "warmup_ratio": 0.06, "max_grad_norm": 1.0, "attention": "eager", "pooling": "last_non_padding_token"}`. Versions: `{"torch": "2.13.0+rocm10.0.0", "transformers": "5.18.0", "peft": "0.21.2", "accelerate": "1.15.0", "numpy": "2.5.3"}`. Human and evaluation data preserve the original RoBERTa splits. Full metadata, source hashes and pinned dataset revisions are in `data_manifest.json` and `run.json`; per-epoch histories, synthetic provenance and replay IDs are preserved. Raw human texts are not redistributed. Synthetic data is assistant-authored and not independently human-reviewed. Both continuation arms replay the same sampled human data; synthetic adds examples/compute. See [learning guide](GEMMA_CLASSIFIERS_GUIDE.md). ## Evaluation # open-sensations: Gemma results Root adapter selected using validation only, before test evaluation. F1 is not accuracy. | Arm | Validation micro F1 | Validation macro F1 | Test micro F1 | Test macro F1 | Threshold | | --- | ---: | ---: | ---: | ---: | ---: | | baseline | 0.7360 | 0.6793 | 0.8088 | 0.7197 | 0.50 | | real-only | 0.7229 | 0.6766 | 0.7674 | 0.7257 | 0.40 | | synthetic | 0.7317 | 0.6967 | 0.7821 | 0.7556 | 0.30 | Selected: **synthetic**. Synthetic accepted: **True**. ## RoBERTa reference on the same held-out data Micro F1: 0.5772; macro F1: 0.5530. Different tokenizer/model size/precision/training budgets: practical comparison, not architecture-only ablation. These test results did not select an arm. | Selected label | Precision | Recall | F1 | Support | | --- | ---: | ---: | ---: | ---: | | vision | 0.7917 | 1.0000 | 0.8837 | 38 | | hearing | 0.3750 | 0.8571 | 0.5217 | 7 | | smell | 1.0000 | 1.0000 | 1.0000 | 6 | | taste | 1.0000 | 1.0000 | 1.0000 | 6 | | touch | 0.5500 | 0.8462 | 0.6667 | 13 | | interoception | 0.3333 | 0.7500 | 0.4615 | 4 | Full experiment: 18.05 minutes. Peak PyTorch allocated GPU memory: 9.69 GiB; reserved: 9.90 GiB. These are not total process/system memory. | Arm | Epoch | Mean training loss | Validation micro F1 | Validation macro F1 | | --- | ---: | ---: | ---: | ---: | | baseline | 1 | 0.79388 | 0.4956 | 0.2977 | | baseline | 2 | 0.58331 | 0.5686 | 0.4946 | | baseline | 3 | 0.50667 | 0.6914 | 0.6260 | | baseline | 4 | 0.49347 | 0.7360 | 0.6793 | | baseline | 5 | 0.48771 | 0.6818 | 0.6417 | | baseline | 6 | 0.48051 | 0.6966 | 0.6637 | | baseline | 7 | 0.47659 | 0.7006 | 0.6685 | | baseline | 8 | 0.47428 | 0.7812 | 0.6731 | | baseline | 9 | 0.47279 | 0.7383 | 0.6537 | | baseline | 10 | 0.47260 | 0.6854 | 0.6438 | | real-only | 1 | 0.49174 | 0.7229 | 0.6766 | | synthetic | 1 | 0.44660 | 0.7317 | 0.6967 | ## Download and classify Use the pinned model-library environment described in `requirements-gemma-wsl.lock.txt`, with hardware-appropriate PyTorch. Download this repository's adapter/head/tokenizer/config files with `huggingface_hub.snapshot_download('mts-the-architect/open-sensations-gemma4-e2b-bf16-lora', local_dir='./downloaded-task')`. The custom loader also obtains the pinned public base (approximately 10.25 GB once in cache). It instantiates only the text backbone; adapters are not autonomous models. ```python import sys sys.path.insert(0, './downloaded-task') # Find the downloaded custom loader. from gemma_classifier import load_classifier import torch model, tokenizer, options = load_classifier('./downloaded-task', device='cuda') model.eval() text = "Target: aroma\nContext: The aroma of bread filled the bakery." inputs = tokenizer(text, return_tensors='pt', truncation=True, max_length=options['max_length']) with torch.inference_mode(): scores = model(**inputs).logits.sigmoid()[0].cpu().tolist() labels = [model.config.id2label[i] for i, s in enumerate(scores) if s >= options['global_threshold']] ``` For the existing window evidence format, use `python ./downloaded-task/predict_windows.py --task open-sensations --model ./downloaded-task --file document.txt --target aroma`. [Windowing guide](WINDOWING_GUIDE.md) documents overlap and uncalibrated max/mean summaries. [API instructions](API_USAGE.md) describe the same routes, owner approvals and rate limits; pass `--model-dir open-sensations=./downloaded-task`. Uploading these files does not deploy a public HTTP service. The private API database is never included. ## Limits and attribution Research models: restricted data coverage, label disagreement, rare-category instability and small sensory supports. Gemma size does not guarantee higher classification quality or explicit reasoning. Sigmoid outputs are not calibrated probabilities; short-input thresholds do not establish document-level decisions. No model judges moral truth or measures actual sensations. Training/validation selection is independent of test results. Base weights: [Google Gemma 4](https://huggingface.co/google/gemma-4-E2B), Apache 2.0; [official card](https://ai.google.dev/gemma/docs/core/model_card_4). Human data: [GoEmotions](https://huggingface.co/datasets/google-research-datasets/go_emotions), Apache 2.0; [MFRC](https://huggingface.co/datasets/USC-MOLA-Lab/MFRC), CC BY 4.0; [Contextualized Sensorimotor Norms](https://huggingface.co/datasets/seantrott/cs_norms), CC BY 4.0. Dataset licenses are distinct from model/code licensing. See LICENSE/NOTICE and source references in the learning guide.