人工智能(pytorch)搭建模型12-pytorch搭建BiGRU模型,利用正态分布数据训练该模型

news2024/11/26 18:50:27

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型12-pytorch搭建BiGRU模型,利用正态分布数据训练该模型。本文将介绍一种基于PyTorch的BiGRU模型应用项目。我们将首先解释BiGRU模型的原理,然后使用PyTorch搭建模型,并提供模型代码和数据样例。接下来,我们将加载数据到模型中进行训练,打印损失值与准确率,并在训练完成后进行测试。最后,我们将提供完整的文章目录结构和全套实现代码。

目录

  1. BiGRU模型原理
  2. 使用PyTorch搭建BiGRU模型
  3. 数据样例
  4. 模型训练
  5. 模型测试
  6. 完整代码

1. BiGRU模型原理

BiGRU(双向门控循环单元)是一种改进的循环神经网络(RNN)结构,它由两个独立的GRU层组成,一个沿正向处理序列,另一个沿反向处理序列。这种双向结构使得BiGRU能够捕捉到序列中的长距离依赖关系,从而提高模型的性能。
在这里插入图片描述

GRU(门控循环单元)是一种RNN变体,它通过引入更新门和重置门来解决传统RNN中的梯度消失问题。更新门负责确定何时更新隐藏状态,而重置门负责确定何时允许过去的信息影响当前隐藏状态。

BiGRU模型的数学原理可以用以下公式表示:

首先,对于一个输入序列 X = x 1 x 2 , . . . , x T X = {x_1 x_2, ..., x_T} X=x1x2,...,xT,BiGRU模型的前向计算可以表示为:

h t → = GRU ( h t − 1 → , x t ) \overrightarrow{h_t} = \text{GRU}(\overrightarrow{h_{t-1}}, x_t) ht =GRU(ht1 ,xt)

h t ← = GRU ( h t + 1 ← , x t ) \overleftarrow{h_t} = \text{GRU}(\overleftarrow{h_{t+1}}, x_t) ht =GRU(ht+1 ,xt)

其中, h t → \overrightarrow{h_t} ht h t ← \overleftarrow{h_t} ht 分别表示从左到右和从右到左的隐藏状态, GRU \text{GRU} GRU 表示GRU单元, x t x_t xt 表示输入序列中的第 t t t 个元素。

然后,将两个方向的隐藏状态拼接在一起,得到最终的隐藏状态 h t h_t ht

h t = [ h t → ; h t ← ] h_t = [\overrightarrow{h_t}; \overleftarrow{h_t}] ht=[ht ;ht ]

其中, [ ⋅ ; ⋅ ] [\cdot;\cdot] [;] 表示向量的拼接操作。

最后,将隐藏状态 h t h_t ht 传递给一个全连接层,得到输出 y t y_t yt

y t = softmax ( W h t + b ) y_t = \text{softmax}(W h_t + b) yt=softmax(Wht+b)

其中, W W W b b b 分别表示全连接层的权重和偏置, softmax \text{softmax} softmax 表示 softmax \text{softmax} softmax激活函数。

2. 使用PyTorch搭建BiGRU模型

首先,我们需要导入所需的库:

import torch
import torch.nn as nn

接下来,我们定义BiGRU模型类:

class BiGRU(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, num_classes):
        super(BiGRU, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.gru = nn.GRU(input_size, hidden_size, num_layers, batch_first=True, bidirectional=True)
        self.fc = nn.Linear(hidden_size * 2, num_classes)

    def forward(self, x):
        # 初始化隐藏状态
        h0 = torch.zeros(self.num_layers * 2, x.size(0), self.hidden_size).to(device)

        # 双向GRU
        out, _ = self.gru(x, h0)
        out = out[:, -1, :]

        # 全连接层
        out = self.fc(out)
        return out

3. 数据样例

为了简化问题,我们将使用一个简单的人造数据集。数据集包含10个样本,每个样本有8个时间步长,每个时间步长有一个特征。标签是一个二分类问题。

# 生成数据样例
import numpy as np

# 均值为1的正态分布随机数
data_0 = np.random.randn(50, 20, 1) + 1
# 均值为-1的正态分布随机数
data_1 = np.random.randn(50, 20, 1) - 1
# 合并为总数据集
data = np.concatenate([data_0, data_1], axis=0)
# 将 labels 修改为对应大小的数组
labels = np.concatenate([np.zeros((50, 1)), np.ones((50, 1))], axis=0)

4. 模型训练

首先,我们需要将数据转换为PyTorch张量,并将其分为训练集和验证集。

from sklearn.model_selection import train_test_split

X_train, X_val, y_train, y_val = train_test_split(data, labels, test_size=0.2, random_state=42)

X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.long)
X_val = torch.tensor(X_val, dtype=torch.float32)
y_val = torch.tensor(y_val, dtype=torch.long)

