Skip to content

Instantly share code, notes, and snippets.

@nilsleh
Last active February 26, 2023 16:34
Show Gist options
  • Save nilsleh/f33b2573290ac536d5f4c1b33c28776b to your computer and use it in GitHub Desktop.
Save nilsleh/f33b2573290ac536d5f4c1b33c28776b to your computer and use it in GitHub Desktop.
SWAG 1D Regression example
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# SWAG"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The autoreload extension is already loaded. To reload it, use:\n",
" %reload_ext autoreload\n"
]
}
],
"source": [
"import sys\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"import torch\n",
"import torch.utils.data\n",
"from torch import nn\n",
"from torch.utils.data import DataLoader, TensorDataset\n",
"from torch.nn import functional as F\n",
"\n",
"import seaborn as sns\n",
"\n",
"from swag import data, models, utils, losses\n",
"from swag.posteriors import SWAG\n",
"\n",
"from tqdm import tqdm, trange\n",
"\n",
"import os\n",
"\n",
"torch.backends.cudnn.benchmark = True\n",
"torch.manual_seed(1)\n",
"torch.cuda.manual_seed(1)\n",
"np.random.seed(1)\n",
"\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def featurize(x):\n",
" return torch.cat([x[:, None], x[:, None]**2], dim=1)\n",
"\n",
"class RegNet(nn.Sequential):\n",
" def __init__(self, dimensions, input_dim=1, output_dim=1, apply_var=True):\n",
" super(RegNet, self).__init__()\n",
" self.dimensions = [input_dim, *dimensions, output_dim] \n",
" for i in range(len(self.dimensions) - 1):\n",
" self.add_module('linear%d' % i, torch.nn.Linear(self.dimensions[i], self.dimensions[i + 1]))\n",
" if i < len(self.dimensions) - 2:\n",
" self.add_module('relu%d' % i, torch.nn.ReLU())"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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6667DvXr18fWrVsLg0RmZib27NnjcDZgMGCw8KITJ07g3LlzOHHiBKxWK/bv3w8AaNKkCapXr44uXbqgefPm6N+/P15//XWkp6fjpZdewsiRI7linkZ27dqFPXv2oGPHjggPD8euXbswduxY9OvXDzVr1tS7eQFj3LhxGDhwIO688060bdsWCQkJyM7OxuDBg/VuWsB67rnn8PDDD6Nx48Y4deoUpkyZArPZjN69e+vdtICSlZVVohcoJSUF+/fvR61atdCoUSPEx8dj5syZaNq0Ka677jq8/PLLaNCgQWHIDkp6T0sJZAMHDlQAytySk5MLtzl27Jjq1q2bqlKliqpdu7YaP368ysvL06/RAWbv3r2qXbt2KjIyUlWuXFndfPPNatasWerKlSt6Ny3gLFy4UDVq1EiFhoaqtm3bqt27d+vdpIDWq1cvFRUVpUJDQ1XDhg1Vr1691JEjR/RuVsBJTk62+zk+cOBApZRMOX355ZdVvXr1VFhYmHrggQfUoUOH9G20zrhsOhEREWmGs0KIiIhIMwwWREREpBkGCyIiItIMgwURERFphsGCiIiINMNgQURERJphsCAiIiLNMFgQERGRZhgsiIiISDMMFkRERKQZBgsiIiLSDIMFERERaeb/AWm8ra6zOgfgAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"arr = np.load(\"data.npz\") \n",
"x = torch.from_numpy(arr['x'])\n",
"f = featurize(x)\n",
"y = torch.from_numpy(arr['y']) * 10\n",
"\n",
"x_ = torch.from_numpy(arr['x_'])\n",
"f_ = featurize(x_)\n",
"y_ = torch.from_numpy(arr['y_']) * 10\n",
"\n",
"plt.plot(x.data.numpy(), y.data.numpy(), \"ro\")\n",
"plt.plot(x_.data.numpy(), y_.data.numpy(), \"-b\")\n",
"\n",
"train_loader = DataLoader(\n",
" TensorDataset(\n",
" f, y\n",
" ),\n",
" batch_size=100\n",
")"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pretrain Model"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def train_model(model: nn.Module, criterion: nn.Module, train_loader: DataLoader, lr: float, n_epochs: int = 100):\n",
" \"\"\"Train model for Map estimate.\n",
" \n",
" Args:\n",
" model: model to train\n",
" criterion: loss function\n",
" train_loader: dataloder with training data\n",
" lr: learning rate\n",
" n_epochs: number of epochs to train for\n",
"\n",
" Returns:\n",
" trained model\n",
" \"\"\"\n",
" optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n",
" bar = trange(n_epochs)\n",
" for i in bar:\n",
" for X, y in train_loader:\n",
" optimizer.zero_grad()\n",
" loss = criterion(model(X), y)\n",
" loss.backward()\n",
" optimizer.step()\n",
" bar.set_postfix(loss=f\"{loss.detach().cpu().item()}\")\n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 2000/2000 [00:04<00:00, 425.18it/s, loss=0.1756414920091629] \n"
]
}
],
"source": [
"my_model = RegNet(dimensions=[10, 10, 10], output_dim=1, input_dim=2)\n",
"my_model = train_model(my_model, nn.MSELoss(), train_loader, lr=2e-3, n_epochs=2000)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f3d1bc058b0>]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(x.data.numpy(), y.data.numpy(), \"ro\")\n",
"plt.plot(x_.data.numpy(), y_.data.numpy(), \"-b\")\n",
"plt.plot(x_.data.numpy(), my_model(f_).detach().numpy(), \"o\")\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Run SWAG"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def run_swag_training(swag_model: nn.Module, model: nn.Module, criterion: nn.Module, train_loader: DataLoader, lr: float, n_epochs: int = 100):\n",
" \"\"\"Train model for Map estimate.\n",
" \n",
" Args:\n",
" swag_model: swag wrapper model to train\n",
" model: underlying model\n",
" criterion: loss function\n",
" train_loader: dataloder with training data\n",
" lr: learning rate\n",
" n_epochs: number of epochs to train for\n",
"\n",
" Returns:\n",
" trained model\n",
" \"\"\"\n",
" eta = lr\n",
" c = 1 # moment update frequence\n",
" K = 20 # maximum number of columns in deviation matrix\n",
" T = n_epochs # number of steps\n",
" optimizer = torch.optim.SGD(model.parameters(), lr=lr)\n",
"\n",
" for i, _ in enumerate(range(T)):\n",
" for X,y in train_loader:\n",
" optimizer.zero_grad()\n",
" loss = criterion(model, X, y)[0]\n",
" loss.backward()\n",
" optimizer.step()\n",
"\n",
" if i % c == 0:\n",
" swag_model.collect_model(model)\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"subspace_type = \"covariance\"\n",
"swag_model = SWAG(\n",
" my_model, subspace_type=subspace_type\n",
")\n",
"\n",
"# train\n",
"run_swag_training(swag_model, my_model, losses.GaussianLikelihood(), train_loader, 3e-3, n_epochs=20)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"swag_samples = 10\n",
"preds = []\n",
"for sample in range(swag_samples):\n",
" swag_model.sample(.5)\n",
" preds.append(swag_model(f_).detach().numpy())\n",
"\n",
"stacked_preds = np.stack(preds, axis=-1)\n",
"swag_mean = np.mean(stacked_preds, -1).squeeze()\n",
"swag_std = np.std(stacked_preds, -1).squeeze()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f3d1bbfa880>]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGdCAYAAABO2DpVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABkMklEQVR4nO3dd3hTZRsG8Dsd7LbILlCWgopMZYiKgIIgOFFEUURcKKgMFw6WCqg4cODenzIUEVEBJ0tAURBliICAFChLoC2jK3m+Px7Tk9MmbcbJaHL/ritXc05O3vM2TXOevON5bSIiICIiIrJAXLgrQERERNGDgQURERFZhoEFERERWYaBBREREVmGgQURERFZhoEFERERWYaBBREREVmGgQURERFZJiHUJ3Q4HNizZw+SkpJgs9lCfXoiIiLyg4ggOzsbdevWRVyc53aJkAcWe/bsQVpaWqhPS0RERBZIT09H/fr1PT4e8sAiKSkJgFYsOTk51KcnIiIiP2RlZSEtLa3wOu5JyAMLZ/dHcnIyAwsiIqIyprRhDBy8SURERJZhYEFERESWYWBBRERElmFgQURERJZhYEFERESWYWBBRERElmFgQURERJZhYEFERESWYWBBRERElmFgQURERJZhYEFERESWiZrAQgT47bdw14KIiCi2RUVgsWIF0KULcOaZwC+/hLs2REREsSsqAovffweWLdP748aFty5ERESxLCoCi1tuARo00PsLFgArV4a3PkRERLEqKgKLcuWAMWOM7bFjw1cXIiKiWBYVgQUADBoENGmi97/7Dli6NLz1ISIiikVRE1gkJppbKsaO1ZkiREREFDpRE1gAwPXXA82a6f0lS4BFi8JbHyIiolgTVYFFQoJ5VghbLYiIiEIrqgILAOjfH2jeXO8vXw58801460NERBRLoi6wiI8Hxo83ttlqQUREFDpRF1gAwFVXAS1b6v1Vq4AvvwxvfYiIiGJFVAYWcXHAY48Z22PGAA5H+OpDREQUK6IysACAyy8H2rXT+7//Dnz6aXjrQ0REFAuiNrCw2YAnnjC2x44F7Pbw1YeIiCgWRG1gAQAXXQScd57e37QJ+Oij8NaHiIgo2kV1YFG01WL8eCA/P2zVISIiinpRHVgAQJcuQI8een/7duCdd8JbHyIiomgW9YEFADz+uPl+Tk746kJERBTNYiKw6NgRuPRS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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pred_upper = swag_mean + swag_std\n",
"pred_lower = swag_mean - swag_std\n",
"\n",
"plt.plot(x.data.numpy(), y.data.numpy(), \"ro\")\n",
"plt.plot(x_.data.numpy(), swag_mean, \"-b\", lw=1)\n",
"plt.plot(x_.data.numpy(), pred_lower, \"-b\", lw=2)\n",
"plt.plot(x_.data.numpy(), pred_upper, \"-b\", lw=2)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "uqboxEnv",
"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.12"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "4a78482e3ded2547d08348c8d78798d539cfd82d43da97871e3619d293b51c30"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment