Pytorch PyG实现EdgePool图分类

 更新时间:2023年04月21日 09:55:27   作者:实力  
这篇文章主要为大家介绍了Pytorch PyG实现EdgePool图分类示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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图分类的详细内容,更多关于Pytorch PyG EdgePool图分类的资料请关注脚本之家其它相关文章!

相关文章

  • Python面向对象编程之继承与多态详解

    Python面向对象编程之继承与多态详解

    这篇文章主要介绍了Python面向对象编程之继承与多态,结合实例形式详细分析了Python面向对象编程中继承与多态的概念、使用方法及相关注意事项,需要的朋友可以参考下
    2018-01-01
  • Python NumPy教程之数组的基本操作详解

    Python NumPy教程之数组的基本操作详解

    Numpy 中的数组是一个元素表(通常是数字),所有元素类型相同,由正整数元组索引。本文将通过一些示例详细讲一下NumPy中数组的一些基本操作,需要的可以参考一下
    2022-08-08
  • Python调用讯飞语音合成API接口来实现文字转语音

    Python调用讯飞语音合成API接口来实现文字转语音

    这篇文章主要为大家介绍了Python调用讯飞语音合成API接口来实现文字转语音方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • K近邻法(KNN)相关知识总结以及如何用python实现

    K近邻法(KNN)相关知识总结以及如何用python实现

    这篇文章主要介绍了K近邻法(KNN)相关知识总结以及如何用python实现,帮助大家更好的利用python实现机器学习,感兴趣的朋友可以了解下
    2021-01-01
  • python 图像增强算法实现详解

    python 图像增强算法实现详解

    这篇文章主要介绍了python 图像增强算法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • python 魔法方法之 __ slots __的实现

    python 魔法方法之 __ slots __的实现

    本文主要介绍了python 魔法方法之 __ slots __的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Pandas中字符串和时间转换与格式化的实现

    Pandas中字符串和时间转换与格式化的实现

    本文主要介绍了Pandas中字符串和时间转换与格式化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Python获取当前路径实现代码

    Python获取当前路径实现代码

    这篇文章主要介绍了 Python获取当前路径实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • 详解python中TCP协议中的粘包问题

    详解python中TCP协议中的粘包问题

    这篇文章主要介绍了python中TCP协议中的粘包问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • python数据分析必会的Pandas技巧汇总

    python数据分析必会的Pandas技巧汇总

    用Python做数据分析光是掌握numpy和matplotlib可不够,numpy虽然能够帮我们处理处理数值型数据,但很多时候,还有字符串,还有时间序列等,比如:我们通过爬虫获取到了存储在数据库中的数据,一些Pandas必会的用法,让你的数据分析水平更上一层楼
    2021-08-08

最新评论