人工智能学习(七)之神经网络

目录

 

一、引言

二、经典神经网络回顾

(一)结构与计算过程

(二)局限性

三、循环神经网络(RNN)原理

(一)基本结构

(二)计算过程

(三)梯度消失与梯度爆炸问题

四、门控循环单元(GRU)原理

(一)结构改进

(二)计算过程

五、长短期记忆网络(LSTM)原理

(一)复杂结构

(二)计算过程

六、双向 RNN 原理

(一)结构特点

(二)输出计算

七、卷积神经网络(CNN)原理

(一)卷积层

(二)池化层

(三)全连接层

八、实际案例编程

(一)使用 RNN 进行时间序列预测

(二)使用 LSTM 进行文本情感分析


 

一、引言

你们的点赞、收藏、评论、关注是我创作的最大动力~

二、经典神经网络回顾

经典神经网络,通常指多层感知机(Multilayer Perceptron,MLP),是一种前馈神经网络。它由输入层、若干隐藏层和输出层组成。每一层包含多个神经元,神经元之间通过带有权重的连接相互关联。

(一)结构与计算过程

(二)局限性

  1. 处理序列数据的局限性:经典神经网络在处理具有序列结构的数据(如时间序列或自然语言)时存在困难,因为它无法有效利用数据中的时间依赖关系。每个输入在处理时被视为独立的,不考虑其在序列中的位置和前后元素的关联。
  2. 参数数量与过拟合问题:在处理图像等具有空间结构的数据时,由于其全连接结构,参数数量会随着输入维度和隐藏层神经元数量的增加而急剧增长。这不仅导致计算成本高昂,还容易引发过拟合问题,使得模型在训练集上表现良好,但在测试集上泛化能力较差。

三、循环神经网络(RNN)原理

循环神经网络(RNN)专为处理序列数据而设计,其核心特点是能够在处理序列时保持对之前信息的 “记忆”。

(一)基本结构

RNN 的核心结构是循环体。在每个时间步,循环体接收当前输入 和上一时刻的隐藏状态 ,并计算当前时刻的隐藏状态

(二)计算过程

  1. 隐藏状态更新

(三)梯度消失与梯度爆炸问题

  1. 问题产生原因:在 RNN 的反向传播过程中,梯度需要沿着时间序列进行反向传播。由于权重矩阵在每个时间步都被重复使用,梯度在时间序列上不断相乘。当 的某些特征值的绝对值大于 1 时,随着时间步的增加,梯度会指数级增长,导致梯度爆炸;当 的某些特征值的绝对值小于 1 时,梯度会指数级衰减,导致梯度消失。
  2. 影响:梯度消失会使得模型在训练过程中难以学习到长距离的依赖关系,因为较早时间步的梯度在反向传播过程中变得极小,对参数更新的贡献几乎可以忽略不计。梯度爆炸则会导致参数更新过大,使得模型无法收敛,甚至出现权重变为无穷大的情况。

四、门控循环单元(GRU)原理

门控循环单元(GRU)是对 RNN 的改进,旨在解决梯度消失问题并更好地处理长序列数据。

(一)结构改进

GRU 引入了两个重要的门控机制:重置门 和更新门。这些门控机制能够动态地控制信息的流动,决定哪些信息需要被保留或丢弃。

(二)计算过程

五、长短期记忆网络(LSTM)原理

长短期记忆网络(LSTM)同样是为解决 RNN 的梯度问题而设计,它具有更复杂但强大的结构,能够更好地处理长序列数据。

(一)复杂结构

LSTM 包含输入门、遗忘门、输出门 和记忆单元。记忆单元 可以看作是一条贯穿时间序列的 “高速公路”,允许信息在序列中长时间流动,而门控机制则控制信息的流入和流出。

(二)计算过程

六、双向 RNN 原理

(一)结构特点

双向 RNN 由两个方向相反的 RNN 组成,一个按顺序处理序列(正向),另一个按逆序处理序列(反向)。这两个 RNN 分别捕捉序列中的过去信息和未来信息。

(二)输出计算

七、卷积神经网络(CNN)原理

卷积神经网络(CNN)主要用于处理具有网格结构的数据,如图像、音频等,其核心在于卷积层和池化层的应用。

(一)卷积层

(二)池化层

(三)全连接层

