【Python深度学习】RNN循环神经网络结构讲解及序列回归问题实战(图文解释 附源码)

简介: 【Python深度学习】RNN循环神经网络结构讲解及序列回归问题实战(图文解释 附源码)

需要全部代码请点赞关注收藏后评论区留言私信~~~

循环神经网络

循环神经网络(Recurrent Neural Network,RNN)是用于对序列的非线性特征进行学习的深度神经网络。循环神经网络的输入是有前后关联关系的序列。

循环神经网络可以用来解决与序列有关的问题,如序列回归、序列分类和序列标注等任务。序列的回归问题,如气温、股票价格的预测问题,它的输入是前几个气温、股票价格的值,输出的是连续的预测值。序列的分类问题,如影评的正负面分类、垃圾邮件的检测,它的输入是影评和邮件的文本,输出的是预定的有限的离散的标签值。序列的标注问题,如自然语言处理中的中文分词和词性标注,循环神经网络可处理传统机器学习中的隐马尔可夫模型、条件随机场等模型胜任的标注任务。

类似隐马尔可夫链,把循环神经网络基本结构的中间部分称为隐层,向量s标记了隐层的状态。隐层的输出有两个,一个是y,另一个反馈到自身。到自身的反馈将与下一步的输入共同改变隐层的状态s。因此,隐层的输入也有两个,分别是当前输入x和来自自身的反馈(首步没有来自自身的反馈)。

输入样本的观测序列有两个分量x^(1),x^(2),即每次输入的步长数为2。观测序列的分量是3维的向量。隐状态是一个2维的向量s。输出是1维的标量,分别是y^(1),y^(2)。

TensorFlow2中Keras的SimpleRNN的类原型

tf.keras.layers.SimpleRNNCell(
    units, activation='tanh', use_bias=True,
    kernel_initializer='glorot_uniform',
    recurrent_initializer='orthogonal',
    bias_initializer='zeros', kernel_regularizer=None,
    recurrent_regularizer=None, bias_regularizer=None, kernel_constraint=None,
    recurrent_constraint=None, bias_constraint=None, dropout=0.0,
    recurrent_dropout=0.0, **kwargs
)

参数units设定该单元的状态向量s的维数。参数use_bias设定是否使用阈值参数θ。

用SimpleRnnCell来模拟循环神经网络前向传播

import tensorflow as tf
# (批大小, 步长数, 序列分量维数)
batch_size = 1
time_step = 2
step_dim = 3
hidden_dim = 2  # 隐状态维度
s0 = tf.constant([[0.0, 0.0]]) # 第1步输入的隐状态
x1 = tf.constant([[0.1, 0.2, 0.3]]) # 第1步输入的序列分量
simpleRnnCell = tf.keras.layers.SimpleRNNCell(hidden_dim , use_bias=False)
out1,s1 = simpleRnnCell(x1, [s0]) # 将当前步的x和上一步的隐状态输入到单元中,产生第1步的输出和隐状态
print("out1:", out1)
print("s1:", s1)
>>> out1: tf.Tensor([[-0.05700448  0.2253606 ]], shape=(1, 2), dtype=float32)
     s1: [<tf.Tensor: id=53, shape=(1, 2), dtype=float32, numpy=array([[-0.05700448,  0.2253606 ]], dtype=float32)>]
x2 = tf.constant([[0.2, 0.3, 0.4]]) # 第2步输入的序列分量
out2,s2 = simpleRnnCell(x2, [s1[0]]) # 将当前步的x和上一步的隐状态输入到单元中,产生第2步的输出和隐状态
print("out2:", out2)
print("s2:", s2)
>>> out2: tf.Tensor([[-0.198356    0.54249984]], shape=(1, 2), dtype=float32)
     s2: [<tf.Tensor: id=62, shape=(1, 2), dtype=float32, numpy=array([[-0.198356  ,  0.54249984]], dtype=float32)>]

网络结构

one to many结构是单输入多输出的结构,可用于输入图片给出文字说明。many to one结构是多输入单输出的结构,可用于文本分类任务,如影评情感分类、垃圾邮件分类等。many to many delay结构也是多输入多输出的结构,但它是有延迟的输出,该结构常用于机器翻译,机器问答等。

