{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":112509,"databundleVersionId":14254895,"sourceType":"competition"},{"sourceId":4534,"sourceType":"modelInstanceVersion","modelInstanceId":3326,"modelId":986},{"sourceId":268942,"sourceType":"modelInstanceVersion","modelInstanceId":230141,"modelId":251887}],"dockerImageVersionId":31236,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"1. Setup & Seeding","metadata":{"_uuid":"cfd61b57-9ca9-4176-ab11-31b6906ce5b7","_cell_guid":"4f92fea6-a203-4350-bc83-92eb5b83df08","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"\nimport os\nimport random\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\nfrom tqdm import tqdm\n\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\n\nfrom transformers import AutoModel, AutoImageProcessor\n\nSEED = 42\nrandom.seed(SEED)\nnp.random.seed(SEED)\ntorch.manual_seed(SEED)\ntorch.cuda.manual_seed_all(SEED)\ntorch.backends.cudnn.deterministic = True\ntorch.backends.cudnn.benchmark = False\n\nDEVICE = \"cuda\" if torch.cuda.is_available() else \"cpu\"","metadata":{"_uuid":"dd37031b-8084-4f42-b55e-8bfd3ff8f8a6","_cell_guid":"d6aaec86-f484-4343-900d-e4e1531ed1bc","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:35:57.140000Z","iopub.execute_input":"2026-01-08T15:35:57.140423Z","iopub.status.idle":"2026-01-08T15:35:57.147603Z","shell.execute_reply.started":"2026-01-08T15:35:57.140394Z","shell.execute_reply":"2026-01-08T15:35:57.146933Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"2. Load Train CSV","metadata":{"_uuid":"1d90cde4-5889-482b-8be4-4743870b76ad","_cell_guid":"dd1b2729-5eef-4f24-a1f4-752e7069e809","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"DATA_DIR = \"/kaggle/input/csiro-biomass\"\n\ntrain = pd.read_csv(f\"{DATA_DIR}/train.csv\")\ntrain[\"image_id\"] = train[\"sample_id\"].str.split(\"__\").str[0]\n\ntrain_images = (\n    train[[\"image_id\", \"image_path\"]]\n    .drop_duplicates()\n    .reset_index(drop=True)\n)\ntrain_images = train_images.sort_values(\"image_id\").reset_index(drop=True)\n\nprint(\"Unique train images:\", len(train_images))","metadata":{"_uuid":"378d2992-b7f8-4444-980e-b56830bd6052","_cell_guid":"75603482-9cf8-4731-8e98-7784a5325242","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:35:57.154273Z","iopub.execute_input":"2026-01-08T15:35:57.154840Z","iopub.status.idle":"2026-01-08T15:35:57.184830Z","shell.execute_reply.started":"2026-01-08T15:35:57.154815Z","shell.execute_reply":"2026-01-08T15:35:57.184272Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"3. Dataset (NO AUGMENTATION)","metadata":{"_uuid":"7c547e68-6b09-4d35-a33a-3a0075be999b","_cell_guid":"8ce0d749-f7dc-41f2-9112-9cd1fea20e78","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"class SiglipDataset(Dataset):\n    def __init__(self, df, root, processor):\n        self.df = df\n        self.root = root\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n        path = os.path.join(self.root, row.image_path)\n        img = Image.open(path).convert(\"RGB\")\n        inputs = self.processor(images=img, return_tensors=\"pt\")\n        return inputs[\"pixel_values\"].squeeze(0), row.image_id","metadata":{"_uuid":"f12b3ada-3dae-47f2-8d86-8b04d99ead70","_cell_guid":"888c4b4f-f8bf-46ea-bf0a-f8172182bdfa","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:35:57.186115Z","iopub.execute_input":"2026-01-08T15:35:57.186354Z","iopub.status.idle":"2026-01-08T15:35:57.191239Z","shell.execute_reply.started":"2026-01-08T15:35:57.186332Z","shell.execute_reply":"2026-01-08T15:35:57.190589Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# PART A — SigLIP Embeddings","metadata":{"_uuid":"a63b906c-e185-4deb-9f05-75f1fffbf8e3","_cell_guid":"92f37efb-440f-4dbb-bf1b-c9f83dfa5426","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"markdown","source":"4. Load SigLIP","metadata":{"_uuid":"5213f83c-0f40-4b34-8737-994c4d23d830","_cell_guid":"ec6a8824-7070-486c-b241-2353137cd3db","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"SIGLIP_PATH = \"/kaggle/input/google-siglip-so400m-patch14-384/transformers/default/1\"\n\nsiglip_model = AutoModel.from_pretrained(SIGLIP_PATH).to(DEVICE).eval()\nsiglip_processor = AutoImageProcessor.from_pretrained(SIGLIP_PATH)","metadata":{"_uuid":"615c1161-64a9-4d02-9377-9178b70b002f","_cell_guid":"4b399768-27e4-4192-b92b-1a4d67fd1b75","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:35:57.192041Z","iopub.execute_input":"2026-01-08T15:35:57.192258Z","iopub.status.idle":"2026-01-08T15:35:58.984212Z","shell.execute_reply.started":"2026-01-08T15:35:57.192234Z","shell.execute_reply":"2026-01-08T15:35:58.983428Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"5. Extract SigLIP Embeddings","metadata":{"_uuid":"d80c17ea-2258-4ac8-9554-bd9be1c3f769","_cell_guid":"da85fe31-678d-487d-aa8b-89f763bf94fd","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"siglip_ds = SiglipDataset(train_images, DATA_DIR, siglip_processor)\nsiglip_dl = DataLoader(siglip_ds, batch_size=16, shuffle=False, num_workers=2)\n\nsiglip_embeds = []\nimage_ids = []\n\nwith torch.no_grad():\n    for x, ids in tqdm(siglip_dl, desc=\"SigLIP\"):\n        x = x.to(DEVICE)\n        feats = siglip_model.get_image_features(pixel_values=x)\n        feats = feats / feats.norm(dim=-1, keepdim=True)\n        siglip_embeds.append(feats.cpu().numpy())\n        image_ids.extend(ids)\n\nsiglip_embeds = np.concatenate(siglip_embeds)\nimage_ids = np.array(image_ids)\n\nprint(\"SigLIP shape:\", siglip_embeds.shape)","metadata":{"_uuid":"b26f08f6-5863-478f-86f4-66af2f9d1ed0","_cell_guid":"013a224c-1fc5-41e1-9ad4-a4a48f1d0a0f","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:35:58.985923Z","iopub.execute_input":"2026-01-08T15:35:58.986186Z","iopub.status.idle":"2026-01-08T15:36:40.204813Z","shell.execute_reply.started":"2026-01-08T15:35:58.986164Z","shell.execute_reply":"2026-01-08T15:36:40.204085Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# PART B — DINOv2 Embeddings","metadata":{"_uuid":"17b04d57-2f9e-4899-bef0-bc405ba00eac","_cell_guid":"8524af91-269f-47dc-be50-35d27d4f4b05","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"import os\nos.listdir('/kaggle/input/dinov2/pytorch/base/1')","metadata":{"_uuid":"8ecddfc5-f8cd-4760-8266-9659aa2760f2","_cell_guid":"7c8f18ea-796d-4dff-a54b-839550c253b1","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:40.205935Z","iopub.execute_input":"2026-01-08T15:36:40.206180Z","iopub.status.idle":"2026-01-08T15:36:40.212697Z","shell.execute_reply.started":"2026-01-08T15:36:40.206153Z","shell.execute_reply":"2026-01-08T15:36:40.212130Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"6. Load DINOv2","metadata":{"_uuid":"5ab957fc-e5af-460e-a071-778d516e09e0","_cell_guid":"6de2ba46-d481-44e8-bfb9-c49da022cee3","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"DINO_PATH = \"/kaggle/input/dinov2/pytorch/base/1\"\n\nfrom transformers import AutoModel\n\ndino_model = AutoModel.from_pretrained(\n    DINO_PATH,\n    local_files_only=True,\n    trust_remote_code=True\n).to(DEVICE).eval()\nfrom transformers import AutoImageProcessor\n\ndino_processor = AutoImageProcessor.from_pretrained(\n    DINO_PATH,\n    local_files_only=True\n)\n\n\nprint(\"✅ DINOv2 (HF) loaded\")\nprint(\"Embedding dim:\", dino_model.config.hidden_size)","metadata":{"_uuid":"bb41934f-7397-451d-8b23-7fef44d331b0","_cell_guid":"34814d4a-d5f0-4f2a-9571-3e0c2934fc68","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:40.213624Z","iopub.execute_input":"2026-01-08T15:36:40.213869Z","iopub.status.idle":"2026-01-08T15:36:40.650407Z","shell.execute_reply.started":"2026-01-08T15:36:40.213846Z","shell.execute_reply":"2026-01-08T15:36:40.649787Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"7. Extract DINO Embeddings","metadata":{"_uuid":"4f638a94-0f1e-455f-83a7-c1219ae42b79","_cell_guid":"135831d1-6fe8-4798-8487-c01dcb28a12c","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"class DinoDataset(Dataset):\n    def __init__(self, df, root, processor):\n        self.df = df.reset_index(drop=True)\n        self.root = root\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n        path = os.path.join(self.root, row.image_path)\n        img = Image.open(path).convert(\"RGB\")\n        inputs = self.processor(images=img, return_tensors=\"pt\")\n        return inputs[\"pixel_values\"].squeeze(0)\n","metadata":{"_uuid":"573d8cbf-996e-4e77-9e91-24ae31f6e637","_cell_guid":"f141de0e-97ed-4449-9859-89089c76e0b7","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:40.651142Z","iopub.execute_input":"2026-01-08T15:36:40.651428Z","iopub.status.idle":"2026-01-08T15:36:40.656465Z","shell.execute_reply.started":"2026-01-08T15:36:40.651404Z","shell.execute_reply":"2026-01-08T15:36:40.655792Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dino_ds = DinoDataset(train_images, DATA_DIR, dino_processor)\n\ndino_dl = DataLoader(dino_ds, batch_size=16, shuffle=False, num_workers=2)\n\ndino_embeds = []\n\nwith torch.no_grad():\n    for x in tqdm(dino_dl, desc=\"DINO\"):\n        x = x.to(DEVICE)\n        outputs = dino_model(pixel_values=x)\n        feats = outputs.last_hidden_state.mean(dim=1)\n        feats = feats / feats.norm(dim=1, keepdim=True)\n        \n        dino_embeds.append(feats.cpu().numpy())\n\ndino_embeds = np.concatenate(dino_embeds)\nprint(\"DINO shape:\", dino_embeds.shape)","metadata":{"_uuid":"351bf210-6e93-4bc7-8800-c2895e09f952","_cell_guid":"9295d028-fb92-400d-b1ba-5a3b941ae8b2","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:40.657274Z","iopub.execute_input":"2026-01-08T15:36:40.657516Z","iopub.status.idle":"2026-01-08T15:36:54.318112Z","shell.execute_reply.started":"2026-01-08T15:36:40.657496Z","shell.execute_reply":"2026-01-08T15:36:54.317398Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"8. Save Artifacts","metadata":{"_uuid":"c0f5140c-423e-40a4-9aa2-7295643749ec","_cell_guid":"4a5b2d0f-3d66-4382-baa0-c2af9ccbc42c","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"","metadata":{"_uuid":"a1d1b439-4a3c-4aaf-99c6-fba1b411992c","_cell_guid":"ac47c6c4-30d2-4367-8eaf-f8454aa13e79","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"np.save(\"train_siglip.npy\", siglip_embeds)\nnp.save(\"train_dino.npy\", dino_embeds)\nnp.save(\"train_image_ids.npy\", image_ids)\n\nprint(\"Saved all train embeddings.\")","metadata":{"_uuid":"c10d15de-bc6d-414e-8724-60b7ccff2590","_cell_guid":"a90b2d7d-ba9c-4c34-861a-39aa1e1b33c0","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:54.319324Z","iopub.execute_input":"2026-01-08T15:36:54.319583Z","iopub.status.idle":"2026-01-08T15:36:54.326485Z","shell.execute_reply.started":"2026-01-08T15:36:54.319555Z","shell.execute_reply":"2026-01-08T15:36:54.325764Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# SANITY CHECK CELL — MUST RUN","metadata":{"_uuid":"3446c39e-245e-40ef-8460-333a73055caa","_cell_guid":"79ca4ec2-3571-4651-a09c-a46678930570","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"markdown","source":"SANITY CHECK CELL — MUST RUN","metadata":{"_uuid":"641c3bbf-4695-49e4-8015-7ff4f923a3f1","_cell_guid":"373f1b9c-7095-4daa-85f2-0264fe03814b","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"print(\"=== SHAPE CHECKS ===\")\nprint(\"SigLIP embeddings:\", siglip_embeds.shape, siglip_embeds.dtype)\nprint(\"DINO embeddings  :\", dino_embeds.shape, dino_embeds.dtype)\nprint(\"Image IDs        :\", image_ids.shape, image_ids.dtype)\n\nassert siglip_embeds.ndim == 2\nassert dino_embeds.ndim == 2\nassert siglip_embeds.shape[0] == dino_embeds.shape[0] == image_ids.shape[0]\n\nprint(\"✔ Shapes are consistent\")","metadata":{"_uuid":"8c4db353-901b-421e-a6df-758f0f56f79c","_cell_guid":"1eba7cde-f504-45de-b5da-b3774404b120","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:54.328546Z","iopub.execute_input":"2026-01-08T15:36:54.328798Z","iopub.status.idle":"2026-01-08T15:36:54.341098Z","shell.execute_reply.started":"2026-01-08T15:36:54.328764Z","shell.execute_reply":"2026-01-08T15:36:54.340425Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"2. NaN / Inf check (VERY IMPORTANT)","metadata":{"_uuid":"7124d171-ae41-4cf3-8937-5b5860521780","_cell_guid":"6de21782-f5b8-4ae9-b036-ca898b31e703","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"print(\"\\n=== NaN / INF CHECK ===\")\n\nprint(\"SigLIP NaNs:\", np.isnan(siglip_embeds).sum())\nprint(\"SigLIP Infs:\", np.isinf(siglip_embeds).sum())\n\nprint(\"DINO NaNs  :\", np.isnan(dino_embeds).sum())\nprint(\"DINO Infs  :\", np.isinf(dino_embeds).sum())\n\nassert not np.isnan(siglip_embeds).any()\nassert not np.isnan(dino_embeds).any()\nassert not np.isinf(siglip_embeds).any()\nassert not np.isinf(dino_embeds).any()\n\nprint(\"✔ No NaNs or Infs\")","metadata":{"_uuid":"147fddd6-9e60-4acc-8c70-9a2d59252d1e","_cell_guid":"de67e81e-03cd-4aa7-8bd4-fe9920d8b138","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:54.342038Z","iopub.execute_input":"2026-01-08T15:36:54.342312Z","iopub.status.idle":"2026-01-08T15:36:54.360892Z","shell.execute_reply.started":"2026-01-08T15:36:54.342290Z","shell.execute_reply":"2026-01-08T15:36:54.360374Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"3. L2-norm validation (SigLIP MUST be normalized)","metadata":{"_uuid":"68eeb787-fac8-48a1-9b4e-b7f04d55a1ee","_cell_guid":"e8521193-0d55-479e-bebf-2893ee51fd9f","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"print(\"\\n=== NORM CHECK ===\")\n\nsiglip_norms = np.linalg.norm(siglip_embeds, axis=1)\ndino_norms = np.linalg.norm(dino_embeds, axis=1)\n\nprint(\"SigLIP norm → min / mean / max:\",\n      siglip_norms.min(),\n      siglip_norms.mean(),\n      siglip_norms.max())\n\nprint(\"DINO norm   → min / mean / max:\",\n      dino_norms.min(),\n      dino_norms.mean(),\n      dino_norms.max())\n\nassert np.allclose(siglip_norms.mean(), 1.0, atol=1e-2)\n\nprint(\"✔ SigLIP normalization OK\")","metadata":{"_uuid":"08c33bfc-6ee3-4d22-8ac4-8c29d71723b2","_cell_guid":"5f244bc4-0564-4a40-abc7-2278684318ae","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:54.361842Z","iopub.execute_input":"2026-01-08T15:36:54.362118Z","iopub.status.idle":"2026-01-08T15:36:54.374829Z","shell.execute_reply.started":"2026-01-08T15:36:54.362090Z","shell.execute_reply":"2026-01-08T15:36:54.374324Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"4. Image ID integrity","metadata":{"_uuid":"13da466f-3d7d-4de4-b283-6df0801e73ab","_cell_guid":"377dcf74-dbaf-4d0b-a3ca-9a66726baad8","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"print(\"\\n=== IMAGE ID CHECK ===\")\n\nprint(\"First 5 image_ids:\", image_ids[:5])\nprint(\"Last 5 image_ids :\", image_ids[-5:])\n\nunique_ids = np.unique(image_ids)\nprint(\"Unique IDs:\", len(unique_ids))\n\nassert len(unique_ids) == len(image_ids)\n\nprint(\"✔ Image IDs are unique\")","metadata":{"_uuid":"b59076c7-2483-4833-b272-77bbe0e09b1f","_cell_guid":"3e396681-673f-464d-97fe-9d2e6812438c","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:54.375762Z","iopub.execute_input":"2026-01-08T15:36:54.376033Z","iopub.status.idle":"2026-01-08T15:36:54.388393Z","shell.execute_reply.started":"2026-01-08T15:36:54.376012Z","shell.execute_reply":"2026-01-08T15:36:54.387708Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"5. Reload test (simulates next notebook)","metadata":{"_uuid":"449183f5-30bf-42cd-bec7-6f536f1ec6bc","_cell_guid":"e65a937d-e4d1-4ca3-b40f-b5afc83d266a","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"print(\"\\n=== RELOAD TEST ===\")\n\nsiglip_test = np.load(\"train_siglip.npy\")\ndino_test   = np.load(\"train_dino.npy\")\nids_test    = np.load(\"train_image_ids.npy\")\n\nprint(\"Reload SigLIP:\", siglip_test.shape)\nprint(\"Reload DINO  :\", dino_test.shape)\nprint(\"Reload IDs   :\", ids_test.shape)\n\nassert np.allclose(siglip_test, siglip_embeds)\nassert np.allclose(dino_test, dino_embeds)\nassert np.array_equal(ids_test, image_ids)\n\nprint(\"✔ Reload successful\")","metadata":{"_uuid":"e9e4a53a-4564-46f2-a367-a8fe5eae8229","_cell_guid":"8b0ea09a-2912-4776-903c-a9bbb411be68","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:54.389232Z","iopub.execute_input":"2026-01-08T15:36:54.389516Z","iopub.status.idle":"2026-01-08T15:36:54.413882Z","shell.execute_reply.started":"2026-01-08T15:36:54.389493Z","shell.execute_reply":"2026-01-08T15:36:54.413243Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"6. Optional: quick distribution check (debug only)","metadata":{"_uuid":"8734917a-b2a2-48c6-a1af-1976c6fa0cce","_cell_guid":"b1eb682b-e2d8-4ec9-a606-f08541f67a96","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"print(\"\\n=== VALUE RANGE CHECK ===\")\n\nprint(\"SigLIP min / max:\", siglip_embeds.min(), siglip_embeds.max())\nprint(\"DINO   min / max:\", dino_embeds.min(), dino_embeds.max())","metadata":{"_uuid":"24d5e767-bee5-4774-9919-e10625bfb411","_cell_guid":"74311b8e-24dd-431e-b404-177750d78925","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2026-01-08T15:36:54.414787Z","iopub.execute_input":"2026-01-08T15:36:54.415072Z","iopub.status.idle":"2026-01-08T15:36:54.422047Z","shell.execute_reply.started":"2026-01-08T15:36:54.415050Z","shell.execute_reply":"2026-01-08T15:36:54.421394Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null}]}