QM9数据集示例项目学习图神经网络

下面所有博客是个人对EEG脑电的探索,项目代码是早期版本不完整,需要完整项目代码和资料请私聊。


数据集
1、脑电项目探索和实现(EEG) (上):研究数据集选取和介绍SEED
相关论文阅读分析:
1、EEG-SEED数据集作者的—基线论文阅读和分析
2、图神经网络EEG论文阅读和分析:《EEG-Based Emotion Recognition Using Regularized Graph Neural Networks》
3、EEG-GNN论文阅读和分析:《EEG Emotion Recognition Using Dynamical Graph Convolutional Neural Networks》
4、论文阅读和分析:Masked Label Prediction: Unified Message Passing Model for Semi-Supervised Classification
5、论文阅读和分析:《DeepGCNs: Can GCNs Go as Deep as CNNs?》
6、论文阅读和分析: “How Attentive are Graph Attention Networks?”
7、论文阅读和分析:Simplifying Graph Convolutional Networks
8、论文阅读和分析:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation
9、图神经网络汇总和总结
相关实验和代码实现:
1、用于图神经网络的脑电数据处理实现_图神经网络 脑电
2、使用GCN训练和测试EEG的公开SEED数据集
3、使用GAT训练和测试EEG公开的SEED数据集
4、使用SGC训练和测试SEED数据集
5、使用Transformer训练和测试EEG的公开SEED数据集_eeg transformer
6、使用RGNN训练和测试EEG公开的SEED数据集
辅助学习资料:
1、官网三个简单Graph示例说明三种层次的应用_graph 简单示例
2、PPI数据集示例项目学习图神经网络
3、geometric库的数据处理详解
4、NetworkX的dicts of dicts以及解决Seven Bridges of Königsberg问题
5、geometric源码阅读和分析:MessagePassin类详解和使用
6、cora数据集示例项目学习图神经网络
7、Graph 聚合
8、QM9数据集示例项目学习图神经网络
9、处理图的开源库

QM9数据集:

QM9为小有机分子的相关的、一致的和详尽的化学空间提供量子化学特征,该数据库可用于现有方法的基准测试,新方法的开发,如混合量子力学/机器学习,以及结构-性质关系的系统识别。

新药物和新材料的计算从头设计需要对化合物空间进行严格和公正的探索。然而,由于其大小与分子大小相结合,大量未知领域仍然存在。报告计算了由CHONF组成的134k稳定有机小分子的几何、能量、电子和热力学性质。这些分子对应于GDB-17化学宇宙中1660亿个有机分子中所有133,885个含有多达9个重原子(CONF)的物种的子集。报告了能量最小的几何,相应的谐波频率,偶极矩,极化率,以及能量,焓,和原子化的自由能。所有性质都是在量子化学的B3LYP/6-31G(2df,p)水平上计算的。此外,对于主要的化学计量,C7H10O2,在134k分子中有6095个组成异构体。在更精确的G4MP2理论水平上报告了所有这些原子化的能量、焓和自由能。因此,该数据集为相关、一致和全面的小有机分子化学空间提供了量子化学性质。该数据库可用于现有方法的基准测试,新方法的开发,如混合量子力学/机器学习,以及结构-性质关系的系统识别。

一些有机分子如下:

在这里插入图片描述

数据集中的分子可视化:

在这里插入图片描述
文件XYZ格式:

对于每个分子,原子坐标和计算属性存储在名为dataset_index.xyz的文件中。XYZ格式(最初由明尼苏达超级计算机中心为XMol程序开发)是一种广泛使用的纯文本格式,用于编码分子的笛卡尔坐标,没有正式的规范。它包含一个标题行(na)、一个注释行和na行(na行包含元素类型和原子坐标),每行一个原子。我们扩展了这种格式,如表2所示。现在,注释行用于存储所有标量属性

QM9数据提取的特征:

