您好,登錄后才能下訂單哦!
這篇文章主要介紹“Pytorch PyG怎么實現EdgePool圖分類”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Pytorch PyG怎么實現EdgePool圖分類”文章能幫助大家解決問題。
EdgePool是一種用于圖分類的卷積神經網絡(Convolutional Neural Network,CNN)模型。其主要思想是通過 edge pooling 上下采樣優化圖像大小,減少空間復雜度,提高分類性能。
一般來講,在構建較大規模數據集時,我們都需要對數據進行規范、歸一和清洗處理,以便后續語義分析或深度學習操作。而在圖像數據集中,則需使用特定的框架或工具庫完成。
# 導入MNIST數據集 from torch_geometric.datasets import MNISTSuperpixels # 加載數據、劃分訓練集和測試集 dataset = MNISTSuperpixels(root='./mnist', transform=Compose([ToTensor(), NormalizeMeanStd()])) data = dataset[0] # 定義超級參數 num_features = dataset.num_features num_classes = dataset.num_classes # 構建訓練集和測試集索引文件 train_mask = torch.zeros(data.num_nodes, dtype=torch.uint8) train_mask[:60000] = 1 test_mask = torch.zeros(data.num_nodes, dtype=torch.uint8) test_mask[60000:] = 1 # 創建數據加載器 train_loader = DataLoader(data[train_mask], batch_size=32, shuffle=True) test_loader = DataLoader(data[test_mask], batch_size=32, shuffle=False)
在定義EdgePool模型時,我們需要重新考慮網絡結構中的上下采樣操作,以便讓整個網絡擁有更強大的表達能力,從而學習到更復雜的關系。
from torch.nn import Linear from torch_geometric.nn import EdgePooling class EdgePool(torch.nn.Module): def __init__(self, dataset): super(EdgePool, self).__init__() # 定義輸入與輸出維度數 self.input_dim = dataset.num_features self.hidden_dim = 128 self.output_dim = 10 # 定義卷積層、歸一化層和pooling層等 self.conv1 = GCNConv(self.input_dim, self.hidden_dim) self.norm1 = BatchNorm1d(self.hidden_dim) self.pool1 = EdgePooling(self.hidden_dim) self.conv2 = GCNConv(self.hidden_dim, self.hidden_dim) self.norm2 = BatchNorm1d(self.hidden_dim) self.pool2 = EdgePooling(self.hidden_dim) self.conv3 = GCNConv(self.hidden_dim, self.hidden_dim) self.norm3 = BatchNorm1d(self.hidden_dim) self.pool3 = EdgePooling(self.hidden_dim) self.lin = torch.nn.Linear(self.hidden_dim, self.output_dim) def forward(self, x, edge_index, batch): x = F.relu(self.norm1(self.conv1(x, edge_index))) x, edge_index, _, batch, _ = self.pool1(x, edge_index, None, batch) x = F.relu(self.norm2(self.conv2(x, edge_index))) x, edge_index, _, batch, _ = self.pool2(x, edge_index, None, batch) x = F.relu(self.norm3(self.conv3(x, edge_index))) x, edge_index, _, batch, _ = self.pool3(x, edge_index, None, batch) x = global_mean_pool(x, batch) x = self.lin(x) return x
在上述代碼中,我們使用了不同的卷積層、池化層和全連接層等神經網絡功能塊來構建EdgePool模型。其中,每個 GCNConv 層被保持為128的隱藏尺寸;BatchNorm1d是一種旨在提高收斂速度并增強網絡泛化能力的方法;EdgePooling是一種在 GraphConvolution 上附加的特殊類別,它將給定圖下采樣至其一半的大小,并返回縮小后的圖與兩個跟蹤full-graph-to-pool雙向映射(keep and senders)的 edge index(edgendarcs)。 在這種情況下傳遞 None ,表明 batch
未更改。
在定義好 EdgePool 網絡結構之后,需要指定合適的優化器、損失函數,并控制訓練輪數、批量大小與學習率等超參數。同時還要記錄大量日志信息,方便后期跟蹤和駕駛員。
# 定義訓練計劃,包括損失函數、優化器及迭代次數等 train_epochs = 50 learning_rate = 0.01 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(edge_pool.parameters(), lr=learning_rate) losses_per_epoch = [] accuracies_per_epoch = [] for epoch in range(train_epochs): running_loss = 0.0 running_corrects = 0.0 count = 0.0 for samples in train_loader: optimizer.zero_grad() x, edge_index, batch = samples.x, samples.edge_index, samples.batch out = edge_pool(x, edge_index, batch) label = samples.y loss = criterion(out, label) loss.backward() optimizer.step() running_loss += loss.item() / len(train_loader.dataset) pred = out.argmax(dim=1) running_corrects += pred.eq(label).sum().item() / len(train_loader.dataset) count += 1 losses_per_epoch.append(running_loss) accuracies_per_epoch.append(running_corrects) if (epoch + 1) % 10 == 0: print("Train Epoch {}/{} Loss {:.4f} Accuracy {:.4f}".format( epoch + 1, train_epochs, running_loss, running_corrects))
在訓練過程中,我們遍歷了每個批次的數據,并通過反向傳播算法進行優化,并更新了 loss 和 accuracy 輸出值。 同時方便可視化與記錄,需要將訓練過程中的 loss 和 accuracy 輸出到相應的容器中,以便后期進行分析和處理。
關于“Pytorch PyG怎么實現EdgePool圖分類”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。