├── MAML-Sines.ipynb ├── README.md ├── Sine tests.ipynb └── src ├── __pycache__ └── tasks.cpython-36.pyc └── tasks.py /README.md: -------------------------------------------------------------------------------- 1 | # maml-pytorch 2 | 3 | A PyTorch reimplementation of MAML, replicating some of the experiments from [Finn et al (2017): Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks](https://arxiv.org/abs/1703.03400). 4 | 5 | Currently, MAML-Sines.ipynb reproduces (qualitatively) the supervised learning experiment from the paper, on a distribution of sine wave regression tasks. It is designed to be as simple and clear as possible while replicating the behaviour. 6 | -------------------------------------------------------------------------------- /Sine tests.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "This notebook demonstrates the Sine_Task and Sine_Task_Distribution classes by training a simple model to fit a sampled sine wave." 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import torch\n", 17 | "import torch.nn as nn\n", 18 | "import numpy as np\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "from src.tasks import Sine_Task_Distribution" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 2, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "tasks = Sine_Task_Distribution(0.1, 5, 0, np.pi, -5, 5)" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 18, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "data": { 39 | "image/png": "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\n", 40 | "text/plain": [ 41 | "
" 42 | ] 43 | }, 44 | "metadata": {}, 45 | "output_type": "display_data" 46 | } 47 | ], 48 | "source": [ 49 | "sine = tasks.sample_task()\n", 50 | "plt.scatter(*sine.sample_data(10))\n", 51 | "plt.show()" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 6, 57 | "metadata": { 58 | "scrolled": true 59 | }, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "image/png": "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\n", 64 | "text/plain": [ 65 | "
" 66 | ] 67 | }, 68 | "metadata": {}, 69 | "output_type": "display_data" 70 | } 71 | ], 72 | "source": [ 73 | "# set up model and task\n", 74 | "model = nn.Sequential(\n", 75 | " nn.Linear(1,40),\n", 76 | " nn.ReLU(),\n", 77 | " nn.Linear(40,40),\n", 78 | " nn.ReLU(),\n", 79 | " nn.Linear(40,1)\n", 80 | ")\n", 81 | "task = tasks.sample_task()\n", 82 | "optimiser = torch.optim.Adam(model.parameters(), lr=0.01)\n", 83 | "criterion = nn.MSELoss()\n", 84 | "\n", 85 | "# fit the model\n", 86 | "losses = []\n", 87 | "\n", 88 | "for i in range(1000):\n", 89 | " model.zero_grad()\n", 90 | " x, y = task.sample_data(10)\n", 91 | " y_hat = model(x)\n", 92 | " loss = criterion(y_hat, y)\n", 93 | " loss.backward()\n", 94 | " optimiser.step()\n", 95 | " losses.append(loss.item())\n", 96 | " \n", 97 | "# plot the result\n", 98 | "x = np.linspace(-5, 5, 100)\n", 99 | "y = model(torch.tensor(x, dtype=torch.float).view(-1, 1))\n", 100 | "\n", 101 | "plt.figure(figsize=(15,5))\n", 102 | "\n", 103 | "plt.subplot(1, 2, 1)\n", 104 | "plt.plot(x, task.true_function(x), '--', label='true function')\n", 105 | "plt.plot(x, y.detach().numpy(), label='model')\n", 106 | "plt.legend(loc='lower right')\n", 107 | "plt.title(\"Model fit\")\n", 108 | "\n", 109 | "plt.subplot(1, 2, 2)\n", 110 | "plt.plot(losses)\n", 111 | "plt.title(\"Loss over time\")\n", 112 | "plt.show()" 113 | ] 114 | }, 115 | { 116 | "cell_type": "code", 117 | "execution_count": null, 118 | "metadata": {}, 119 | "outputs": [], 120 | "source": [] 121 | } 122 | ], 123 | "metadata": { 124 | "kernelspec": { 125 | "display_name": "Python 3", 126 | "language": "python", 127 | "name": "python3" 128 | }, 129 | "language_info": { 130 | "codemirror_mode": { 131 | "name": "ipython", 132 | "version": 3 133 | }, 134 | "file_extension": ".py", 135 | "mimetype": "text/x-python", 136 | "name": "python", 137 | "nbconvert_exporter": "python", 138 | "pygments_lexer": "ipython3", 139 | "version": "3.6.4" 140 | } 141 | }, 142 | "nbformat": 4, 143 | "nbformat_minor": 2 144 | } 145 | -------------------------------------------------------------------------------- /src/__pycache__/tasks.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vmikulik/maml-pytorch/f4a6c070d10f9fa3005d446cad38bba5f12f1308/src/__pycache__/tasks.cpython-36.pyc -------------------------------------------------------------------------------- /src/tasks.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import numpy as np 4 | import matplotlib.pyplot as plt 5 | 6 | class Sine_Task(): 7 | """ 8 | A sine wave data distribution object with interfaces designed for MAML. 9 | """ 10 | 11 | def __init__(self, amplitude, phase, xmin, xmax): 12 | self.amplitude = amplitude 13 | self.phase = phase 14 | self.xmin = xmin 15 | self.xmax = xmax 16 | 17 | def true_function(self, x): 18 | """ 19 | Compute the true function on the given x. 20 | """ 21 | 22 | return self.amplitude * np.sin(self.phase + x) 23 | 24 | def sample_data(self, size=1): 25 | """ 26 | Sample data from this task. 27 | 28 | returns: 29 | x: the feature vector of length size 30 | y: the target vector of length size 31 | """ 32 | 33 | x = np.random.uniform(self.xmin, self.xmax, size) 34 | y = self.true_function(x) 35 | 36 | x = torch.tensor(x, dtype=torch.float).unsqueeze(1) 37 | y = torch.tensor(y, dtype=torch.float).unsqueeze(1) 38 | 39 | return x, y 40 | 41 | class Sine_Task_Distribution(): 42 | """ 43 | The task distribution for sine regression tasks for MAML 44 | """ 45 | 46 | def __init__(self, amplitude_min, amplitude_max, phase_min, phase_max, x_min, x_max): 47 | self.amplitude_min = amplitude_min 48 | self.amplitude_max = amplitude_max 49 | self.phase_min = phase_min 50 | self.phase_max = phase_max 51 | self.x_min = x_min 52 | self.x_max = x_max 53 | 54 | def sample_task(self): 55 | """ 56 | Sample from the task distribution. 57 | 58 | returns: 59 | Sine_Task object 60 | """ 61 | amplitude = np.random.uniform(self.amplitude_min, self.amplitude_max) 62 | phase = np.random.uniform(self.phase_min, self.phase_max) 63 | return Sine_Task(amplitude, phase, self.x_min, self.x_max) --------------------------------------------------------------------------------