接下来,我们定义训练和验证函数:

def train(model, device, X_train, y_train, optimizer, criterion):
    model.train()
    optimizer.zero_grad()
    output = model(X_train.to(device))
    loss = criterion(output, y_train.squeeze().to(device))
    loss.backward()
    optimizer.step()
    return loss.item()

def validate(model, device, X_val, y_val, criterion):
    model.eval()
    with torch.no_grad():
        output = model(X_val.to(device))
        loss = criterion(output, y_val.squeeze().to(device))
    return loss.item()

现在,我们可以开始训练模型:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
input_size = 1
hidden_size = 32
num_layers = 1
num_classes = 2
num_epochs = 10
learning_rate = 0.01

model = BiGRU(input_size, hidden_size, num_layers, num_classes).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

for epoch in range(num_epochs):
    train_loss = train(model, device, X_train, y_train, optimizer, criterion)
    val_loss = validate(model, device, X_val, y_val, criterion)
    print(f"Epoch [{epoch + 1}/{num_epochs}], Train Loss: {train_loss:.4f}, Validation Loss: {val_loss:.4f}")

5. 模型测试

在训练完成后,我们可以使用测试数据集评估模型的性能。这里,我们将使用训练过程中的验证数据作为测试数据。

def test(model, device, X_test, y_test):
    model.eval()
    with torch.no_grad():
        output = model(X_test.to(device))
        _, predicted = torch.max(output.data, 1)
        correct = (predicted == y_test.squeeze().to(device)).sum().item()
        accuracy = correct / y_test.size(0)
    return accuracy

test_accuracy = test(model, device, X_val, y_val)
print(f"Test Accuracy: {test_accuracy * 100:.2f}%")

6. 完整代码

以下是本文中提到的完整代码:

# 导入库
import torch
import torch.nn as nn
import numpy as np
from sklearn.model_selection import train_test_split

# 定义BiGRU模型
class BiGRU(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, num_classes):
        super(BiGRU, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.gru = nn.GRU(input_size, hidden_size, num_layers, batch_first=True, bidirectional=True)
        self.fc = nn.Linear(hidden_size * 2, num_classes)

    def forward(self, x):
        h0 = torch.zeros(self.num_layers * 2, x.size(0), self.hidden_size).to(device)
        out, _ = self.gru(x, h0)
        out = out[:, -1, :]
        out = self.fc(out)
        return out

# 生成数据样例
# 均值为1的正态分布随机数
data_0 = np.random.randn(50, 20, 1) + 1
# 均值为-1的正态分布随机数
data_1 = np.random.randn(50, 20, 1) - 1
# 合并为总数据集
data = np.concatenate([data_0, data_1], axis=0)
# 将 labels 修改为对应大小的数组
labels = np.concatenate([np.zeros((50, 1)), np.ones((50, 1))], axis=0)

# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(data, labels, test_size=0.2, random_state=42)
X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.long)
X_val = torch.tensor(X_val, dtype=torch.float32)
y_val = torch.tensor(y_val, dtype=torch.long)

# 定义训练和验证函数
def train(model, device, X_train, y_train, optimizer, criterion):
    model.train()
    optimizer.zero_grad()
    output = model(X_train.to(device))
    loss = criterion(output, y_train.squeeze().to(device))
    loss.backward()
    optimizer.step()
    return loss.item()

def validate(model, device, X_val, y_val, criterion):
    model.eval()
    with torch.no_grad():
        output = model(X_val.to(device))
        loss = criterion(output, y_val.squeeze().to(device))
    return loss.item()

