下面是根据您的要求所编写的代码:

import torch
import torch.nn as nn
import torch.optim as optim
from torch_geometric.data import Data, DataLoader
from torch_geometric.nn import GCNConv

import pandas as pd

# 自定义数据集类
class My_dataset(Data):
    def __init__(self, x, edge_index, y):
        super(My_dataset, self).__init__()
        self.x = x
        self.edge_index = edge_index
        self.y = y

# 读取数据
edges_df = pd.read_csv('C:/Users/jh/Desktop/data/raw/edges.csv')
features1_df = pd.read_csv('C:/Users/jh/Desktop/data/raw/features1.csv')
features2_df = pd.read_csv('C:/Users/jh/Desktop/data/raw/features2.csv')
label_df = pd.read_csv('C:/Users/jh/Desktop/data/raw/label.csv')

# 构建图数据
x = torch.cat([torch.tensor(features1_df.values), torch.tensor(features2_df.values)], dim=1)
edge_index = torch.tensor(edges_df[['source', 'target']].values).t().contiguous()
y = torch.tensor(label_df.values)

# 划分训练集和验证集
train_mask = torch.zeros(y.size(0), y.size(1))
train_mask[:, :16] = 1  # 前16个节点作为训练集
val_mask = torch.ones(y.size(0), y.size(1))
val_mask[:, :16] = 0  # 剩下4个节点作为验证集

# 创建数据集对象
dataset = My_dataset(x, edge_index, y)

# 创建数据加载器
loader = DataLoader(dataset, batch_size=1, shuffle=False)

# 定义GCN模型
class GCN(nn.Module):
    def __init__(self):
        super(GCN, self).__init__()
        self.conv1 = GCNConv(4, 16)
        self.conv2 = GCNConv(16, 2)

    def forward(self, x, edge_index):
        x = self.conv1(x, edge_index)
        x = torch.relu(x)
        x = self.conv2(x, edge_index)
        return x

# 创建GCN模型实例
model = GCN()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 训练和验证
for data in loader:
    x, edge_index, y = data.x, data.edge_index, data.y
    x = x.float()
    edge_index = edge_index.long()
    y = y.long()

    optimizer.zero_grad()
    output = model(x, edge_index)

    train_output = output[train_mask.bool()]
    train_label = y[train_mask.bool()]
    val_output = output[val_mask.bool()]
    val_label = y[val_mask.bool()]

    loss = criterion(train_output, train_label)
    loss.backward()
    optimizer.step()

    train_acc = (train_output.argmax(dim=1) == train_label).sum().item() / train_label.size(0)
    val_acc = (val_output.argmax(dim=1) == val_label).sum().item() / val_label.size(0)

    print('Train Loss: {:.4f} | Train Acc: {:.4f} | Val Acc: {:.4f}'.format(loss.item(), train_acc, val_acc))

请注意,上述代码仅为示例代码,可能需要根据您的实际数据格式和模型结构进行适当修改。此外,您需要安装PyTorch和torch-geometric库才能运行该代码。

将10张图片进行节点分类每张图片包含20个节点节点从0到19每张图数据66条边储存在CUsersjhDesktopdatarawedgescsv中每行为一条边第1列为源节点第2列为目标节点;1个节点包含2个特征所有图片节点的第一个特征储存在CUsersjhDesktopdatarawfeatures1csv中第二个特征储存在CUsersjhDesktopdatarawfeatures2csv中其中

原文地址: https://www.cveoy.top/t/topic/i6e2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录