资讯专栏INFORMATION COLUMN

Python实现双向RNN与堆叠的双向RNN的示例代码

89542767 / 579人阅读

  小编写这篇文章的一个主要目的,主要是给大家做一个详细的介绍,介绍的内容主要是利用Python知识,利用Python去实现RNN与堆叠的RNN,具体的实例代码,下面就给大家详细的去做一个解答。


  1、双向RNN


  双向RNN(Bidirectional RNN)的结构如下图所示。

01.png

02.png

  03.png

04.png

      双向的RNN是同时考虑“过去”和“未来”的信息。上图是一个序列长度为4的双向RNN结构。


  双向RNN就像是我们做阅读理解的时候从头向后读一遍文章,然后又从后往前读一遍文章,然后再做题。有可能从后往前再读一遍文章的时候会有新的不一样的理解,最后模型可能会得到更好的结果。


  2、堆叠的双向RNN

05.png

  堆叠的双向RNN(Stacked Bidirectional RNN)的结构如上图所示。上图是一个堆叠了3个隐藏层的RNN网络。

06.png

  注意,这里的堆叠的双向RNN并不是只有双向的RNN才可以堆叠,其实任意的RNN都可以堆叠,如SimpleRNN、LSTM和GRU这些循环神经网络也可以进行堆叠。


  堆叠指的是在RNN的结构中叠加多层,类似于BP神经网络中可以叠加多层,增加网络的非线性。


  3、双向LSTM实现MNIST数据集分类


  import tensorflow as tf
  from tensorflow.keras.models import Sequential
  from tensorflow.keras.layers import Dense
  from tensorflow.keras.layers import LSTM,Dropout,Bidirectional
  from tensorflow.keras.optimizers import Adam
  import matplotlib.pyplot as plt
  #载入数据集
  mnist=tf.keras.datasets.mnist
  #载入数据,数据载入的时候就已经划分好训练集和测试集
  #训练集数据x_train的数据形状为(60000,28,28)
  #训练集标签y_train的数据形状为(60000)
  #测试集数据x_test的数据形状为(10000,28,28)
  #测试集标签y_test的数据形状为(10000)
  (x_train,y_train),(x_test,y_test)=mnist.load_data()
  #对训练集和测试集的数据进行归一化处理,有助于提升模型训练速度
  x_train,x_test=x_train/255.0,x_test/255.0
  #把训练集和测试集的标签转为独热编码
  y_train=tf.keras.utils.to_categorical(y_train,num_classes=10)
  y_test=tf.keras.utils.to_categorical(y_test,num_classes=10)
  #数据大小-一行有28个像素
  input_size=28
  #序列长度-一共有28行
  time_steps=28
  #隐藏层memory block个数
  cell_size=50
  #创建模型
  #循环神经网络的数据输入必须是3维数据
  #数据格式为(数据数量,序列长度,数据大小)
  #载入的mnist数据的格式刚好符合要求
  #注意这里的input_shape设置模型数据输入时不需要设置数据的数量
  model=Sequential([
  Bidirectional(LSTM(units=cell_size,input_shape=(time_steps,input_size),return_sequences=True)),
  Dropout(0.2),
  Bidirectional(LSTM(cell_size)),
  Dropout(0.2),
  #50个memory block输出的50个值跟输出层10个神经元全连接
  Dense(10,activation=tf.keras.activations.softmax)
  ])
  #循环神经网络的数据输入必须是3维数据
  #数据格式为(数据数量,序列长度,数据大小)
  #载入的mnist数据的格式刚好符合要求
  #注意这里的input_shape设置模型数据输入时不需要设置数据的数量
  #model.add(LSTM(
  #units=cell_size,
  #input_shape=(time_steps,input_size),
  #))
  #50个memory block输出的50个值跟输出层10个神经元全连接
  #model.add(Dense(10,activation='softmax'))
  #定义优化器
  adam=Adam(lr=1e-3)
  #定义优化器,loss function,训练过程中计算准确率使用交叉熵损失函数
  model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])
  #训练模型
  history=model.fit(x_train,y_train,batch_size=64,epochs=10,validation_data=(x_test,y_test))
  #打印模型摘要
  model.summary()
  loss=history.history['loss']
  val_loss=history.history['val_loss']
  accuracy=history.history['accuracy']
  val_accuracy=history.history['val_accuracy']
  #绘制loss曲线
  plt.plot(loss,label='Training Loss')
  plt.plot(val_loss,label='Validation Loss')
  plt.title('Training and Validation Loss')
  plt.legend()
  plt.show()
  #绘制acc曲线
  plt.plot(accuracy,label='Training accuracy')
  plt.plot(val_accuracy,label='Validation accuracy')
  plt.title('Training and Validation Loss')
  plt.legend()
  plt.show()


  这个可能对文本数据比较容易处理,这里用这个模型有点勉强,只是简单测试下。


  模型摘要:

07.png

  acc曲线:

08.png

  loss曲线:

09.png

10.png

  到此为止,这篇文章就给大家介绍完毕了,希望可以给大家带来帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128394.html

相关文章

  • 深度学习解决机器阅读理解任务研究进展

    摘要:深度学习近年来在中广泛使用,在机器阅读理解领域也是如此,深度学习技术的引入使得机器阅读理解能力在最近一年内有了大幅提高,本文对深度学习在机器阅读理解领域的技术应用及其进展进行了归纳梳理。目前的各种阅读理解任务中完形填空式任务是最常见的类型。 关于阅读理解,相信大家都不陌生,我们接受的传统语文教育中阅读理解是非常常规的考试内容,一般形式就是给你一篇文章,然后针对这些文章提出一些问题,学生回答这...

    flybywind 评论0 收藏0
  • 神经网络基础

    摘要:要学习深度学习,那么首先要熟悉神经网络,简称的一些基本概念。网络径向基函数网络是一种单隐层前馈神经网络,它使用径向基函数作为隐层神经元激活函数,而输出层则是对隐层神经元输出的线性组合。 阅读目录1. 神经元模型2. 感知机和神经网络3. 误差逆传播算法4. 常见的神经网络模型5. 深度学习6. 参考内容目前,深度学习(Deep Learning,简称DL)在算法领域可谓是大红大紫,现在不只是...

    starsfun 评论0 收藏0
  • 神经网络

    摘要:通过将神经元的值设置为希望的模式来训练网络,之后可以计算权重。输入神经元在完整网络更新结束时变成输出神经元。在某种程度上,这类似于峰值神经网络,并不是所有的神经元始终都在发射并且点的生物合理性得分。 随着新的神经网络架构不时出现,很难跟踪这些架构。知道所有缩写(DCIGN,BiLSTM,DCGAN,任何人?)起初可能有点压倒性。 所以我决定编写一个包含许多这些体系结构的备忘单。这些大多...

    Anonymous1 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<