将10张图片进行节点分类每张图片有20个节点从节点0到节点19每张图66条边储存在CUsersjhDesktopdatarawedgescsv中每行为一条边第1列为源节点第2列为目标节点;1个节点包含2个特征所有图片节点的第一个特征储存在CUsersjhDesktopdatarawfeatures1csv中第二个特征储存在CUsersjhDesktopdatarawfeatures2csv中其中每
下面是根据你的要求编写的代码:
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch_geometric.data import Dataset
from torch_geometric.data import Data
class My_dataset(Dataset):
def __init__(self, root):
self.root = root
self.edges = torch.tensor([], dtype=torch.long)
self.features1 = torch.tensor([], dtype=torch.float)
self.features2 = torch.tensor([], dtype=torch.float)
self.labels = torch.tensor([], dtype=torch.long)
self.train_mask = torch.tensor([], dtype=torch.bool)
# Load data from files
for i in range(10):
edges = torch.tensor([], dtype=torch.long)
features1 = torch.tensor([], dtype=torch.float)
features2 = torch.tensor([], dtype=torch.float)
labels = torch.tensor([], dtype=torch.long)
# Load edges
edges_file = f"{self.root}/edges_{i}.csv"
with open(edges_file, 'r') as f:
lines = f.readlines()
for line in lines:
src, tgt = line.strip().split(',')
edges = torch.cat((edges, torch.tensor([[int(src)], [int(tgt)]])), dim=1)
# Load features1
features1_file = f"{self.root}/features1_{i}.csv"
with open(features1_file, 'r') as f:
lines = f.readlines()
for line in lines:
feats = [float(x) for x in line.strip().split(',')]
features1 = torch.cat((features1, torch.tensor([feats])), dim=0)
# Load features2
features2_file = f"{self.root}/features2_{i}.csv"
with open(features2_file, 'r') as f:
lines = f.readlines()
for line in lines:
feats = [float(x) for x in line.strip().split(',')]
features2 = torch.cat((features2, torch.tensor([feats])), dim=0)
# Load labels
labels_file = f"{self.root}/labels_{i}.csv"
with open(labels_file, 'r') as f:
lines = f.readlines()
for line in lines:
lbls = [int(x) for x in line.strip().split(',')]
labels = torch.cat((labels, torch.tensor([lbls])), dim=0)
# Create train mask
train_mask = torch.ones(features1.size(0), dtype=torch.bool)
train_mask[:16] = False
self.edges = torch.cat((self.edges, edges), dim=1)
self.features1 = torch.cat((self.features1, features1), dim=0)
self.features2 = torch.cat((self.features2, features2), dim=0)
self.labels = torch.cat((self.labels, labels), dim=0)
self.train_mask = torch.cat((self.train_mask, train_mask), dim=0)
def __len__(self):
return self.features1.size(0)
def __getitem__(self, idx):
edge_index = self.edges[:, idx].view(2, -1)
x = torch.cat((self.features1[idx], self.features2[idx]), dim=1)
y = self.labels[idx]
train_mask = self.train_mask[idx]
data = Data(x=x, edge_index=edge_index, y=y, train_mask=train_mask)
return data
class GCN(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(GCN, self).__init__()
self.conv1 = nn.Conv1d(input_dim, hidden_dim, kernel_size=1)
self.conv2 = nn.Conv1d(hidden_dim, output_dim, kernel_size=1)
def forward(self, x, edge_index):
x = x.permute(0, 2, 1)
x = F.relu(self.conv1(x))
x = F.dropout(x, training=self.training)
x = self.conv2(x)
x = x.permute(0, 2, 1)
x = F.log_softmax(x, dim=2)
return x
# Create dataset
dataset = My_dataset("C:/Users/jh/Desktop/data/raw")
# Create GCN model
model = GCN(input_dim=2, hidden_dim=16, output_dim=2)
# Train and validate the model
for data in dataset:
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
criterion = nn.NLLLoss()
model.train()
optimizer.zero_grad()
out = model(data.x, data.edge_index)
loss = criterion(out[data.train_mask], data.y[data.train_mask])
loss.backward()
optimizer.step()
model.eval()
with torch.no_grad():
pred = model(data.x, data.edge_index)
val_loss = criterion(pred[~data.train_mask], data.y[~data.train_mask])
pred = pred.argmax(dim=2)
acc = pred.eq(data.y.view(-1, 1)).sum().item() / pred.numel()
print(f"Loss: {loss.item()}, Val Loss: {val_loss.item()}, Accuracy: {acc}")
请注意,以上代码假设每个节点的特征维度为2,GCN模型的第一个卷积层将输入的特征维度从2转换为16,第二个卷积层将输入的特征维度从16转换为2。你可以根据实际情况进行调整。此外,你需要将文件路径中的"C:/Users/jh/Desktop/data/raw"修改为你自己的文件路径。
原文地址: https://www.cveoy.top/t/topic/i6gE 著作权归作者所有。请勿转载和采集!