diff --git a/PrediNet/PrediNet.ipynb b/PrediNet/PrediNet.ipynb new file mode 100644 index 0000000..8f0b11d --- /dev/null +++ b/PrediNet/PrediNet.ipynb @@ -0,0 +1,2050 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "KDiJzbb8KFvP" + }, + "source": [ + "Copyright 2019 DeepMind Technologies Limited.\n", + "\n", + "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use\n", + "this file except in compliance with the License. You may obtain a copy of the\n", + "License at\n", + "\n", + "[https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)\n", + "\n", + "Unless required by applicable law or agreed to in writing, software distributed\n", + "under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n", + "CONDITIONS OF ANY KIND, either express or implied. See the License for the\n", + "specific language governing permissions and limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "OgbZIk-6eFRA" + }, + "source": [ + "# The PrediNet architecture and experiment code\n", + "\n", + "This is the core code used for the results presented in the paper\n", + "[\"An Explicitly Relational Neural Network Architecture\"](https://arxiv.org/abs/1905.10307).\n", + "\n", + "If this is the first time running the colab, run the cell below to install\n", + "TensorFlow 2.0 and Sonnet 2.0. You might be asked to re-start the session." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "arE0dFJJjCYe" + }, + "outputs": [], + "source": [ + "!pip install \"tensorflow-gpu\u003e=2.0.0rc0\" --pre\n", + "!pip install \"dm-sonnet\u003e=2.0.0b0\" --pre" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "1shymGSjLG88" + }, + "source": [ + "## Implementing the PrediNet model\n", + "\n", + "Let's first import the necessary dependencies: TensorFlow, numpy, matplotlib,\n", + "and files for uploading our datasets." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "_0k8XnhjQ8Ym" + }, + "outputs": [], + "source": [ + "from __future__ import absolute_import\n", + "from __future__ import division\n", + "from __future__ import print_function\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import sonnet as snt\n", + "import tensorflow as tf\n", + "from google.colab import files" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "cEH2-TNUPeCD" + }, + "source": [ + "## Importing the training, validation and testing datasets\n", + "\n", + "We now load smaller versions of the datasets, provided in this repository. Make\n", + "sure you download all dataset files for the target task:\n", + "\n", + "* `mini_3task_col_patts_pentos.npz`\n", + "* `mini_3task_col_patts_hexos.npz`\n", + "* `mini_3task_col_patts_stripes.npz`,\n", + "\n", + "as well for the pre-training task:\n", + "\n", + "* `mini_between_pentos.npz`\n", + "* `mini_between_hexos.npz`\n", + "* `mini_between_stripes.npz`\n", + "\n", + "from the repository to your local machine. You can select all six files for\n", + "uploading using `files.upload()`.\n", + "\n", + "The files for the pentominoes datasets contain only 50,000 out of the 250,000\n", + "sample images and will be used here as the training set. The files for the\n", + "hexominoes and stripes datasets contain 5,000 samples and will be our held-out\n", + "sets. We use a downsampled version of the full datasets to avoid memory issues\n", + "when loading and running our experiments in Colab, but the full datasets can be\n", + "found\n", + "[here](https://console.cloud.google.com/storage/browser/relations-game-datasets)." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "kBpGpBW6uUFo" + }, + "outputs": [], + "source": [ + "uploaded = files.upload()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "1DfGQyOxWOQ5" + }, + "source": [ + "## Dataset parameters\n", + "\n", + "Now that the dataset files have been uploaded, we need to set some global\n", + "parameters:\n", + "\n", + "* **`RES`** - a scalar denoting the resolution of the images contained in the\n", + " dataset. All the datasets provided have a resolution of 36 x 36 x 3.\n", + "* **`NUM_CLASSES`** - a scalar denoting the number of classes, ie: the size of\n", + " the label for the tasks. All the datasets provided have 2 classes\n", + " (indicating True or False), with the exception of the `colour_and_or_shape`\n", + " datasets which have 4 classes.\n", + "* **`NUM_TASKS`** - a scalar denoting the number of tasks contained in each of\n", + " the datasets. This can take a value between 1 and 5. Having a higher than\n", + " required number of tasks will not lead to an error, so it is recommended to\n", + " keep it to 5, which is the maximum number of tasks considered in any of the\n", + " datasets.\n", + "\n", + "Let's also define our task, training set, validation set and test set names:\n", + "\n", + "* **`TASKS`** - a string denoting the name of the tasks on which the network\n", + " will be trained. Here, this will be `'3task_col_patts'`, in which each image\n", + " contains a column of objects conforming to one of three possible patterns.\n", + " Recognising each of the 3 possible patterns is a separate task.\n", + "* **`PRE_TASKS`** - a string denoting the name of the pre-training tasks on\n", + " which the network will be pre-trained. Here, this will be `'between'`, in\n", + " which the (single) task is to determine whether the image contains three\n", + " objects in a line comprising two identical objects either side of a third.\n", + "* **`TRAINING_SET_NAME`** - a string denoting the name of the training set.\n", + " Here we will use pentominoes (`'pentos'`) for training.\n", + "* **`VALIDATION_SET_NAME`** - a string denoting the name of the validation\n", + " set. Here we will use hexominoes (`'hexos'`) for validation.\n", + "* **`TEST_SET_NAME`** - a string denoting the name of the test set. Here we\n", + " will use striped squares (`'stripes'`) for testing.\n", + "\n", + "Using the above tasks and datasets we will be able to produce figures that match\n", + "those in Figure 4 of the paper. You could, of course, train, validate and test\n", + "on any of the full datasets." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "4aOWvqSnWOpj" + }, + "outputs": [], + "source": [ + "RESOLUTION = 36\n", + "NUM_CLASSES = 2\n", + "NUM_TASKS = 5\n", + "TASKS = '3task_col_patts'\n", + "PRE_TASKS = 'between'\n", + "TRAINING_SET_NAME = 'pentos'\n", + "VALIDATION_SET_NAME = 'hexos'\n", + "TEST_SET_NAME = 'stripes'" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "VJLifnKZYoij" + }, + "source": [ + "## Retrieving a dataset and get a batch\n", + "\n", + "We now need to define functions for loading a dataset and retrieving batches\n", + "from it, using the task and set names." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "rZbx9mPAQiDQ" + }, + "outputs": [], + "source": [ + "def preprocess_dataset(images, labels, tasks):\n", + " \"\"\"Preprocesses a batch from the dataset.\n", + "\n", + " Args:\n", + " images: An image of integer values in the range [0-255].\n", + " labels: a numpy array of size (batch_size, 1). Contains an integer from 0\n", + " to (NUM_CLASSES - 1) denoting the class of each image.\n", + " tasks: a numpy array of size (batch_size, 1). Contains an integer from 0\n", + " to (NUM_TASKS - 1) denoting the task from which each sample was drawn\n", + " from.\n", + "\n", + " Returns:\n", + " images: a tf.Tensor of size (batch_size, RESOLUTION, RESOLUTION, 3).\n", + " Contains the normalised images.\n", + " labels: a numpy array of size (batch_size, 1). Contains an integer from\n", + " 0 to (NUM_CLASSES - 1) denoting the class of each image.\n", + " labels_1hot: a tf.Tensor of size (batch_size, NUM_CLASSES). Encodes the\n", + " label for each sample into a 1-hot vector.\n", + " tasks: a numpy array of size (batch_size, 1). Contains an integer from 0 to\n", + " (NUM_TASKS - 1) denoting the task from which each sample was drawn from.\n", + " tasks_1hot: a tf.Tensor of size (batch_size, NUM_TASKS). Encodes the\n", + " task for each sample into a 1-hot vector.\n", + " \"\"\"\n", + "\n", + " images = tf.divide(tf.cast(images, tf.float32), 256.0)\n", + " labels_1hot = tf.one_hot(tf.cast(tf.squeeze(labels), tf.int32), NUM_CLASSES)\n", + " tasks_1hot = tf.one_hot(tf.cast(tf.squeeze(tasks), tf.int32), NUM_TASKS)\n", + "\n", + " return (images, labels, labels_1hot, tasks, tasks_1hot)\n", + "\n", + "\n", + "def get_dataset(task_name, set_name, batch_size):\n", + " \"\"\"Given a task and set name loads and creates a dataset iterator.\n", + "\n", + " Args:\n", + " task_name: a string. The name of the task.\n", + " set_name: a string. One of 'pentos', 'hexos', 'stripes'\n", + " batch_size: a scalar (int). The required number of samples in each batch.\n", + "\n", + " Returns:\n", + " dataset: a tf.Dataset for the multitask dataset, with preprocessing.\n", + " \"\"\"\n", + " loader = np.load('mini_{}_{}.npz'.format(task_name, set_name), 'rb')\n", + " images = loader['images']\n", + " labels = loader['labels']\n", + " tasks = loader['tasks']\n", + "\n", + " # Create at tf.Dataset from the numpy arrays.\n", + " dataset = tf.data.Dataset.from_tensor_slices((images, labels, tasks))\n", + " # Create a dataset with infinite iterations, a buffer of 1000 elements from\n", + " # which to draw samples, and specify the batch size.\n", + " dataset = dataset.repeat(-1).shuffle(1000).batch(batch_size)\n", + "\n", + " return dataset.map(preprocess_dataset)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "VqG6DEUXS7h1" + }, + "source": [ + "## Visualising the images\n", + "\n", + "Now we define a couple of useful functions for visualising the images from the\n", + "datasets." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "xP6IDyWVu4fa" + }, + "outputs": [], + "source": [ + "def show_image(image):\n", + " \"\"\"Plots an image from the dataset with the appropriate formating.\n", + "\n", + " Args:\n", + " image: a numpy array or tf.Tensor of size (RESOLUTION, RESOLUTION, 3) from\n", + " the dataset.\n", + " \"\"\"\n", + " # Plot the image\n", + " plt.imshow(image, interpolation='nearest')\n", + " # Make the plot look nice\n", + " plt.xticks([])\n", + " plt.yticks([])\n", + " plt.grid(False)\n", + " ax = plt.gca()\n", + " ax.spines['bottom'].set_color('0.5')\n", + " ax.spines['top'].set_color('0.5')\n", + " ax.spines['left'].set_color('0.5')\n", + " ax.spines['right'].set_color('0.5')\n", + "\n", + "\n", + "def visualise_dataset(dataset):\n", + " \"\"\"Plots and prints a 3 x 3 grid of sample images from the dataset.\n", + "\n", + " Args:\n", + " dataset: a tf.Iterator object. Used to draw batches of data for\n", + " visualisation.\n", + " \"\"\"\n", + " # Retrieve a batch from the dataset iterator\n", + " images, labels, _, tasks, _ = next(dataset)\n", + "\n", + " # Plot it\n", + " plt.figure(figsize=(8, 8))\n", + " for i in range(9):\n", + " image = images[i, :, :, :]\n", + " label = labels[i][0]\n", + " task = tasks[i][0]\n", + " plt.subplot(3, 3, i + 1)\n", + " show_image(image)\n", + " if label:\n", + " plt.title('Task id: {0}. Label: True'.format(task))\n", + " else:\n", + " plt.title('Task id: {0}. Label: False'.format(task))\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "yFaoe8vAT-J4" + }, + "source": [ + "And let's use them to visualise the datasets we have loaded. You can play around\n", + "by changing the dataset or task." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "yWYPK1OPUF2A" + }, + "outputs": [], + "source": [ + "visualise_dataset(iter(get_dataset(TASKS, TRAINING_SET_NAME, 10)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "1kA5N2DfZD3b" + }, + "source": [ + "## Model configurations\n", + "\n", + "Here we define some global parameters.\n", + "\n", + "### Pre-processing convolutional layer\n", + "\n", + "* **`FILTER_SIZE`** - a scalar (int). The size of the filter convolution of\n", + " the pre-processing convolutional layer.\n", + "* **`STRIDE`** - a scalar (int). The stride of the convolutional layer.\n", + "* **`NUM_CHANNELS`** - a scalar (int). The number of output channels of the\n", + " pre-processing convolutional layer.\n", + "* **`CONV_OUT_SIZE`** - a scalar (int). The resolution of the output of the\n", + " pre-processing convolutional layer. i.e. the output of that layer will be of\n", + " size (CONV_OUT_SIZE, CONV_OUT_SIZE, NUM_CHANNELS).\n", + "\n", + "### PrediNet\n", + "\n", + "* **`HEADS_P`** - a scalar (int). The number of heads of the PrediNet.\n", + "* **`RELATIONS_P`** - a scalar (int). The size of the relations vector that\n", + " each of the PrediNet heads produces.\n", + "* **`CENTRAL_OUTPUT_SIZE`** - a scalar (int). The output size of the central\n", + " PrediNet module. It is the combined size of all heads." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "gdgh9j_Xppsj" + }, + "outputs": [], + "source": [ + "# Pre-processing convolutional layer parameters\n", + "FILTER_SIZE = 12\n", + "STRIDE = 6\n", + "NUM_CHANNELS = 32\n", + "CONV_OUT_SIZE = int((RESOLUTION - FILTER_SIZE) / STRIDE + 1)\n", + "\n", + "# PrediNet module parameters\n", + "HEADS_P = 32\n", + "RELATIONS_P = 16\n", + "CENTRAL_OUTPUT_SIZE = HEADS_P * (RELATIONS_P + 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ZIjWJCsfs0xI" + }, + "source": [ + "## Predinet model\n", + "\n", + "We now need to define the PrediNet model, which is broken down into three\n", + "modules: 1. The input module composed of a single convolutional layer 2. The\n", + "central module composed of the PrediNet 3. The output module composed of a two\n", + "layer MLP\n", + "\n", + "The model receives an image from the dataset and a 1-hot encoding of the task\n", + "id. The input module processes the image to produce a vector of features for\n", + "each of the patches in the input image. The central PrediNet module receives\n", + "these feature vectors and produces a key for each of them. Then, each of the\n", + "PrediNet heads produces two queries that match two of the keys (or mixtures of\n", + "them). A vector of relations is produced by each head using its corresponding\n", + "pair of selected feature vectors. The relations produced by all heads are then\n", + "put together in a long vector, to which the 1-hot task id is appended. This is\n", + "then passed through the output module to produce a classification indicating\n", + "whether, or not, the objects in the image conform to the particular high-level\n", + "relation defined by the task id. For more details about the network architecture\n", + "and the tasks, see the [PrediNet paper](https://arxiv.org/abs/1905.10307)." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "NmPnVBlJghXi" + }, + "outputs": [], + "source": [ + "class PrediNet4MultiTask(snt.Module):\n", + " \"\"\"PrediNet model for supervised learning.\"\"\"\n", + "\n", + " def __init__(self,\n", + " resolution,\n", + " conv_out_size,\n", + " filter_size,\n", + " stride,\n", + " channels,\n", + " relations,\n", + " heads,\n", + " key_size,\n", + " output_hidden_size,\n", + " num_classes,\n", + " num_tasks,\n", + " name='PrediNet'):\n", + " \"\"\"Initialise the PrediNet model.\n", + "\n", + " Args:\n", + " resolution: a scalar (int). Resolution of raw images.\n", + " conv_out_size: a scalar (int). Downsampled image resolution obtained at\n", + " the output of the convolutional layer.\n", + " filter_size: a scalar (int). Filter size for the convnet.\n", + " stride: a scalar (int). Stride size for the convnet.\n", + " channels: a scalar (int). Number of channels of the convnet.\n", + " relations: a scalar (int). Number of relations computed by each head.\n", + " heads: a scalar (int). Number of PrediNet heads.\n", + " key_size: a scalar (int). Size of the keys.\n", + " output_hidden_size: a scalar (int). Size of hidden layer in output MLP.\n", + " num_classes: a scalar (int). Number of classes in the output label.\n", + " num_tasks: a scalar (int). Max number of possible tasks.\n", + " name: a str. The name of the model.\n", + " \"\"\"\n", + " super(PrediNet4MultiTask, self).__init__(name=name)\n", + " self.model_desc = name\n", + " self._resolution = resolution\n", + " self._conv_out_size = conv_out_size\n", + " self._filter_size = filter_size\n", + " self._stride = stride\n", + " self._channels = channels\n", + " self._relations = relations\n", + " self._heads = heads\n", + " self._key_size = key_size\n", + " self._output_hidden_size = output_hidden_size\n", + " self._num_classes = num_classes\n", + "\n", + " self._weight_initializer = snt.initializers.TruncatedNormal(\n", + " mean=0.0, stddev=0.1)\n", + " self._bias_initializer = snt.initializers.Constant(0.1)\n", + "\n", + " # Feature co-ordinate matrix\n", + " cols = tf.constant([[[x / float(self._conv_out_size)]\n", + " for x in range(self._conv_out_size)]\n", + " for _ in range(self._conv_out_size)])\n", + " rows = tf.transpose(cols, [1, 0, 2])\n", + " # Append feature co-ordinates\n", + " self._locs = tf.reshape(\n", + " tf.concat([cols, rows], 2),\n", + " [self._conv_out_size * self._conv_out_size, 2])\n", + "\n", + " # Define all model components\n", + " self.input_module = snt.Conv2D(\n", + " output_channels=self._channels,\n", + " kernel_shape=self._filter_size,\n", + " stride=self._stride,\n", + " padding='VALID',\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.get_keys = snt.Linear(\n", + " output_size=self._key_size,\n", + " with_bias=False,\n", + " w_init=self._weight_initializer)\n", + " self.get_query1 = snt.Linear(\n", + " output_size=self._heads * self._key_size,\n", + " with_bias=False,\n", + " w_init=self._weight_initializer)\n", + " self.get_query2 = snt.Linear(\n", + " output_size=self._heads * self._key_size,\n", + " with_bias=False,\n", + " w_init=self._weight_initializer)\n", + " self.embed_entities = snt.Linear(\n", + " output_size=self._relations,\n", + " with_bias=False,\n", + " w_init=self._weight_initializer)\n", + " self.output_hidden = snt.Linear(\n", + " output_size=self._output_hidden_size,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.output = snt.Linear(\n", + " output_size=self._num_classes,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + "\n", + " def _reinitialise_weight(self, submodule):\n", + " \"\"\"Re-initialise a weight variable.\"\"\"\n", + " submodule.w.assign(submodule.w_init(submodule.w.shape, submodule.w.dtype))\n", + "\n", + " def _reinitialise_bias(self, submodule):\n", + " \"\"\"Re-initialise a bias variable.\"\"\"\n", + " submodule.b.assign(submodule.b_init(submodule.b.shape, submodule.b.dtype))\n", + "\n", + " def reinitialise_input_module(self):\n", + " \"\"\"Re-initialise the weights of the input convnet.\"\"\"\n", + " self._reinitialise_weight(self.input_module)\n", + " self._reinitialise_bias(self.input_module)\n", + "\n", + " def reinitialise_central_module(self):\n", + " \"\"\"Re-initialise the weights of the central PrediNet module.\"\"\"\n", + " self._reinitialise_weight(self.get_keys)\n", + " self._reinitialise_weight(self.get_query1)\n", + " self._reinitialise_weight(self.get_query2)\n", + " self._reinitialise_weight(self.embed_entities)\n", + "\n", + " def reinitialise_output_module(self):\n", + " \"\"\"Re-initialise the weights of the output MLP.\"\"\"\n", + " self._reinitialise_weight(self.output_hidden)\n", + " self._reinitialise_weight(self.output)\n", + " self._reinitialise_bias(self.output_hidden)\n", + " self._reinitialise_bias(self.output)\n", + "\n", + " def __call__(self, x, tasks, batch_size):\n", + " \"\"\"Applies model to image x yielding a label.\n", + "\n", + " Args:\n", + " x: tensor. Input images of size (batch_size, RESOLUTION, RESOLUTION, 3).\n", + " tasks: tensor. List of task sizes of size (batch_size, NUM_TASKS).\n", + " batch_size: scalar (int). Batch size.\n", + "\n", + " Returns:\n", + " output: tensor. Output of the model of size (batch_size, NUM_CLASSES).\n", + " \"\"\"\n", + " features = tf.nn.relu(self.input_module(x))\n", + " features = tf.reshape(features, [batch_size, -1, self._channels])\n", + "\n", + " # Append location\n", + " locs = tf.tile(tf.expand_dims(self._locs, 0), [batch_size, 1, 1])\n", + " features_locs = tf.concat([features, locs], 2)\n", + " # (batch_size, conv_out_size*conv_out_size, channels+2)\n", + "\n", + " features_flat = snt.Flatten()(features_locs)\n", + " # (batch_size, conv_out_size*conv_out_size*channels+2)\n", + "\n", + " # Keys\n", + " keys = snt.BatchApply(self.get_keys)(features_locs)\n", + " # (batch_size, conv_out_size*conv_out_size, key_size)\n", + "\n", + " keys = tf.tile(tf.expand_dims(keys, 1), [1, self._heads, 1, 1])\n", + " # (batch_size, heads, conv_out_size*conv_out_size, key_size)\n", + "\n", + " # Queries\n", + " query1 = self.get_query1(features_flat)\n", + " # (batch_size, heads*key_size)\n", + " query1 = tf.reshape(query1, [batch_size, self._heads, self._key_size])\n", + " # (batch_size, heads, key_size)\n", + " query1 = tf.expand_dims(query1, 2)\n", + " # (batch_size, heads, 1, key_size)\n", + "\n", + " query2 = self.get_query2(features_flat)\n", + " # (batch_size, heads*key_size)\n", + " query2 = tf.reshape(query2, [batch_size, self._heads, self._key_size])\n", + " # (batch_size, heads, key_size)\n", + " query2 = tf.expand_dims(query2, 2)\n", + " # (batch_size, heads, 1, key_size)\n", + "\n", + " # Attention weights\n", + " keys_t = tf.transpose(keys, perm=[0, 1, 3, 2])\n", + " # (batch_size, heads, key_size, conv_out_size*conv_out_size)\n", + " att1 = tf.nn.softmax(tf.matmul(query1, keys_t))\n", + " att2 = tf.nn.softmax(tf.matmul(query2, keys_t))\n", + " # (batch_size, heads, 1, conv_out_size*conv_out_size)\n", + "\n", + " # Reshape features\n", + " features_tiled = tf.tile(\n", + " tf.expand_dims(features_locs, 1), [1, self._heads, 1, 1])\n", + " # (batch_size, heads, conv_out_size*conv_out_size, channels+2)\n", + "\n", + " # Compute a pair of features using attention weights\n", + " feature1 = tf.squeeze(tf.matmul(att1, features_tiled))\n", + " feature2 = tf.squeeze(tf.matmul(att2, features_tiled))\n", + " # (batch_size, heads, (channels+2))\n", + "\n", + " # Spatial embedding\n", + " embedding1 = snt.BatchApply(self.embed_entities)(feature1)\n", + " embedding2 = snt.BatchApply(self.embed_entities)(feature2)\n", + " # (batch_size, heads, relations)\n", + "\n", + " # Comparator\n", + " dx = tf.subtract(embedding1, embedding2)\n", + " # (batch_size, heads, relations)\n", + "\n", + " # Positions\n", + " pos1 = tf.slice(feature1, [0, 0, self._channels], [-1, -1, -1])\n", + " pos2 = tf.slice(feature2, [0, 0, self._channels], [-1, -1, -1])\n", + " # (batch_size, heads, 2)\n", + "\n", + " # Collect relations and concatenate positions\n", + " relations = tf.concat([dx, pos1, pos2], 2)\n", + " # (batch_size, heads, relations+4)\n", + " relations = tf.reshape(relations,\n", + " [batch_size, self._heads * (self._relations + 4)])\n", + " # (batch_size, heads*(relations+4))\n", + "\n", + " # Append task id\n", + " relations_plus = tf.concat([relations, tasks], 1)\n", + "\n", + " # Apply output network\n", + " hidden_activations = tf.nn.relu(self.output_hidden(relations_plus))\n", + " output = self.output(hidden_activations)\n", + "\n", + " return output" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "-fxRUx6qBM6m" + }, + "source": [ + "## Baselines\n", + "\n", + "If you wish to also train the other baselines, you can run the following code\n", + "cell, which will set the required parameters and define the baseline model\n", + "classes." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "yBIu3-zIBy2f" + }, + "outputs": [], + "source": [ + "# Baseline parameters\n", + "\n", + "# 2-layer MLP baseline\n", + "# Fully connected hidden layer size\n", + "CENTRAL_HIDDEN_SIZE = 1024\n", + "\n", + "# Relation net\n", + "# Relation net MLP layer 1 size\n", + "RN_HIDDEN_SIZE = 256\n", + "\n", + "# Self-attention net\n", + "# Self-attention net number of heads - 32 will match those of PrediNet.\n", + "HEADS_SA = 32\n", + "# The required size of the Values produced by the model (per head), such that\n", + "# the self-attention output size equals that of the PrediNet.\n", + "VALUE_SIZE = int(CENTRAL_OUTPUT_SIZE / HEADS_SA)\n", + "\n", + "\n", + "# And below you can find the function definition.\n", + "class ConvNetMLP1L(snt.Module):\n", + " \"\"\"Convnet + Single layer baseline model for supervised learning.\n", + "\n", + " Input net = convnet\n", + " Central net = Single linear layer\n", + " Output net = 2-layer MLP\n", + " \"\"\"\n", + "\n", + " def __init__(self,\n", + " resolution,\n", + " conv_out_size,\n", + " filter_size,\n", + " stride,\n", + " channels,\n", + " central_output_size,\n", + " output_hidden_size,\n", + " num_classes,\n", + " num_tasks,\n", + " name='ConvNetMLP1L'):\n", + " \"\"\"Initialise the convnet/MLP model.\n", + "\n", + " Args:\n", + " resolution: scalar. Resolution of raw images.\n", + " conv_out_size: scalar. Downsampled resolution of the images.\n", + " filter_size: scalar. Filter size for the convnet.\n", + " stride: scalar. Stride size for the convnet.\n", + " channels: scalar. Number of channels of the convnet.\n", + " central_output_size: scalar. Output size of central MLP.\n", + " output_hidden_size: a scalar (int). Size of hidden layer in output MLP.\n", + " num_classes: scalar. Number of classes in the output label.\n", + " num_tasks: scalar. Max number of possible tasks.\n", + " name: a str. The name of the model.\n", + " \"\"\"\n", + " super(ConvNetMLP1L, self).__init__(name=name)\n", + " self.model_desc = '1-layer baseline'\n", + " self._resolution = resolution\n", + " self._conv_out_size = conv_out_size\n", + " self._filter_size = filter_size\n", + " self._stride = stride\n", + " self._channels = channels\n", + " self._central_output_size = central_output_size\n", + " self._output_hidden_size = output_hidden_size\n", + " self._num_classes = num_classes\n", + "\n", + " self._weight_initializer = snt.initializers.TruncatedNormal(\n", + " mean=0.0, stddev=0.1)\n", + " self._bias_initializer = snt.initializers.Constant(0.1)\n", + "\n", + " # Feature co-ordinate matrix\n", + " cols = tf.constant([[[x / float(self._conv_out_size)]\n", + " for x in range(self._conv_out_size)]\n", + " for _ in range(self._conv_out_size)])\n", + " rows = tf.transpose(cols, [1, 0, 2])\n", + " # Append feature co-ordinates\n", + " self._locs = tf.reshape(\n", + " tf.concat([cols, rows], 2),\n", + " [self._conv_out_size * self._conv_out_size, 2])\n", + "\n", + " # Define all model components\n", + " self.input_module = snt.Conv2D(\n", + " output_channels=self._channels,\n", + " kernel_shape=self._filter_size,\n", + " stride=self._stride,\n", + " padding='VALID',\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.central_hidden = snt.Linear(\n", + " output_size=self._central_output_size,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.output_hidden = snt.Linear(\n", + " output_size=self._output_hidden_size,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.output = snt.Linear(\n", + " output_size=self._num_classes,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + "\n", + " def _reinitialise_weight(self, submodule):\n", + " \"\"\"Re-initialise a weight variable.\"\"\"\n", + " submodule.w.assign(submodule.w_init(submodule.w.shape, submodule.w.dtype))\n", + "\n", + " def _reinitialise_bias(self, submodule):\n", + " \"\"\"Re-initialise a bias variable.\"\"\"\n", + " submodule.b.assign(submodule.b_init(submodule.b.shape, submodule.b.dtype))\n", + "\n", + " def reinitialise_input_module(self):\n", + " \"\"\"Re-initialise the weights of the input convnet.\"\"\"\n", + " self._reinitialise_weight(self.input_module)\n", + " self._reinitialise_bias(self.input_module)\n", + "\n", + " def reinitialise_central_module(self):\n", + " \"\"\"Re-initialise the weights of the central hidden layer.\"\"\"\n", + " self._reinitialise_weight(self.central_hidden)\n", + " self._reinitialise_bias(self.central_hidden)\n", + "\n", + " def reinitialise_output_module(self):\n", + " \"\"\"Re-initialise the weights of the output MLP.\"\"\"\n", + " self._reinitialise_weight(self.output_hidden)\n", + " self._reinitialise_weight(self.output)\n", + " self._reinitialise_bias(self.output_hidden)\n", + " self._reinitialise_bias(self.output)\n", + "\n", + " def __call__(self, x, tasks, batch_size):\n", + " \"\"\"Applies model to image x yielding a label.\n", + "\n", + " Args:\n", + " x: tensor. Input image.\n", + " tasks: tensor. List of task sizes of length batch_size.\n", + " batch_size: scalar. Batch size.\n", + "\n", + " Returns:\n", + " output: tensor. Output of the model.\n", + " \"\"\"\n", + " features = tf.nn.relu(self.input_module(x))\n", + " features = tf.reshape(features, [batch_size, -1, self._channels])\n", + "\n", + " # Append location\n", + " locs = tf.tile(tf.expand_dims(self._locs, 0), [batch_size, 1, 1])\n", + " features_locs = tf.concat([features, locs], 2)\n", + " # (batch_size, conv_out_size*conv_out_size, channels+2)\n", + "\n", + " features_flat = snt.Flatten()(features_locs)\n", + " # (batch_size, conv_out_size*conv_out_size*(channels+2))\n", + "\n", + " # Fully connected layers\n", + " central_activations = tf.nn.relu(self.central_hidden(features_flat))\n", + " # (batch_size, central_output_size)\n", + "\n", + " # Append task id\n", + " central_output = tf.concat([central_activations, tasks], 1)\n", + "\n", + " # Apply output network\n", + " hidden_activations = tf.nn.relu(self.output_hidden(central_output))\n", + " output = self.output(hidden_activations)\n", + "\n", + " return output\n", + "\n", + "\n", + "class ConvNetMLP2L(snt.Module):\n", + " \"\"\"Convnet/MLP baseline model for supervised learning.\n", + "\n", + " Input net = convnet\n", + " Central net = 2-layer MLP\n", + " Output net = 2-layer MLP\n", + " \"\"\"\n", + "\n", + " def __init__(self,\n", + " resolution,\n", + " conv_out_size,\n", + " filter_size,\n", + " stride,\n", + " channels,\n", + " central_hidden_size,\n", + " central_output_size,\n", + " output_hidden_size,\n", + " num_classes,\n", + " num_tasks,\n", + " name='MLP2'):\n", + " \"\"\"Initialise the convnet/MLP model.\n", + "\n", + " Args:\n", + " resolution: scalar. Resolution of raw images.\n", + " conv_out_size: scalar. Downsampled resolution of the images.\n", + " filter_size: scalar. Filter size for the convnet.\n", + " stride: scalar. Stride size for the convnet.\n", + " channels: scalar. Number of channels of the convnet.\n", + " central_hidden_size: scalar. Hidden units size of central MLP.\n", + " central_output_size: scalar. Output size of central MLP.\n", + " output_hidden_size: a scalar (int). Size of hidden layer in output MLP.\n", + " num_classes: scalar. Number of classes in the output label.\n", + " num_tasks: scalar. Max number of possible tasks.\n", + " name: a str. The name of the model.\n", + " \"\"\"\n", + " super(ConvNetMLP2L, self).__init__(name=name)\n", + " self.model_desc = '2-layer MLP baseline'\n", + " self._resolution = resolution\n", + " self._conv_out_size = conv_out_size\n", + " self._filter_size = filter_size\n", + " self._stride = stride\n", + " self._channels = channels\n", + " self._central_hidden_size = central_hidden_size\n", + " self._central_output_size = central_output_size\n", + " self._output_hidden_size = output_hidden_size\n", + " self._num_classes = num_classes\n", + "\n", + " self._weight_initializer = snt.initializers.TruncatedNormal(\n", + " mean=0.0, stddev=0.1)\n", + " self._bias_initializer = snt.initializers.Constant(0.1)\n", + "\n", + " # Feature co-ordinate matrix\n", + " cols = tf.constant([[[x / float(self._conv_out_size)]\n", + " for x in range(self._conv_out_size)]\n", + " for _ in range(self._conv_out_size)])\n", + " rows = tf.transpose(cols, [1, 0, 2])\n", + " # Append feature co-ordinates\n", + " self._locs = tf.reshape(\n", + " tf.concat([cols, rows], 2),\n", + " [self._conv_out_size * self._conv_out_size, 2])\n", + "\n", + " # Define all model components\n", + " self.input_module = snt.Conv2D(\n", + " output_channels=self._channels,\n", + " kernel_shape=self._filter_size,\n", + " stride=self._stride,\n", + " padding='VALID',\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.central_hidden = snt.Linear(\n", + " output_size=self._central_hidden_size,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.central_output = snt.Linear(\n", + " output_size=self._central_output_size,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.output_hidden = snt.Linear(\n", + " output_size=self._output_hidden_size,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.output = snt.Linear(\n", + " output_size=self._num_classes,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + "\n", + " def _reinitialise_weight(self, submodule):\n", + " \"\"\"Re-initialise a weight variable.\"\"\"\n", + " submodule.w.assign(submodule.w_init(submodule.w.shape, submodule.w.dtype))\n", + "\n", + " def _reinitialise_bias(self, submodule):\n", + " \"\"\"Re-initialise a bias variable.\"\"\"\n", + " submodule.b.assign(submodule.b_init(submodule.b.shape, submodule.b.dtype))\n", + "\n", + " def reinitialise_input_module(self):\n", + " \"\"\"Re-initialise the weights of the input convnet.\"\"\"\n", + " self._reinitialise_weight(self.input_module)\n", + " self._reinitialise_bias(self.input_module)\n", + "\n", + " def reinitialise_central_module(self):\n", + " \"\"\"Re-initialise the weights of the central layers.\"\"\"\n", + " self._reinitialise_weight(self.central_hidden)\n", + " self._reinitialise_bias(self.central_hidden)\n", + " self._reinitialise_weight(self.central_output)\n", + " self._reinitialise_bias(self.central_output)\n", + "\n", + " def reinitialise_output_module(self):\n", + " \"\"\"Re-initialise the weights of the output MLP.\"\"\"\n", + " self._reinitialise_weight(self.output_hidden)\n", + " self._reinitialise_weight(self.output)\n", + " self._reinitialise_bias(self.output_hidden)\n", + " self._reinitialise_bias(self.output)\n", + "\n", + " def __call__(self, x, tasks, batch_size):\n", + " \"\"\"Applies model to image x yielding a label.\n", + "\n", + " Args:\n", + " x: tensor. Input image.\n", + " tasks: tensor. List of task sizes of length batch_size.\n", + " batch_size: scalar. Batch size.\n", + "\n", + " Returns:\n", + " output: tensor. Output of the model.\n", + " \"\"\"\n", + " features = tf.nn.relu(self.input_module(x))\n", + " features = tf.reshape(features, [batch_size, -1, self._channels])\n", + "\n", + " # Append location\n", + " locs = tf.tile(tf.expand_dims(self._locs, 0), [batch_size, 1, 1])\n", + " features_locs = tf.concat([features, locs], 2)\n", + " # (batch_size, conv_out_size*conv_out_size, channels+2)\n", + "\n", + " features_flat = snt.Flatten()(features_locs)\n", + " # (batch_size, conv_out_size*conv_out_size*(channels+2))\n", + "\n", + " # Fully connected layers\n", + " central_activations = tf.nn.relu(self.central_hidden(features_flat))\n", + " # (batch_size, central_hidden_size)\n", + " central_out_activations = tf.nn.relu(\n", + " self.central_output(central_activations))\n", + " # (batch_size, central_output_size)\n", + "\n", + " # Append task id\n", + " central_out_locs = tf.concat([central_out_activations, tasks], 1)\n", + "\n", + " # Apply output network\n", + " hidden_activations = tf.nn.relu(self.output_hidden(central_out_locs))\n", + " output = self.output(hidden_activations)\n", + "\n", + " return output\n", + "\n", + "\n", + "class RelationNet(snt.Module):\n", + " \"\"\"Relation net baseline model for supervised learning.\n", + "\n", + " Input net = convnet\n", + " Central net = relation net\n", + " Output net = 2-layer MLP\n", + "\n", + " Relation network taken from: Santoro, A., Raposo, D., Barrett,\n", + " D. G., Malinowski, M., Pascanu, R., Battaglia, P., \u0026 Lillicrap, T.\n", + " (2017). A simple neural network module for relational reasoning.\n", + " In Advances in neural information processing systems (pp. 4967-4976).\n", + " http://papers.nips.cc/paper/7082-a-simple-neural-network-module-for-relational-reasoning\n", + " \"\"\"\n", + "\n", + " def __init__(self,\n", + " resolution,\n", + " conv_out_size,\n", + " filter_size,\n", + " stride,\n", + " channels,\n", + " central_hidden_size,\n", + " central_output_size,\n", + " output_hidden_size,\n", + " num_classes,\n", + " num_tasks,\n", + " name='RelationNet'):\n", + " \"\"\"Initialise the relation net model.\n", + "\n", + " Args:\n", + " resolution: scalar. Resolution of raw images.\n", + " conv_out_size: scalar. Downsampled resolution of the images.\n", + " filter_size: scalar. Filter size for the convnet.\n", + " stride: scalar. Stride size for the convnet.\n", + " channels: scalar. Number of channels of the convnet.\n", + " central_hidden_size: scalar. Hidden units size of Relation Net module.\n", + " central_output_size: scalar. Output size of Relation Net module.\n", + " output_hidden_size: a scalar (int). Size of hidden layer in output MLP.\n", + " num_classes: scalar. Number of classes in the output label.\n", + " num_tasks: scalar. Max number of possible tasks.\n", + " name: a str. The name of the model.\n", + " \"\"\"\n", + " super(RelationNet, self).__init__(name=name)\n", + " self.model_desc = 'Relation net baseline'\n", + " self._resolution = resolution\n", + " self._conv_out_size = conv_out_size\n", + " self._filter_size = filter_size\n", + " self._stride = stride\n", + " self._channels = channels\n", + " self._central_hidden_size = central_hidden_size\n", + " self._central_output_size = central_output_size\n", + " self._output_hidden_size = output_hidden_size\n", + " self._num_classes = num_classes\n", + "\n", + " self._weight_initializer = snt.initializers.TruncatedNormal(\n", + " mean=0.0, stddev=0.1)\n", + " self._bias_initializer = snt.initializers.Constant(0.1)\n", + "\n", + " # Feature co-ordinate matrix\n", + " cols = tf.constant([[[x / float(self._conv_out_size)]\n", + " for x in range(self._conv_out_size)]\n", + " for _ in range(self._conv_out_size)])\n", + " rows = tf.transpose(cols, [1, 0, 2])\n", + " # Append feature co-ordinates\n", + " self._locs = tf.reshape(\n", + " tf.concat([cols, rows], 2),\n", + " [self._conv_out_size * self._conv_out_size, 2])\n", + "\n", + " # Define all model components\n", + " self.input_module = snt.Conv2D(\n", + " output_channels=self._channels,\n", + " kernel_shape=self._filter_size,\n", + " stride=self._stride,\n", + " padding='VALID',\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.central_hidden = snt.Linear(\n", + " output_size=self._central_hidden_size,\n", + " with_bias=False,\n", + " w_init=self._weight_initializer)\n", + " self.central_output = snt.Linear(\n", + " output_size=self._central_output_size,\n", + " with_bias=False,\n", + " w_init=self._weight_initializer)\n", + " self.output_hidden = snt.Linear(\n", + " output_size=self._output_hidden_size,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.output = snt.Linear(\n", + " output_size=self._num_classes,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + "\n", + " def _reinitialise_weight(self, submodule):\n", + " \"\"\"Re-initialise a weight variable.\"\"\"\n", + " submodule.w.assign(submodule.w_init(submodule.w.shape, submodule.w.dtype))\n", + "\n", + " def _reinitialise_bias(self, submodule):\n", + " \"\"\"Re-initialise a bias variable.\"\"\"\n", + " submodule.b.assign(submodule.b_init(submodule.b.shape, submodule.b.dtype))\n", + "\n", + " def reinitialise_input_module(self):\n", + " \"\"\"Re-initialise the weights of the input convnet.\"\"\"\n", + " self._reinitialise_weight(self.input_module)\n", + " self._reinitialise_bias(self.input_module)\n", + "\n", + " def reinitialise_central_module(self):\n", + " \"\"\"Re-initialise the weights of the central layers.\"\"\"\n", + " self._reinitialise_weight(self.central_hidden)\n", + " self._reinitialise_weight(self.central_output)\n", + "\n", + " def reinitialise_output_module(self):\n", + " \"\"\"Re-initialise the weights of the output MLP.\"\"\"\n", + " self._reinitialise_weight(self.output_hidden)\n", + " self._reinitialise_weight(self.output)\n", + " self._reinitialise_bias(self.output_hidden)\n", + " self._reinitialise_bias(self.output)\n", + "\n", + " def __call__(self, x, tasks, batch_size):\n", + " \"\"\"Applies model to image x yielding a label.\n", + "\n", + " Args:\n", + " x: tensor. Input image.\n", + " tasks: tensor. List of task sizes of length batch_size.\n", + " batch_size: scalar. Batch size.\n", + "\n", + " Returns:\n", + " output: tensor. Output of the model.\n", + " \"\"\"\n", + " features = tf.nn.relu(self.input_module(x))\n", + " features = tf.reshape(features, [batch_size, -1, self._channels])\n", + "\n", + " # Append location\n", + " locs = tf.tile(tf.expand_dims(self._locs, 0), [batch_size, 1, 1])\n", + " features_locs = tf.concat([features, locs], 2)\n", + " # (batch_size, conv_out_size*conv_out_size, channels+2)\n", + "\n", + " features_flat = tf.reshape(\n", + " features_locs,\n", + " [batch_size, (self._conv_out_size**2), self._channels + 2])\n", + " # (batch_size, conv_out_size*conv_out_size, (channels+2))\n", + "\n", + " # Compute all possible pairs of features\n", + " num_features = self._conv_out_size * self._conv_out_size\n", + " indexes = tf.range(num_features)\n", + " receiver_indexes = tf.tile(indexes, [num_features])\n", + " sender_indexes = tf.reshape(\n", + " tf.transpose(\n", + " tf.reshape(receiver_indexes, [num_features, num_features])), [-1])\n", + " receiver_objects = tf.gather(features_flat, receiver_indexes, axis=1)\n", + " sender_objects = tf.gather(features_flat, sender_indexes, axis=1)\n", + " object_pairs = tf.concat([sender_objects, receiver_objects], -1)\n", + " # (batch_size, (conv_out_size*conv_out_size)^2, (channels+2)*2)\n", + "\n", + " # Compute \"relations\"\n", + " central_activations = tf.nn.relu(\n", + " snt.BatchApply(self.central_hidden)(object_pairs))\n", + " # (batch_size, (conv_out_size*conv_out_size)^2, central_hidden_size)\n", + " central_out_activations = tf.nn.relu(\n", + " snt.BatchApply(self.central_output)(central_activations))\n", + " # (batch_size, (conv_out_size*conv_out_size)^2, central_output_size)\n", + "\n", + " # Aggregate relations\n", + " central_out_mean = tf.reduce_mean(central_out_activations, 1)\n", + " # (batch_size, central_output_size)\n", + "\n", + " # Append task id\n", + " central_out_locs = tf.concat([central_out_mean, tasks], 1)\n", + "\n", + " # Apply output network\n", + " hidden_activations = tf.nn.relu(self.output_hidden(central_out_locs))\n", + " output = self.output(hidden_activations)\n", + "\n", + " return output\n", + "\n", + "\n", + "class CombineValues(snt.Module):\n", + " \"\"\"Custom module for computing tensor products in SelfAttentionNet.\"\"\"\n", + "\n", + " def __init__(self, heads, w_init=None):\n", + " \"\"\"Initialise the CombineValues module.\n", + "\n", + " Args:\n", + " heads: scalar. Number of heads over which to combine the values.\n", + " w_init: an initializer. A sonnet snt.initializers.\n", + " \"\"\"\n", + " super(CombineValues, self).__init__(name='CombineValues')\n", + " self._heads = heads\n", + " self.w_init = w_init\n", + "\n", + " @snt.once\n", + " def _initialize(self, inputs):\n", + " num_features = inputs.shape[2]\n", + " if self.w_init is None:\n", + " self.w_init = snt.initializers.TruncatedNormal(mean=0.0, stddev=0.1)\n", + " self.w = tf.Variable(\n", + " self.w_init([self._heads, 1, num_features], inputs.dtype), name='w')\n", + "\n", + " def __call__(self, inputs):\n", + " self._initialize(inputs)\n", + " return tf.einsum('bhrv,har-\u003ebhav', inputs, self.w)\n", + "\n", + "\n", + "class SelfAttentionNet(snt.Module):\n", + " \"\"\"Self-attention network model for supervised learning.\n", + "\n", + " Input net = convnet\n", + " Central net = self-attention module\n", + " Output net = 2-layer MLP\n", + " \"\"\"\n", + "\n", + " def __init__(self,\n", + " resolution,\n", + " conv_out_size,\n", + " filter_size,\n", + " stride,\n", + " channels,\n", + " heads,\n", + " key_size,\n", + " value_size,\n", + " output_hidden_size,\n", + " num_classes,\n", + " num_tasks,\n", + " name='SelfAttention'):\n", + " \"\"\"Initialise the self-attention net model.\n", + "\n", + " Args:\n", + " resolution: scalar. Resolution of raw images.\n", + " conv_out_size: scalar. Downsampled resolution of the images.\n", + " filter_size: scalar. Filter size for the convnet.\n", + " stride: scalar. Stride size for the convnet.\n", + " channels: scalar. Number of channels of the convnet.\n", + " heads: scalar. Number of self-attention net heads.\n", + " key_size: scalar. Size of the keys.\n", + " value_size: scalar. Size of values in self-attention module.\n", + " output_hidden_size: a scalar (int). Size of hidden layer in output MLP.\n", + " num_classes: scalar. Number of classes in the output label.\n", + " num_tasks: scalar. Max number of possible tasks.\n", + " name: a str. The name of the model.\n", + " \"\"\"\n", + " super(SelfAttentionNet, self).__init__(name=name)\n", + " self.model_desc = 'Self-attention net baseline'\n", + " self._resolution = resolution\n", + " self._conv_out_size = conv_out_size\n", + " self._filter_size = filter_size\n", + " self._stride = stride\n", + " self._channels = channels\n", + " self._heads = heads\n", + " self._key_size = key_size\n", + " self._value_size = value_size\n", + " self._output_hidden_size = output_hidden_size\n", + " self._num_classes = num_classes\n", + "\n", + " self._weight_initializer = snt.initializers.TruncatedNormal(\n", + " mean=0.0, stddev=0.1)\n", + " self._bias_initializer = snt.initializers.Constant(0.1)\n", + "\n", + " # Feature co-ordinate matrix\n", + " cols = tf.constant([[[x / float(self._conv_out_size)]\n", + " for x in range(self._conv_out_size)]\n", + " for _ in range(self._conv_out_size)])\n", + " rows = tf.transpose(cols, [1, 0, 2])\n", + " # Append feature co-ordinates\n", + " self._locs = tf.reshape(\n", + " tf.concat([cols, rows], 2),\n", + " [self._conv_out_size * self._conv_out_size, 2])\n", + "\n", + " # Define all model components\n", + " self.input_module = snt.Conv2D(\n", + " output_channels=self._channels,\n", + " kernel_shape=self._filter_size,\n", + " stride=self._stride,\n", + " padding='VALID',\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.get_keys = snt.Linear(\n", + " output_size=self._heads * self._key_size,\n", + " with_bias=False,\n", + " w_init=self._weight_initializer)\n", + " self.get_queries = snt.Linear(\n", + " output_size=self._heads * self._key_size,\n", + " with_bias=False,\n", + " w_init=self._weight_initializer)\n", + " self.get_values = snt.Linear(\n", + " output_size=self._heads * self._value_size,\n", + " with_bias=False,\n", + " w_init=self._weight_initializer)\n", + " self.central_output = CombineValues(\n", + " heads=self._heads, w_init=self._weight_initializer)\n", + " self.output_hidden = snt.Linear(\n", + " output_size=self._output_hidden_size,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + " self.output = snt.Linear(\n", + " output_size=self._num_classes,\n", + " w_init=self._weight_initializer,\n", + " b_init=self._bias_initializer)\n", + "\n", + " def _reinitialise_weight(self, submodule):\n", + " \"\"\"Re-initialise a weight variable.\"\"\"\n", + " submodule.w.assign(submodule.w_init(submodule.w.shape, submodule.w.dtype))\n", + "\n", + " def _reinitialise_bias(self, submodule):\n", + " \"\"\"Re-initialise a bias variable.\"\"\"\n", + " submodule.b.assign(submodule.b_init(submodule.b.shape, submodule.b.dtype))\n", + "\n", + " def reinitialise_input_module(self):\n", + " \"\"\"Re-initialise the weights of the input convnet.\"\"\"\n", + " self._reinitialise_weight(self.input_module)\n", + " self._reinitialise_bias(self.input_module)\n", + "\n", + " def reinitialise_central_module(self):\n", + " \"\"\"Re-initialise the weights of the central PrediNet module.\"\"\"\n", + " self._reinitialise_weight(self.get_keys)\n", + " self._reinitialise_weight(self.get_queries)\n", + " self._reinitialise_weight(self.get_values)\n", + " self._reinitialise_weight(self.central_output)\n", + "\n", + " def reinitialise_output_module(self):\n", + " \"\"\"Re-initialise the weights of the output MLP.\"\"\"\n", + " self._reinitialise_weight(self.output_hidden)\n", + " self._reinitialise_weight(self.output)\n", + " self._reinitialise_bias(self.output_hidden)\n", + " self._reinitialise_bias(self.output)\n", + "\n", + " def __call__(self, x, tasks, batch_size):\n", + " \"\"\"Applies model to image x yielding a label.\n", + "\n", + " Args:\n", + " x: tensor. Input images of size (batch_size, RESOLUTION, RESOLUTION, 3).\n", + " tasks: tensor. List of task sizes of size (batch_size, NUM_TASKS).\n", + " batch_size: scalar (int). Batch size.\n", + "\n", + " Returns:\n", + " output: tensor. Output of the model of size (batch_size, NUM_CLASSES).\n", + " \"\"\"\n", + " features = tf.nn.relu(self.input_module(x))\n", + " features = tf.reshape(features, [batch_size, -1, self._channels])\n", + "\n", + " # Append location\n", + " locs = tf.tile(tf.expand_dims(self._locs, 0), [batch_size, 1, 1])\n", + " features_locs = tf.concat([features, locs], 2)\n", + " # (batch_size, conv_out_size*conv_out_size, channels+2)\n", + "\n", + " # Keys\n", + " keys = snt.BatchApply(self.get_keys)(features_locs)\n", + " #(batch_size, conv_out_size*conv_out_size, heads*key_size)\n", + " keys = tf.reshape(keys, [\n", + " batch_size, self._conv_out_size * self._conv_out_size, self._heads,\n", + " self._key_size\n", + " ])\n", + " #(batch_size, conv_out_size*conv_out_size, heads, key_size)\n", + "\n", + " # Queries\n", + " queries = snt.BatchApply(self.get_queries)(features_locs)\n", + " #(batch_size, conv_out_size*conv_out_size, heads*key_size)\n", + " queries = tf.reshape(queries, [\n", + " batch_size, self._conv_out_size * self._conv_out_size, self._heads,\n", + " self._key_size\n", + " ])\n", + " #(batch_size, conv_out_size*conv_out_size, heads, key_size)\n", + "\n", + " # Values\n", + " values = snt.BatchApply(self.get_values)(features_locs)\n", + " #(batch_size, conv_out_size*conv_out_size, heads*value_size)\n", + " values = tf.reshape(values, [\n", + " batch_size, self._conv_out_size * self._conv_out_size, self._heads,\n", + " self._value_size\n", + " ])\n", + " #(batch_size, conv_out_size*conv_out_size, heads, values_size)\n", + "\n", + " # Attention weights\n", + " queries_t = tf.transpose(queries, perm=[0, 2, 1, 3])\n", + " # (batch_size, heads, conv_out_size*conv_out_size, key_size)\n", + " keys_t = tf.transpose(keys, perm=[0, 2, 3, 1])\n", + " # (batch_size, heads, key_size, conv_out_size*conv_out_size)\n", + " att = tf.nn.softmax(tf.matmul(queries_t, keys_t))\n", + " # (batch_size, heads, conv_out_size^2, conv_out_size^2)\n", + "\n", + " # Apply attention weights to values\n", + " values_t = tf.transpose(values, perm=[0, 2, 1, 3])\n", + " # (batch_size, heads, conv_out_size*conv_out_size, value_size)\n", + " values_out = tf.matmul(att, values_t)\n", + " # (batch_size, heads, conv_out_size*conv_out_size, value_size)\n", + "\n", + " # Compute self-attention head output\n", + " central_out = snt.Flatten()(tf.squeeze(self.central_output(values_out)))\n", + " # (batch_size, heads*value_size)\n", + "\n", + " # Append task id\n", + " central_out_plus = tf.concat([central_out, tasks], 1)\n", + "\n", + " # Apply output network\n", + " hidden_activations = tf.nn.relu(self.output_hidden(central_out_plus))\n", + " output = self.output(hidden_activations)\n", + "\n", + " return output" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "F-Xv4cwLs5NC" + }, + "source": [ + "## Training\n", + "\n", + "We now define functions for calculating the accuracy, loss, and gradients of our\n", + "model, as well as the training function. The training function takes a model and\n", + "a task name, draws batches from the training set (pentos) to train, and from the\n", + "validation set (hexos) to report progress periodically. The model is trained\n", + "with a learning rate of `0.01` using the `GradientDescentOptimizer`." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "OXAgc6k_RQXf" + }, + "outputs": [], + "source": [ + "def accuracy(y, y_labels):\n", + " \"\"\"Returns the average accuracy between model predictions and labels.\n", + "\n", + " Args:\n", + " y: a tensor (batch_size, NUM_CLASSES) containing the model predictions.\n", + " y_labels: a tensor of size (batch_size, NUM_CLASSES) containing 1-hot\n", + " embeddings of the labels.\n", + " \"\"\"\n", + " correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_labels, 1))\n", + "\n", + " return tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", + "\n", + "\n", + "def loss(y, y_labels):\n", + " \"\"\"Returns the cross entropy loss between the predictions and the labels.\n", + "\n", + " Args:\n", + " y: a tensor (batch_size, NUM_CLASSES) containing the model predictions.\n", + " y_labels: a tensor of size (batch_size, NUM_CLASSES) containing 1-hot\n", + " embeddings of the labels.\n", + "\n", + " Returns:\n", + " cross_entropy: A tensor containing the average cross entropy between the\n", + " predictions and the model.\n", + " \"\"\"\n", + "\n", + " cross_entropy = tf.reduce_mean(\n", + " tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_labels))\n", + " return cross_entropy\n", + "\n", + "\n", + "def grad(model, x, tasks, y_labels, batch_size, variable_list):\n", + " \"\"\"Compute the gradients of the loss wirht respect the the model parameters.\n", + "\n", + " Args:\n", + " model: An instance of the model being trained.\n", + " x: tensor. Input images of size (batch_size, RESOLUTION, RESOLUTION, 3).\n", + " tasks: tensor. List of task sizes of size (batch_size, NUM_TASKS).\n", + " y_labels: a tensor of size (batch_size, NUM_CLASSES) containing 1-hot\n", + " embeddings of the labels.\n", + " batch_size: scalar (int). The number of samples in the batch.\n", + " variable_list: list. Contains all the variables to be updated.\n", + "\n", + " Returns:\n", + " A list of Tensors containing the gradients for each of the variables in the\n", + " variable_list with respect to the loss.\n", + " \"\"\"\n", + "\n", + " with tf.GradientTape() as tape:\n", + " y = model(x=x, tasks=tasks, batch_size=batch_size)\n", + " loss_value = loss(y, y_labels)\n", + " return tape.gradient(loss_value, variable_list)\n", + "\n", + "\n", + "def train_model(model, task_name, variable_list, epsilon=0.01):\n", + " \"\"\"Trains the given model on the given dataset.\n", + "\n", + " Args:\n", + " model: An instance of the model to be trained.\n", + " task_name: string. The name of the task to train on.\n", + " variable_list: list. Contains all the variables to be updated.\n", + " epsilon: float. The early stopping threshold.\n", + "\n", + " Returns:\n", + " A tuple containing the trained model and a list of accuracies during\n", + " training.\n", + " \"\"\"\n", + "\n", + " print('Training {0} on {1}\\n'.format(model.model_desc, TRAINING_SET_NAME))\n", + "\n", + " train_iterations = 100000\n", + " train_batch_size = 10\n", + " valid_batch_size = 250\n", + "\n", + " training_set = get_dataset(task_name, TRAINING_SET_NAME, train_batch_size)\n", + " valid_set = iter(\n", + " get_dataset(task_name, VALIDATION_SET_NAME, valid_batch_size))\n", + "\n", + " valid_data = next(valid_set)\n", + " x_valid = valid_data[0]\n", + " y_valid_labels = valid_data[2]\n", + " tasks_valid = valid_data[4]\n", + "\n", + " optimizer = snt.optimizers.SGD(learning_rate=0.01)\n", + "\n", + " # Initial accuracy for reference.\n", + " y_valid = model(x_valid, tasks_valid, valid_batch_size)\n", + " acc = accuracy(y_valid, y_valid_labels)\n", + " accuracies = [acc]\n", + " print('Accuracy for batch 0 {:.3f}\\n'.format(acc))\n", + "\n", + " converged = False\n", + " for train_iter, train_data in enumerate(training_set.take(train_iterations)):\n", + "\n", + " if not converged:\n", + " x_train = train_data[0]\n", + " y_train_labels = train_data[2]\n", + " tasks_train = train_data[4]\n", + " grads = grad(model, x_train, tasks_train, y_train_labels,\n", + " train_batch_size, variable_list)\n", + " optimizer.apply(grads, variable_list)\n", + "\n", + " # Compute accuracy\n", + " if (train_iter + 1) % 500 == 0:\n", + " valid_data = next(valid_set)\n", + " x_valid = valid_data[0]\n", + " y_valid_labels = valid_data[2]\n", + " tasks_valid = valid_data[4]\n", + " y_valid = model(x_valid, tasks_valid, valid_batch_size)\n", + " acc = accuracy(y_valid, y_valid_labels)\n", + " accuracies.append(acc)\n", + " converged = (1 - acc) \u003c epsilon\n", + "\n", + " if (train_iter + 1) % 20000 == 0:\n", + " if not converged:\n", + " print('Accuracy for batch {0} {1:.3f}\\n'.format(train_iter + 1, acc))\n", + "\n", + " return (model, accuracies)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "jNV52vCl4yLI" + }, + "source": [ + "## Testing\n", + "\n", + "Here we define a function that will test the accuracy of the trained model on a\n", + "given task, using the test set (stripes)." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "xKUcjusr3Icn" + }, + "outputs": [], + "source": [ + "def test_model(model, task_name):\n", + " \"\"\"Tests the given (trained) model on the given dataset and prints accuracy.\n", + "\n", + " Args:\n", + " model: An instance of the trained model.\n", + " task_name: string. The name of the task to train on.\n", + " \"\"\"\n", + "\n", + " print('Testing {0} on {1}'.format(model.model_desc, TEST_SET_NAME))\n", + "\n", + " batch_size = 250\n", + "\n", + " test_set = iter(get_dataset(task_name, TEST_SET_NAME, batch_size))\n", + " test_data = next(test_set)\n", + "\n", + " x_test = test_data[0]\n", + " y_test_labels = test_data[2]\n", + " tasks_test = test_data[4]\n", + "\n", + " y_test = model(x_test, tasks_test, batch_size)\n", + "\n", + " test_accuracy = accuracy(y_test, y_test_labels)\n", + " print('Accuracy for test set {:.3f}\\n'.format(test_accuracy))\n", + "\n", + " # Show first 10 samples\n", + " plt.subplots(figsize=(20, 5))\n", + "\n", + " for i in range(10):\n", + " image = x_test[i]\n", + " label = tf.argmax(y_test[i])\n", + " task = tf.argmax(tasks_test[i])\n", + "\n", + " plt.subplot(1, 10, i + 1)\n", + " show_image(image)\n", + " plt.title('Task {0} label {1}'.format(task, label))\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "_bH32LrP4_fF" + }, + "source": [ + "## The Multi-task experiment\n", + "\n", + "Now that all the necesary functions for running the experiment have been\n", + "defined, we will create our experiment. In order to assess the benefits of\n", + "pre-training, we will be conducting a four-stage experiment. These four stages\n", + "are:\n", + "\n", + "1. Train model A on target tasks from scratch\n", + "2. Pre-train a new model B on pre-training tasks\n", + "3. Retrain model B on target tasks with input and central network weights\n", + " frozen, and output weights randomised\n", + "4. Retrain on target tasks with input weights only frozen, and central and\n", + " output weights randomised\n", + "\n", + "What we expect to see is that during the third stage, the model can utilise the\n", + "representations learned from the pre-training task, and train on the original\n", + "task using fewer samples than when trained on the original task from scratch." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "Vao9Qxcy-4P3" + }, + "outputs": [], + "source": [ + "def multitask_experiment(model_name, tasks, pre_tasks):\n", + " \"\"\"Carries out a four-stage experiment to assess benefits of pre-training.\n", + "\n", + " Args:\n", + " model_name: string. Indicates which model is to be evaluated.\n", + " tasks: string. The name of the target task(s) dataset.\n", + " pre_tasks: string. The name of the pre-training tasks dataset.\n", + "\n", + " Returns:\n", + " model. The final trained model.\n", + " [accs1, accs2, accs3, accs4]. Lists of accuracies during training\n", + " for each of the four stages of the experiment.\n", + " \"\"\"\n", + "\n", + " print('\\n *** Starting experiment with {} model \\n'.format(model_name))\n", + " print('Target task(s): {}'.format(tasks))\n", + " print('Curriculum task(s): {} \\n'.format(pre_tasks))\n", + "\n", + " # 1. Train on target task(s) without pre-training\n", + " print('\\nTARGET TASK(S) WITHOUT PRE-TRAINING\\n')\n", + "\n", + " if model_name == 'ConvNetMLP1L':\n", + " model = ConvNetMLP1L(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " central_output_size=CENTRAL_OUTPUT_SIZE,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " elif model_name == 'ConvNetMLP2L':\n", + " model = ConvNetMLP2L(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " central_hidden_size=CENTRAL_HIDDEN_SIZE,\n", + " central_output_size=CENTRAL_OUTPUT_SIZE,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " elif model_name == 'RelationNet':\n", + " model = RelationNet(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " central_hidden_size=RN_HIDDEN_SIZE,\n", + " central_output_size=CENTRAL_OUTPUT_SIZE,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " elif model_name == 'SelfAttentionNet':\n", + " model = SelfAttentionNet(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " heads=HEADS_SA,\n", + " key_size=16,\n", + " value_size=VALUE_SIZE,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " elif model_name == 'PrediNet':\n", + " model = PrediNet4MultiTask(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " relations=RELATIONS_P,\n", + " heads=HEADS_P,\n", + " key_size=16,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " else:\n", + " raise ValueError('Model {0} not recognised'.format(model_name))\n", + " # Connect model\n", + " _ = model(\n", + " tf.zeros([10, RESOLUTION, RESOLUTION, 3]), tf.zeros([10, NUM_TASKS]), 10)\n", + " variable_list = model.trainable_variables\n", + " (model, accs1) = train_model(model, tasks, variable_list, epsilon=0.01)\n", + " test_model(model, tasks)\n", + "\n", + " # 2. Pre-train on multi-task curriculum\n", + " print('PRE-TRAINING CURRICULUM TASKS\\n')\n", + "\n", + " if model_name == 'ConvNetMLP1L':\n", + " model = ConvNetMLP1L(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " central_output_size=CENTRAL_OUTPUT_SIZE,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " elif model_name == 'ConvNetMLP2L':\n", + " model = ConvNetMLP2L(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " central_hidden_size=CENTRAL_HIDDEN_SIZE,\n", + " central_output_size=CENTRAL_OUTPUT_SIZE,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " elif model_name == 'RelationNet':\n", + " model = RelationNet(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " central_hidden_size=RN_HIDDEN_SIZE,\n", + " central_output_size=CENTRAL_OUTPUT_SIZE,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " elif model_name == 'SelfAttentionNet':\n", + " model = SelfAttentionNet(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " heads=HEADS_SA,\n", + " key_size=16,\n", + " value_size=VALUE_SIZE,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " elif model_name == 'PrediNet':\n", + " model = PrediNet4MultiTask(\n", + " resolution=RESOLUTION,\n", + " conv_out_size=CONV_OUT_SIZE,\n", + " filter_size=FILTER_SIZE,\n", + " stride=STRIDE,\n", + " channels=NUM_CHANNELS,\n", + " relations=RELATIONS_P,\n", + " heads=HEADS_P,\n", + " key_size=16,\n", + " output_hidden_size=8,\n", + " num_classes=NUM_CLASSES,\n", + " num_tasks=NUM_TASKS)\n", + " else:\n", + " raise ValueError('Model {0} not recognised'.format(model_name))\n", + " # Connect model\n", + " _ = model(\n", + " tf.zeros([10, RESOLUTION, RESOLUTION, 3]), tf.zeros([10, NUM_TASKS]), 10)\n", + " variable_list = model.trainable_variables\n", + " (model, accs2) = train_model(model, pre_tasks, variable_list, epsilon=0.01)\n", + " test_model(model, pre_tasks)\n", + "\n", + " # Freeze some weights and reset others\n", + " print('Freezing weights\\n')\n", + " variable_list = [] # freeze all weights\n", + "\n", + " # 3. Unfreeze output network weights and retrain on target task(s)\n", + " print('TARGET TASK(S) AFTER PRE-TRAINING, INPUT \u0026 CENTRAL NETS FROZEN\\n')\n", + " # Reset output network weights\n", + " model.reinitialise_output_module()\n", + " # Unfreeze output network weights\n", + " variable_list = variable_list + [\n", + " model.output_hidden.w, model.output_hidden.b, model.output.w,\n", + " model.output.b\n", + " ]\n", + " # Retrain model\n", + " (model, accs3) = train_model(model, tasks, variable_list, epsilon=0.01)\n", + " test_model(model, tasks)\n", + "\n", + " # 4. Unfreeze central network weights and retrain again\n", + " print('TARGET TASK(S) AFTER PRE-TRAINING, INPUT NET ONLY FROZEN\\n')\n", + " # Reset output network weights\n", + " model.reinitialise_output_module()\n", + " # Reset central network weights\n", + " model.reinitialise_central_module()\n", + " # Unfreeze central network weights\n", + " if model_name == 'ConvNetMLP1L':\n", + " variable_list = variable_list + [\n", + " model.central_hidden.w, model.central_hidden.b\n", + " ]\n", + " elif model_name == 'ConvNetMLP2L':\n", + " variable_list = variable_list + [\n", + " model.central_hidden.w, model.central_hidden.b, model.central_output.w,\n", + " model.central_output.b\n", + " ]\n", + " elif model_name == 'RelationNet':\n", + " variable_list = variable_list + [\n", + " model.central_hidden.w, model.central_output.w\n", + " ]\n", + " elif model_name == 'SelfAttentionNet':\n", + " variable_list = variable_list + [\n", + " model.get_keys.w, model.get_queries.w, model.get_values.w,\n", + " model.central_output.w\n", + " ]\n", + " elif model_name == 'PrediNet':\n", + " variable_list = variable_list + [\n", + " model.get_keys.w, model.get_query1.w, model.get_query2.w,\n", + " model.embed_entities.w\n", + " ]\n", + " else:\n", + " raise ValueError('Model {0} not recognised'.format(model_name))\n", + " # Retrain model\n", + " (model, accs4) = train_model(model, tasks, variable_list, epsilon=0.01)\n", + " test_model(model, tasks)\n", + "\n", + " return (model, [accs1, accs2, accs3, accs4])\n", + "\n", + "\n", + "def plot_multitask_accuracies(model, accuracies):\n", + " \"\"\"Plots the accuracies from the experiments.\n", + "\n", + " Args:\n", + " model: An instance of the trained model.\n", + " accuracies: The list of accuracies returned by the experiment.\n", + " \"\"\"\n", + "\n", + " ipdp = 500 # iterations per data point\n", + "\n", + " # Plot everything\n", + " plt.plot(np.arange(len(accuracies[0])) * ipdp, accuracies[0])\n", + " plt.plot(np.arange(len(accuracies[1])) * ipdp, accuracies[1])\n", + " plt.plot(np.arange(len(accuracies[2])) * ipdp, accuracies[2])\n", + " plt.plot(np.arange(len(accuracies[3])) * ipdp, accuracies[3])\n", + "\n", + " # Add title, lables\n", + " plt.title('{} with multi-task pre-training'.format(model.model_desc))\n", + " plt.xlabel('Batches')\n", + " plt.ylabel('Accuracy')\n", + " plt.ylim((0.4, 1.0))\n", + " plt.legend([\n", + " 'No pre-training', 'Curriculum tasks', 'Input \u0026 central net pre-trained',\n", + " 'Input net only pre-trained'\n", + " ],\n", + " loc='best')\n", + " plt.grid(False)\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "1xsRmDRhNcCv" + }, + "source": [ + "## Running the experiment\n", + "\n", + "You can run the experiment with one of the following model names:\n", + "\n", + "1. **`'PrediNet'`** - Central module is the PrediNet.\n", + "2. **`'ConvNetMLP1L'`** (baseline). Central module is a single fully-connected\n", + " layer.\n", + "3. **`'ConvNetMLP2L'`** (baseline). Central module is two fully-connected\n", + " layers.\n", + "4. **`'RelationNet'`** (baseline). Central module is a relation net\n", + " [Santoro et al](http://papers.nips.cc/paper/7082-a-simple-neural-network-module-for-relational-reasoning).\n", + "5. **`'SelfAttentionNet'`** (baseline). Central module is a self-attention\n", + " network with the same number of heads as the PrediNet.\n", + "\n", + "For each name, the appropriate central module will be invoked. The input and\n", + "output modules are the same for all of them." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "xRAkQBaiKP-J" + }, + "outputs": [], + "source": [ + "(trained_model, acc_list) = multitask_experiment('PrediNet', TASKS, PRE_TASKS)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "LK4lXxZduWCI" + }, + "source": [ + "And finally let's print the learning curves. If the green curve increase above\n", + "chance much earlier than the blue one, there is evidence that the pre-training\n", + "task has led to the network learning reusable representations of the input." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "height": 621 + }, + "colab_type": "code", + "executionInfo": { + "elapsed": 995, + "status": "ok", + "timestamp": 1566473797728, + "user": { + "displayName": "", + "photoUrl": "", + "userId": "" + }, + "user_tz": -60 + }, + "id": "UhiN-CP80dIm", + "outputId": "0538e0ef-98d6-4d08-abbf-beb3d2ce9eff" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAJcCAYAAABXOLh8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsnXeYG+X1th+11UpaabW9F6/7rg02\ntmENNgZCDDZgwBgSQgmBYEicYBL4hYAhEFowhMBHCDWEQEIJGIMpNhADLgEb997L9t606v374+id\nGXVpi3cx731de2kljUbTNPPMOc97jszv9/vB4XA4HA6Hwxky5EO9ABwOh8PhcDjfd7gg43A4HA6H\nwxliuCDjcDgcDofDGWK4IONwOBwOh8MZYrgg43A4HA6HwxliuCDjcDgcDofDGWK4IONwvmPU1NRA\nJpPB4/EAAObMmYPXXnttiJcqnFtvvRUPPfRQ1PcfeOABXHvttSdwiURuuOEG3HvvvVHff/TRR/Hz\nn/980JcjdF+eDMTb732dlsM52eGCjMMZBMrLy6HRaJCWloa8vDz87Gc/g8ViGZTvWrVqFX76058C\nAP75z39CJpPhiSeeCJqmuLgYa9asiTuvgRQIL7zwAu677z4AwJo1a1BcXNzveQ4GkZbtnnvuwd//\n/veonznnnHNivv9dpby8HKtXr+7XPKT7fSCn5XBOdrgg43AGiY8++ggWiwXbtm3D5s2b8fDDD4dN\n4/f74fP5BvR7MzMzsXTpUvT29g7ofDnfLbxe74DP82SK5HE4ww0uyDicQaaoqAhz5szBnj17AFB0\nZcmSJTjrrLOg1Wpx7NgxmEwm3HTTTSgoKEBRURHuvfde4YLq9Xpx5513Ijs7GxUVFfjkk0+C5h8a\nrRk/fjymT5+Op556KuLy+Hw+PPbYYxg5ciSysrJw1VVXoaurCwBw9tlnAwCMRiPS0tKwYcOGoM86\nHA5oNBp0dHQAAB5++GEolUpB/N177724/fbbAYhpQavVijlz5qCpqQlpaWlIS0tDU1MTAMDlcuH6\n66+HXq9HVVUVtmzZEnU7ymQyPPfccxg9ejT0ej3uu+8+HD16FNOnT4fBYMBVV10Fl8sFgCKFM2bM\nCPv8kSNHgl6Ltmyx0qlLlizB+vXr8atf/QppaWn41a9+BQBYvHgxSkpKYDAYMGXKFKxfv174zKZN\nmzB16lQYDAbk5eXht7/9bcR5v/feeygvLxeOFSkskvfoo48iOzsb5eXleOONN4T3b7jhBvziF7/A\n3LlzodPp8NVXX8HpdOLOO+9EaWkp8vLycOutt8Jut0f87uuuuw51dXW45JJLkJaWhscff1yImL7y\nyisoLS3FeeedBwC48sorkZ+fj/T0dJx99tnYu3dv0HKwdDBb5ieffBK5ubkoKCjAq6++2qdpOzs7\ncckll8BgMGDatGm49957w/Yxh/NdhgsyDmeQqa+vx8qVKzF58mThtX/961946aWXYDabUVZWhp/+\n9KdQKpU4cuQItm/fjs8//1wQWS+//DI+/vhjbN++HVu2bMGyZcvifudDDz2Ep556ShBaUp555hl8\n8MEHWLt2LZqampCRkYFFixYBANatWwcA6OnpgcViwfTp04M+m5qaimnTpmHt2rXC9GVlZfj666+F\n57NmzQr6jE6nw6pVq1BYWAiLxQKLxYLCwkIAwIcffogf//jH6Onpwbx58wRxE41PP/0UW7duxcaN\nG/H4449j4cKFeOONN1BfX489e/bgrbfeirttEl22aDzyyCOYOXMmnn32WVgsFjz77LMAgGnTpmHH\njh3o6urCT37yE1x55ZVwOBwASKwtXrwYvb29OHr0KK666qqw+b766qu46667sHr1akyYMCHid7e0\ntKCjowONjY147bXXsHDhQhw8eFB4/80338SSJUtgNpsxY8YM3HXXXTh06BB27NiBI0eOoLGxEQ8+\n+GDEef/rX/9CaWmpENn93e9+J7y3du1a7N+/H5999hkA8i0ePnwYbW1tOO2003DNNddE3V4tLS0w\nmUxobGzEK6+8gkWLFqG7uzvpaRctWgSdToeWlha89tprw9I3yeH0By7IOJxB4rLLLoPRaMSMGTMw\na9Ys3HPPPcJ7N9xwA6qqqqBUKtHV1YVVq1bh6aefhk6nQ25uLn7zm9/g7bffBgC88847uP3221FS\nUoLMzEzcfffdcb970qRJmD17NpYuXRr23osvvohHHnkExcXFUKvVeOCBB7Bs2bKE01GzZs3C2rVr\n4fF4sGvXLtx2221Yu3YtHA4HNm/ejJkzZya4hYAZM2Zg7ty5UCgUuO6667Bz586Y0991110wGAyo\nqqrChAkTMHv2bFRUVCA9PR1z5szB9u3bE/7ugebaa69FVlYWlEol7rjjDjidTkEsqVQqHDlyBB0d\n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\nzJkz2b9/P+np6UyZMoXf/e53fq9lMpk4fvw4AB06dKh1XC+//DIffvghOp2OMWPGMHfuXA4fPswj\njzzCuXPnCA0N5b333qNbt25MnTqVyMhIsrKyOH36NC+//DITJ06sNp6YmBi++uorbDYbpaWlrFq1\nivHjx1NQUIDdbmf27NmMHz++xjHl5uYyZswYhg4dypYtW2jbti0rV67EYrEEHFt+fj6rVq1i06ZN\nzJ49m88++4xOnTpp55s6dSohISHs3buXM2fO8Je//IVx48axaNEiv3GuX7+eV155hb///e+Ul5cz\nYcIEnnvuuWpje+edd9Dr9SxZsoQ333yT+fPnExsby65du+jXrx+TJk1ixowZWK1WLBYLCxcuJDU1\nlY0bN/Lqq6/y5ZdfMmvWLH7++Wd++uknfv75Z2bMmKFlz5YsWcIbb7xBRUUFgwYN4u2330av17Nw\n4ULmzJlDUlISXbt29dtjNBgkIBNCCHFV2LVrF3v37qVNmzZcd911bN68maFDhwLufSm3b9/OBx98\nwIwZM/jyyy9rPM/cuXO1D/ZAOnXqxNy5c+nbty/jxo2r8Txff/01X3zxBdu2bSM0NFTb2Hv69Om8\n8847dOnShW3btvHwww+zfv16AE6dOsV3333HgQMHyMzMZOLEidXGs2jRIrZu3cru3buJjY3F4XCw\nYsUKIiMjOX/+PIMHDyYzM7PW/XEPHTrExx9/zHvvvccdd9zBZ599xuTJk2scW2Zmpl/wWlVubi6b\nNm3i8OHDDB8+nB9//BHAb5xr1qzh0KFDbN++HVVVyczM5JtvvuGGG27QzpOSksKDDz5IeHg4jz/+\nOADz58/n4MGDrF27Fr1ez4ULF/jmm28wGAysXbuWp59+ms8++6zamA4cOMCGDRsoLi4mNTWVhx56\niB9//JFly5axefNmjEYjDz/8MB999BEjR47kz3/+M9nZ2URFRTF8+PAGb7dVEwnIhBBCNLq6ZrIa\n08CBA0lOdtdlpqenk5ubqwVkd911l/bfqhmv+ti5cyerV69m165djBo1itjYWIYMGUKnTp04fPiw\nXxC0du1a7rvvPkJDQwGIjY2lpKSELVu2cPvtt2vHlZeXa1//6le/QqfT0aNHD86cOVPjOEaOHEls\nrLtljqqqPP3003zzzTfodDpOnDjBmTNnaN26dY3P79ChA+np6QD079+f3Nzci46tNnfccQc6nY4u\n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\n/y22FwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "\u003cFigure size 1000x1000 with 1 Axes\u003e" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(10, 10))\n", + "plot_multitask_accuracies(trained_model, acc_list)" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "last_runtime": { + "build_target": "//learning/deepmind/dm_python:dm_notebook3", + "kind": "private" + }, + "name": "PrediNet.ipynb", + "provenance": [ + { + "file_id": "1n337yrEPEHP96Otf9JVq2TVunb6y8Bph", + "timestamp": 1560424278071 + }, + { + "file_id": "1kwSIRpWIrMqzlkrXT6oyZPvtOmSvgJEU", + "timestamp": 1559065222853 + }, + { + "file_id": "1vlbYwWbJXfwrHOSpSNNVZ7l4BNP1w4uA", + "timestamp": 1553869581767 + }, + { + "file_id": "1kTHl60edotmMJa6WtxJKDJaFn1G8eaJX", + "timestamp": 1549406943984 + }, + { + "file_id": "1p8XzSnh89yV5PJnYvDQdUcjrGqvdzFH6", + "timestamp": 1548458764481 + }, + { + "file_id": "1NBrElIZ01K3z4SeKIDH8LL3Ta4Z05p1d", + "timestamp": 1548411560658 + }, + { + "file_id": "19gXeyf9a_UVnqs3HvKHkgDJW3CbEjPVd", + "timestamp": 1547752992099 + }, + { + "file_id": "1Vfv-2v-j0kWYdlBpTeF70cHGWNAz0kVU", + "timestamp": 1547586988844 + }, + { + "file_id": "139B5ivXZUuEtA5zVgAgW4ciQFHbwpWqp", + "timestamp": 1547225320474 + } + ], + "version": "0.3.2" + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/PrediNet/README.md b/PrediNet/README.md new file mode 100644 index 0000000..7efb350 --- /dev/null +++ b/PrediNet/README.md @@ -0,0 +1,72 @@ +# The PrediNet Architecture and Relations Game Datasets + +This repository contains a notebook implementation of the PrediNet architecture, +as well as the baselines and sample datasets. + +The code was written by Murray Shanahan, Marta Garnelo and Kyriacos Nikiforou. + +The `PrediNet.ipynb` notebook includes an overview of the PrediNet +architecture and the code to reproduce the *multi-task experiment* presented in the paper +[*An Explicitly Relational Neural Network Architecture*](https://arxiv.org/pdf/1905.10307.pdf). +Additional details of the model and experiments can be found in the paper. + +Six `.npz` files contain downsampled versions of the datasets required to train +and evaluate the various models on the multi-task experiment. The training set (`*_pentos.npz`), +containing pentominoes, is a NPZ NumPy archive with the following fields: + +* `images`: (50000 x 36 x 36, 3) Images in RGB. +* `labels`: (50000 x 2) Labels for the images. +* `tasks`: (50000 x 1) Task ids that denote which relation must hold between the + objects in the images. + +Two additional `.npz` files are provided for each task, one with hexominoes (`*_hexos.npz`) +and one with striped squares (`*_stripes.npz`). These can be used for testing. + +The full Relations Game datasets composed of 250,000 samples for pentominoes - and 50,000 samples +for hexominoes and stripes - can be found [here](https://console.cloud.google.com/storage/browser/relations-game-datasets) + +## Running the experiments + +The easiest way to run the code is using the publicly available [Colab](https://colab.research.google.com) kernel. +You can run simply by clicking on [PrediNet Notebook](https://colab.research.google.com/github/deepmind/deepmind-research/PrediNet/blob/master/PrediNet.ipynb) + +Colaboratory is a free Jupyter notebook environment provided by Google that requires no setup and runs entirely in the cloud. +You will need the following dependencies to run the code, with instructions on how to install them. +The code was tested with the versions shown in brackets + +* TensorFlow 2 (2.0.0-rc0 with gpu support) - not installed +You can install TensorFlow 2.0 beta version by running the following command in +Colab: + +``` +!pip install "tensorflow-gpu>=2.0.0rc0" --pre +``` + +* Sonnet 2 (2.0.0b0) - not installed +You can install Sonnet 2 by running the following comment in Colab. + +``` +!pip install "dm-sonnet>=2.0.0b0" --pre +``` + +Alternatively, you can open the `.ipynb` files using +[Jupyter notebook](http://jupyter.org/install.html). If you do this you will +also have to set up a local kernel that includes the libraries above. + +## Citing Predicate Networks + +If you use this code in your work, please cite us as follows: + +Shanahan, M., Nikiforou, K., Creswell, A., Kaplanis, C., Barrett, D., +& Garnelo, M. (2019). *An Explicitly Relational Neural Network Architecture*. +arXiv preprint arXiv:1905.10307. + + +## Contact + +If you have any feedback, or would like to get in touch with us, you can reach out to us +at mshanahan@google.com and knikiforou@google.com. + +## Disclaimer + +This is not an officially supported Google product. diff --git a/PrediNet/mini_3task_col_patts_hexos.npz b/PrediNet/mini_3task_col_patts_hexos.npz new file mode 100644 index 0000000..a4ee505 Binary files /dev/null and b/PrediNet/mini_3task_col_patts_hexos.npz differ diff --git a/PrediNet/mini_3task_col_patts_pentos.npz b/PrediNet/mini_3task_col_patts_pentos.npz new file mode 100644 index 0000000..4454e86 Binary files /dev/null and b/PrediNet/mini_3task_col_patts_pentos.npz differ diff --git a/PrediNet/mini_3task_col_patts_stripes.npz b/PrediNet/mini_3task_col_patts_stripes.npz new file mode 100644 index 0000000..f73195d Binary files /dev/null and b/PrediNet/mini_3task_col_patts_stripes.npz differ diff --git a/PrediNet/mini_between_hexos.npz b/PrediNet/mini_between_hexos.npz new file mode 100644 index 0000000..660707b Binary files /dev/null and b/PrediNet/mini_between_hexos.npz differ diff --git a/PrediNet/mini_between_pentos.npz b/PrediNet/mini_between_pentos.npz new file mode 100644 index 0000000..a7a03d9 Binary files /dev/null and b/PrediNet/mini_between_pentos.npz differ diff --git a/PrediNet/mini_between_stripes.npz b/PrediNet/mini_between_stripes.npz new file mode 100644 index 0000000..9644820 Binary files /dev/null and b/PrediNet/mini_between_stripes.npz differ diff --git a/README.md b/README.md index fc8afd3..4f41470 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ https://deepmind.com/research/publications/ ## Projects +* [PrediNet Architecture and Relations Game Datasets](PrediNet) * [Unsupervised Adversarial Training](unsupervised_adversarial_training) * [Graph Matching Networks for Learning the Similarity of Graph Structured Objects](graph_matching_networks), ICML 2019