[278d8a]: / reproducibility / Reproduce Linear Probing.ipynb

Download this file

304 lines (303 with data), 22.8 kB

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4d8f75cf",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import torch\n",
    "import clip\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "from PIL import Image\n",
    "\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "from metrics import eval_metrics\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "e56d9ac9",
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset = \"PanNuke\"\n",
    "data_folder = \"/path/to/data\"\n",
    "cache_dir = \".cache\"\n",
    "model_name = \"plip\"\n",
    "plip_path = \"/path/to/plip\"\n",
    "device=\"cuda\"\n",
    "\n",
    "class CLIPImageDataset(Dataset):\n",
    "    def __init__(self, list_of_images, preprocessing):\n",
    "        self.images = list_of_images\n",
    "        self.preprocessing = preprocessing\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.images)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        images = self.preprocessing(Image.open(self.images[idx]))  # preprocess from clip.load\n",
    "        return images\n",
    "    \n",
    "@torch.no_grad()\n",
    "def get_embs(loader, model, model_name):\n",
    "    all_embs = []\n",
    "    for images in tqdm(loader):\n",
    "        images = images.to(device)\n",
    "        if model_name in [\"clip\", \"plip\"]:\n",
    "            all_embs.append(model.encode_image(images).cpu().numpy())\n",
    "        else:\n",
    "            all_embs.append(model(images).squeeze().cpu().numpy())\n",
    "    all_embs = np.concatenate(all_embs, axis=0)\n",
    "    return all_embs\n",
    "\n",
    "\n",
    "def run_classification(train_x, train_y, test_x, test_y, seed=1, alpha=0.1):\n",
    "    classifier = SGDClassifier(random_state=seed, loss=\"log_loss\",\n",
    "                               alpha=alpha, verbose=0,\n",
    "                               penalty=\"l2\", max_iter=10000, class_weight=\"balanced\")\n",
    "    \n",
    "    le = LabelEncoder()\n",
    "\n",
    "    train_y = le.fit_transform(train_y)\n",
    "    test_y = le.transform(test_y)\n",
    "\n",
    "    train_y = np.array(train_y)\n",
    "    test_y = np.array(test_y)\n",
    "\n",
    "    classifier.fit(train_x, train_y)\n",
    "    test_pred = classifier.predict(test_x)\n",
    "    train_pred = classifier.predict(train_x)\n",
    "    test_metrics = eval_metrics(test_y, test_pred, average_method=\"macro\")\n",
    "    return test_metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2ed88421",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7bac69d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_dataset_name = dataset + \"_train.csv\"\n",
    "test_dataset_name = dataset + \"_test.csv\"\n",
    "\n",
    "train_dataset = pd.read_csv(os.path.join(data_folder, train_dataset_name))\n",
    "test_dataset = pd.read_csv(os.path.join(data_folder, test_dataset_name))\n",
    "\n",
    "test_y = test_dataset[\"label\"].tolist()\n",
    "train_y = train_dataset[\"label\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "5f2d857b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<All keys matched successfully>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model, preprocess = clip.load(\"ViT-B/32\", device=device, download_root=cache_dir)\n",
    "model.load_state_dict(torch.load(plip_path))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "efb1786b",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = model.eval()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "aabf4aca",
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_study(model_name, cache_dir=cache_dir):\n",
    "    if model_name == \"plip\":\n",
    "        model, preprocess = clip.load(\"ViT-B/32\", device=device, download_root=cache_dir)\n",
    "        model.load_state_dict(torch.load(plip_path))\n",
    "    elif model_name == \"clip\":\n",
    "        model, preprocess = clip.load(\"ViT-B/32\", device=device, download_root=cache_dir)\n",
    "    elif model_name == \"mudipath\": \n",
    "        from torchvision import transforms\n",
    "        from embedders.mudipath import build_densenet\n",
    "        \n",
    "        model = build_densenet(download_dir=cache_dir,\n",
    "                                      pretrained=\"mtdp\")\n",
    "        model.num_feats = model.n_features()\n",
    "        model.forward_type = \"image\"\n",
    "        model = model.to(device)\n",
    "        model.eval()\n",
    "        preprocess = transforms.Compose([\n",
    "            transforms.Resize(224),\n",
    "            transforms.CenterCrop(224),\n",
    "            transforms.ToTensor(),\n",
    "            transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # ImageNet stats\n",
    "        ])\n",
    "    \n",
    "    train_loader = DataLoader(CLIPImageDataset(train_dataset[\"image\"].tolist(), preprocess), batch_size=32)\n",
    "    test_loader = DataLoader(CLIPImageDataset(test_dataset[\"image\"].tolist(), preprocess), batch_size=32)\n",
    "\n",
    "    train_embs = get_embs(train_loader, model, model_name)\n",
    "    test_embs = get_embs(test_loader, model, model_name)\n",
    "    \n",
    "\n",
    "    all_records = []\n",
    "    for alpha in [1.0, 0.1, 0.01, 0.001]:\n",
    "        metrics = run_classification(train_embs, train_y, test_embs, test_y, alpha=alpha)\n",
    "        metrics[\"alpha\"] = alpha\n",
    "        metrics[\"model_name\"] = model_name\n",
    "        all_records.append(metrics)\n",
    "    return all_records"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e331473e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 136/136 [00:47<00:00,  2.86it/s]\n",
      "100%|██████████| 59/59 [00:20<00:00,  2.85it/s]\n",
      "100%|██████████| 136/136 [00:38<00:00,  3.49it/s]\n",
      "100%|██████████| 59/59 [00:17<00:00,  3.37it/s]\n",
      "100%|██████████| 136/136 [00:39<00:00,  3.48it/s]\n",
      "100%|██████████| 59/59 [00:17<00:00,  3.46it/s]\n"
     ]
    }
   ],
   "source": [
    "all_records = []\n",
    "for model_name in [\"mudipath\", \"plip\", \"clip\"]:\n",
    "    all_records.extend(run_study(model_name))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fccfc443",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "80436432",
   "metadata": {},
   "outputs": [],
   "source": [
    "result_df = pd.DataFrame(all_records)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "63d4ca50",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='model_name', ylabel='F1'>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the metrics you care about\n",
    "import seaborn as sns\n",
    "sns.lineplot(x=\"model_name\", y=\"F1\", data=result_df, estimator=\"max\", ci=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "914757a5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df649cab",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}