# torch geometric try: import torch_geometric except ModuleNotFoundError: # Installing torch geometric packages with specific CUDA+PyTorch version. # See https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html for details import torch TORCH = torch.__version__.split('+')[0] CUDA = 'cu' + torch.version.cuda.replace('.','') !pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-{TORCH}+{CUDA}.html !pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-{TORCH}+{CUDA}.html !pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-{TORCH}+{CUDA}.html !pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-{TORCH}+{CUDA}.html !pip install torch-geometric import torch_geometric import torch_geometric.nn as geom_nn import torch_geometric.data as geom_data import os.path as osp import torch import torch.nn.functional as F import torch_geometric from torch_geometric.datasets import Planetoid from torch_geometric.nn import SAGEConv use_cuda_if_available = False dataset = Planetoid(root="/content/cora", name= "Cora") print(dataset) print("number of graphs:\t\t",len(dataset)) print("number of classes:\t\t",dataset.num_classes) print("number of node features:\t",dataset.num_node_features) print("number of edge features:\t",dataset.num_edge_features) print(dataset.data) print("edge_index:\t\t",dataset.data.edge_index.shape) print(dataset.data.edge_index) print("\n") print("train_mask:\t\t",dataset.data.train_mask.shape) print(dataset.data.train_mask) print("\n") print("x:\t\t",dataset.data.x.shape) print(dataset.data.x) print("\n") print("y:\t\t",dataset.data.y.shape) print(dataset.data.y) data = dataset[0] class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.conv = SAGEConv(dataset.num_features, dataset.num_classes, aggr="max") # max, mean, add ...) def forward(self): x = self.conv(data.x, data.edge_index) return F.log_softmax(x, dim=1) device = torch.device('cuda' if torch.cuda.is_available() and use_cuda_if_available else 'cpu') model, data = Net().to(device), data.to(device) optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4) device def train(): model.train() optimizer.zero_grad() F.nll_loss(model()[data.train_mask], data.y[data.train_mask]).backward() optimizer.step() def test(): model.eval() logits, accs = model(), [] for _, mask in data('train_mask', 'val_mask', 'test_mask'): pred = logits[mask].max(1)[1] acc = pred.eq(data.y[mask]).sum().item() / mask.sum().item() accs.append(acc) return accs best_val_acc = test_acc = 0 for epoch in range(1,100): train() _, val_acc, tmp_test_acc = test() if val_acc > best_val_acc: best_val_acc = val_acc test_acc = tmp_test_acc log = 'Epoch: {:03d}, Val: {:.4f}, Test: {:.4f}' if epoch % 10 == 0: print(log.format(epoch, best_val_acc, test_acc)) %%writefile src/datasets/vectorial.py import torch.nn as nn import torch #%% Dataset to manage vector to vector data class VectorialDataset(torch.utils.data.Dataset): def __init__(self, input_data, output_data): super(VectorialDataset, self).__init__() self.input_data = torch.tensor(input_data.astype('f')) self.output_data = torch.tensor(output_data.astype('f')) def __len__(self): return self.input_data.shape[0] def __getitem__(self, idx): if torch.is_tensor(idx): idx = idx.tolist() sample = (self.input_data[idx, :], self.output_data[idx, :]) return sample %%writefile src/datasets/__init__.py from .vectorial import VectorialDataset %%writefile src/models/linear.py import torch.nn as nn import torch #%% Linear layer class LinearModel(nn.Module): def __init__(self, input_dim, output_dim): super(LinearModel, self).__init__() self.input_dim = input_dim self.output_dim = output_dim self.linear = nn.Linear(self.input_dim, self.output_dim, bias=True) def forward(self, x): out = self.linear(x) return out def reset(self): self.linear.reset_parameters() %%writefile src/models/__init__.py from .linear import LinearModel !pip install -q watermark %reload_ext watermark %watermark -a "Sparsh A." -m -iv -u -t -d