能量最小的几何空间结构、相应的谐波频率、偶极矩、极化率、能量、焓、原子化的自由能等

在这里插入图片描述

网络结构的设计

Set2Set的聚合方式:

Set2Set指的是一种序列到序列的一种扩展。许多情况下,可变大小的输入和/或输出可能不会自然地表示为序列,但是有一些数据不是序列形式的,Set2Set可以是从集合到集合。

注意:输出通道数是输入通道数的两倍
q t = L S T M ( q t − 1 ∗ ) α i , t = s o f t m a x ( x i ⋅ q t ) r t = ∑ i = 1 N α i , t x i q t ∗ = q t   ∥   r t , \begin{align}\begin{aligned}\mathbf{q}_t &= \mathrm{LSTM}(\mathbf{q}^{*}_{t-1})\\\alpha_{i,t} &= \mathrm{softmax}(\mathbf{x}_i \cdot \mathbf{q}_t)\\\mathbf{r}_t &= \sum_{i=1}^N \alpha_{i,t} \mathbf{x}_i\\\mathbf{q}^{*}_t &= \mathbf{q}_t \, \Vert \, \mathbf{r}_t,\end{aligned}\end{align} qtαi,trtqt=LSTM(qt1)=softmax(xiqt)=i=1Nαi,txi=qtrt,

set2set = Set2Set(dim, processing_steps=3)

out = self.set2set(out, data.batch)

GRU:
r t = σ ( W i r x t + b i r + W h r h ( t − 1 ) + b h r ) z t = σ ( W i z x t + b i z + W h z h ( t − 1 ) + b h z ) n t = tanh ⁡ ( W i n x t + b i n + r t ∗ ( W h n h ( t − 1 ) + b h n ) ) h t = ( 1 − z t ) ∗ n t + z t ∗ h ( t − 1 ) r_t = \sigma(W_{ir} x_t + b_{ir} + W_{hr} h_{(t-1)} + b_{hr}) \\ z_t = \sigma(W_{iz} x_t + b_{iz} + W_{hz} h_{(t-1)} + b_{hz}) \\ n_t = \tanh(W_{in} x_t + b_{in} + r_t * (W_{hn} h_{(t-1)}+ b_{hn})) \\ h_t = (1 - z_t) * n_t + z_t * h_{(t-1)} rt=σ(Wirxt+bir+Whrh(t1)+bhr)zt=σ(Wizxt+biz+Whzh(t1)+bhz)nt=tanh(Winxt+bin+rt(Whnh(t1)+bhn))ht=(1zt)nt+zth(t1)

rnn = nn.GRU(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
output, hn = rnn(input, h0)

官网示例代码注释:

GitHub - pyg-team/pytorch_geometric: Graph Neural Network Library for PyTorch

import os.path as osp

import networkx as nx
import torch
import torch.nn.functional as F
from torch.nn import GRU, Linear, ReLU, Sequential

import torch_geometric.transforms as T
from torch_geometric.datasets import QM9
from torch_geometric.loader import DataLoader
from torch_geometric.nn import NNConv
from torch_geometric.nn.aggr import Set2Set
from torch_geometric.utils import remove_self_loops, to_networkx
import pylab

target = 0
dim = 64


class MyTransform(object):
    def __call__(self, data):
        # Specify target.
        data.y = data.y[:, target]
        return data


class Complete(object):
    def __call__(self, data):
        device = data.edge_index.device

        row = torch.arange(data.num_nodes, dtype=torch.long, device=device)
        col = torch.arange(data.num_nodes, dtype=torch.long, device=device)

        row = row.view(-1, 1).repeat(1, data.num_nodes).view(-1)
        col = col.repeat(data.num_nodes)
        edge_index = torch.stack([row, col], dim=0)

        edge_attr = None
        if data.edge_attr is not None:
            idx = data.edge_index[0] * data.num_nodes + data.edge_index[1]
            size = list(data.edge_attr.size())
            size[0] = data.num_nodes * data.num_nodes
            edge_attr = data.edge_attr.new_zeros(size)
            edge_attr[idx] = data.edge_attr

        edge_index, edge_attr = remove_self_loops(edge_index, edge_attr)
        data.edge_attr = edge_attr
        data.edge_index = edge_index

        return data


path = osp.join(osp.dirname(osp.realpath(__file__)), '..', 'data', 'QM9')
transform = T.Compose([MyTransform(), Complete(), T.Distance(norm=False)])
dataset = QM9(path, transform=transform).shuffle()

# 可视化分子
one_data = dataset[0]
G = to_networkx(one_data)
nx.draw(G)
pylab.show()

# Normalize targets to mean = 0 and std = 1.
mean = dataset.data.y.mean(dim=0, keepdim=True)
std = dataset.data.y.std(dim=0, keepdim=True)
dataset.data.y = (dataset.data.y - mean) / std
mean, std = mean[:, target].item(), std[:, target].item()

# Split datasets.
test_dataset = dataset[:10000]
val_dataset = dataset[10000:20000]
train_dataset = dataset[20000:]
test_loader = DataLoader(test_dataset, batch_size=128, shuffle=False)
val_loader = DataLoader(val_dataset, batch_size=128, shuffle=False)
train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)


