--- license: mit pipeline_tag: text-to-image language: - en tags: - image - t2i - text-to-image - custoom-code model-index: - name: PixelModel results: - task: type: text-to-image dataset: name: fid type: fid metrics: - name: fid type: fid value: 566.84 - task: type: text-to-image dataset: name: clip type: clip metrics: - name: clip type: clip value: 0.186 new_version: bench-labs/pixelmodel-v1 ---
πŸ† BenchLabs Leaderboard β€’ 🌍 Tiny-T2I Leaderboard
# PixelModel πŸ–ΌοΈ A neural network where the weights **are** the image. ## πŸ“Œ What is this? `model.png` is not a picture β€” it *is* the model. Every pixel encodes neural network weights. At inference, the PNG is decoded into weight matrices forming a tiny MLP. The prompt is embedded into a vector, and the model generates a 32Γ—32 image. Training directly optimizes pixel values via gradient descent until the PNG becomes the model itself. --- ## 🎨 Weight Encoding - **R channel** β†’ weight magnitude (0–255 β†’ 0.0–1.0) - **B channel** β†’ weight sign (<128 = negative, β‰₯128 = positive) - **G channel** β†’ unused / reserved --- ## 🧠 Architecture ```text prompt string β†’ char embedding β†’ 32-dim vector β†’ W1 (64Γ—32) β†’ tanh β†’ W2 (64Γ—64) β†’ tanh β†’ W3 (3072Γ—64) β†’ sigmoid β†’ reshape β†’ 32Γ—32Γ—3 image ```` All weights live inside `model.png`. --- ## πŸ“¦ Standard weights (safetensors) `model.png` is the canonical model β€” training writes to it directly, and it's what makes PixelModel PixelModel. For tooling that expects standard weight files, the same 3 matrices are also exported as `model.safetensors` (202,752 parameters total, no bias terms): ```bash python convert_to_safetensors.py # model.png -> model.safetensors python convert_to_safetensors.py --model model.png --out model.safetensors ``` Re-run this after training if you retrain into a new `model.png` β€” `model.safetensors` doesn't update itself. Parameter count is verifiable two ways without running any code: `config.json` (`total_parameters: 202752`, full per-layer breakdown) and the safetensors file's own header metadata (`total_parameters`, `param_breakdown`, `has_bias`, `text_encoder_parameters`, `vae_parameters` β€” all 0 except the MLP itself). --- ## πŸ§ͺ Dataset vs Outputs | Target | Output | | ------------------------------------------ | -------------------------------------- | | | | | | | | | | | | | | | | | | | --- ## πŸ“ Files ```text model.png ← THE MODEL (64Γ—3200 px) model.safetensors ← same weights, standard format (generated, see below) config.json ← architecture + parameter-count metadata main.py ← inference, loads model.png INFERENCE.py ← inference, loads model.safetensors convert_to_safetensors.py ← model.png -> model.safetensors train.py ← training model.py ← architecture dataset/ red.png red.txt ← prompt: "red" ... ``` --- ## βš™οΈ Usage ```bash python train.py python train.py --epochs 500 --lr 0.05 python main.py "red" python main.py "a cat" --out cat.png --scale 8 # equivalent, but loads model.safetensors instead of model.png python convert_to_safetensors.py python INFERENCE.py "a cat" --out cat.png --scale 8 ``` `main.py` and `INFERENCE.py` produce byte-identical output for the same prompt β€” they're the same architecture and weights, just loaded from different files. --- ## πŸ“Š Tips * 6–20 samples are enough * Simple patterns converge fastest * 200–500 epochs typical * Loss < 0.001 is strong for toy datasets --- *It’s a toy. It’s not useful. But it works.* Bench Labs Β· Simple, Reliable, Open sourced