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

目录

 

一、引言

二、经典神经网络回顾

(一)结构与计算过程

(二)局限性

三、循环神经网络(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_sizeself.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, hiddeninput_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 = 10predictions = []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.5model = 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 = 0total_count = 0with 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 += correcttotal_count += batch.label.shape[0]accuracy = total_correct / total_countprint(f'Epoch {epoch + 1}, Test Accuracy: {accuracy.item()}')

代码解释

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Java中操作Redis

4.在Java中操作Redis 4.1 Redis的Java客户端 前面我们讲解了Redis的常用命令,这些命令是我们操作Redis的基础,那么我们在java程序中应该如何操作Redis呢?这就需要使用Redis的Java客户端,就如同我们使用JDBC操作MySQL数据库一样。…

大语言模型需要的可观测性数据的关联方式

可观测性数据的关联方式及其优缺点 随着现代分布式架构和微服务的普及,可观测性(Observability)已经成为确保系统健康、排查故障、优化性能的重要组成部分。有效的可观测性数据关联方式不仅能够帮助我们实时监控系统的运行状态,还…

棱光PDF工具箱:一站式解决你的各种需要

今天为大家介绍一款非常实用且完全免费的PDF工具箱——棱光PDF工具箱。它功能强大,操作简单,能够满足你对PDF文件的各种处理需求,包括添加水印、去除水印、批量转换格式等,绝对值得推荐! 棱光PDF工具箱 棱光PDF工具箱…

Docker安装Redis

一、保证Docker提起来了 systemctl status docker想这没有启动要先启动一下 systemctl status docke二、拉取Redis(默认拉最新版) sudo docker pull redis检查一下拉成功没有 docker images三、创建相关目录 mkdir -p /home/redis/{conf,data}四、…

云原生(五十四) | RDS数据导入与导出

文章目录 RDS数据导入与导出 一、导入场景说明 二、RDS数据导入实现 三、导出场景说明 四、RDS数据导出实现 RDS数据导入与导出 一、导入场景说明 思考:我们刚才的操作都是通过SQL语句实现的,如果我们要导入的文件是以SQL、CSV或Excel等形式存储&…

如何使用DeepSeek帮助自己的工作?

最近众多大模型爆火,如日中天的,莫过于最近的DeepSeek了,那么怎么去利用它帮助我们的工作呢? 代码生成与优化 快速生成代码:程序员可以直接通过自然语言描述功能需求,让 DeepSeek 生成相应的代码。比如需要实现一个用 Python 编写的计算斐波那契数列的函数,只需简单描述…

Python Pandas(3):DataFrame

1 介绍 DataFrame 是 Pandas 中的另一个核心数据结构,类似于一个二维的表格或数据库中的数据表。它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由…

防火墙术语大全( Firewalld Glossary of Terms)

防火墙术语大全 防火墙作为网络安全中不可或缺的设备,在各种网络架构中扮演着至关重要的角色。无论是企业级防火墙、云防火墙还是家用路由器内置的防火墙,它们的工作原理和配置策略都离不开一系列专业术语的支撑。对于网络工程师来说,掌握这…

Web前端开发--HTML

HTML快速入门 1.新建文本文件&#xff0c;后缀名改为.html 2.编写 HTML结构标签 3.在<body>中填写内容 HTML结构标签 特点 1.HTML标签中不区分大小写 2.HTML标签属性值中可以使用单引号也可使用双引号 3.HTML语法结构比较松散&#xff08;但在编写时要严格一点&…

深度整理总结MySQL——MySQL加锁工作原理

MySQL加锁工作原理 前言前置知识- 锁为什么加在索引上锁的粒度优化提高并发性避免全表扫描优化死锁处理解决幻读问题 什么SQL语句会加行级锁MySQL是如何加行级锁场景模拟代码唯一索引等值查询退化为记录锁为什么会退化为记录锁分析加了什么锁为什么会退化为间隙锁为什么我可以插…

2.10日学习总结

题目一&#xff1a; AC代码 #include <stdio.h>#define N 1000000typedef long long l;int main() {int n, m;l s 0;l a[N 1], b[N 1];int i 1, j 1;scanf("%d %d", &n, &m);for (int k 1; k < n; k) {scanf("%lld", &a[k]);…

Spring Boot Actuator(官网文档解读)

定义 Spring Boot Actuator 是 Spring Boot 提供的一个用于监控和管理应用程序的模块。它能够提供各种生产级别的功能&#xff0c;如健康检查、度量指标收集、配置属性查看等&#xff0c;帮助开发者了解应用的内部状态并进行故障排查。 Actuator 引入 要启用 Actuator…

如何实现图片式按钮的功能

文章目录 1. 概念介绍2. 使用方法2.1 filled风格2.2 filledTonal风格2.3 outlined风格 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何修改NavigationBar组件的形状"相关的内容&#xff0c;本章回中将介绍IconButtion组件.闲话休提…

[LLM面试题] 指示微调(Prompt-tuning)与 Prefix-tuning区别

一、提示调整(Prompt Tuning) Prompt Tuning是一种通过改变输入提示语&#xff08;input prompt&#xff09;以获得更优模型效果的技术。举个例子&#xff0c;如果我们想将一条英语句子翻译成德语&#xff0c;可以采用多种不同的方式向模型提问&#xff0c;如下图所示&#xf…

2月10日QT

作业> 将文本编辑器功能完善 include "widget.h" #include "ui_widget.h" #include <QMessageBox> //消息对话框类 #include <QFontDialog> //字体类对话框 #include <QFont> //字体类 #include <QColorDialog> //颜…

安卓开发,底部导航栏

1、创建导航栏图标 使用系统自带的矢量图库文件&#xff0c;鼠标右键点击res->New->Vector Asset 修改 Name , Clip art 和 Color 再创建一个 同样的方法再创建四个按钮 2、添加百分比布局依赖 app\build.gradle.kts 中添加百分比布局依赖&#xff0c;并点击Sync Now …

Spring Boot中实现多租户架构

文章目录 Spring Boot中实现多租户架构多租户架构概述核心思想多租户的三种模式优势挑战租户识别机制1. 租户标识(Tenant Identifier)2. 常见的租户识别方式3. 实现租户识别的关键点4. 租户识别示例代码5. 租户识别机制的挑战数据库隔离的实现1. 数据库隔离的核心目标2. 数据…

《LeetCode Hot100》 Day01

Day01 轮转数组 思路&#xff1a; &#xff08;1&#xff09; 使用O(1) 空间复杂度解决&#xff0c;就需要原地解决&#xff0c;不能创建新的数组。 &#xff08;2&#xff09; 先整体反转数组&#xff0c;再反转前k个数&#xff0c;再反转剩下的数。即可完整本题。 &…

【python】matplotlib(animation)

文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…

【网络安全】服务器安装Docker及拉取镜像教程

文章目录 1. 安装 Docker2. 拉取镜像3. 运行 Ubuntu 容器4. 执行相关操作5. 退出并停止容器1. 安装 Docker # 更新软件包索引 sudo apt update# 安装必要的依赖 sudo apt install -y ca-certificates curl gnupg