See our collection for all Gemma 4 sizes and variants.
Run Gemma 4 with Keras 3: JAX, PyTorch, or TensorFlow

zeromodels/gemma-4-e2b-it
Pure-Keras 3 conversion of google/gemma-4-E2B-it for
zeromodels. One implementation runs unmodified on
TensorFlow / Torch / JAX. This is the 5B variant, served here as
image + audio + text -> text via Gemma4Processor; weights are stored in bfloat16.
For model details, license, and usage terms, see Google's
model card.
Gemma 4 family
| Property |
E2B |
E4B |
12B Unified |
31B Dense |
| Total Parameters |
2.3B effective (5.1B with embeddings) |
4.5B effective (8B with embeddings) |
11.95B |
30.7B |
| Layers |
35 |
42 |
48 |
60 |
| Sliding Window |
512 tokens |
512 tokens |
1024 tokens |
1024 tokens |
| Context Length |
128K tokens |
128K tokens |
256K tokens |
256K tokens |
| Vocabulary Size |
262K |
262K |
262K |
262K |
| Supported Modalities |
Text, Image, Audio |
Text, Image, Audio |
Text, Image, Audio |
Text, Image |
| Vision Encoder Parameters |
~150M |
~150M |
- |
~550M |
| Audio Encoder Parameters |
~300M |
~300M |
- |
No Audio |
✨ Quick start
Text-only
import os
os.environ["KERAS_BACKEND"] = "torch"
from zeromodels.models.gemma4 import Gemma4TextGenerate, Gemma4Tokenizer
model = Gemma4TextGenerate.from_weights("zeromodels/gemma-4-e2b-it")
tokenizer = Gemma4Tokenizer.from_weights("zeromodels/gemma-4-e2b-it")
inputs = tokenizer([{"role": "user", "content": "Hello, who are you?"}])
outputs = model.generate(**inputs, max_new_tokens=64)
print(tokenizer.decode(outputs[0]))
Image + audio + text
import os
os.environ["KERAS_BACKEND"] = "torch"
from PIL import Image
from zeromodels.models.gemma4 import Gemma4ConditionalGenerate, Gemma4Processor
model = Gemma4ConditionalGenerate.from_weights("zeromodels/gemma-4-e2b-it")
processor = Gemma4Processor.from_weights("zeromodels/gemma-4-e2b-it")
inputs = processor(conversation=[
{"role": "user", "content": [
{"type": "image", "image": Image.open("cat.jpg")},
{"type": "audio", "path": "clip.wav"},
{"type": "text", "text": "Describe the image and what you hear."},
]}
])
outputs = model.generate(**inputs, max_new_tokens=64)
print(processor.decode(outputs[0]))
Load any Gemma 4 variant the same way with from_weights("zeromodels/<variant>"):
Tips
- Set
KERAS_BACKEND before importing Keras / zeromodels.
- Loads in bfloat16 by default. Pass
load_dtype="float32" for full precision,
or quantization="int8" to shrink further.
- See the Gemma 4 docs.
- Community / upstream weights still work via the
hf: prefix:
Gemma4ConditionalGenerate.from_weights("hf:google/gemma-4-E2B-it").
Special Thanks
A huge thank you to the Google Gemma authors for creating and releasing these models.
License: Apache 2.0.