深度学习技巧应用22-构建万能数据生成类的技巧,适用于CNN,RNN,GNN模型的调试与训练贯通

深度学习技巧应用22-构建万能数据生成类的技巧,适用于CNN,RNN,GNN模型的调试与训练贯通

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用22-构建万能数据生成类的技巧,适用于CNN,RNN,GNN模型的调试与训练贯通。本文将实现了一个万能数据生成类的编写,并使用PyTorch框架训练CNN、RNN和GNN模型。

目录:
1.背景介绍
2.依赖库介绍
3.万能的数据生成器介绍
4.CNN,RNN,GNN模型搭建
5.数据生成与模型训练
6.训练结果与总结

www.zeeklog.com  - 深度学习技巧应用22-构建万能数据生成类的技巧,适用于CNN,RNN,GNN模型的调试与训练贯通

1.背景介绍

在人工智能模型训练过程中,我们需要进行一些实验、测试或调试,我们可能需要一个具有特定形状和数量的数据集来验证我们的算法或模型。通过构建一个万能的数据生成器,我们可以灵活地生成各种形状和大小的数据集,无需手动制作和准备真实数据集。

其次,数据生成器还可以用于探索数据集的性质和特征。通过生成具有特定分布、特征或规律的数据集,我们可以更深入地了解数据之间的关系、特征之间的相互影响以及数据的结构等。这对于数据预处理、特征工程和模型选择都非常有帮助。

此外,数据生成器还可以用于实现数据增强技术。数据增强是指通过对原始数据进行一系列变换或扰动来生成新的训练样本,以增加训练数据的多样性和泛化能力。通过构建一个万能的数据生成器,我们可以定义各种数据增强方法,并在训练过程中动态地生成增强后的样本,从而提高模型的稳健性和可靠性。

2.依赖库介绍

首先,我们需要引入以下依赖库:

  • torch:PyTorch框架
  • torch.optim:torch.optim是PyTorch框架中的一个模块,用于优化模型的参数。它提供了各种优化算法,如随机梯度下降(SGD)、Adam、Adagrad等。通过选择适当的优化算法和调整参数,可以使模型在训练过程中更好地收敛并获得更好的性能。
  • torch.utils.data:torch.utils.data是PyTorch框架中的一个模块,用于处理数据集的工具类。它提供了一些常用的数据处理操作,如数据加载、批量处理、数据迭代和数据转换等。通过使用torch.utils.data,可以方便地将数据集加载到模型中进行训练,并且能够灵活地处理不同格式的数据。
  • numpy:numpy是一个Python库,主要用于进行数值计算和科学计算。它提供了多维数组对象(ndarray)和一系列用于操作数组的函数。numpy可以高效地进行数值运算,并且支持广播(broadcasting)和向量化操作,因此在科学计算、数据分析和机器学习等领域都得到广泛应用。在PyTorch中,numpy可以与torch.Tensor进行无缝的转换,方便进行数据的处理和转换。

3.万能的数据生成器介绍

首先我们需要定义了一个名为UniversalDataset的数据集类,用于生成具有特定形状和数量的数据和标签。

在类的初始化方法__init__中,我们传入了三个参数:data_shape表示数据的形状(一个元组),target_shape表示标签的形状(一个元组),num_samples表示数据集中样本的数量。通过这三个参数生成数据。

接着,我们实现了__len__方法,该方法返回数据集中样本的数量,即num_samples。

再定义__getitem__方法,该方法根据索引idx返回数据集中索引对应的数据和标签。在这个方法中,我们首先创建了一个与data_shape相同形状的全零张量data,以及一个与target_shape相同形状的全零张量target。

然后,我们分别计算了数据和标签的维度,即data_dims和target_dims。

本文使用torch.linspace函数在0和1之间生成长度为data_dim_size的等间隔数据范围data_range,并通过reshape方法将其重新塑形为data_shape_expanded形状的张量。然后,我们将这个塑形后的数据范围加到数据张量data上。

我们对标签也进行了类似的操作,生成了一个有规律的标签张量target。

最后,我们返回了数据张量data和标签张量target作为这个索引对应的样本。

通过这个类,我们可以根据需要生成具有指定形状和数量的数据集,并且数据和标签都是有规律的,方便进行后续的训练和评估。

import torch
from torch import nn
from torch.utils.data import DataLoader, Dataset