class Net(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.lin0 = torch.nn.Linear(dataset.num_features, dim)

        nn = Sequential(Linear(5, 128), ReLU(), Linear(128, dim * dim))
        self.conv = NNConv(dim, dim, nn, aggr='mean')
        self.gru = GRU(dim, dim)

        # Set2Set是一种将集合到集合用LSTM时序模型进行映射的聚合方式,注意out_channels = 2 * in_channels
        self.set2set = Set2Set(dim, processing_steps=3)
        self.lin1 = torch.nn.Linear(2 * dim, dim)
        self.lin2 = torch.nn.Linear(dim, 1)

    def forward(self, data):
        out = F.relu(self.lin0(data.x))
        h = out.unsqueeze(0)

        for i in range(3):
            m = F.relu(self.conv(out, data.edge_index, data.edge_attr))
            out, h = self.gru(m.unsqueeze(0), h)
            out = out.squeeze(0)
        # (2325,64)
        out = self.set2set(out, data.batch)
        # (128,128)
        out = F.relu(self.lin1(out))
        out = self.lin2(out)
        return out.view(-1)


device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Net().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min',
                                                       factor=0.7, patience=5,
                                                       min_lr=0.00001)


def train(epoch):
    model.train()
    loss_all = 0

    for data in train_loader:
        data = data.to(device)
        optimizer.zero_grad()
        loss = F.mse_loss(model(data), data.y)
        loss.backward()
        loss_all += loss.item() * data.num_graphs
        optimizer.step()
    return loss_all / len(train_loader.dataset)


def test(loader):
    model.eval()
    error = 0

    for data in loader:
        data = data.to(device)
        error += (model(data) * std - data.y * std).abs().sum().item()  # MAE
    return error / len(loader.dataset)


best_val_error = None
for epoch in range(1, 301):
    lr = scheduler.optimizer.param_groups[0]['lr']
    loss = train(epoch)
    val_error = test(val_loader)
    scheduler.step(val_error)

    if best_val_error is None or val_error <= best_val_error:
        test_error = test(test_loader)
        best_val_error = val_error

    print(f'Epoch: {epoch:03d}, LR: {lr:7f}, Loss: {loss:.7f}, '
          f'Val MAE: {val_error:.7f}, Test MAE: {test_error:.7f}')

参考:

1、Quantum-Machine.org: Datasets

2、Quantum chemistry structures and properties of 134 kilo molecules (figshare.com)

3、GitHub - pyg-team/pytorch_geometric: Graph Neural Network Library for PyTorch

