FOT-OOD / notebooks / visualize_geometry.ipynb
visualize_geometry.ipynb
Raw
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import math\n",
    "import json\n",
    "import glob\n",
    "from functools import reduce"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_results(dataset, model, pretrained, ckpt, metric, n_sample, seed):\n",
    "    if pretrained:\n",
    "        result_dir = f'../results/{dataset}/pretrained/{model}_{seed}-{ckpt}/{metric}_{n_sample}'\n",
    "    else:\n",
    "        result_dir = f'../results/{dataset}/scratch/{model}_{seed}-{ckpt}/{metric}_{n_sample}'\n",
    "      \n",
    "    result_fs = glob.glob(f'{result_dir}/*.json')\n",
    "    results = []\n",
    "    for file in result_fs:\n",
    "        with open(file, 'r') as f:\n",
    "            data = json.load(f)\n",
    "        results.extend(data)\n",
    "        \n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_base_est(dataset, model, pretrained, ckpt, metric, seed):\n",
    "    if pretrained:\n",
    "        result_dir = f'../cache/{dataset}/{model}_{seed}-{ckpt}/pretrained_cot_base.json'\n",
    "    else:\n",
    "        result_dir = f'../cache/{dataset}/{model}_{seed}-{ckpt}/scratch_cot_base.json'\n",
    "    \n",
    "    with open(result_dir, 'r') as f:\n",
    "        base_est = json.load(f)['base']\n",
    "    \n",
    "    return base_est"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_sample_dict = {\n",
    "    'CIFAR-10': -1, \n",
    "    'CIFAR-100': -1, \n",
    "    'Living-17': -1,\n",
    "    'Nonliving-26': -1,\n",
    "    'Entity-13': -1,\n",
    "    'Entity-30': -1,\n",
    "    'ImageNet': -1,\n",
    "    'RxRx1': -1,\n",
    "    'FMoW': -1,\n",
    "    'Amazon': -1,\n",
    "    'CivilComments': -1\n",
    "}\n",
    "\n",
    "n_epoch_dict = {\n",
    "    'CIFAR-10': 300, \n",
    "    'CIFAR-100': 300, \n",
    "    'Living-17': 450,\n",
    "    'Nonliving-26': 450,\n",
    "    'Entity-13': 300,\n",
    "    'Entity-30': 300,\n",
    "    'ImageNet': 10,\n",
    "    'FMoW': 50,\n",
    "    'RxRx1': 90,\n",
    "    'Amazon': 3,\n",
    "    'CivilComments': 5\n",
    "}\n",
    "\n",
    "pretrained_dict = {\n",
    "    'CIFAR-10': False, \n",
    "    'CIFAR-100': False, \n",
    "    'Living-17': False,\n",
    "    'Nonliving-26': False,\n",
    "    'Entity-13': False,\n",
    "    'Entity-30': False,\n",
    "    'ImageNet': True,\n",
    "    'FMoW': True,\n",
    "    'RxRx1': True,\n",
    "    'Amazon': True,\n",
    "    'CivilComments': True\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset = 'Entity-30'\n",
    "arch = 'resnet50'\n",
    "n_sample = n_sample_dict[dataset]\n",
    "seed = '1'\n",
    "model_ckpt = n_epoch_dict[dataset]\n",
    "pretrained = pretrained_dict[dataset]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "cot_results = load_results(dataset, arch, pretrained, model_ckpt, 'COT', n_sample, seed)\n",
    "cot_max_results = load_results(dataset, arch, pretrained, model_ckpt, 'COT-Max', n_sample, seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "cot_max_base = get_base_est(dataset, arch, pretrained, model_ckpt, metric, seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "cot_metrics = np.array([i['metric'] for i in cot_results])\n",
    "cot_max_metrics = np.array([i['metric'] for i in cot_max_results])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "ratio = cot_metrics / cot_max_metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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sZ599tnzjicnJ7ftRAALxJV29QoA9HTd5d+ZU6dOKS4u7qJjuuXbmgsKCoLu2rS0tOi7777T1VdfrYiIiHb9u/x+v5KTk3Xw4EHFxsa269w9DXvVduxV27FXoWG/2o69aruO2itjjE6dOqWkpKSfHRtSsMTHxysqKko+ny/ouM/nk9PpbPU5TqfzouPP/dfn8ykxMTFoTEZGRqtzOhwOORyOoGP9+/cP5VRCFhsbywXdRuxV27FXbcdehYb9ajv2qu06Yq9+7s7KOSG96DY6OlpjxoyRx+MJHGtpaZHH41FWVlarz8nKygoaL0lbt24NjE9NTZXT6Qwa4/f7tX379gvOCQAALi8hf0soPz9fs2bN0tixYzVu3DiVlpaqoaFBeXl5kqSZM2dq0KBBKi4uliQ99thjmjhxol566SVNmTJFGzZs0Oeff64///nPkqSIiAg9/vjjev755zV06FClpqZq4cKFSkpK0rRp09rvTAEAQLcVcrDk5OTo+PHjKiwslNfrVUZGhsrLywMvmq2trVVk5E83bm655Ra99dZbeuaZZ7RgwQINHTpUmzZt0o033hgYM2/ePDU0NOihhx7SyZMnNX78eJWXlysmJqYdTvHSOBwOFRUVnfctKJyPvWo79qrt2KvQsF9tx161nQ17FWHa8l4iAACALsTvEgIAANYjWAAAgPUIFgAAYD2CBQAAWO+yDJaysjKlpKQoJiZGmZmZqqqquuDYW2+9VREREec9pkyZEhhjjFFhYaESExPVu3dvuVwu7dmzpzNOpcO1917df//9530+Ozu7M06lw4WyV5JUWlqqYcOGqXfv3kpOTtYTTzxx3m8oD3XO7qK992rRokXnXVfDhw/v6NPoFKHs1dmzZ/Xcc89p8ODBiomJUXp6usrLyy9pzu6kvfeqp15Xn3zyie644w4lJSUpIiKiTb9ouKKiQqNHj5bD4dCQIUO0du3a88Z0+HVlLjMbNmww0dHRZs2aNearr74ys2fPNv379zc+n6/V8XV1debo0aOBx86dO01UVJT561//GhhTUlJi4uLizKZNm8y///1vc+edd5rU1FTz/fffd9JZdYyO2KtZs2aZ7OzsoHHfffddJ51Rxwl1r958803jcDjMm2++afbv32/+8Y9/mMTERPPEE0+EPWd30RF7VVRUZG644Yag6+r48eOddUodJtS9mjdvnklKSjKbN282+/btM6+99pqJiYkxNTU1Yc/ZXXTEXvXU62rLli3mj3/8o3nvvfeMJPP+++9fdPw333xj+vTpY/Lz882uXbvMq6++aqKiokx5eXlgTGdcV5ddsIwbN8488sgjgY+bm5tNUlKSKS4ubtPz//SnP5l+/fqZ06dPG2OMaWlpMU6n07z44ouBMSdPnjQOh8OsX7++fRffydp7r4z5MVimTp3a3kvtcqHu1SOPPGJuu+22oGP5+fnmV7/6VdhzdhcdsVdFRUUmPT29Q9bblULdq8TERLNixYqgY3fddZe57777wp6zu+iIveqp19X/ry3BMm/ePHPDDTcEHcvJyTFutzvwcWdcV5fVt4SamppUXV0tl8sVOBYZGSmXy6XKyso2zfH6668rNzdXV155pSRp//798nq9QXPGxcUpMzOzzXPaqCP26pyKigpdc801GjZsmObMmaO6urp2XXtnC2evbrnlFlVXVwdumX7zzTfasmWLfv3rX4c9Z3fQEXt1zp49e5SUlKS0tDTdd999qq2t7bgT6QTh7FVjY+N5P3Czd+/e+vTTT8OeszvoiL06p6ddV+GorKwM2ltJcrvdgb3trOvqsgqWEydOqLm5OfBTec9JSEiQ1+v92edXVVVp586devDBBwPHzj0v3Dlt1RF7JUnZ2dl644035PF4tGTJEn388ceaPHmympub23X9nSmcvfrd736n5557TuPHj9cVV1yhwYMH69Zbb9WCBQvCnrM76Ii9kqTMzEytXbtW5eXlWrlypfbv368JEybo1KlTHXo+HSmcvXK73Vq+fLn27NmjlpYWbd26Ve+9956OHj0a9pzdQUfsldQzr6tweL3eVvfW7/fr+++/77Tr6rIKlkv1+uuva+TIkRo3blxXL8V6F9qr3Nxc3XnnnRo5cqSmTZumv//97/rXv/6lioqKrlloF6moqNALL7yg1157TTU1NXrvvfe0efNmLV68uKuXZp227NXkyZN17733atSoUXK73dqyZYtOnjypt99+uwtX3vlefvllDR06VMOHD1d0dLQeffRR5eXlBf26FPyoLXvFdWWXy+oqjo+PV1RUlHw+X9Bxn88np9N50ec2NDRow4YNeuCBB4KOn3teOHParCP2qjVpaWmKj4/X3r17L2m9XSmcvVq4cKFmzJihBx98UCNHjtRvfvMbvfDCCyouLlZLS8sl7b/NOmKvWtO/f39dd911l911NXDgQG3atEkNDQ369ttvtXv3bvXt21dpaWlhz9kddMRetaYnXFfhcDqdre5tbGysevfu3WnX1WUVLNHR0RozZow8Hk/gWEtLizwej7Kysi763HfeeUeNjY36/e9/H3Q8NTVVTqczaE6/36/t27f/7Jw264i9as2hQ4dUV1enxMTES15zVwlnr86cOXPe//VGRUVJ+vFt8pey/zbriL1qzenTp7Vv377L7ro6JyYmRoMGDdL//vc/vfvuu5o6deolz2mzjtir1vSE6yocWVlZQXsrSVu3bg3sbaddV+328t1uYsOGDcbhcJi1a9eaXbt2mYceesj079/feL1eY4wxM2bMMPPnzz/veePHjzc5OTmtzllSUmL69+9v/va3v5kvv/zSTJ06tce8rbk99+rUqVPmqaeeMpWVlWb//v3mww8/NKNHjzZDhw41P/zwQ4efT0cKda+KiopMv379zPr1680333xjPvjgAzN48GDz29/+ts1zdlcdsVdPPvmkqaioMPv37zf//Oc/jcvlMvHx8ebYsWOdfn7tKdS92rZtm3n33XfNvn37zCeffGJuu+02k5qaav773/+2ec7uqiP2qqdeV6dOnTI7duwwO3bsMJLM8uXLzY4dO8y3335rjDFm/vz5ZsaMGYHx597WPHfuXPP111+bsrKyVt/W3NHX1WUXLMYY8+qrr5pf/vKXJjo62owbN85s27Yt8LmJEyeaWbNmBY3fvXu3kWQ++OCDVudraWkxCxcuNAkJCcbhcJjbb7/d/Oc//+nIU+g07blXZ86cMZMmTTIDBw40V1xxhbn22mvN7Nmzu/0/lOeEsldnz541ixYtMoMHDzYxMTEmOTnZPPzww0H/WP7cnN1Ze+9VTk6OSUxMNNHR0WbQoEEmJyfH7N27txPPqOOEslcVFRXm+uuvNw6Hw1x99dVmxowZ5vDhwyHN2Z2191711Ovqo48+MpLOe5zbn1mzZpmJEyee95yMjAwTHR1t0tLSgn6+1jkdfV1FGHOBe6oAAACWuKxewwIAALonggUAAFiPYAEAANYjWAAAgPUIFgAAYD2CBQAAWI9gAQAA1iNYAACA9QgWAABgPYIFAABYj2ABAADWI1gAAID1/h/WaYNJbvensAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(ratio, bins=np.arange(0.7, 1, 0.0125), weights=[1/len(ratio)] * len(ratio))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ood",
   "language": "python",
   "name": "ood"
  },
  "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.13"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}