prototorch_models/docs/source/tutorial.ipynb
Jensun Ravichandran d091dea6a1 Update tutorial
2021-05-25 20:54:07 +02:00

624 lines
68 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "f176387e",
"metadata": {},
"source": [
"# A short tutorial for the `prototorch.models` plugin"
]
},
{
"cell_type": "markdown",
"id": "08f641b4",
"metadata": {},
"source": [
"## Introduction"
]
},
{
"cell_type": "markdown",
"id": "d0d8096f",
"metadata": {},
"source": [
"This is a short tutorial for the [models](https://github.com/si-cim/prototorch_models) plugin of the [ProtoTorch](https://github.com/si-cim/prototorch) framework.\n",
"\n",
"[ProtoTorch](https://github.com/si-cim/prototorch) provides [torch.nn](https://pytorch.org/docs/stable/nn.html) modules and utilities to implement prototype-based models. However, it is up to the user to put these modules together into models and handle the training of these models. Expert machine-learning practioners and researchers sometimes prefer this level of control. However, this leads to a lot of boilerplate code that is essentially same across many projects. Needless to say, this is a source of a lot of frustration. [PyTorch-Lightning](https://pytorch-lightning.readthedocs.io/en/latest/) is a framework that helps avoid a lot of this frustration by handling the boilerplate code for you so you don't have to reinvent the wheel every time you need to implement a new model.\n",
"\n",
"With the [prototorch.models](https://github.com/si-cim/prototorch_models) plugin, we've gone one step further and pre-packaged commonly used prototype-models like GMLVQ as [Lightning-Modules](https://pytorch-lightning.readthedocs.io/en/latest/api/pytorch_lightning.core.lightning.html?highlight=lightning%20module#pytorch_lightning.core.lightning.LightningModule). With only a few lines to code, it is now possible to build and train prototype-models. It quite simply cannot get any simpler than this."
]
},
{
"cell_type": "markdown",
"id": "7b57f991",
"metadata": {},
"source": [
"## Basics"
]
},
{
"cell_type": "markdown",
"id": "009efb2c",
"metadata": {},
"source": [
"First things first. When working with the models plugin, you'll probably need `torch`, `prototorch` and `pytorch_lightning`. So, we recommend that you import all three like so:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "d8eb606b",
"metadata": {},
"outputs": [],
"source": [
"import prototorch as pt\n",
"import pytorch_lightning as pl\n",
"import torch"
]
},
{
"cell_type": "markdown",
"id": "d5daf6be",
"metadata": {},
"source": [
"### Building Models"
]
},
{
"cell_type": "markdown",
"id": "7ddc8d04",
"metadata": {},
"source": [
"Let's start by building a `GLVQ` model. It is one of the simplest models to build. The only requirements are a prototype distribution and an initializer."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "39cc97fc",
"metadata": {},
"outputs": [],
"source": [
"model = pt.models.GLVQ(\n",
" hparams=dict(distribution=[1, 1, 1]),\n",
" prototype_initializer=pt.components.Zeros(2),\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "54dc20ec",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GLVQ(\n",
" (proto_layer): LabeledComponents(components.shape: (3, 2))\n",
" (acc_metric): Accuracy()\n",
")\n"
]
}
],
"source": [
"print(model)"
]
},
{
"cell_type": "markdown",
"id": "3927cfea",
"metadata": {},
"source": [
"The key `distribution` in the `hparams` argument describes the prototype distribution. If it is a Python [list](https://docs.python.org/3/tutorial/datastructures.html), it is assumed that there are as many entries in this list as there are classes, and the number at each location of this list describes the number of prototypes to be used for that particular class. So, `[1, 1, 1]` implies that we have three classes with one prototype per class. If it is a Python [tuple](https://docs.python.org/3/tutorial/datastructures.html), a shorthand of `(num_classes, prototypes_per_class)` is assumed. If it is a Python [dictionary](https://docs.python.org/3/tutorial/datastructures.html), the key-value pairs describe the class label and the number of prototypes for that class respectively. So, `{0: 2, 1: 2, 2: 2}` implies that we have three classes with labels `{1, 2, 3}`, each equipped with two prototypes. If however, the dictionary contains the keys `\"num_classes\"` and `\"prototypes_per_class\"`, they are parsed to use their values as one might expect.\n",
"\n",
"The `prototype_initializer` argument describes how the prototypes are meant to be initialized. This argument has to be an instantiated object of some kind of [ComponentInitializer](https://github.com/si-cim/prototorch/blob/dev/prototorch/components/initializers.py#L27). If this is a [DimensionAwareInitializer](https://github.com/si-cim/prototorch/blob/dev/prototorch/components/initializers.py), this only requires a dimension arugment that describes the vector dimension of the prototypes. So, `pt.components.Zeros(2)` creates 2d-vector prototypes all initialized to zeros.\n",
"\n",
"It is also possible to use a [ClassAwareInitializer](https://github.com/si-cim/prototorch/blob/dev/prototorch/components/initializers.py). However, this type of initializer requires data to be instantiated.\n",
"\n",
"For a full list of available models, please check the [prototorch_models documentation](https://prototorch-models.readthedocs.io/en/latest/)."
]
},
{
"cell_type": "markdown",
"id": "b17c1476",
"metadata": {},
"source": [
"### Data"
]
},
{
"cell_type": "markdown",
"id": "b5d6d28e",
"metadata": {},
"source": [
"The preferred way to working with data in `torch` is to use the [Dataset and Dataloader API](https://pytorch.org/tutorials/beginner/basics/data_tutorial.html). There a few pre-packaged datasets available under `prototorch.datasets`. See [here](https://prototorch.readthedocs.io/en/latest/api.html#module-prototorch.datasets) for a full list of available datasets."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "9a104e40",
"metadata": {},
"outputs": [],
"source": [
"train_ds = pt.datasets.Iris(dims=[0, 2])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ebe9036c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"prototorch.datasets.iris.Iris"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(train_ds)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "40fc6e22",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((150, 2), (150,))"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_ds.data.shape, train_ds.targets.shape"
]
},
{
"cell_type": "markdown",
"id": "413a1d4e",
"metadata": {},
"source": [
"Once we have such a dataset, we could wrap it in a `Dataloader` to load the data in batches, and possibly apply some transformations on the fly."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "cc8cbc5d",
"metadata": {},
"outputs": [],
"source": [
"train_loader = torch.utils.data.DataLoader(train_ds, batch_size=2)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "0788db2f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"torch.utils.data.dataloader.DataLoader"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(train_loader)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "b0aa9ef5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"x_batch=tensor([[5.1000, 1.4000],\n",
" [4.9000, 1.4000]]), y_batch=tensor([0., 0.])\n"
]
}
],
"source": [
"x_batch, y_batch = next(iter(train_loader))\n",
"print(f\"{x_batch=}, {y_batch=}\")"
]
},
{
"cell_type": "markdown",
"id": "d8c63bd8",
"metadata": {},
"source": [
"This perhaps seems like a lot of work for a small dataset that fits completely in memory. However, this comes in very handy when dealing with huge datasets that can only be processed in batches."
]
},
{
"cell_type": "markdown",
"id": "b4bb738f",
"metadata": {},
"source": [
"### Training"
]
},
{
"cell_type": "markdown",
"id": "8da4f8eb",
"metadata": {},
"source": [
"If you're familiar with other deep learning frameworks, you might perhaps expect a `.fit(...)` or `.train(...)` method. However, in PyTorch-Lightning, this is done slightly differently. We first create a trainer and then pass the model and the Dataloader to `trainer.fit(...)` instead. So, it is more functional in style than object-oriented."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "952d90de",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: False, used: False\n",
"GPU available: False, used: False\n",
"TPU available: False, using: 0 TPU cores\n",
"TPU available: False, using: 0 TPU cores\n"
]
}
],
"source": [
"trainer = pl.Trainer(max_epochs=2, weights_summary=None)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "8937b061",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/blackfly/pyenvs/pt/lib/python3.9/site-packages/pytorch_lightning/utilities/distributed.py:69: UserWarning: you defined a validation_step but have no val_dataloader. Skipping val loop\n",
" warnings.warn(*args, **kwargs)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation sanity check: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/blackfly/pyenvs/pt/lib/python3.9/site-packages/pytorch_lightning/utilities/distributed.py:69: UserWarning: The dataloader, train dataloader, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 6 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.\n",
" warnings.warn(*args, **kwargs)\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "45ecc3d497a847c7a81b980c6e047d19",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"trainer.fit(model, train_loader)"
]
},
{
"cell_type": "markdown",
"id": "915860fe",
"metadata": {},
"source": [
"### From data to a trained model - a very minimal example"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "6ce12fc8",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"GPU available: False, used: False\n",
"GPU available: False, used: False\n",
"TPU available: False, using: 0 TPU cores\n",
"TPU available: False, using: 0 TPU cores\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Validation sanity check: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a651cde7ef1e4543a146ce81fb11d62c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Training: 0it [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"train_ds = pt.datasets.Iris(dims=[0, 2])\n",
"train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32)\n",
"\n",
"model = pt.models.GLVQ(\n",
" dict(distribution=(3, 2), lr=0.1),\n",
" prototype_initializer=pt.components.SMI(train_ds),\n",
")\n",
"\n",
"trainer = pl.Trainer(max_epochs=50, weights_summary=None)\n",
"trainer.fit(model, train_loader)"
]
},
{
"cell_type": "markdown",
"id": "e8094c0b",
"metadata": {},
"source": [
"## Advanced"
]
},
{
"cell_type": "markdown",
"id": "6d691b30",
"metadata": {},
"source": [
"### Initializing prototypes with a subset of a dataset (along with transformations)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "71a028da",
"metadata": {},
"outputs": [],
"source": [
"import prototorch as pt\n",
"import pytorch_lightning as pl\n",
"import torch\n",
"from torchvision import transforms\n",
"from torchvision.datasets import MNIST"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "37528377",
"metadata": {},
"outputs": [],
"source": [
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "7626a902",
"metadata": {},
"outputs": [],
"source": [
"train_ds = MNIST(\n",
" \"~/datasets\",\n",
" train=True,\n",
" download=True,\n",
" transform=transforms.Compose([\n",
" transforms.RandomHorizontalFlip(p=1.0),\n",
" transforms.RandomVerticalFlip(p=1.0),\n",
" transforms.ToTensor(),\n",
" ]),\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "de9ed93c",
"metadata": {},
"outputs": [],
"source": [
"s = int(0.05 * len(train_ds))\n",
"init_ds, rest_ds = torch.utils.data.random_split(train_ds, [s, len(train_ds) - s])"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "400b9ba0",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<torch.utils.data.dataset.Subset at 0x7fd9c9c5b8e0>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"init_ds"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "0574a071",
"metadata": {},
"outputs": [],
"source": [
"model = pt.models.ImageGLVQ(\n",
" dict(distribution=(10, 5)),\n",
" prototype_initializer=pt.components.SMI(init_ds),\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "5fc34157",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fd9c8173a00>"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(model.get_prototype_grid(num_columns=10))"
]
},
{
"cell_type": "markdown",
"id": "e75ba9e0",
"metadata": {},
"source": [
"## FAQs"
]
},
{
"cell_type": "markdown",
"id": "bffea4a1",
"metadata": {},
"source": [
"### How do I Retrieve the prototypes and their respective labels from the model?\n",
"\n",
"For prototype models, the prototypes can be retrieved (as `torch.tensor`) as `model.prototypes`. You can convert it to a NumPy Array by calling `.numpy()` on the tensor if required.\n",
"\n",
"```python\n",
">>> model.prototypes.numpy()\n",
"```\n",
"\n",
"Similarly, the labels of the prototypes can be retrieved via `model.prototype_labels`.\n",
"\n",
"```python\n",
">>> model.prototype_labels\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "ecf33e0a",
"metadata": {},
"source": [
"### How do I make inferences/predictions/recall with my trained model?\n",
"\n",
"The models under [prototorch.models](https://github.com/si-cim/prototorch_models) provide a `.predict(x)` method for making predictions. This returns the predicted class labels. It is essential that the input to this method is a `torch.tensor` and not a NumPy array. Model instances are also callable. So, you could also just say `model(x)` as if `model` were just a function. However, this returns a (pseudo)-probability distribution over the classes.\n",
"\n",
"#### Example\n",
"\n",
"```python\n",
">>> y_pred = model.predict(torch.Tensor(x_train)) # returns class labels\n",
"```\n",
"or, simply\n",
"```python\n",
">>> y_pred = model(torch.Tensor(x_train)) # returns probabilities\n",
"```"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}