深度学习 GNN图神经网络(四)线性回归之ESOL数据集水溶性预测

这篇具有很好参考价值的文章主要介绍了深度学习 GNN图神经网络(四)线性回归之ESOL数据集水溶性预测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

本文旨在使用化合物分子的SMILES字符串进行数据模型训练,对其水溶性的值进行预测。

之前的文章《深度学习 GNN图神经网络(三)模型思想及文献分类案例实战》引用的Cora数据集只有一张图,属于图神经网络的节点分类问题。本文介绍的是多图批量训练的线性回归问题,在文章最后也讨论了图分类问题。

二、ESOL数据集

本文使用的是ESOL数据集,在文章《如何将化学分子SMILES字符串转化为Pytorch图数据结构——ESOL分子水溶性数据集解析》中有详细介绍,在此不作详述。

三、加载数据集

from torch_geometric.datasets import MoleculeNet

dataset = MoleculeNet(root="data", name="ESOL")

print('num_features:',dataset.num_features)
print('num_classes:',dataset.num_classes)
print('num_node_features',dataset.num_node_features)
print("size:", len(dataset))

d=dataset[10]
print("Sample:", d)
print("Sample y:", d.y)
print("Sample num_nodes:",d.num_nodes)
print("Sample num_edges:",d.num_edges)

这里可以得到数据集的一些基本信息:

num_features: 9
num_classes: 734
num_node_features 9
size: 1128
Sample: Data(x=[6, 9], edge_index=[2, 12], edge_attr=[12, 3], smiles='O=C1CCCN1', y=[1, 1])
Sample y: tensor([[1.0700]])
Sample num_nodes: 6
Sample num_edges: 12

四、数据拆分

将数据集拆分为训练数据和测试数据:

from torch_geometric.loader import DataLoader
data_size = len(dataset)
batch_size = 128
train_data=dataset[:int(data_size*0.8)]
test_data=dataset[int(data_size*0.8):]

train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_data, batch_size=len(test_data))

五、构造模型

import torch
import torch.nn as nn
from torch_geometric.nn import GCNConv
import matplotlib.pyplot as plt
from torch_geometric.nn import global_mean_pool

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

hidden_channels = 64

class GNN(nn.Module):
    
    def __init__(self):
        # 初始化Pytorch父类
        super().__init__()
        
        self.conv1=GCNConv(dataset.num_node_features, hidden_channels)
        self.conv2=GCNConv(hidden_channels, hidden_channels)
        self.conv3 = GCNConv(hidden_channels, hidden_channels)
        self.conv4 = GCNConv(hidden_channels, hidden_channels)
        self.out = nn.Linear(hidden_channels, 1)
        
        # 创建损失函数,使用均方误差
        self.loss_function = nn.MSELoss()

        # 创建优化器,使用Adam梯度下降
        self.optimiser = torch.optim.Adam(self.parameters(), lr=0.005,weight_decay=5e-4)

        # 训练次数计数器
        self.counter = 0
        # 训练过程中损失值记录
        self.progress = []
    
    # 前向传播函数
    def forward(self, x, edge_index,batch):
        
        x=x.to(device)
        edge_index=edge_index.to(device)
        batch=batch.to(device)

        x=self.conv1(x, edge_index)
        x=x.relu()
        x=self.conv2(x, edge_index)
        x=x.relu()
        x=self.conv3(x, edge_index)
        x=x.relu()
        x=self.conv4(x, edge_index)
        x=x.relu()

        # 全局池化
        x = global_mean_pool(x, batch)  # [x, batch]

        out=self.out(x)
        return out
    
    # 训练函数
    def train(self, data):

        # 前向传播计算,获得网络输出
        outputs = self.forward(data.x.float(),data.edge_index,data.batch)
        
        # 计算损失值
        y=data.y.to(device)
        loss = self.loss_function(outputs, y)

        # 累加训练次数
        self.counter += 1

        # 每10次训练记录损失值
        if (self.counter % 10 == 0):
            self.progress.append(loss.item())

        # 每1000次输出训练次数   
        if (self.counter % 1000 == 0):
            print(f"counter={self.counter}, loss={loss.item()}")
            
        # 梯度清零, 反向传播, 更新权重
        self.optimiser.zero_grad()
        loss.backward()
        self.optimiser.step()
    
    # 测试函数
    def test(self, data):
        # 前向传播计算,获得网络输出
        outputs = self.forward(data.x.float(),data.edge_index,data.batch)

        # 把绝对值误差小于1的视为正确,计算准确度
        y=data.y.to(device)
        acc=sum(torch.abs(y-outputs)<1)/len(data.y)
        return acc

    # 绘制损失变化图
    def plot_progress(self):
        plt.plot(range(len(self.progress)),self.progress)
      

六、训练模型

model = GNN()
model.to(device)

for i in range(1001):
    for data in train_loader:
        # print(data,'num_graphs:',data.num_graphs)
        model.train(data)
counter=1000, loss=1.4304862022399902
counter=2000, loss=0.9842458963394165
counter=3000, loss=0.27240827679634094
counter=4000, loss=0.23295772075653076
counter=5000, loss=0.38499030470848083
counter=6000, loss=1.470423698425293
counter=7000, loss=0.845589816570282
counter=8000, loss=0.15707021951675415

绘制损失值变化图::

model.plot_progress()

深度学习 GNN图神经网络(四)线性回归之ESOL数据集水溶性预测