经过卷积和池化后,数据被展平并输入到全连接层。全连接层的作用是将提取到的特征进行整合,并进行最终的分类或回归任务。全连接层的每个神经元与上一层的所有神经元都有连接,其计算方式与经典神经网络中的隐藏层和输出层类似,通过加权求和和激活函数变换得到输出。

八、实际案例编程

(一)使用 RNN 进行时间序列预测

以预测正弦波序列为例,使用 PyTorch 实现:

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt

# 生成正弦波数据
time_steps = 100
data = np.sin(np.linspace(0, 10 * np.pi, time_steps))
data = torch.FloatTensor(data).view(-1, 1)

class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size
        self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x, hidden):
        out, hidden = self.rnn(x, hidden)
        out = self.fc(out[:, -1, :])
        return out, hidden

input_size = 1
hidden_size = 10
output_size = 1
rnn = RNN(input_size, hidden_size, output_size)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(rnn.parameters(), lr=0.01)

# 训练
hidden = torch.zeros(1, 1, hidden_size)
for epoch in range(1000):
    output, hidden = rnn(data.view(1, -1, 1), hidden)
    loss = criterion(output, data[-1].view(1, -1))
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if epoch % 100 == 0:
        print(f'Epoch {epoch}, Loss: {loss.item()}')

# 预测
with torch.no_grad():
    future_steps = 10
    predictions = []
    current_data = data[-1].view(1, 1, 1)
    for _ in range(future_steps):
        output, hidden = rnn(current_data, hidden)
        predictions.append(output.item())
        current_data = output.view(1, 1, 1)

plt.plot(range(time_steps), data.numpy(), label='Original')
plt.plot(range(time_steps, time_steps + future_steps), predictions, label='Prediction')
plt.legend()
plt.show()

代码解释

  1. 数据生成:通过np.linspace生成一个包含 100 个点的正弦波序列,并将其转换为 PyTorch 的张量。
  2. 模型定义:定义了一个简单的 RNN 模型,包含一个 RNN 层和一个全连接层。RNN 层用于处理序列数据,全连接层用于将 RNN 的输出转换为预测值。
  3. 训练过程:使用均方误差损失函数(MSE)和 Adam 优化器进行训练。在每个 epoch 中,将数据输入到模型中进行前向传播,计算损失,然后进行反向传播和参数更新。
  4. 预测过程:在训练完成后,使用最后一个时间步的数据作为初始输入,进行未来 10 个时间步的预测。预测结果通过循环不断更新输入,逐步生成。
  5. 可视化:使用matplotlib库将原始序列和预测序列绘制在同一张图上,方便直观观察预测效果。

(二)使用 LSTM 进行文本情感分析

下面是一个使用 PyTorch 实现的基于 LSTM 的文本情感分析示例,使用的数据集为 IMDB 电影评论数据集。

import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.legacy import data, datasets

# 定义字段
TEXT = data.Field(tokenize='spacy', lower=True)
LABEL = data.LabelField(dtype=torch.float)

# 加载数据集
train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)

# 构建词汇表
TEXT.build_vocab(train_data, max_size=25000, vectors="glove.6B.100d")
LABEL.build_vocab(train_data)

# 创建迭代器
train_iterator, test_iterator = data.BucketIterator.splits(
    (train_data, test_data),
    batch_size=64,
    device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')
)

# 定义 LSTM 模型
class LSTMClassifier(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim, n_layers, bidirectional, dropout):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim,
                            hidden_dim,
                            num_layers=n_layers,
                            bidirectional=bidirectional,
                            dropout=dropout)
        self.fc = nn.Linear(hidden_dim * 2 if bidirectional else hidden_dim, output_dim)
        self.dropout = nn.Dropout(dropout)

    def forward(self, text):
        embedded = self.dropout(self.embedding(text))
        output, (hidden, cell) = self.lstm(embedded)
        if self.lstm.bidirectional:
            hidden = self.dropout(torch.cat((hidden[-2, :, :], hidden[-1, :, :]), dim=1))
        else:
            hidden = self.dropout(hidden[-1, :, :])
        return self.fc(hidden.squeeze(0))

# 初始化模型
vocab_size = len(TEXT.vocab)
embedding_dim = 100
hidden_dim = 256
output_dim = 1
n_layers = 2
bidirectional = True
dropout = 0.5