序列回归问题实战

该示例是对三角函数的值进行预测,先对sin三角函数值顺序采点,然后用一段值序列来预测紧接的第1个值。

基本结构采用了TensorFlow中Keras的SimpleRNN,它实现了RNN基本单元。它的输入有两个重要的参数:units和input_shape。units是设定该单元的状态向量s的维数,它的大小决定了W矩阵的维度。input_shape设定了输入的序列的长度和每个序列元素的特征数,每个序列元素的特征数和units共同决定了U矩阵的维度。

输入序列的长度决定了SimpleRNN的循环步数,在最后一步,将状态向量s输出到一个全连接层,该连接层输出为1维的预测值,因此V矩阵的维度是units×1。

预测结果如下

部分代码如下

import numpy as np
np.random.seed(0)
def myfun(x):
    '''目标函float):自变量
    output:函数值'''
    return np.sin(x)
x = np.linspace(0,15, 150)
y = myfun(x) + 1 + np.random.random(size=len(x)) * 0.3 - 0.15
input_len = 10
train_x = []
train_y = []
for i in range(len(y)-input_len):
    train_data = []
    for j in range(input_len):
        train_data.append([y[i+j]])
    train_x.append(train_data)
    train_y.append((y[i+input_len]))
import tensorflow as tf
model = tf.keras.Sequential()
model.add(tf.keras.layers.SimpleRNN(100, return_sequences=False, 
                    activation='relu',
                    input_shape=(input_len, 1)))
model.add(tf.keras.layers.Dense(1))
model.add(tf.keras.layers.Activation("relu"))
model.compile(lopochs=10, batch_size=10, verbose=1)
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus']=False
plt.rc('font', family='SimHei', size=13)
#plt.scatter(x, y, color="black", linewidth=1)
y0 = myfun(x) + 1
plt.plot(x, y0, color="red", linewidth=1)
y1 = model.predict(train_x)
plt.plot(x[input_len:], y1, "b--", linewidth=1)
plt.show()

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
7天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
5天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
25 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
11天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
20天前
|
机器学习/深度学习 搜索推荐 安全
深度学习之社交网络中的社区检测
在社交网络分析中,社区检测是一项核心任务,旨在将网络中的节点(用户)划分为具有高内部连接密度且相对独立的子群。基于深度学习的社区检测方法,通过捕获复杂的网络结构信息和节点特征,在传统方法基础上实现了更准确、更具鲁棒性的社区划分。
35 7
|
8天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
25 0
|
10天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习的奇迹:如何用神经网络识别图像
【10月更文挑战第33天】在这篇文章中,我们将探索深度学习的奇妙世界,特别是卷积神经网络(CNN)在图像识别中的应用。我们将通过一个简单的代码示例,展示如何使用Python和Keras库构建一个能够识别手写数字的神经网络。这不仅是对深度学习概念的直观介绍,也是对技术实践的一次尝试。让我们一起踏上这段探索之旅,看看数据、模型和代码是如何交织在一起,创造出令人惊叹的结果。
21 0
|
11天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
17天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第26天】在这篇文章中,我们将深入探讨卷积神经网络(CNN)的基本原理、结构和应用。CNN是深度学习领域的一个重要分支,广泛应用于图像识别、语音处理等领域。我们将通过代码示例和实际应用案例,帮助读者更好地理解CNN的概念和应用。
|
19天前
|
机器学习/深度学习 算法 计算机视觉
深度学习与生活:如何利用卷积神经网络识别日常物品
【10月更文挑战第24天】在这篇文章中,我们将探索深度学习如何从理论走向实践,特别是卷积神经网络(CNN)在图像识别中的应用。通过一个简单的示例,我们将了解如何使用CNN来识别日常生活中的物体,如水果和家具。这不仅是对深度学习概念的一次直观体验,也是对技术如何融入日常生活的一次深刻反思。文章将引导读者思考技术背后的哲理,以及它如何影响我们的生活和思维方式。