# 训练模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
input_size = 1
hidden_size = 32
num_layers = 1
num_classes = 2
num_epochs = 10
learning_rate = 0.01

model = BiGRU(input_size, hidden_size, num_layers, num_classes).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

for epoch in range(num_epochs):
    train_loss = train(model, device, X_train, y_train, optimizer, criterion)
    val_loss = validate(model, device, X_val, y_val, criterion)
    print(f"Epoch [{epoch + 1}/{num_epochs}], Train Loss: {train_loss:.4f}, Validation Loss: {val_loss:.4f}")

# 测试模型
def test(model, device, X_test, y_test):
    model.eval()
    with torch.no_grad():
        output = model(X_test.to(device))
        _, predicted = torch.max(output.data, 1)
        correct = (predicted == y_test.squeeze().to(device)).sum().item()
        accuracy = correct / y_test.size(0)
    return accuracy

test_accuracy = test(model, device, X_val, y_val)
print(f"Test Accuracy: {test_accuracy * 100:.2f}%")

运行结果:

Epoch [1/10], Train Loss: 0.7157, Validation Loss: 0.6330
Epoch [2/10], Train Loss: 0.6215, Validation Loss: 0.5666
Epoch [3/10], Train Loss: 0.5390, Validation Loss: 0.4980
Epoch [4/10], Train Loss: 0.4613, Validation Loss: 0.4214
Epoch [5/10], Train Loss: 0.3825, Validation Loss: 0.3335
Epoch [6/10], Train Loss: 0.2987, Validation Loss: 0.2357
Epoch [7/10], Train Loss: 0.2096, Validation Loss: 0.1381
Epoch [8/10], Train Loss: 0.1230, Validation Loss: 0.0644
Epoch [9/10], Train Loss: 0.0581, Validation Loss: 0.0273
Epoch [10/10], Train Loss: 0.0252, Validation Loss: 0.0125
Test Accuracy: 100.00%

本文介绍了一个基于PyTorch的BiGRU模型应用项目的完整实现。我们详细介绍了BiGRU模型的原理,并使用PyTorch搭建了模型。我们还提供了模型代码和数据样例,并展示了如何加载数据到模型中进行训练和测试。希望能帮助大家理解和实现BiGRU模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniApp -- 学习笔记(vue3+ts)

uniApp学习笔记目录 一.关于界面节点信息 6月15 一.关于界面节点信息 6月15 uniApp官网介绍 (一) 个人理解是官网返回一个 SelectorQuery 对象实例。 并且可以在这个实例上使用 select 等方法选择节点,并使用 boundingClientRect 等方法选择…

使用 Sharesheet分享Android 应用链接

使用 Sharesheet分享Android 应用链接 使用 Sharesheet 进行丰富的链接共享 Android App Links 允许您的应用程序打开网页链接,而不是使用网络浏览器。处理这些深层链接已在我们的《深层链接入门课程》中介绍过。除了能够打开深层链接外,您的应用程序还…

《Lua程序设计》--学习8

编译,执行和错误 编译 可以认为dofile函数就是这样: loadfile函数从文件中加载Lua代码段,但它不会运行代码,只是编译代码,然乎将编译后的代码段作为一个函数返回 函数loadfile更灵活。在发生错误的情况中&#xff0…

100种思维模型之排列组合思维模型-78

说到模型,一般人会觉得特别难,会觉得是学霸级别的人才能做出来的高科技。 然实际上并不是! 西方人常说Model,模型在西方人眼里是一个非常常见的词。 查理芒格,多元思维模型倡导者和践行者,他说任何能够帮助…

Elasticsearch:实用 BM25 - 第 1 部分:分片如何影响 Elasticsearch 中的相关性评分

作者:Shane Connelly 背景 在 Elasticsearch 5.0 中,我们切换到 Okapi BM25 作为我们的默认相似度算法,这是用于对与查询相关的结果进行评分的算法。 在本博客中,我不会过多地介绍 BM25 与替代措施,但如果你想了解 B…

3天没睡吐血整理,性能测试瓶颈问题+分析,一篇概全...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 如何定位性能瓶颈…

白鲸优化算法优化VMD参数,并提取特征向量,以西储大学数据为例,附MATLAB代码