model = LSTMClassifier(vocab_size, embedding_dim, hidden_dim, output_dim, n_layers, bidirectional, dropout)

# 加载预训练的词向量
pretrained_embeddings = TEXT.vocab.vectors
model.embedding.weight.data.copy_(pretrained_embeddings)

# 定义损失函数和优化器
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters())

# 训练模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
criterion = criterion.to(device)

for epoch in range(5):
    model.train()
    for batch in train_iterator:
        optimizer.zero_grad()
        predictions = model(batch.text).squeeze(1)
        loss = criterion(predictions, batch.label)
        loss.backward()
        optimizer.step()

    # 评估模型
    model.eval()
    total_correct = 0
    total_count = 0
    with torch.no_grad():
        for batch in test_iterator:
            predictions = model(batch.text).squeeze(1)
            rounded_preds = torch.round(torch.sigmoid(predictions))
            correct = (rounded_preds == batch.label).float().sum()
            total_correct += correct
            total_count += batch.label.shape[0]

    accuracy = total_correct / total_count
    print(f'Epoch {epoch + 1}, Test Accuracy: {accuracy.item()}')

代码解释

  1. 数据处理:使用torchtext库加载 IMDB 电影评论数据集,并进行分词、构建词汇表等预处理操作。
  2. 模型定义:定义了一个基于 LSTM 的文本分类模型,包含嵌入层、LSTM 层和全连接层。嵌入层将输入的文本转换为词向量,LSTM 层用于捕捉文本中的序列信息,全连接层用于进行情感分类。
  3. 加载预训练词向量:使用预训练的 GloVe 词向量初始化嵌入层的权重,有助于提高模型的性能。
  4. 训练过程:使用二元交叉熵损失函数(BCEWithLogitsLoss)和 Adam 优化器进行训练。在每个 epoch 中,将数据输入到模型中进行前向传播,计算损失,然后进行反向传播和参数更新。
  5. 评估过程:在每个 epoch 结束后,在测试集上评估模型的准确率。通过将预测结果进行四舍五入,与真实标签进行比较,计算正确预测的样本数,从而得到准确率。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决

目录 概述|背景 报错解析 解决方法 IDEA配置解决 Pom配置插件解决 概述|背景 报错发生背景:在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。 本文讨论在上述背景下发生的报错原因和解决办法,如果仅为了解决BUG不论原…

使用golang wails写了一个桌面端小工具:WoWEB, 管理本地多前端项目

WoWEB 本地快速启动 http 服务。 辅助管理本地前端项目。 使用界面配置代理转发。 支持平台 windows 10macOS 功能描述 管理本地前端项目启动本地 HTTP 服务,可本地或者局域网访问快速打开项目文件夹配置 HTTP 代理转发规则,方便开发调试 以下情况…

Unity Dots理论学习-5.与ECS相关的概念

DOTS的面向数据编程方式比你在MonoBehaviour项目中常见的面向对象编程方式更适合硬件开发。可以尝试理解一些与数据导向设计(DOD)相关的关键概念,以及这些概念如何影响你的代码,对你在MonoBehaviour项目中的C#编程通常是较少涉及的…

【hive】记一次hiveserver内存溢出排查,线程池未正确关闭导致

一、使用 MemoryAnalyzer软件打开hprof文件 很大有30G,win内存24GB,不用担心可以打开,ma软件能够生成索引文件,逐块分析内存,如下图。 大约需要4小时。 overview中开不到具体信息。 二、使用Leak Suspects功能继续…

(篇三)基于PyDracula搭建一个深度学习的软件之解析yolo算法融合

文章目录 1YoloPredictor类——检测器1.1继承BasePredictor解析1.2继承QObject解析 2MainWindow类——主窗口 在前面两篇中,篇一介绍了启动界面的制作,篇二介绍了如何修改PyDracula的界面,那么这一篇我们学习一下yolo要融合进入软件中&#x…

26~31.ppt

目录 26.北京主要的景点 题目 解析 27.创新产品展示及说明会 题目​ 解析 28.《小企业会计准则》 题目​ 解析 29.学习型社会的学习理念 题目​ 解析 30.小王-产品展示信息 题目​ 解析 31.小王-办公理念-信息工作者的每一天 题目​ 解析 26.北京主要的景点…

