{"nbformat":4,"nbformat_minor":0,"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.3"},"colab":{"provenance":[{"file_id":"1cCzRRE7gg-9SPd8Rscc7F79gYrjzNDqT","timestamp":1671012074432},{"file_id":"1YpZSfRWRNvIBFYuwQuy66H4KtB6HiiqZ","timestamp":1670800278106},{"file_id":"1sB8oD-tZIPlAUrswvIk2oeqWFqe_OwQx","timestamp":1670404510523},{"file_id":"1ElyxGyEh8BGfRRWigB_Q9Sm4r0nmznk8","timestamp":1670345019391},{"file_id":"1b9rZIjD7MUEKwYbXZc3dchTBTpzdrvpd","timestamp":1623221956992},{"file_id":"1Jc5CAEGZIvY0vka3mBdf0tqn2TaJr2O1","timestamp":1610408674518},{"file_id":"1gc6u6hItUKY9uJt6GXHaneSYCMaGcxp1","timestamp":1610395347938},{"file_id":"1CqWY4pk7_VFxi8K8v4asr18ed0Hs8FVA","timestamp":1578441204356}],"machine_shape":"hm"}},"cells":[{"cell_type":"markdown","metadata":{"id":"XuXWJLEm2UWS"},"source":["# TP : Réseaux de neurones graphiques à base d'Attention."]},{"cell_type":"markdown","metadata":{"id":"8gzsP50bF6Gb"},"source":["Dans ce TP, nous nous proposons d'étudier le dataset Cora. Celui-ci est composé de 2708 papiers scientifiques répartis en sept classes. L'objectif de ce TP est de construire un modèle permettant de prédire la classe à laquelle appartient un noeud (papier scientifique).\n","\n"]},{"cell_type":"code","source":["import os\n","import torch\n","import networkx as nx\n","import pandas as pd\n","os.environ['TORCH'] = torch.__version__\n","print(torch.__version__)\n","\n","!pip install -q torch-scatter -f https://data.pyg.org/whl/torch-${TORCH}.html\n","!pip install -q torch-sparse -f https://data.pyg.org/whl/torch-${TORCH}.html\n","!pip install -q git+https://github.com/pyg-team/pytorch_geometric.git"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"82DqiWzUG53f","executionInfo":{"status":"ok","timestamp":1671015061158,"user_tz":-60,"elapsed":13308,"user":{"displayName":"Redha Moulla","userId":"02824964285977805531"}},"outputId":"c26b5419-a913-4108-c23e-a64602549e78"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["1.13.0+cu116\n"]}]},{"cell_type":"code","metadata":{"id":"VWPkJjPAfVNW"},"source":["from torch_geometric.data import Data\n","from torch_geometric.nn import GATConv\n","from torch_geometric.datasets import Planetoid\n","from torch_geometric.utils import to_networkx\n","import torch_geometric.transforms as T\n","\n","import matplotlib.pyplot as plt"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"VqUnYT5qUZYh"},"source":["## Analyse du dataset Cora\n","\n","On se propose ici d'explorer le dataset Cora. Il est fortement recommandé de compléter cette analyse exploratoire (visualiser le graphe, etc.)."]},{"cell_type":"code","source":["\n","dataset = Planetoid(root='~/somewhere/Cora', name='Cora')\n","\n","data = dataset[0]\n","print(f'Dataset: {dataset}:')\n","print('======================')\n","print(f'Number of graphs: {len(dataset)}')\n","print(f'Number of features: {dataset.num_features}')\n","print(f'Number of classes: {dataset.num_classes}')\n","\n","print(f'Number of nodes: {data.num_nodes}')\n","print(f'Number of edges: {data.num_edges}')\n","print(f'Average node degree: {data.num_edges / data.num_nodes:.2f}')\n","print(f'Number of training nodes: {data.train_mask.sum()}')\n","print(f'Training node label rate: {int(data.train_mask.sum()) / data.num_nodes:.2f}')\n","print(f'Contains isolated nodes: {data.contains_isolated_nodes()}')\n","print(f'Contains self-loops: {data.contains_self_loops()}')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tTeFQyPUNE4A","executionInfo":{"status":"ok","timestamp":1671014449323,"user_tz":-60,"elapsed":535,"user":{"displayName":"Redha Moulla","userId":"02824964285977805531"}},"outputId":"7392f6b8-2b29-4103-e392-c181ba996a29"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Dataset: Cora():\n","======================\n","Number of graphs: 1\n","Number of features: 1433\n","Number of classes: 7\n","Number of nodes: 2708\n","Number of edges: 10556\n","Average node degree: 3.90\n","Number of training nodes: 140\n","Training node label rate: 0.05\n","Contains isolated nodes: False\n","Contains self-loops: False\n"]}]},{"cell_type":"markdown","metadata":{"id":"FX25Y1CrYmgN"},"source":["## Question 1 : construire un modèle à base de GAT qui permet de prédire la classe à laquelle appartient un noeud.\n","---\n","\n"]}]}