Download examples/tutorials/attention_temperature.py from gexinh/vlm-probe: direct link, hf CLI and curl.
- Browser
- Download file 2.92 kB
-
https://huggingface.co/spaces/gexinh/vlm-probe/resolve/main/examples/tutorials/attention_temperature.py
- Command line
-
hf download hf://spaces/gexinh/vlm-probe/examples/tutorials/attention_temperature.py
-
curl -L -o attention_temperature.py https://huggingface.co/spaces/gexinh/vlm-probe/resolve/main/examples/tutorials/attention_temperature.py
2.92 kB
| from pathlib import Path | |
| import os | |
| from io import BytesIO | |
| from urllib.request import urlopen | |
| import numpy as np | |
| import torch | |
| from PIL import Image | |
| from transformers import AutoImageProcessor, ViTForImageClassification | |
| from vlmprobe import Prober, ClassScore | |
| from vlmprobe import visualization as viz | |
| import matplotlib.pyplot as plt | |
| # Install: pip install "vlmprobe[transformers,visualization]" | |
| # Set VLM_PROBING_MODEL to a local directory to avoid downloading this checkpoint. | |
| model_id = os.environ.get("VLM_PROBING_MODEL", "google/vit-base-patch16-224") | |
| device = os.environ.get("VLM_PROBING_DEVICE", "cuda:0" if torch.cuda.is_available() else "cpu") | |
| model = ViTForImageClassification.from_pretrained(model_id, attn_implementation="eager").to(device).eval() | |
| processor = AutoImageProcessor.from_pretrained(os.environ.get("VLM_PROBING_PROCESSOR", model_id)) | |
| probe = Prober(model, processor) | |
| # A raw COCO image, not a saved attention map or a previous model result. | |
| image_path = os.environ.get("VLM_PROBING_IMAGE") | |
| image = (Image.open(image_path) if image_path else Image.open(BytesIO(urlopen( | |
| "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/coco_sample.png" | |
| ).read()))).convert("RGB") | |
| inputs = {k: v.to(device) for k, v in processor(images=image, return_tensors="pt").items()} | |
| with torch.no_grad(): | |
| logits = model(**inputs).logits | |
| target_id = int(logits[0].argmax()) # Choose once; keep fixed during attribution. | |
| metric = ClassScore(target_id, kind="logit") | |
| print("Fixed target:", target_id, model.config.id2label.get(target_id)) | |
| # Plot the actual processed image; its crop/resize aligns with the patch tokens. | |
| mean = torch.tensor(processor.image_mean)[:, None, None] | |
| std = torch.tensor(processor.image_std)[:, None, None] | |
| rgb = (inputs["pixel_values"][0].detach().cpu() * std + mean).clamp(0, 1) | |
| processed_image = Image.fromarray((rgb.permute(1, 2, 0).numpy() * 255).astype("uint8")) | |
| patch = model.config.patch_size | |
| grid_shape = tuple(int(n // patch) for n in inputs["pixel_values"].shape[-2:]) | |
| visual_positions = list(range(1, 1 + grid_shape[0] * grid_shape[1])) # CLS is 0. | |
| last = probe.describe()["methods"]["attention.profile"]["sites"][-1] | |
| output_dir = Path(os.environ.get("VLM_PROBING_OUTPUT", "outputs/attention-tutorial")) | |
| output_dir.mkdir(parents=True, exist_ok=True) | |
| result = probe.attention.temperature(layers=list(range(last + 1)), queries=[0], temperature=0.7).run(inputs, metric=metric) | |
| print("Baseline:", result.tensors["baseline_score"]) | |
| print("Edited:", result.tensors["intervention_score"]) | |
| print("Effect:", result.tensors["effect"]) | |
| ax = viz.plot_intervention_curves( | |
| {"Temperature": result}, tensor="effect", baseline=0, | |
| xlabel="Independently edited layer", ylabel="Change in fixed class logit", | |
| ) | |
| ax.figure.savefig(output_dir / "attention-temperature.png", dpi=160, bbox_inches="tight") | |
| result.save(output_dir / "attention-temperature") | |
| plt.show() | |