class UniversalDataset(Dataset):
    def __init__(self, data_shape, target_shape, num_samples):
        self.data_shape = data_shape
        self.target_shape = target_shape
        self.num_samples = num_samples

    def __len__(self):
        return self.num_samples

    def __getitem__(self, idx):
        # 生成数据和标签
        data = torch.zeros(self.data_shape)
        target = torch.zeros(self.target_shape)

        # 计算数据和标签的维度
        data_dims = len(self.data_shape)
        target_dims = len(self.target_shape)

        # 生成有规律的数据和标签
        for dim in range(data_dims):
            data_dim_size = self.data_shape[dim]
            data_range = torch.linspace(0, 1, data_dim_size)
            data_shape_expanded = [1] * data_dims
            data_shape_expanded[dim] = data_dim_size
            data += data_range.reshape(data_shape_expanded)

        for dim in range(target_dims):
            target_dim_size = self.target_shape[dim]
            target_range = torch.linspace(0, 1, target_dim_size)
            target_shape_expanded = [1] * target_dims
            target_shape_expanded[dim] = target_dim_size
            target += target_range.reshape(target_shape_expanded)

        return data, target

4.CNN,RNN,GNN模型搭建

class CNNModel(nn.Module):
    def __init__(self, input_shape):
        super(CNNModel, self).__init__()
        self.conv1 = nn.Conv2d(input_shape[0], 16, kernel_size=3, stride=1, padding=1)
        self.fc = nn.Linear(16 * (input_shape[1] // 2) * (input_shape[2] // 2), 10)

    def forward(self, x):
        x = self.conv1(x)
        x = nn.functional.relu(x)
        x = nn.functional.max_pool2d(x, 2)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x

class RNNModel(nn.Module):
    def __init__(self, input_shape):
        super(RNNModel, self).__init__()
        self.rnn = nn.RNN(input_shape[1], 64, batch_first=True)
        self.fc = nn.Linear(64, 10)

    def forward(self, x):

        _, h_n = self.rnn(x)
        x = self.fc(h_n.squeeze(0))
        return x

class GNNModel(nn.Module):
    def __init__(self, input_shape):
        super(GNNModel, self).__init__()
        self.fc1 = nn.Linear(input_shape[1], 32)
        self.fc2 = nn.Linear(32, 10)

    def forward(self, x):
        x = torch.mean(x, dim=1)
        x = self.fc1(x)
        x = nn.functional.relu(x)
        x = self.fc2(x)
        return x

5.数据生成与模型训练

# 定义训练函数
def train(model, dataloader, criterion, optimizer):
    running_loss = 0.0
    correct = 0
    total = 0

    for inputs, labels in dataloader:
        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, labels)

        _, predicted = torch.max(outputs.data, dim=1)
        total += labels.size(0)

        correct += (predicted == labels.argmax(dim=1)).sum().item()

        loss.backward()
        optimizer.step()

        running_loss += loss.item()

    epoch_loss = running_loss / len(dataloader)
    epoch_acc = correct / total

    return epoch_loss, epoch_acc

# 设置参数
data_shape_cnn = (3, 32, 32)  # (channels, height, width)
target_shape = (10,)
num_samples = 1000
batch_size = 32
learning_rate = 0.001
num_epochs = 10

# 创建数据集和数据加载器
dataset = UniversalDataset(data_shape_cnn, target_shape, num_samples)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 创建CNN模型、优化器和损失函数
cnn_model = CNNModel(data_shape_cnn)
cnn_optimizer = torch.optim.Adam(cnn_model.parameters(), lr=learning_rate)
cnn_criterion = nn.CrossEntropyLoss()

print('CNN模型训练:')
# 训练CNN模型
for epoch in range(num_epochs):
    cnn_loss, cnn_acc = train(cnn_model, dataloader, cnn_criterion, cnn_optimizer)
    print(f'CNN - Epoch {epoch+1}/{num_epochs}, Loss: {cnn_loss:.4f}, Accuracy: {cnn_acc:.4f}')


# 重新创建数据集和数据加载器
data_shape_rnn = (20, 32)  # (sequence_length, input_size, hidden_size)
dataset = UniversalDataset(data_shape_rnn, target_shape, num_samples)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 创建RNN模型、优化器和损失函数
rnn_model = RNNModel(data_shape_rnn)
rnn_optimizer = torch.optim.Adam(rnn_model.parameters(), lr=learning_rate)
rnn_criterion = nn.CrossEntropyLoss()

print('RNN模型训练:')
# 训练RNN模型
for epoch in range(num_epochs):
    rnn_loss, rnn_acc = train(rnn_model, dataloader, rnn_criterion, rnn_optimizer)
    print(f'RNN - Epoch {epoch+1}/{num_epochs}, Loss: {rnn_loss:.4f}, Accuracy: {rnn_acc:.4f}')

# 重新创建数据集和数据加载器
data_shape_gnn = (10, 100)  # (num_nodes, node_features)
dataset = UniversalDataset(data_shape_gnn, target_shape, num_samples)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 创建GNN模型、优化器和损失函数
gnn_model = GNNModel(data_shape_gnn)
gnn_optimizer = torch.optim.Adam(gnn_model.parameters(), lr=learning_rate)
gnn_criterion = nn.CrossEntropyLoss()

print('GNN模型训练:')
# 训练GNN模型
for epoch in range(num_epochs):
    gnn_loss, gnn_acc = train(gnn_model, dataloader, gnn_criterion, gnn_optimizer)
    print(f'GNN - Epoch {epoch+1}/{num_epochs}, Loss: {gnn_loss:.4f}, Accuracy: {gnn_acc:.4f}')

6.训练结果与总结

运行结果:

CNN模型训练:
CNN - Epoch 1/10, Loss: 10.4031, Accuracy: 0.5840
CNN - Epoch 2/10, Loss: 10.2561, Accuracy: 1.0000
CNN - Epoch 3/10, Loss: 10.2503, Accuracy: 1.0000
CNN - Epoch 4/10, Loss: 10.2496, Accuracy: 1.0000
CNN - Epoch 5/10, Loss: 10.2495, Accuracy: 1.0000
CNN - Epoch 6/10, Loss: 10.2494, Accuracy: 1.0000
CNN - Epoch 7/10, Loss: 10.2493, Accuracy: 1.0000
CNN - Epoch 8/10, Loss: 10.2493, Accuracy: 1.0000
CNN - Epoch 9/10, Loss: 10.2493, Accuracy: 1.0000
CNN - Epoch 10/10, Loss: 10.2493, Accuracy: 1.0000
RNN模型训练:
RNN - Epoch 1/10, Loss: 10.3851, Accuracy: 0.9680
RNN - Epoch 2/10, Loss: 10.2606, Accuracy: 1.0000
RNN - Epoch 3/10, Loss: 10.2551, Accuracy: 1.0000
RNN - Epoch 4/10, Loss: 10.2531, Accuracy: 1.0000
RNN - Epoch 5/10, Loss: 10.2520, Accuracy: 1.0000
RNN - Epoch 6/10, Loss: 10.2513, Accuracy: 1.0000
RNN - Epoch 7/10, Loss: 10.2509, Accuracy: 1.0000
RNN - Epoch 8/10, Loss: 10.2506, Accuracy: 1.0000
RNN - Epoch 9/10, Loss: 10.2504, Accuracy: 1.0000
RNN - Epoch 10/10, Loss: 10.2502, Accuracy: 1.0000
GNN模型训练:
GNN - Epoch 1/10, Loss: 10.9591, Accuracy: 0.0400
GNN - Epoch 2/10, Loss: 10.3914, Accuracy: 1.0000
GNN - Epoch 3/10, Loss: 10.2818, Accuracy: 1.0000
GNN - Epoch 4/10, Loss: 10.2635, Accuracy: 1.0000
GNN - Epoch 5/10, Loss: 10.2569, Accuracy: 1.0000
GNN - Epoch 6/10, Loss: 10.2539, Accuracy: 1.0000
GNN - Epoch 7/10, Loss: 10.2524, Accuracy: 1.0000
GNN - Epoch 8/10, Loss: 10.2515, Accuracy: 1.0000
GNN - Epoch 9/10, Loss: 10.2509, Accuracy: 1.0000
GNN - Epoch 10/10, Loss: 10.2505, Accuracy: 1.0000

本文主要介绍了如何创建一个万能的数据生成类,可以根据输入的形状参数生成不同形状的数据。然后,将生成的数据和标签输入到CNN、RNN和GNN模型中进行训练,并打印出损失值和准确率。后续我们可以根据实际应用中可能需要根据具体任务做更多修改和扩展。

Read more

60个“特征工程”计算函数(Python代码)

60个“特征工程”计算函数(Python代码)

转自:coggle数据科学 近期一些朋友询问我关于如何做特征工程的问题,有没有什么适合初学者的有效操作。 特征工程的问题往往需要具体问题具体分析,当然也有一些暴力的策略,可以在竞赛初赛前期可以带来较大提升,而很多竞赛往往依赖这些信息就可以拿到非常好的效果,剩余的则需要结合业务逻辑以及很多其他的技巧,此处我们将平时用得最多的聚合操作罗列在下方。 最近刚好看到一篇文章汇总了非常多的聚合函数,就摘录在下方,供许多初入竞赛的朋友参考。 聚合特征汇总 pandas自带的聚合函数 * 其它重要聚合函数 其它重要聚合函数&分类分别如下。 def median(x):     return np.median(x) def variation_coefficient(x):     mean = np.mean(x)     if mean != 0:         return np.std(x) / mean     else:         return np.nan def variance(x):     return

By Ne0inhk
90w,确实可以封神了!

90w,确实可以封神了!

要说24年一定最热的技术,还得是AIGC! 前段时间阿里旗下的开源项目,登上GitHub热榜! AI大热,如今ChatGPT的优异表现,必然会出现各种细分场景应用的工具软件,和大量岗位项目! 山雨欲来风满楼,强人工智能的出现,所有科技公司已经开始巨量扩招此领域的人才。算法的岗位,近三个月已经增长68%!这件事在HR届也是相当震撼的。 目前各行各业都不景气的市场,人工智能岗位却一直保持常青!甚至同属AI边缘岗都比其他岗薪资高40%! 与此同时,AI算法岗上岸也不简单,竞争激烈,好公司核心岗位不用说,谁都想去。 所以事实就是,想要上岸,门槛也逐渐变高,项目经历、实习经历都很重要,越早明白这个道理就越能提前建立起自己的优势。 但我在b站逛知识区的时候,经常看到有些同学,因为一些客观原因导致无法参加实习,这种情况下,如果你想提升背景,增加项目经历的话,可以试试这个《CV/NLP 算法工程师培养计划》。 目前已经有上千位同学通过该计划拿到offer了,最新一期学员就业薪资最高能拿到78K!年薪94w! 优势就是有BAT大厂讲师带领,手把手带做AI真实企业项目(包含CV、NLP等

By Ne0inhk
再见nohup!试试这个神器,Python Supervisor!

再见nohup!试试这个神器,Python Supervisor!

👇我的小册 45章教程:() ,原价299,限时特价2杯咖啡,满100人涨10元。 作者丨Ais137 https://juejin.cn/post/7354406980784373798 1. 概述 Supervisor 是一个 C/S 架构的进程监控与管理工具,本文主要介绍其基本用法和部分高级特性,用于解决部署持久化进程的稳定性问题。 2. 问题场景 在实际的工作中,往往会有部署持久化进程的需求,比如接口服务进程,又或者是消费者进程等。这类进程通常是作为后台进程持久化运行的。 一般的部署方法是通过 nohup cmd & 命令来部署。但是这种方式有个弊端是在某些情况下无法保证目标进程的稳定性运行,有的时候 nohup 运行的后台任务会因为未知原因中断,从而导致服务或者消费中断,进而影响项目的正常运行。 为了解决上述问题,通过引入 Supervisor 来部署持久化进程,提高系统运行的稳定性。 3. Supervisor 简介 Supervisor is a client/

By Ne0inhk
第一本给程序员看的AI Agent图书上市了!

第一本给程序员看的AI Agent图书上市了!

AI Agent火爆到什么程度? OpenAI创始人奥特曼预测,未来各行各业,每一个人都可以拥有一个AI Agent;比尔·盖茨在2023年层预言:AI Agent将彻底改变人机交互方式,并颠覆整个软件行业;吴恩达教授在AI Ascent 2024演讲中高赞:AI Agent是一个令人兴奋的趋势,所有从事AI开发的人都应该关注。而国内的各科技巨头也纷纷布局AI Agent平台,如:钉钉的AI PaaS、百度智能云千帆大模型平台等等。 Agent 是未来最重要的智能化工具。对于程序员来说,是时候将目光转向大模型的应用开发了,率先抢占AI的下一个风口AI Agent。 小异带来一本新书《大模型应用开发 动手做 AI Agent》,这本书由《GPT图解》的作者黄佳老师创作,从0到1手把手教你做AI Agent。现在下单享受5折特惠! ▼点击下方,即可5折起购书 有这样一本秘籍在手,程序员们这下放心了吧,让我们先来揭开 Agent 的神秘面纱。 AI Agent 面面观

By Ne0inhk