4、Quantum chemistry structures and properties of 134 kilo molecules | Scientific Data (nature.com)

5、《ORDER MATTERS: SEQUENCE TO SEQUENCE FOR SETS》

6、GRU — PyTorch 1.13 documentation

<think>嗯,用户是一名大二计算机科学与技术专业的女生,想从零开始学习YOLO并尽快上手实践。首先,我需要考虑她的背景。作为计算机专业的学生,她可能已经具备一定的编程基础,尤其是Python,可能对机器学习有初步了解,但可能对深度学习和计算机视觉的具体应用不太熟悉。 她需要的是详细的学习路径和具体的实践步骤。我应该从基础开始,确保她理解必要的背景知识,比如深度学习的基本概念和计算机视觉的基础。然后,逐步引导她搭建开发环境,学习YOLO的理论,最后进行实践操作。 首先,学习准备阶段。她可能需要安装Python、PyTorch等工具。考虑到她可能使用Windows系统,需要给出相应的安装命令和注意事项。例如,安装PyTorch时,可能需要通过conda或pip,并确保CUDA版本兼容。 接下来是YOLO的理论学习。需要推荐一些资源,比如论文和官方文档,帮助她理解YOLO的架构和原理。同时,建议她学习相关库,如OpenCV和Pillow,这对数据处理很重要。 然后是环境搭建。这里要详细说明步骤,包括创建虚拟环境、安装依赖库、验证安装是否成功。可能需要提醒她注意版本兼容性问题,避免后续出现错误。 数据准备部分,她需要了解如何收集和标注数据。这里可能需要推荐工具,比如LabelImg,并说明标注的格式要求。同时,数据集划分和配置文件(如data.yaml)的编写也是关键步骤,需要具体示例。 模型训练部分,要给出具体的命令和参数解释,比如调整批次大小和训练轮数。可能还要提醒她根据硬件情况调整参数,比如显存不足时减小批次大小。 模型验证和推理阶段,需要说明如何测试模型性能,使用验证集和实际图片进行测试,并解释相关参数的作用。 最后,优化和部署建议,帮助她进一步提升模型效果,并应用到实际项目中。 需要确保每个步骤都清晰具体,避免使用过于专业的术语,或者对术语进行解释。同时,考虑到她可能的时间安排,给出一个合理的学习计划建议,比如每天投入的时间分配。 可能还需要预见她会遇到的问题,比如环境配置错误、数据标注格式不正确、训练时的显存不足等,提前给出提示或解决方案。例如,在安装PyTorch时,如何检查CUDA是否可用,或者在训练时调整批次大小。 另外,她作为女生可能在技术社区中遇到较少的同性别榜样,可以适当鼓励,强调实践和持续学习的重要性,帮助她建立信心。 总结来说,回答需要结构清晰,步骤详尽,语言友好,同时提供必要的资源链接和示例代码,帮助她一步步完成从环境搭建到训练自己的YOLO模型的全过程。</think>好的!我将从**环境搭建、知识储备、实践步骤**三个维度为你梳理学习路径,并提供**可操作性极强的详细步骤**。按照这个流程,最快可以在**3-7天**内完成第一个YOLO模型的训练。(以下步骤基于Windows系统+PyTorch框架) --- ### **一、学习准备阶段** #### 1. 前置知识储备 - **Python基础**:需掌握`类/函数/文件操作`(YOLO代码基于Python) - **深度学习基础**:了解`卷积神经网络(CNN) / 损失函数 / 反向传播`(可速通吴恩达深度学习课程前3周内容) - **计算机视觉基础**:理解`边界框(Bounding Box) / 置信度 / 非极大值抑制(NMS)`概念 #### 2. 开发环境搭建(30分钟) ```bash # 步骤1:安装Python(推荐3.8版本) https://www.python.org/downloads/ # 步骤2:安装PyTorch(带GPU加速) conda create -n yolo python=3.8 conda activate yolo # 访问https://pytorch.org/获取对应CUDA版本的安装命令,例如: pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 步骤3:安装YOLOv5依赖库 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt # 自动安装所有依赖 ``` #### 3. 验证安装(5分钟) ```python import torch print(torch.cuda.is_available()) # 应输出True(GPU可用) print(torch.__version__) # 需≥1.8.0 ``` --- ### **二、YOLO理论学习(1天)** #### 必学资料清单 1. **YOLO论文精读**: - [YOLOv1](https://arxiv.org/abs/1506.02640)(理解核心思想) - [YOLOv5](https://github.com/ultralytics/yolov5)(直接看官方文档) 2. **关键概念**: - **网格划分**:把图像划分为$S \times S$网格 - **锚框(Anchor)**:预定义不同长宽比的检测框 - **损失函数**:$\text{Loss} = \lambda_{\text{coord}} \sum \text{坐标误差} + \lambda_{\text{obj}} \sum \text{置信度误差} + \lambda_{\text{noobj}} \sum \text{背景误差} + \lambda_{\text{class}} \sum \text{分类误差}$ 3. **推荐学习资源**: - 哔哩哔哩:同济子豪兄的YOLO系列教程 - 官方文档:`https://docs.ultralytics.com/` --- ### **三、动手实践阶段(重点!)** #### 1. 数据准备(核心!) - **数据收集**: - 自拍照片(手机拍摄)+ 公开数据集(如COCO、VOC) - 推荐使用**Roboflow**平台下载现成标注数据 - **数据标注**(使用LabelImg工具): ```bash pip install labelImg # 安装标注工具 labelImg # 启动后选择YOLO格式标注 ``` ![标注示例](https://i.imgur.com/9Qm7g0l.png) - **数据集结构**: ``` dataset/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 └── labels/ ├── train/ # 对应标注文件(.txt) └── val/ ``` - **创建data.yaml**: ```yaml train: ../dataset/images/train val: ../dataset/images/val nc: 2 # 类别数(例如:人、猫) names: [&#39;person&#39;, &#39;cat&#39;] ``` #### 2. 模型训练(GPU加速!) ```bash python train.py --img 640 --batch 16 --epochs 100 --data data.yaml --cfg yolov5s.yaml --weights yolov5s.pt ``` - **参数解析**: - `--img 640`:输入图像尺寸 - `--batch 16`:批次大小(根据GPU显存调整) - `--epochs 100`:训练轮数 - `--weights yolov5s.pt`:使用预训练权重 #### 3. 模型验证 ```bash python detect.py --weights runs/train/exp/weights/best.pt --source test.jpg ``` - 输出结果保存在`runs/detect/exp`目录 --- ### **四、进阶优化建议** 1. **模型压缩**:使用`--weights yolov5s.pt --include onnx`导出为ONNX格式 2. **数据增强**:在data.yaml中添加 ```yaml augment: hsv_h: 0.015 # 色调增强 hsv_s: 0.7 # 饱和度增强 flipud: 0.5 # 垂直翻转概率 ``` 3. **部署应用**:结合Flask搭建Web API ```python from flask import Flask, request app = Flask(__name__) @app.route(&#39;/detect&#39;, methods=[&#39;POST&#39;]) def detect(): file = request.files[&#39;image&#39;] results = model(file) # 调用YOLO模型 return results.pandas().xyxy[0].to_json() ``` --- ### **五、学习计划表** | 时间段 | 任务目标 | 预期产出 | |--------|----------|----------| | Day1 | 完成环境搭建+跑通官方Demo | 成功检测出示例图片中的物体 | | Day2 | 标注自定义数据集+训练模型 | 获得初步训练结果(mAP≥0.5) | | Day3 | 优化参数+尝试部署 | 完成模型导出和简单Web应用 | 遇到问题优先查看官方Issues区(90%的问题已有解决方案),祝你训练顺利! 🚀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KPer_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值