大家看到这篇文章,肯定会有疑问,难道本篇文章和上一篇文章不是一个意思嘛,这是来凑数的嘛……其实不然,如果各位读者仔细看,就会发现本篇文章和上一篇文章大有不同,这篇文章也是我一直以来想在上一篇文章基…

TALL论文笔记

TALL论文笔记 0.论文来源1摘要2引言3模型结构3.1视觉编码器3.2句子编码器3.3模态融合3.4时间定位回归网络 4训练4.1损失函数4.2采集训练样本 5 评估5.1数据集5.2评价指标5.3实验结果 0.论文来源 2017 TALL 1摘要 问题描述:通过语言来对未修剪视频中动作的时间定位…

【JVM】日志分析工具--gcviewer的使用

文章目录 gcviewer是什么?gcviewer的使用最后 gcviewer是什么? GCViewer是一个小工具,可以可视化Sun / Oracle、IBM、HP和BEA Java虚拟机生成的详细GC输出。它是在GNU LGPL下发布的自由软件。—官网翻译 gcviewer的使用 文章使用的配置 工具…

Dubbo面试题

Dubbo 基础知识为什么要用 Dubbo?Dubbo 是什么?Dubbo 的使用场景有哪些?Dubbo 核心功能有哪些? 架构设计Dubbo 服务器注册与发现的流程?Dubbo 的整体架构设计有哪些分层?Dubbo Monitor 实现原理? 分布式框…

一键部署通义千问预体验丨阿里云云原生 5 月动态

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。 本栏目每月更新。 01 趋势热点 🥇 Apache RocketMQ 入选可信开…

如何创建 GitHub 配置文件自述文件

背景 最近再搞GitHub Actions的东西。突然看到了 github推出的这项服务。就搞了一下。主要目的:装扮自己的GitHub主页。俗称装逼(小声) 步骤 创建一个与 GitHub 用户名同名(包括大小写)的新仓库。比如我的就是 创建…

Docker学习(一)

第1章 docker简介 1.1 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 …

ethers.js常用的操作方法

安装:npm install --save5.7.2 ethers --ethers比web3来说使用方式相对简洁很多,主要就操作三个大对象 1. Provider,(提供者)是一个用于连接以太坊网络的抽象类,提供了只读形式来访问区块链网络和获取链上…

8年测试老鸟总结,性能测试案例经验,高级测试之道...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能基准测试&…

测试员最令程序员讨厌的十种行为,你中了几条?

在做软件测试这些年,总会有程序员给我吐槽某某测试员令其发指的一些事。这里我总结了一些,看你有没有中呢? 1、爱较真,只要逮着问题,哪怕是技术文档中的错别字也要提到bug管理工具中,更让程序员绝望的是&a…

测试员与程序员那些烂在心里的共同秘密

1、生产环境出现了一个较严重的bug,赶在用户没发现的情况下,测试员与程序员悄悄地改了,并跳过了N个步骤做了次发布。 2、程序员告诉测试员,新来的技术leader每天做得最多的事就是copy他们的代码,一份不够还再来一份&a…

VR全景智慧园区,沉浸式数字化体验,720度全视角展示

导语: 随着科技的迅猛发展,虚拟现实(Virtual Reality,简称VR)全景技术已经成为了人们趋之若鹜的新兴领域。 而城市园区作为现代社会的重要组成部分,也正在积极寻求创新的方式来吸引更多的人流和投资。 一&…

【QQ界面展示-设置文本框的leftView属性 Objective-C语言】

一、这个搞定以后,接下来,就实现另外一个效果, 1.注意,我们上午把这个文本框,是不是本来说文本框,直接放这儿就OK了吧,但是,我们上午为了能让这个文本框兼容iOS6,是不是把这个文本框的边框,设为None,然后呢,边框设为nil边框,是不是设了一个背景图啊, 但我们做完…

Ansys Zemax | 如何在OpticStudio中建模和设计真实波片

本文介绍了如何在 OpticStudio 中建模和设计真实的单色和消色差波片。它将演示如何使用双折射材料,通过构建评价函数来计算相位延迟,并使用 Universal Plot 将相位延迟与波片厚度的关系可视化。(联系我们获取文章附件) 双折射材料…