Pytorch PyG实现EdgePool图分类
作者:实力 发布时间:2022-03-17 15:47:55
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 输出到相应的容器中,以便后期进行分析和处理。
来源:https://juejin.cn/post/7224127112709652538


猜你喜欢
- python虽然是一门'慢语言',但是也有着比较多的性能检测工具来帮助我们优化程序的运行效率。这里总结了五个比较好的pyth
- 这里有numpy数组的相关介绍https://www.jb51.net/article/130657.htm排序numpy与python列表
- 在安装好MYSQL ODBD的驱动程序后,应如何建立ASP文件连接数据库?我们有两种方法:一种是在ODBC数据源中建立一个DSN。具体方法是
- 代码如下: 在ie下,貌似要改安全设置中的【对为标记为可安全执行脚本的ActiveX空间初始化并执行】那项 <html> <
- 概要:本文主要描述XHTML中相对定位和绝对定位各自的本质、用法、区别和两者之间的关系。以及使用CSS的Left、Right、Top、Bot
- 我们在为大家整Python程序员面试试题中,发现了一些被面试官问到的最多的一些问题,以下就是本篇内容:Python是个非常受欢迎的编程语言,
- 介绍在操作数据帧时,初学者有时甚至是更高级的数据科学家会对如何在pandas中使用inplace参数感到困惑。更有趣的是,我看到的解释这个概
- 我用的数据库是Access2000的,系统为Win2000 Advance Server.今天在程序调试中遇到了以下几个怪现象:1.如果Ac
- 背景手机型号:型号:iphone 7 / iphone xs max版本:ios 10.3.1 / ios 12.1微信版本:WeChat
- 感觉很流畅的键盘控制(带惯性) <body> <div id="man" style="po
- Python argparse中的action=store_true用法前言Python的命令行参数解析模块学习。示例参数解析模块支持act
- 本文介绍了vue下history模式刷新后404错误解决方法,分享给大家,具体如下:官方说明文档:https://router.vuejs.
- 项目中经常会遇到这样的问题:当某个 js 脚本加载完成后再执行相应任务,但很多朋友可能并不知道怎么判断我们要加载的 js 文件是否加载完成,
- python安装教程和Pycharm安装详细教程,分享给大家。首先我们来安装python1、首先进入网站下载:点击打开链接(或自己输入网址h
- TensorFlow官网给的cifar-10教程,是卷积神经网络入门的好例子,有时想直接拿这个模型来跑自己的数据,却发现他的数据类型不是常见
- 1. 前言vue-cli 一个简单的构建Vue.js项目的命令行界面整体过程:$ npm install -g vue-cli $ vue
- 这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 1、说明当函数/方法执行出现异常,会将异常传递给函数/方法的调用一方。如果传递到主程序,仍然没有异常处理,程序才会被终止。2、实例def d
- sql server的备份与恢复(查询分析器) 查询分析器: 命令: 1:备份数据库命令: backup database whdb1(要备
- 代码如下:create proc p_sword_getblcolumn ( @tblN