Vue.js 状态管理库Pinia

Pinia Pinia :Vue.js 状态管理库Pinia持久化插件-persist Pinia :Vue.js 状态管理库 Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。 要使用Pinia ,先要安装npm install pinia在main.js中导入Pinia 并使用 示例…

day10-字符串

目录 字符串1、API 和 API 帮助文档2、String概述3、String构造方法代码实现 和 内存分析3.1 创建String对象的两种方式3.2 Java的内存模型 4、字符串的比较4.1 号的作用4.2 equals方法的作用 练习5、用户登录6、遍历字符串和统计字符个数7、字符串拼接和翻转8、较难练习-金额转…

从二叉树遍历深入理解BFS和DFS

1. 介绍 1.1 基础 BFS(Breadth-First Search,广度优先搜索)和 DFS(Depth-First Search,深度优先搜索)是两种常见的图和树的遍历算法。 BFS:从根节点(或起始节点)开始&am…

【大数据安全分析】大数据安全分析技术框架与关键技术

在数字化时代,网络安全面临着前所未有的挑战。传统的网络安全防护模式呈现出烟囱式的特点,各个安全防护措施和数据相互孤立,形成了防护孤岛和数据孤岛,难以有效应对日益复杂多变的安全威胁。而大数据分析技术的出现,为…

亚博microros小车-原生ubuntu支持系列 27、手掌控制小车运动

背景知识 本节跟上一个测试类似:亚博microros小车-原生ubuntu支持系列:26手势控制小车基础运动-CSDN博客 都是基于MediaPipe hands做手掌、手指识别的。 为了方便理解,在贴一下手指关键点分布。手掌位置就是靠第9点来识别的。 2、程序说明…

MySQL第五次作业

根据图片内容完成作业 1.建表 (1)建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…

Linux:软硬链接和动静态库

hello,各位小伙伴,本篇文章跟大家一起学习《Linux:软硬链接和动静态库》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞&#xff0…

CSS 组合选择符详解与实战示例

在 Web 开发过程中,CSS 用于定义页面元素的样式,而选择器则帮助我们精确定位需要添加样式的元素。今天我们主要来讲解 CSS 中的组合选择符,它们能够根据 DOM 结构中元素之间的关系来选中目标元素,从而写出结构清晰、易于维护的 CS…

【Linux系统】—— 简易进度条的实现

【Linux系统】—— 简易进度条的实现 1 回车和换行2 缓冲区3 进度条的准备代码4 第一版进度条5 第二版进度条 1 回车和换行 先问大家一个问题:回车换行是什么,或者说回车和换行是同一个概念吗?   可能大家对回车换行有一定的误解&#xff0…

Winform开发框架(蝇量级) MiniFramework V2.1

C/S框架网与2022年发布的一款蝇量级开发框架,适用于开发Windows桌面软件、数据管理应用系统、软件工具等轻量级软件,如:PLC上位机软件、数据采集与分析软件、或企业管理软件,进销存等。适合个人开发者快速搭建软件项目。 适用开发…

win10 llamafactory模型微调相关②

微调 使用微调神器LLaMA-Factory轻松改变大语言模型的自我认知_llamafactory 自我认知-CSDN博客 【大模型微调】使用Llama Factory实现中文llama3微调_哔哩哔哩_bilibili 样本数据集 (数据集管理脚本处需更改,见报错解决参考1) 自我认知微…

AI大模型随机初始化权重并打印网络结构方法(以Deepseekv3为例,单机可跑)

背景 当前大模型的权重加载和调用,主要是通过在HuggingFace官网下载并使用transformer的库来加以实现;其中大模型的权重文件较大(部分>100GB),若只是快速研究网络结构和数据流变化,则无需下载权重。本文…

前端项目打包完成后dist本地起node服务测试运行项目

1、新建文件夹 node-test 将打包dist 文件同步自定义本地服务文件夹node-test 中,安装依赖包。 npm install express serve-static cors 2、新创建服务文件js server.js 构建链接及端口 const express require(express); const path require(path); const co…

《语义捕捉全解析:从“我爱自然语言处理”到嵌入向量的全过程》

首先讲在前面,介绍一些背景 RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了信息检索与语言生成模型的技术,通过从外部知识库中检索相关信息,并将其作为提示输入给大型语言模型&#xff…