当前位置: 首页 > news >正文

深度学习第2天:RNN循环神经网络

☁️主页 Nowl

🔥专栏《机器学习实战》 《机器学习》

📑君子坐而论道,少年起而行之 

文章目录

介绍

记忆功能对比展现

任务描述

导入库 

处理数据 

前馈神经网络

循环神经网络

编译与训练模型

模型预测

可能的问题

梯度消失

梯度爆炸

其他的循环神经网络

结语


介绍

RNN也叫循环神经网络,普通的神经网络层的输入都是上一层的输出,而循环神经网络会在RNN层循环指定次数,这样的特点使得RNN在处理序列数据上表现得很好,因为它可以更好地记住前后文的关系

记忆功能对比展现

任务描述

我们有一段数字序列,我们训练一个神经网络,使得该模型能通过任意连在一起的两个数,判断出第三个数

我们先定义数字序列

data_sequence = [1, 3, 5, 2, 4, 9, 7, 6, 8]

导入库 

import numpy as np
from keras.models import Sequential
from keras.layers import SimpleRNN, Dense

处理数据 

# 准备训练数据,使用前两个数字作为输入,预测第三个数字,以此类推
X = []
y = []for i in range(len(data_sequence)-2):X.append([data_sequence[i], data_sequence[i+1]])y.append(data_sequence[i+2])X = np.array(X)
y = np.array(y)# 转换数据形状以适应RNN
X = X.reshape((X.shape[0], X.shape[1], 1))

我们打印X,得到下图结果,结果竖向排列,无法展示完全,X的形状为(7, 2, 1)(两两排列有七组数据,每组数据两个特征,每个特征单独输入)

 

打印y

为每两个数的第三个数

前馈神经网络

接下来我们定义一个简单的前馈神经网络

model = Sequential()
model.add(Dense(500, input_dim=2))
model.add(Dense(1))

 该模型有三层,输入层(没有在这里定义,我们等下输入的数据就充当这一层),一个500个神经元的线性层(输入维度为二),一个输出维度为1的输出层(输入维度为上一层神经元的个数,即500)

循环神经网络

定义一个循环神经网络

# 创建RNN模型
model = Sequential()
model.add(SimpleRNN(500, input_shape=(2, 1)))
model.add(Dense(1))

 该模型有三层,输入层(没有在这里定义,我们等下输入的数据就充当这一层),一个500个神经元的RNN层(input_shape=(2,1)的意思是时间步为2,每个时间步有一个数据,可以理解时间步为网络记忆的长度),一个输出维度为1的输出层(输入维度为上一层神经元的个数,即500)

编译与训练模型

# 编译模型
model.compile(optimizer='adam', loss='mse')# 训练模型
model.fit(X, y, epochs=200, batch_size=1, verbose=2)
  • 编译阶段设置模型的优化器为adam,损失函数为mse
  • 训练部分设置模型训练数据(X,y),设置训练回合为200次,批次为1,即一次输入一组数据,verbose决定了是否打印训练过程中的信息。verbose=2 表示打印每个 epoch 的信息,包括损失值和其他指标。verbose=0表示不打印任何信息,verbose=1表示打印进度条。

模型预测

接下来看看在相同神经元数量和相同训练批次上谁的效果更好吧

# 使用模型进行预测
input_data = np.array([[data_sequence[2], data_sequence[3]]])
predicted_value = model.predict(input_data)[0, 0]# 打印预测结果
print(f"输入序列: {data_sequence[2:4]},预测下一个数字: {predicted_value}")

 我们训练后使用5, 2进行预测,查看原始数据,我们知道下一个数字应该是4,让我们看看两个模型运行的结果吧

前馈神经网络

循环神经网络

可以看到循环神经网络的效果更优

可能的问题

梯度消失

 当在网络的反向传播过程中梯度逐渐减小到几乎为零时,就会出现梯度消失问题。这使得网络难以学习到远距离时间步的依赖关系,因为在反向传播时,较早时间步的信息无法有效传递给较晚时间步。

梯度爆炸

 相反,梯度爆炸是指在反向传播中,梯度变得非常大,这可能导致权重更新变得非常大,模型不稳定。这可能导致数值溢出和无法收敛。

这两个问题在神经网络中都会出现,只是由于RNN的结构,梯度消失与梯度爆炸问题会更加显著

其他的循环神经网络

  • LSTM,LSTM引入了三个门(门是一种控制信息流动的机制)来控制信息的输入、输出和遗忘。
  • GRU,GRU是对LSTM的一种简化版本,它只包含两个门:更新门(Update Gate)和重置门(Reset Gate)。

这两种循环神经网络能有效地应对梯度消失和梯度爆炸的问题,这里先做了解,之后会具体介绍

结语

  • 循环神经网络是深度学习中一种重要的结构,一般用来处理文本,语音的序列数据
  • 我们通过一个比较直观地感受到了RNN的记忆功能
  • 梯度消失与梯度爆炸问题在RNN中更加显著

感谢阅读,觉得有用的话就订阅下本专栏吧

http://www.lryc.cn/news/247527.html

相关文章:

  • 深度学习之基于百度飞桨PaddleOCR图像字符检测识别系统
  • 九、LuaTable(表)
  • 每日一题(LeetCode)----链表--链表最大孪生和
  • 腾讯云轻量服务器通过Docker搭建外网可访问连接的redis5.x集群
  • C++学习之路(十一)C++ 用Qt5实现一个工具箱(增加一个进制转换器功能)- 示例代码拆分讲解
  • C语言每日一题(40)栈实现队列
  • Vue.js 的生命周期
  • SeaTunnel引擎下的SQL Server CDC解决方案:构建高效数据管道
  • 【攻防世界-misc】Encode
  • visual c++ 2019 redistributable package
  • WPF中DataGrid解析
  • 在数据库中进行表内容的修改(MYSQL)
  • Android中的多进程
  • Apache2.4 AliasMatch导致301重定向问题?
  • 广州华锐视点:基于VR元宇宙技术开展法律法规常识在线教学,打破地域和时间限制
  • Maven——Maven使用基础
  • U4_2:图论之MST/Prim/Kruskal
  • springboot 注解@JsonInclude
  • Python 中文完整教程目录
  • C/C++---------------LeetCode第35. 搜索插入位置
  • 网络安全--基于Kali的网络扫描基础技术
  • C语言——求π的近似值
  • 如何使用ffmpeg转换图片格式
  • 11 动态规划解最后一块石头的重量II
  • LeetCode算法题解(动态规划,股票买卖)|LeetCode121. 买卖股票的最佳时机、LeetCode122. 买卖股票的最佳时机 II
  • python实验3 石头剪刀布游戏
  • 米贸搜|如何设置 Facebook 转换 API + 事件重复数据删除
  • python每日一题——11滑动窗口最大值
  • 【C++ 程序设计入门基础】- 第3节-循环结构01
  • 人工智能原理复习--知识表示(一)