使用DeeperGCN训练和测试SEED数据集

文章介绍了一个用PyTorch实现的ECG_DeeperGCNs模型,该模型基于图神经网络(GENConv)进行心电图数据的分析。模型包含多层DeepGCNLayer,用于学习节点特征,并使用Adam优化器和交叉熵损失函数进行训练。代码还定义了训练和测试过程,以及数据加载器。模型在SEED数据集上进行训练和评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
#
# Copyright (C) 2022 Emperor_Yang, Inc. All Rights Reserved 
#
# @CreateTime    : 2023/2/9 22:12
# @Author        : Emperor_Yang 
# @File          : ECG_DeepGCNs.py
# @Software      : PyCharm

import torch
from torch.nn import ReLU
from easydict import EasyDict
from torch_geometric.nn import GENConv, LayerNorm, DeepGCNLayer, global_add_pool
from torch_geometric.data import DataLoader
from data_process.seed_loader_gnn_memory import SeedGnnMemoryDataset

config = EasyDict()
config.learn_rate = 0.01
config.epoch = 5
config.note_feature_dim = 5
config.note_num = 62
config.hidden_channels = 16
config.class_num = 3
config.hidden_layers = 2
config.batch_size = 16
config.max_loss_increase_time = 3


class ECG_DeeperGCNs(torch.nn.Module):
    """
    GCN handle ECG
    """

    def __init__(self, in_channels, hidden_channels, out_channels):
        super(ECG_DeeperGCNs, self).__init__()

        self.layers = torch.nn.ModuleList()
        for i in range(1, config.hidden_layers + 1):
            conv = GENConv(hidden_channels, hidden_channels, aggr='softmax',
                           t=1.0, learn_t=True, num_layers=2, norm='layer')
            norm = LayerNorm(hidden_channels)
            act = ReLU(inplace=True)

            layer = DeepGCNLayer(conv, norm, act, block='res+', dropout=0.1)
            self.layers.append(layer)

        self.fc1 = torch.nn.Linear(hidden_channels , out_channels)

    def forward(self, x, edge_index, index, edge_weight=None):
        """
        forward
        :param index:
        :param x:note feature
        :param edge_index:edge pair
        :param edge_weight: edge feature
        :return:
        """
        for layer in self.layers[1:]:
            x = layer(x, edge_index, edge_weight)
        x = global_add_pool(x, index)
        x = self.fc1(x)
        return x


model = ECG_DeeperGCNs(config.note_feature_dim, config.hidden_channels, config.class_num)
data_set = SeedGnnMemoryDataset(root='../data/SEED/', processed_file='1_20131027.pt')
train_data_set = data_set[: int(0.8 * data_set.len())]
test_data_set = data_set[int(0.8 * data_set.len()):]
train_data_loader = DataLoader(train_data_set, batch_size=config.batch_size, shuffle=True)
test_data_loader = DataLoader(test_data_set, batch_size=config.batch_size, shuffle=False)
optimizer = torch.optim.Adam(model.parameters(), lr=config.learn_rate)
criterion = torch.nn.CrossEntropyLoss()


def train():
    loss_sum = 0
    data_size = 0
    for mini_batch in train_data_loader:
        if mini_batch.num_graphs == config.batch_size:
            data_size += mini_batch.num_graphs
            model.train()
            optimizer.zero_grad()
            out = model(mini_batch.x, mini_batch.edge_index, mini_batch.batch)
            loss = criterion(out, mini_batch.y)
            loss.backward()
            optimizer.step()
            loss_sum += loss.item() / mini_batch.num_graphs
    return loss_sum / data_size


def test():
    count = 0
    data_size = 0
    for mini_batch in test_data_loader:
        if mini_batch.num_graphs == config.batch_size:
            out = model(mini_batch.x, mini_batch.edge_index, mini_batch.batch)
            predict = torch.argmax(out, dim=1)
            count += int(predict.eq(mini_batch.y).sum())
            data_size += mini_batch.num_graphs
    print("Test Accuracy:{}%".format(count / data_size * 100))


if __name__ == '__main__':
    loss_increase_time = 0
    last_lost = 1
    for epoch in range(config.epoch):
        avg_loss = train()
        print("epoch:{}, loss:{}".format(epoch + 1, avg_loss))
        if avg_loss > last_lost:
            loss_increase_time += 1
        else:
            last_lost = avg_loss
        # 如果连续增加loss大于config.max_loss_increase_time,则停止训练
        if loss_increase_time > config.max_loss_increase_time:
            break
    test()

对于使用XGBoost进行建模的数据集划分,你可以按照以下步骤进行: 1. 导入所需的库: ```python import xgboost as xgb from sklearn.model_selection import train_test_split ``` 2. 加载数据集并准备特征标签数据: ```python # 假设你的特征数据保存在X中,标签数据保存在y中 # 加载数据集 data = xgb.DMatrix(X, label=y) ``` 3. 划分训练测试集: ```python # 设置随机种子,以确保每次划分都是一致的 random_seed = 42 # 划分训练测试集,将70%的数据用于训练,30%的数据用于测试 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=random_seed) # 将训练测试集转换为DMatrix格式 dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test) ``` 4. 使用训练集进行模型训练: ```python # 设置参数 params = { "objective": "binary:logistic", # 二分类问题 "eval_metric": "logloss", # 使用logloss作为评估指标 "seed": random_seed } # 训练模型 model = xgb.train(params, dtrain) ``` 5. 使用测试集评估模型性能: ```python # 预测测试集结果 y_pred = model.predict(dtest) # 在测试集上计算性能指标,例如准确率、精确率、召回率等 # 这里使用了二分类问题的例子,你可以根据具体问题选择适当的评估指标 ``` 这样,你就完成了使用XGBoost进行数据集划分、训练测试的流程。请注意,上述代码仅为示例,具体情况可能需要根据你的数据集任务进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KPer_Yang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值