七、测试结果

#torch.set_printoptions(precision=4,sci_mode=False) #pytorch不使用科学计数法显示

for data in test_loader:
    acc=model.test(data)
    print(acc)
tensor([0.8186], device='cuda:0')

可以看到,预测值误差小于1的占了81.86%,效果还行。

八、分类问题

对于图分类问题,其实也差不多。只需要修改下Linear网络层:

self.out = Linear(hidden_channels, dataset.num_classes)

这样预测结果就会有num_classes个,取最大值的下标索引即可。
伪代码为:

pred=outputs.argmax(dim=1)
correct += int((pred == data.y).sum())

参考文献

[1] https://pytorch-geometric.readthedocs.io/en/latest/get_started/colabs.html
[2] https://zhuanlan.zhihu.com/p/504978470文章来源地址https://www.toymoban.com/news/detail-430799.html

到了这里,关于深度学习 GNN图神经网络(四)线性回归之ESOL数据集水溶性预测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pytorch学习——线性神经网络——1线性回归

    概要:线性神经网络是一种最简单的神经网络模型,它由若干个线性变换和非线性变换组成。线性变换通常表示为矩阵乘法,非线性变换通常是一个逐元素的非线性函数。线性神经网络通常用于解决回归和分类问题。         线性回归是一种常见的机器学习算法,用于建

    2024年02月15日
    浏览(44)
  • pytorch学习-线性神经网络——softmax回归+损失函数+图片分类数据集

            Softmax回归(Softmax Regression)是一种常见的多分类模型,可以用于将输入变量映射到多个类别的概率分布中。softmax回归是机器学习中非常重要并且经典的模型,虽然叫回归,实际上是一个分类问题         回归是估计一个连续值,分类是预测一个连续的类别  示例

    2024年02月15日
    浏览(45)
  • 《动手学深度学习》——线性神经网络

    参考资料: 《动手学深度学习》 样本: n n n 表示样本数, x ( i ) = [ x 1 ( i ) , x 2 ( i ) , ⋯   , x d ( i ) ] x^{(i)}=[x^{(i)}_1,x^{(i)}_2,cdots,x^{(i)}_d] x ( i ) = [ x 1 ( i ) ​ , x 2 ( i ) ​ , ⋯ , x d ( i ) ​ ] 表示第 i i i 个样本。 预测: y ^ = w T x + b hat{y}=w^Tx+b y ^ ​ = w T x + b 表示单个样本的预

    2024年02月12日
    浏览(53)
  • 动手学深度学习(二)线性神经网络

    推荐课程:跟李沐学AI的个人空间-跟李沐学AI个人主页-哔哩哔哩视频 目录 一、线性回归 1.1 线性模型 1.2 损失函数(衡量预估质量) 二、基础优化算法(梯度下降算法) 2.1 梯度下降公式 2.2 选择学习率 2.3 小批量随机梯度下降 三、线性回归的从零开始实现(代码实现) 3.1

    2024年02月14日
    浏览(46)
  • Pytorch深度学习-----神经网络之线性层用法

    PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop) Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10) Pytorch深度学习--

    2024年02月14日
    浏览(34)
  • 动手学深度学习-pytorch版本(二):线性神经网络

    参考引用 动手学深度学习 神经网络的整个训练过程,包括: 定义简单的神经网络架构、数据处理、指定损失函数和如何训练模型 。经典统计学习技术中的 线性回归 和 softmax 回归 可以视为线性神经网络 1.1 线性回归 回归 (regression) 是能为一个或多个自变量与因变量之间关系建

    2024年02月12日
    浏览(47)
  • 【图神经网络】图神经网络(GNN)学习笔记:Graph Embedding

    Graph广泛存在于真实世界的多种场景中,即节点和边的集合。比如社交网络中人与人之间的联系,生物中蛋白质相互作用以及通信网络中的IP地址之间的通信等等。除此之外,我们最常见的一张图片、一个句子也可以抽象地看做是一个图模型的结构,图结构可以说是无处不在。

    2024年02月08日
    浏览(43)
  • 【深度学习】基于MindSpore和pytorch的Softmax回归及前馈神经网络

    1 实验内容简介 1.1 实验目的 (1)熟练掌握tensor相关各种操作; (2)掌握广义线性回归模型(logistic模型、sofmax模型)、前馈神经网络模型的原理; (3)熟练掌握基于mindspore和pytorch的广义线性模型与前馈神经网络模型的实现。   1.2 实验内容及要求 请基于mindspore和pytorch平

    2023年04月22日
    浏览(39)
  • 复现图神经网络(GNN)论文的过程以及PyTorch与TensorFlow对比学习

    复现图神经网络(GNN)论文的过程通常包括以下几个步骤: 一、理解论文内容:首先彻底理解论文,包括其理论基础、模型架构、使用的数据集、实验设置和得到的结果。 二、获取或准备数据集:根据论文中描述的实验,获取相应的数据集。如果论文中使用的是公开数据集

    2024年01月20日
    浏览(52)
  • A.图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)

    图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk、node2vec);图神经网络算法(GCN、GAT、GraphSage),部分进阶 GNN 模型(UniMP标签传播、ERNIESage)模型算法等,完成项目实战 专栏链接 :图学习图神经网络算法专栏简介:含图算法(图游走模型、图神经网络算法等)原

    2024年02月01日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包