pixelmodel / README.md
wop's picture
Update README.md
76164de verified
|
Raw
History Blame Contribute Delete
4.62 kB
---
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
---
<table align="center">
<tr>
<td align="center">
<a href="https://huggingface.co/spaces/bench-labs/BenchLabs-Leaderboard">πŸ† BenchLabs Leaderboard</a> β€’
<a href="https://huggingface.co/spaces/FlameF0X/Tiny-T2I-Leaderboard">🌍 Tiny-T2I Leaderboard</a>
</td>
</tr>
</table>
# 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 |
| ------------------------------------------ | -------------------------------------- |
| <img src="dataset/red.png" width="120"> | <img src="out_red.png" width="120"> |
| <img src="dataset/green.png" width="120"> | <img src="out_green.png" width="120"> |
| <img src="dataset/blue.png" width="120"> | <img src="out_blue.png" width="120"> |
| <img src="dataset/white.png" width="120"> | <img src="out_white.png" width="120"> |
| <img src="dataset/yellow.png" width="120"> | <img src="out_yellow.png" width="120"> |
| <img src="dataset/dark.png" width="120"> | <img src="out_dark.png" width="120"> |
---
## πŸ“ 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