Pytorch结合PyG实现MLP过程详解

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

导入库和数据

首先,我们需要导入PyTorch和PyG库,然后准备好我们的数据。例如,我们可以使用以下方式生成一个简单的随机数据集:

from torch.utils.data import random_split
from torch_geometric.datasets import TUDataset
dataset = TUDataset(root='/tmp/ENZYMES', name='ENZYMES')
train_dataset, test_dataset = random_split(dataset, [len(dataset) - 1000, 1000])

其中,TUDataset 是PyG提供的图形数据集之一。这里我们选择了 ENZYMES 数据集并存储到 /tmp/ENZYMES 文件夹中。然后我们将该数据集分成训练集和测试集,其中训练集包含所有数据减去最后1000个数据,测试集则为最后1000个数据。

定义模型结构

接下来,我们需要定义MLP模型的结构。通过PyTorch和PyG,我们可以自己定义完整的MLP模型或者利用现有的库函数快速构建模型。在这里,我们将使用 torch.nn.Sequential 函数逐层堆叠多个线性层来实现MLP模型。以下是MLP模型定义的示例代码:

import torch.nn as nn
from torch_geometric.nn import MLP
class Net(nn.Module):
    def __init__(self, in_channels, hidden_channels, out_channels, num_layers=3):
        super(Net, self).__init__()
        self.num_layers = num_layers
        self.mlp = MLP([in_channels] + [hidden_channels] * (num_layers-1) + [out_channels])
    def forward(self, x):
        return self.mlp(x)

上述代码中,我们定义了一个 Net 类用于构建MLP网络,接收输入通道数、隐藏层节点数、输出通道数以及MLP层数作为参数。例如,我们可以按照以下方式创建一个拥有 4 层、128 个隐藏节点、并将度为图结构作为输入的MLP模型:

model = Net(in_channels=dataset.num_node_features, hidden_channels=128, out_channels=dataset.num_classes, num_layers=4)

定义训练函数

然后,我们需要定义训练函数来训练我们的MLP神经网络。在这里,我们将使用交叉熵损失和Adam优化器进行训练,并在每一个epoch结束时计算准确率并打印出来。以下是训练函数的示例代码:

import torch.optim as optim
from torch_geometric.data import DataLoader
from tqdm import tqdm
def train(model, loader, optimizer, loss_fn):
    model.train()
    correct = 0
    total_loss = 0
    for data in tqdm(loader, desc='Training'):
        optimizer.zero_grad()
        out = model(data.x)
        pred = out.argmax(dim=1)
        loss = loss_fn(out, data.y)
        loss.backward()
        optimizer.step()
        total_loss += loss.item() * data.num_graphs
        correct += pred.eq(data.y).sum().item()
    return total_loss / len(loader.dataset), correct / len(loader.dataset)

在上述代码中,我们遍历加载器中的每个数据批次,并对模型进行培训。对于每个图数据批次,我们计算网络输出、预测和损失,然后通过反向传播来更新权重。最后,我们将总损失和正确率记录下来并返回。

定义测试函数

接下来,我们还需要定义测试函数来测试我们的MLP神经网络性能表现。我们将利用与训练函数相同的输出参数进行测试,并打印出最终的测试准确率。以下是测试函数的示例代码:

def test(model, loader, loss_fn):
    model.eval()
    correct = 0
    total_loss = 0
    with torch.no_grad():
        for data in tqdm(loader, desc='Testing'):
            out = model(data.x)
            pred = out.argmax(dim=1)
            loss = loss_fn(out, data.y)
            total_loss += loss.item() * data.num_graphs
            correct += pred.eq(data.y).sum().item()
    return total_loss / len(loader.dataset), correct / len(loader.dataset)

在上述代码中,我们对测试数据集中的所有数据进行了循环,并计算网络的输出和预测。我们记录下总损失和正确分类的数据量,并返回损失和准确率之间的比率(我们使用该比率而不是精度来反映测试表现通常较小)。

训练模型并评估训练结果

最后,我们可以使用前面定义过的函数来定义主函数,从而完成MLP神经网络的训练和测试。以下是主函数的示例代码:

if __name__ == '__main__':
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model = Net(in_channels=dataset.num_node_features, hidden_channels=128, out_channels=dataset.num_classes, num_layers=4).to(device)
    loader = DataLoader(train_dataset, batch_size=128, shuffle=True)
    test_loader = DataLoader(test_dataset, batch_size=128)
    optimizer = optim.Adam(model.parameters(), lr=0.01)
    loss_fn = nn.CrossEntropyLoss()
    for epoch in range(1, 201):
        train_loss, train_acc = train(model, loader, optimizer, loss_fn)
        test_loss, test_acc = test(model, test_loader, loss_fn)
        print(f'Epoch {epoch:03d}, Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.4f}, '
              f'Test Loss: {test_loss:.4f}, Test Acc: {test_acc:.4f}')

通过上述代码,我们就可以完成MLP神经网络的训练和测试。我们使用 DataLoader 函数进行数据加载,设置学习率、损失函数、训练轮数等超参数。最后,我们可以在屏幕上看到每个时代的准确率和损失值,并通过它们评估模型的训练表现。

以上就是Pytorch结合PyG实现MLP过程详解的详细内容,更多关于Pytorch PyG实现MLP的资料请关注脚本之家其它相关文章!

相关文章

  • Python 实现一行输入多个数字(用空格隔开)

    Python 实现一行输入多个数字(用空格隔开)

    这篇文章主要介绍了Python 实现一行输入多个数字,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • tensorflow基于Anaconda环境搭建的方法步骤

    tensorflow基于Anaconda环境搭建的方法步骤

    本文主要介绍了tensorflow基于Anaconda环境搭建的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • keras的ImageDataGenerator和flow()的用法说明

    keras的ImageDataGenerator和flow()的用法说明

    这篇文章主要介绍了keras的ImageDataGenerator和flow()的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python如何将list中的string转换为int

    Python如何将list中的string转换为int

    这篇文章主要介绍了Python如何将list中的string转换为int,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python生成随机数详解流程

    Python生成随机数详解流程

    生成随机数一般使用的就是random模块下的函数,生成的随机数并不是真正意义上的随机数,而是对随机数的一种模拟。random模块包含各种伪随机数生成函数,以及各种根据概率分布生成随机数的函数。今天我们的目标就是摸清随机数有几种生成方式
    2022-03-03
  • Python中创建对象列表的实现示例

    Python中创建对象列表的实现示例

    本文主要介绍了Python中创建对象列表的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • python 如何实现遗传算法

    python 如何实现遗传算法

    这篇文章主要介绍了python 如何实现遗传算法,帮助大家更好的利用python进行数据分析、处理,感兴趣的朋友可以了解下
    2020-09-09
  • python中单例常用的几种实现方法总结

    python中单例常用的几种实现方法总结

    Python 的模块就是天然的单例模式,下面这篇文章主要给大家介绍了关于python中单例常用的几种实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用python单例具有一定的参考学习价值,需要的朋友们一起来看看吧
    2018-10-10
  • Ubuntu安装Python3.8的两种方法详解

    Ubuntu安装Python3.8的两种方法详解

    这篇文章主要给大家介绍了关于Ubuntu安装Python3.8的两种方法,在Ubuntu上安装Python非常简单,文中介绍了两种方法,每种方法都给出了详细实例,需要的朋友可以参考下
    2023-09-09
  • 详解Selenium+PhantomJS+python简单实现爬虫的功能

    详解Selenium+PhantomJS+python简单实现爬虫的功能

    这篇文章主要介绍了详解Selenium+PhantomJS+python简单实现爬虫的功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论