理解循环神经网络
创始人
2024-04-13 12:05:10
0

理解循环神经网络

之前有一篇文章已经初步介绍过RNN的原理(https://forchenxi.github.io/2021/04/23/nlp-rnn/),里面其实已经介绍的比较清晰易懂了,这篇文章再来回顾和拓展一下.

首先要知道RNN是一个带有内部环的神经网络,上面的这篇文章中的图描述的更形象,这里再来简单回顾下,使用tensorflow来实现(实际也是用keras来实现的)。

SimpleRNN

RNN基本计算过程

在这里插入图片描述

在这里插入图片描述

这张图中为了让大家看到RNN网络的计算过程,没有展现出RNN网络的内部循环,但是各个参数的含义表示的非常清楚。

import tensorflow as tf# 这里随机生成一个3*2的矩阵,前面的1表示样本数量(表示本批次只有一个样本)
# 输出数据的第一维与这里样本数量一致
# 3*2可以理解为一个文本句子的向量表示,有三个单词,每个单词的的向量长度为2
x = tf.random.normal((1, 3, 2))# 这里的4可以理解为权重向量的长度(上面的图上有标注出来),最后输出张量的尺寸也与此参数有关
layer = tf.keras.layers.SimpleRNN(4, input_shape=(3, 2))
output = layer(x)print(output.shape)print(output)(1, 4)
tf.Tensor([[0.8968392  0.53277504 0.07782626 0.42022803]], shape=(1, 4), dtype=float32)

这里最后输出只有一个长度为4的向量,而RNN在实际计算时是每个单词都计算了一遍,所以实际计算过程得到了3个长度为4的向量,上篇文章中也有提到是通过return_sequences这个参数来控制的。

RNN的输出

RNN的输出分为多对一(N vs 1)、多对多(N vs N)和一对多(1 vs N)三种

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面的代码是单输出形式,多输出的代码如下:

x = tf.random.normal((1, 3, 2))layer = tf.keras.layers.SimpleRNN(4, input_shape=(3, 2), return_sequences=True)
output = layer(x)print(output.shape)(1, 3, 4)

代码理解图

在这里插入图片描述

上面仅是得到了每个时间步的张量,还可以通过添加输层出来获取输出

model = tf.keras.Sequential()
model.add(tf.keras.layers.SimpleRNN(4, input_shape=(3, 2), return_sequences=True))
model.add(tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(4, activation='softmax')))

在这里插入图片描述

另外也可以将多个RNN层叠加在一起

model = tf.keras.Sequential()
model.add(tf.keras.layers.SimpleRNN(4, input_shape=(3, 2), return_sequences=True))
model.add(tf.keras.layers.SimpleRNN(4))

在这里插入图片描述

添加embedding层

这里的词向量是随机矩阵,直接输入到RNN中,其实还可以再此之前插入一个embedding层

model = tf.keras.Sequential()
# embedding层的shape与RNN的输入shape保持一致
model.add(tf.keras.layers.Embedding(3, 2))
model.add(tf.keras.layers.SimpleRNN(4, input_shape=(3, 2)))

关于embedding层的原理和使用方法,在这篇博客中也有介绍

https://forchenxi.github.io/2021/03/15/nlp-vectorize/

双向RNN

在这里插入图片描述

双向的RNN实际上就是将一个前向的RNN和一个后向的RNN在每个时间步得到的状态值拼接在一起作为总的状态。

model = tf.keras.Sequential()
model.add(tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(10, return_sequences=True), input_shape=(5, 10)))
model.add(tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(10)))
model.add(tf.keras.layers.Dense(5))
model.add(tf.keras.layers.Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

这里实际是用的LSTM网络

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...