Created
October 31, 2022 20:33
-
-
Save smsharma/4b99ee9bc6e47ea56ab24d2865f878ba to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "1c397a07-d448-4630-921c-b6f42d965263", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Device: cpu\n" | |
] | |
} | |
], | |
"source": [ | |
"import numpy as np\n", | |
"\n", | |
"import sys\n", | |
"sys.path.append(\"../../mine-pytorch/\")\n", | |
"from mine.models.layers import ConcatLayer, CustomSequential\n", | |
"from mine.models.mine import CustomSequential, Mine\n", | |
"\n", | |
"import torch\n", | |
"import torch.nn as nn\n", | |
"\n", | |
"import pytorch_lightning as pl\n", | |
"from pytorch_lightning import Trainer\n", | |
"\n", | |
"from torch.utils.data import TensorDataset, DataLoader" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "f5dc6356-ec88-4a63-ab48-adfd19d1d03e", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"Pk_ary = np.load(\"../data/Pk.npy\")\n", | |
"features = np.load(\"../data/features_25_25_1.npy\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "6c974a2c-e091-4655-9b07-164c40eab342", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class MutualInformationEstimator(pl.LightningModule):\n", | |
" def __init__(self, x_dim, z_dim, loss='mine', **kwargs):\n", | |
" super().__init__()\n", | |
" self.x_dim = x_dim\n", | |
" \n", | |
" T = CustomSequential(ConcatLayer(), nn.Linear(x_dim + z_dim, 64), nn.ReLU(),\n", | |
" nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, 1))\n", | |
"\n", | |
" self.energy_loss = Mine(T, loss=loss, alpha=kwargs['alpha'])\n", | |
"\n", | |
" self.kwargs = kwargs\n", | |
"\n", | |
" def forward(self, x, z):\n", | |
" return self.energy_loss(x, z)\n", | |
"\n", | |
" def configure_optimizers(self):\n", | |
" return torch.optim.Adam(self.parameters(), lr=self.kwargs['lr'])\n", | |
"\n", | |
" def training_step(self, batch, batch_idx):\n", | |
" x, z = batch\n", | |
" loss = self.energy_loss(x, z)\n", | |
" mi = -loss\n", | |
" return loss" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"id": "91ca5458-7013-442c-8fb4-c66e9f411612", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from tqdm.notebook import tqdm" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"id": "3af4a688-ab4a-426f-b7de-75ada32f59db", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "1627fc415cf34529874ecce6e4a3d47a", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
" 0%| | 0/14 [00:00<?, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "ab8f2b6b733b4541a942fbe242f24dd9", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "b0cad9a2763d480c8b7e8b0da2ca831c", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "57b73f7070014bf89b42695bd11abfc4", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "e035122129f84c0b8ce6269e0161e2e7", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "3c402c5fd7844043aa2a16d4b8e21cd9", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "bb313653e0954fa58e9ae0046a375233", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "76e078f34af24fb596043a6d3241f0a9", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "53492b3abb004d94a4a720b92f423319", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "13765119f1a64192b91a3afbd80967f9", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "d74e88c822fc4e15b272fc9340bf4a57", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "77ec384bc10a4d9b95d9f9ac67d9e74d", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "1906c69142e4402f86ad1a9d1d55eb2a", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "bef3ab076ce7482c9feb5b17bee8e3fb", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"GPU available: False, used: False\n", | |
"TPU available: False, using: 0 TPU cores\n", | |
"IPU available: False, using: 0 IPUs\n", | |
"\n", | |
" | Name | Type | Params\n", | |
"-------------------------------------\n", | |
"0 | energy_loss | Mine | 7.0 K \n", | |
"-------------------------------------\n", | |
"7.0 K Trainable params\n", | |
"0 Non-trainable params\n", | |
"7.0 K Total params\n", | |
"0.028 Total estimated model params size (MB)\n" | |
] | |
}, | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "bf061d99ca3d4df291a736a213d85dc3", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"Training: -1it [00:00, ?it/s]" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"max_epochs = 20 # Max epochs over which to optimize MI\n", | |
"x_dim = 10 # Binning of the P(k)\n", | |
"z_dim = features.shape[-1]\n", | |
"n_eval = 100 # Number of times to evaluate MI (uses different shufflings to get the marginal distributions)\n", | |
"\n", | |
"Pk_idxs = np.arange(0, Pk_ary.shape[-1] + 1, x_dim) \n", | |
"mi_val = np.zeros((len(Pk_idxs) - 1, n_val))\n", | |
"\n", | |
"# Go bin-by-bin and optimize MI bound\n", | |
"for idx in tqdm(range(len(Pk_idxs) - 1)):\n", | |
" \n", | |
" mi_model = MutualInformationEstimator(x_dim, z_dim, alpha=0.01, lr=1e-4)\n", | |
" dataset = TensorDataset(torch.Tensor(Pk_ary)[:, Pk_idxs[idx]:Pk_idxs[idx + 1]], torch.Tensor(features))\n", | |
" dataloader = DataLoader(dataset, batch_size=128, shuffle=True)\n", | |
"\n", | |
" trainer = pl.Trainer(max_epochs=max_epochs, accelerator='cpu', devices=1, gradient_clip_val=10.)\n", | |
" trainer.fit(model=mi_model, train_dataloaders=dataloader) \n", | |
" \n", | |
" mi_model.eval()\n", | |
"\n", | |
" for i_eval in range(n_eval):\n", | |
" mi_val[idx, i_eval] = np.array(mi_model.energy_loss.mi(torch.Tensor(Pk_ary)[:, Pk_idxs[idx]:Pk_idxs[idx + 1]], torch.Tensor(features)))\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 41, | |
"id": "e6b41086-22bb-42f9-b79c-b0925cd680b1", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0.5, 0, 'P(k) index')" | |
] | |
}, | |
"execution_count": 41, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 640x480 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"plt.plot(mi_val.mean(-1))\n", | |
"# plt.fill_between(np.percentile(mi_val, 5, -1), np.percentile(mi_val, 95, -1), alpha=0.5)\n", | |
"\n", | |
"plt.ylabel(\"MI\")\n", | |
"plt.xlabel(\"P(k) index\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "812e8c0c-1d8d-4ff3-9fe9-6b7c8e223bcd", | |
"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.13" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment