{ "cells": [ { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Explainability in Graph Neural Networks\n", "\n", "Author: [Filippo Maria Bianchi](https://sites.google.com/view/filippombianchi/home).\n", "\n", "Adapted from the original tutorial of [Simone Scardapane](https://www.sscardapane.it/).\n", "\n", "Colab notebook [here](https://colab.research.google.com/drive/1nV44NrNqcXC2thU6-zzxnJPnIalo870m)." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Libraries:\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "editable": true, "slideshow": { "slide_type": "skip" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch: 1.13.0\n", "pyg: 2.4.0\n", "networkx: 2.8.4\n", "captum: 0.6.0\n" ] } ], "source": [ "import os, torch\n", "os.environ['TORCH'] = torch.__version__\n", "print(\"torch: \",torch.__version__)\n", "\n", "# PyTorch imports\n", "from torch.nn import functional as F\n", "\n", "# PyTorch-related imports\n", "import torch_geometric as pyg\n", "import torch_scatter, torch_sparse\n", "print(\"pyg: \",pyg.__version__)\n", "\n", "# PyG explainability\n", "from torch_geometric.explain import Explainer, GNNExplainer\n", "\n", "import pytorch_lightning as ptlight\n", "from torchmetrics.functional import accuracy\n", "\n", "# Other imports\n", "import numpy as np\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", "import matplotlib.colors as mcolors\n", "from sklearn.model_selection import train_test_split\n", "print(\"networkx: \",nx.__version__)\n", "\n", "# Finally, Captum\n", "import captum\n", "from captum.attr import IntegratedGradients\n", "from captum.influence import TracInCP, TracInCPFast\n", "print(\"captum: \",captum.__version__)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## 1. Dataset exploration\n", "\n", "We consider the [MUTAG](https://paperswithcode.com/dataset/mutag) dataset, a collection of nitroaromatic compounds. \n", "\n", "The goal is to predict their mutagenicity on Salmonella.\n", "\n", "This is a toy version of the dataset, so we do not care too much about the final performance. " ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Download the data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "mutag = pyg.datasets.TUDataset(root='.', name='MUTAG')" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Print some statistics about the dataset" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "graph samples: 188\n", "classes: 2\n", "node features: 7\n", "edge features: 4\n" ] } ], "source": [ "print(f\"graph samples: {len(mutag)}\")\n", "print(f\"classes: {mutag.num_classes}\") # Binary (graph-level) classification\n", "print(f\"node features: {mutag.num_features}\") # One-hot encoding for each node type (atom)\n", "print(f\"edge features: {mutag.num_edge_features}\") # One-hot encoding for the bond type (we will ignore this)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Each graph in the dataset is represented as an instance of the generic [Data](https://pytorch-geometric.readthedocs.io/en/latest/modules/data.html#torch_geometric.data.Data) object" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "mutag_0 = mutag[0]\n", "print(type(mutag_0))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "torch.Size([17, 7])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# x contains the node features\n", "mutag_0.x.shape" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "tensor([1])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# y contains the corresponding class\n", "mutag_0.y" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "The Edges are stored in a COO format, with a 2xE list (``edge_index[:, i]`` are the source and target nodes of the $i$-th edge)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "torch.Size([2, 38])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mutag_0.edge_index.shape" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "tensor([[0, 0, 1, 1],\n", " [1, 5, 0, 2]])" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# We print the first four edges in the list\n", "mutag_0.edge_index[:, 0:4]" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Inside ``pyg.utils`` there are a number of useful tools.\n", "\n", "E.g., we can check that the graph is undirected (the adjacency matrix is symmetric)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pyg.utils.is_undirected(mutag_0.edge_index)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We define a simple function for plotting the graph using the tools from networkx" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "colors = list(mcolors.TABLEAU_COLORS)\n", "def draw_graph(g: pyg.data.Data, ax=None):\n", " # Get a different color for each atom type\n", " node_color = [colors[i.item()] for i in g.x.argmax(dim=1)]\n", " # Convert to networkx\n", " g = pyg.utils.to_networkx(g, to_undirected=True)\n", " # Draw on screen\n", " pos = nx.planar_layout(g)\n", " pos = nx.spring_layout(g, pos=pos)\n", " nx.draw_networkx(g, node_color=node_color, with_labels=False,\n", " node_size=150, ax=ax)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "draw_graph(mutag_0)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "editable": true, "slideshow": { "slide_type": "skip" }, "tags": [] }, "outputs": [], "source": [ "from torch_geometric.utils import to_networkx\n", "\n", "def draw_molecule(g, edge_mask=None, draw_edge_labels=False, ax=None):\n", " g = g.copy().to_undirected()\n", " node_labels = {}\n", " for u, data in g.nodes(data=True):\n", " node_labels[u] = data['name']\n", " pos = nx.planar_layout(g)\n", " pos = nx.spring_layout(g, pos=pos)\n", " if edge_mask is None:\n", " edge_color = 'black'\n", " widths = None\n", " else:\n", " edge_color = [edge_mask[(u, v)] for u, v in g.edges()]\n", " widths = [x * 10 for x in edge_color]\n", " nx.draw_networkx(g, pos=pos, labels=node_labels, width=widths,\n", " edge_color=edge_color, edge_cmap=plt.cm.Blues,\n", " node_color='azure')\n", "\n", " if draw_edge_labels and edge_mask is not None:\n", " edge_labels = {k: ('%.2f' % v) for k, v in edge_mask.items()}\n", " nx.draw_networkx_edge_labels(g, pos, edge_labels=edge_labels,\n", " font_color='red', ax=ax)\n", "\n", " if ax is None:\n", " plt.show()\n", "\n", "\n", "def to_molecule(data: pyg.data.Data):\n", " ATOM_MAP = ['C', 'O', 'Cl', 'H', 'N', 'F',\n", " 'Br', 'S', 'P', 'I', 'Na', 'K', 'Li', 'Ca']\n", " g = to_networkx(data, node_attrs=['x'])\n", " for u, data in g.nodes(data=True):\n", " data['name'] = ATOM_MAP[data['x'].index(1.0)]\n", " del data['x']\n", " return g" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We can also use a more advanced drawing script (taken from [here](https://colab.research.google.com/drive/1fLJbFPz0yMCQg81DdCP5I8jXw9LoggKO?usp=sharing)) that also shows the atom type" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "draw_molecule(to_molecule(mutag_0))" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## 2. Transformations\n", "Transformations are a quick way to include standard preprocessing when loading the graphs. \n", "\n", "E.g., automatically computing edge from the nodes' positions. \n", "\n", "The full list of available transformations is [here](https://pytorch-geometric.readthedocs.io/en/latest/modules/transforms.html)." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "As an experiment, we load the graph with the adjacency in a SparseTensor format instead of the COO list" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "mutag_adj = pyg.datasets.TUDataset(root='.', name='MUTAG',\n", " transform=pyg.transforms.ToSparseTensor())" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "We now have the adjacency matrix available as an additional propertyty)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "SparseTensor(row=tensor([ 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7,\n", " 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14,\n", " 15, 16]),\n", " col=tensor([ 1, 5, 0, 2, 1, 3, 2, 4, 9, 3, 5, 6, 0, 4, 4, 7, 6, 8,\n", " 7, 9, 13, 3, 8, 10, 9, 11, 10, 12, 11, 13, 14, 8, 12, 12, 15, 16,\n", " 14, 14]),\n", " size=(17, 17), nnz=38, density=13.15%)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mutag_adj[0].adj_t # This gives us useful information (size, nnz, density)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "The SparseTensor format supports [several useful methods](https://github.com/rusty1s/pytorch_sparse).\n", "\n", "For example, we can propagate the features on the graph (cornerstone of graph-based methods) efficiently with a sparse-dense matrix multiplication" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([17, 7])\n" ] } ], "source": [ "print(torch_sparse.matmul(mutag_adj[0].adj_t, mutag_adj[0].x).shape)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## 3. Data loaders\n", "\n", "Data loaders are a nice utility to automatically build mini-batches from the dataset.\n", "\n", "A batch can either be a set of graphs, or subgraphs extracted from a single graph." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "First, we split the original dataset into a training and a test part with a split stratified on the class" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "train_idx, test_idx = train_test_split(range(len(mutag)), stratify=[m.y[0].item() for m in mutag], test_size=0.25)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Then, we build the two loaders" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "train_loader = pyg.loader.DataLoader(mutag[train_idx], batch_size=32, shuffle=True)\n", "test_loader = pyg.loader.DataLoader(mutag[test_idx], batch_size=32)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Let us load the first batch of data" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "batch = next(iter(train_loader))" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "The batch is built by considering all the subgraphs as a single giant graph with unconnected components\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x shape: torch.Size([566, 7])\n", "y shape: torch.Size([32])\n", "edges shape: torch.Size([2, 1242])\n" ] } ], "source": [ "print(f\"x shape: {batch.x.shape}\") # All the nodes of the 32 graphs are put together\n", "print(f\"y shape: {batch.y.shape}\") # A single label for each graph\n", "print(f\"edges shape: {batch.edge_index.shape}\") # Edge list of all 32 graphs" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "There is an additional property in ``batch`` that links each node to its corresponding graph index" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([566])\n", "tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1])\n" ] } ], "source": [ "print(batch.batch.shape)\n", "print(batch.batch[0:30]) # print the first 30 elements" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "We can perform graph-level operations with ``torch_scatter`` (more details [here](https://pytorch-scatter.readthedocs.io/en/latest/functions/scatter.html))\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([32, 7])\n" ] } ], "source": [ "# Sum all the nodes in the same graph\n", "print(torch_scatter.scatter_sum(batch.x, batch.batch, dim=0).shape)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([32, 7])\n" ] } ], "source": [ "# Average all the nodes in the same graph\n", "print(torch_scatter.scatter_mean(batch.x, batch.batch, dim=0).shape)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "torch.Size([32, 7])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Alternatively, PyG has this implemented as a functional layer\n", "pyg.nn.global_mean_pool(batch.x, batch.batch).shape" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## 4. Building the GNN" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Layers in PyG are very similar to standard PyTorch layers." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "This is a standard graph convolutional layer." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "gcn = pyg.nn.GCNConv(7, 12)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "torch.Size([566, 12])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gcn(batch.x, batch.edge_index).shape" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Different layers have different properties \n", "\n", "See [this cheatsheet](https://pytorch-geometric.readthedocs.io/en/latest/notes/cheatsheet.html) from more info." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "For example, GCNConv accepts an additional ``edge_weight`` parameter to weight each edge. \n", "\n", "We will use this later on, to mask the corresponding edges for the prediction." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "### 4.1 Pytorch lightning" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "PyTorch Lightning is a lightweight wrapper that helps organize PyTorch code, making it more readable and maintainable." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "It simplifies the complex engineering tasks involved in PyTorch models removing a lot of boilerplate code." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "If you are not famliar with PyTorch Lightning, see this [5-minutes intro](https://pytorch-lightning.readthedocs.io/en/latest/common/lightning_module.html)." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### 4.1.1 The Lightning Module\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [], "source": [ "class MUTAGClassifier(ptlight.LightningModule):\n", "\n", " def __init__(self):\n", " # The model is just GCNConv --> GCNConv --> global pooling --> Dropout --> Linear\n", " super().__init__()\n", " self.gc1 = pyg.nn.GCNConv(7, 64)\n", " self.gc2 = pyg.nn.GCNConv(64, 256)\n", " self.linear = torch.nn.Linear(256, 1)\n", "\n", " def forward(self, x, edge_index=None, batch=None, edge_weight=None):\n", " # Note: \"edge_weight\" is not used for training, but only for the explainability part\n", " if edge_index == None:\n", " x, edge_index, batch = x.x, x.edge_index, x.batch\n", " x = F.relu(self.gc1(x, edge_index, edge_weight))\n", " x = F.relu(self.gc2(x, edge_index, edge_weight))\n", " x = pyg.nn.global_mean_pool(x, batch)\n", " x = F.dropout(x)\n", " x = self.linear(x)\n", " return x\n", "\n", " def configure_optimizers(self):\n", " optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)\n", " return optimizer\n", "\n", " def training_step(self, batch, _):\n", " y_hat = self.forward(batch.x, batch.edge_index, batch.batch)\n", " loss = F.binary_cross_entropy_with_logits(y_hat, batch.y.unsqueeze(1).float())\n", " self.log(\"train_loss\", loss)\n", " self.log(\"train_accuracy\", accuracy(y_hat, batch.y.unsqueeze(1), task='binary'), prog_bar=True, batch_size=32)\n", " return loss\n", "\n", " def validation_step(self, batch, _):\n", " x, edge_index, batch_idx = batch.x, batch.edge_index, batch.batch\n", " y_hat = self.forward(x, edge_index, batch_idx)\n", " self.log(\"val_accuracy\", accuracy(y_hat, batch.y.unsqueeze(1), task='binary'), prog_bar=True, batch_size=32)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We instantiate the classifier" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "gnn = MUTAGClassifier() # PL module" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Sanity check: we run a single mini-batch and check the output shape" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "torch.Size([32, 1])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gnn(batch.x, batch.edge_index, batch.batch).shape" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "#### 4.1.2 The training loop\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Save weights of the model during training" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "checkpoint_callback = ptlight.callbacks.ModelCheckpoint(\n", " dirpath='./checkpoints/',\n", " filename='gnn-{epoch:02d}',\n", " every_n_epochs=50,\n", " save_top_k=-1)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "Create the trainer" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "GPU available: True (cuda), used: True\n", "TPU available: False, using: 0 TPU cores\n", "IPU available: False, using: 0 IPUs\n", "HPU available: False, using: 0 HPUs\n", "/home/filippo/anaconda3/envs/pyg/lib/python3.10/site-packages/pytorch_lightning/trainer/connectors/logger_connector/logger_connector.py:67: Starting from v1.9.0, `tensorboardX` has been removed as a dependency of the `pytorch_lightning` package, due to potential conflicts with other packages in the ML ecosystem. For this reason, `logger=True` will use `CSVLogger` as the default logger, unless the `tensorboard` or `tensorboardX` packages are found. Please `pip install lightning[extra]` or one of them to enable TensorBoard support by default\n" ] } ], "source": [ "trainer = ptlight.Trainer(max_epochs=150, callbacks=[checkpoint_callback])" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Start the training loop" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": true, "editable": true, "jupyter": { "outputs_hidden": true }, "scrolled": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "You are using a CUDA device ('NVIDIA GeForce RTX 3090') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision\n", "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n", "\n", " | Name | Type | Params\n", "-----------------------------------\n", "0 | gc1 | GCNConv | 512 \n", "1 | gc2 | GCNConv | 16.6 K\n", "2 | linear | Linear | 257 \n", "-----------------------------------\n", "17.4 K Trainable params\n", "0 Non-trainable params\n", "17.4 K Total params\n", "0.070 Total estimated model params size (MB)\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Sanity Checking: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "/home/filippo/anaconda3/envs/pyg/lib/python3.10/site-packages/pytorch_lightning/trainer/connectors/data_connector.py:441: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=23` in the `DataLoader` to improve performance.\n", "/home/filippo/anaconda3/envs/pyg/lib/python3.10/site-packages/pytorch_lightning/trainer/connectors/data_connector.py:441: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=23` in the `DataLoader` to improve performance.\n", "/home/filippo/anaconda3/envs/pyg/lib/python3.10/site-packages/pytorch_lightning/loops/fit_loop.py:293: The number of training batches (5) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8d55fa92b2ad45d99e339a5cdf149565", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Training: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "712ad36d439244339abab956c79ea277", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e603eb479d624695a071bbfc756ab40c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "05ab265d598b4631a1361a0d73e0c024", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4f5d56625a96431fb71522ffbaa1d24c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a8b0cda655554302a86c7e9a9c9e7078", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6f41f53a1682473da7a4b358c36d9694", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "19980a23e8d44f61805d3e647c559892", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3159f50b44974ba8a1d1c07832aef303", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "555fea8b56b54a3d97961f65669908fc", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "db096ce6f7134fa88eec43481105e162", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "63bc889ce4d547369e0548f55c4e0773", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "253085bc15004da699605df99e1146cf", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "871d63b0013b485f895653d4d81f065c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "IOPub message rate exceeded.\n", "The Jupyter server will temporarily stop sending output\n", "to the client in order to avoid crashing it.\n", "To change this limit, set the config variable\n", "`--ServerApp.iopub_msg_rate_limit`.\n", "\n", "Current values:\n", "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", "ServerApp.rate_limit_window=3.0 (secs)\n", "\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8a576fd1b30b482ca5789190c8373910", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "47774c2fc965454a88143720b33c6323", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a0a04de8754b4fb696aad1ddfc65c7f2", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f5cef57d7a224b0191a5981d0b00ffb6", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "23d293f00dac417f993e4b1f6a81be2b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d4723703c6d546fd933afee0255593a7", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9dd9c32e81b045729bb7c62c1aa2553d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9dd393c1691845f6ae3a9722646b811b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a56fbd521b9c4568b3b37c16eea5507e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a989e01cceb1433da57299668fd40c84", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "49c6b08177f2429ea20133ff5858f0eb", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "77151cc700734d7f95f1515c8a9c13da", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "941e51bf2c734307b466676a4725d527", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "febe9a58bca24a1dad8d0155e9d42872", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c09dc67d1b9a4f899f27e76782ea3b25", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0916facc8a384132846a8bb5bb2722ed", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "336f602186ff44d193d54dccf4e368c4", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3dfdf5c2923f4b8f88220267ebb2c132", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "27fa2c4e2b95463392652b1230a35e37", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0eef755334a7472ea507396adf89c44f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "74c0487ae2a342b2b8762be3eeeb9775", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a204d6f5237043faaacb035d618bff1c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "811be514294a48e8b1a680d379736e43", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b8b458d4bb94430292a9154df4686204", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2d4564265f424d48a83c24dc7ed92c56", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "85739369d3dd43559451719f95bfaf6c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5348ea17b7b044c39cd74f0597f7b08a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "13c92e0655e0446fa79a779a9895ce7d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ef4503bd34f948efae777cc566162f52", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1756d30ec67041429154919c887dec4d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1ae60d6f870e4c17a23e748cca58d24b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "852da0ca4052485f944999e8a16478f6", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4e5b6611a4eb4a99855bda6f8f6b3e3d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "357aa0fac7bb4560a0480aa8c63eba4c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "46f10d9db54c4b88b50c7d7bdec19b84", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9c28ffd98c144765aff73e7a726d0d81", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1f9f49a7c7884fb98d5a09e436ce5a33", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1b7e0fa9c0734182816639cd58ab0c9b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "106bed39f35b44e7a51a29cdb15121ac", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "77e587e192944eb4ad9b71b751720348", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7017fd42e64744748088c3fe19e26c80", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1f497ed3e202479ab2f1bfbd940b4a9b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "875247aa42344453ab4e524cd765262f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1d30ca87bbea4ac380769fd4c9b5521d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8d00ed247fed47dea4d1cb9c2dea6593", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "03c68de26f304a36a6e1bc0815c64465", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "bcc4e406ee0548f581c827a466fb250e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f9989e50f88b4ea19faa172f0a1ad8a0", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0981ceb3140b4262b2cf2b74954af0ff", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f0b300340dc44e3c99d1e959043d7481", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4ba9c5a89b2b440ba3853e09faa4aa87", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Validation: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "`Trainer.fit` stopped: `max_epochs=150` reached.\n" ] } ], "source": [ "# This is not a particularly well-designed model, we expect approximately 70-80% val accuracy\n", "trainer.fit(gnn, train_loader, test_loader)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## 5. Explainability" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### 5.1 GNNExplainer" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "[GNNExplainer](https://arxiv.org/abs/1903.03894) is a simple method to search for instance-level explanations on a trained GNN. \n", "\n", "It optimizes for the smallest feature and edge masks that do not vary the prediction of the trained model. \n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We take a single graph from the test dataset" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "idx = 0\n", "test_graph = mutag[test_idx[idx]]\n", "\n", "draw_graph(test_graph)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([1])\n" ] } ], "source": [ "# Explanations are mostly interesting for mutagenic graphs\n", "print(test_graph.y)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "PyG has an implementation of GNNExplainer that we will use.\n", "\n", "It provides a mask that can remove individual features for each node." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "# Instantiate the explainer\n", "explainer = Explainer(\n", " model=gnn,\n", " algorithm=GNNExplainer(epochs=300),\n", " explanation_type='model',\n", " node_mask_type='attributes',\n", " edge_mask_type='object',\n", " model_config=dict(\n", " mode='binary_classification',\n", " task_level='graph',\n", " return_type='raw',\n", " ),\n", " )" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "# Compute the explanations\n", "explanation = explainer(test_graph.x, test_graph.edge_index)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "These are the resulting masks." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Explanation(node_mask=[22, 7], edge_mask=[50], prediction=[1, 1], target=[1], x=[22, 7], edge_index=[2, 50])\n" ] } ], "source": [ "print(explanation)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "We mostly care about the edges here." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "tensor([0.0322, 0.0369, 0.0410, 0.0401, 0.0363, 0.0415, 0.0340, 0.0341, 0.0368,\n", " 0.0443, 0.0419, 0.0393, 0.0369, 0.0333, 0.0417, 0.0404, 0.0408, 0.0363,\n", " 0.0389, 0.0335, 0.0252, 0.0400, 0.0465, 0.0368, 0.0397, 0.0549, 0.0455,\n", " 0.0473, 0.0420, 0.0431, 0.0352, 0.0485, 0.0410, 0.0450, 0.0552, 0.0453,\n", " 0.0584, 0.0482, 0.0626, 0.0737, 0.0592, 0.0607, 0.9391, 0.9240, 0.9459,\n", " 0.0922, 0.0538, 0.0559, 0.9325, 0.9292])" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "explanation.edge_mask" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Get the relevant edges (highest values inside the edge mask)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "relevant_edges = explanation.edge_mask > 0.90" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "We build the subgraph corresponding to the explanation" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "explanation_subgraph = pyg.data.Data(test_graph.x, test_graph.edge_index[:, relevant_edges])" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "editable": true, "slideshow": { "slide_type": "skip" }, "tags": [] }, "outputs": [], "source": [ "# Make undirected and remove the isolated nodes\n", "explanation_subgraph = pyg.transforms.RemoveIsolatedNodes()(pyg.transforms.ToUndirected()(explanation_subgraph))" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "A good explanation should contain $CI_2O$ groups, which are known to be mutagenic" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "draw_graph(explanation_subgraph)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We can also use the other visualizer" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "draw_molecule(to_molecule(explanation_subgraph))" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "### 5.2 Integrated Gradients\n", "\n", "Instead of using a custom-made explainer, we can also try using a \"standard\" one. \n", "\n", "Here we use the implementation of **Integrated Gradients** provided by Captum. " ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### How IG works?\n", "\n", "1. **Baseline Selection:** Choose a baseline representing a non-informative input (e.g., a black image)." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "2. **Path Construction:** Construct a path that gradually changes the baseline into the actual input.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "3. **Gradient Calculation:** At each step along this path, the gradient of the model output with respect to the input is calculated.\n", "\n", " This gradient signifies how much each input feature contributes to the output." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "4. **Integration:** The gradients across all the steps are summed up to quantify the importance of each input feature in determining the model's output.\n" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "In our case, we will integrate a \"saliency vector\" moving from a graph with no connectivity to our actual graph." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "We define a custom function whose input is the edge mask." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "batch_idx = torch.zeros(test_graph.x.shape[0], dtype=torch.int64) # All nodes belong to the same graph\n", "gnn.eval() # disable dropout, turn off gradients computation\n", "def model_forward(edge_mask, graph):\n", " out = gnn(graph.x, graph.edge_index, batch_idx, edge_weight=edge_mask[0])\n", " return out" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "We initialize the edge mask with all 1s" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([1, 50])\n" ] } ], "source": [ "edge_mask = torch.ones(test_graph.edge_index.shape[1]).unsqueeze(0).requires_grad_(True)\n", "print(edge_mask.shape)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "tensor([[1.6257]], grad_fn=)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_forward(edge_mask, test_graph)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We compute IG using the Captum [IntegratedGradients](https://captum.ai/docs/extension/integrated_gradients) class." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "# Instantiate IG with the custom function we just defined\n", "ig = IntegratedGradients(model_forward)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "# Compute the mask\n", "ig_mask = ig.attribute(edge_mask, additional_forward_args=test_graph, internal_batch_size=1)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "This is the same as before, we just use the new mask" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "explanation = pyg.data.Data(test_graph.x, test_graph.edge_index[:, ig_mask[0] > 0.1])\n", "explanation = pyg.transforms.RemoveIsolatedNodes()(pyg.transforms.ToUndirected()(explanation))\n", "draw_graph(explanation)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "### 5.3 TracIn\n", "\n", "TracIn (Traceable Inputs) measures the impact of each training example on a specific prediction (e.g., the class of ``test_graph``). \n", "\n", "It helps to identify which training data points are most influential for a particular prediction." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "TracIn computes the gradients of the loss for a particular data point (e.g., ``test_graph``) and for all training samples. \n", "\n", "By comparing these gradients, TracIn estimates the cumulative influence of each training example on the classification of the particular data point." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "First, we manually select (some of) the checkpoints.\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "'gnn-epoch=149.ckpt' 'gnn-epoch=49.ckpt' 'gnn-epoch=99.ckpt'\n" ] } ], "source": [ "!ls checkpoints" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "ckpt = ['checkpoints/gnn-epoch=49.ckpt',\n", " 'checkpoints/gnn-epoch=99.ckpt',\n", " 'checkpoints/gnn-epoch=149.ckpt'\n", " ]" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We will compute the gradient only with respect to the last linear layer of the GNN.\n", "\n", "Remember that our GNN model is GCNConv $\\rightarrow$ GCNConv $\\rightarrow$ global pooling $\\rightarrow$ Dropout $\\rightarrow$ Linear\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "256\n" ] } ], "source": [ "params = gnn.linear.weight.shape[1]\n", "print(params)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We will store here the gradients for the test graph on all checkpoints" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "test_gradients = torch.zeros((len(ckpt), params))" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "for k in range(len(ckpt)):\n", "\n", " # Manually load the checkpoint\n", " checkpoint = torch.load(ckpt[k])\n", " gnn.load_state_dict(checkpoint['state_dict'])\n", " gnn.eval()\n", "\n", " # Compute the gradient on the test graph\n", " y = gnn(test_graph.x, test_graph.edge_index)\n", " test_gradients[k] = torch.autograd.grad(y, gnn.linear.weight)[0]" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We do the same also for all training points" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "mutag_train = mutag[train_idx] # Training set\n", "train_gradients = torch.zeros((len(mutag_train), len(ckpt), params))" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "for k in range(len(ckpt)):\n", "\n", " # Manually load the checkpoint\n", " checkpoint = torch.load(ckpt[k])\n", " gnn.load_state_dict(checkpoint['state_dict'])\n", " gnn.eval()\n", "\n", " # Same as before, but we loop over all training graphs\n", " for i in range(len(mutag_train)):\n", "\n", " y = gnn(mutag_train[i].x, mutag_train[i].edge_index)\n", " train_gradients[i, k] = torch.autograd.grad(y, gnn.linear.weight)[0]" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "# test_gradients.shape = ( 3, 256)\n", "# train_gradients.shape = (141, 3, 256)\n", "# This computes the relevance score for all graphs\n", "relevance = (test_gradients * train_gradients).sum(dim=[1, 2])" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "torch.Size([141])" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "relevance.shape" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "# Take the top-k highest values (proponents), and top-k lowest values (opponents)\n", "_, proponents = torch.topk(relevance, k=3, largest=True)\n", "_, opponents = torch.topk(relevance, k=3, largest=False)" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Let's draw once again the test_graph\n", "draw_graph(test_graph)" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "editable": true, "raw_mimetype": "", "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axs = plt.subplots(1, 3, layout='tight', figsize=(10, 4))\n", "for c, i in enumerate(proponents):\n", " draw_graph(mutag_train[i], ax=axs[c])\n", " sign_i = gnn(mutag_train[i].x, mutag_train[i].edge_index).sign()\n", " axs[c].set_title(f\"Class: {mutag_train[i].y.numpy()[0]}\")\n", "fig.suptitle('Proponents', fontsize=16)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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JqkZduswGoQ38EIqERGR/OkcJiLiHU91egp/m3+Rjq9xzeJoXqW5F1KJWMMnxbtl1Za8cucr+Nn8CnXXILZRLOPbjfdeMBERkXzoHCYi4h1NKzflf3r+DwH2gEIdX++ufzeTO032YjIRz/lsvv076tzBe/e8R2RIJMB1Hysxfvkn0B7I2LZjmdl1pmVLDYiIiBSVzmEiIt4RXSua93/3PnVD6wI3P7762/x5rPVjzOk2B7vNs4nZRLzNz5cv3qZaG/7V/18kHU9iyb4lbDy6EbfpvvL9uqF1iW8Rz/2N7tdECSIiUqL89hz25ZEvMTGvfF/nMBGRoomKiGLVA6tIOZnCkn1LWP/T+qs6QmTFSOJbxNO3UV/CA61ZhkzE23xavAFsho0ukV3oEtmFS85LnMs+R647l7CAMMICwjCMwo/xEBERKQ46h4mIeIdhGHSs2ZGONTuS7crm3KVz5LhzdHyVUsvnxfvXgvyCqOlX09cxRERECk3nMBER7wi0B1IjpIavY4h4RIPNRERERERERLxIxVtERERERETEi1S8RURERERERLxIxVtERERERETEi1S8RURERERERLxIxVtERERERETEi1S8RURERERERLxIxVtERERERETEi1S8RURERERERLxIxVtERERERETEi1S8RURERERERLxIxVtERERERETEi1S8RURERERERLxIxVtERERERETEi1S8RURERERERLzIryA/ZJomABkZGV4NIyLiC5ePbZePdYWh46OIlHU6RoqIXF9hjo8FKt6ZmZkA1K1b14NYIiIlW2ZmJuHh4YXeBnR8FJGyT8dIEZHrK8jx0TALUM/dbjfHjh0jNDQUwzAsCygiUhKYpklmZiaRkZHYbIUbgaPjo4iUdTpGiohcX2GOjwUq3iIiIiIiIiJSNJpcTURERERERMSLVLxFREREREREvEjFW0RERERERMSLVLxFREREREREvEjFW0RERERERMSLVLxFREREREREvEjFW0RERERERMSL/j+gDPtSSDZNUgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axs = plt.subplots(1, 3, layout='tight', figsize=(10, 4))\n", "for c, i in enumerate(opponents):\n", " draw_graph(mutag_train[i], ax=axs[c])\n", " sign_i = gnn(mutag_train[i].x, mutag_train[i].edge_index).sign()\n", " axs[c].set_title(f\"Class: {mutag_train[i].y.numpy()[0]}\")\n", "fig.suptitle('Opponents', fontsize=16)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## The end\n", "\n", "- Questions?\n", "- Contact: filippo.m.bianchi@uit.no" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" }, "toc": { "base_numbering": 1 } }, "nbformat": 4, "nbformat_minor": 4 }