16 循环神经网络(进阶)

循环神经网络

  这篇博客主要设计一个 RNN Classifier - Name Classifier。我们需要训练一个模型,能够根据输入的名字预测该名字是基于哪种语言的。在该例子中一共有几千个名字,有 18 个类别。

在这里插入图片描述
  
  通常在构造循环神经网络时,比如说在处理自然语言的时候,通常都将神经网络设计成如下形式:首先会将字或次转变成 one-hot 向量,但是 one-hot 向量维度太高而且过于稀疏,所以我们一般都会通过一个嵌入层(Embed),嵌入层负责将它转换成一个低维的稠密的向量。然后经过循环神经网络 RNN ,之后隐层的输出不一定和最终要求的目标一致,所以我们可能会再做一个线性层(Linear Layer),将它的输出映射成和我们要求的一致。

在这里插入图片描述
  
  但是在我们这个例子中,我们要求最后输出一个大的分类,就是名字它属于哪个分类,所以对于 o 1 o_1 o1 o 5 o_5 o5 这部分输出我们没有要求。换句话说,我们可以不用对所有的隐层输出做线性变换,而且我们也不知道它输出的结果应该是什么?所以为了解决我们的问题,我们可以简化上面的网络。我们只需要将最终的隐层输出再经过一个线性层的变化即可。

在这里插入图片描述
  
  我们这个例子中用到的模型如下:首先是输入 x x x,经过嵌入层,经过 GRU 模型,之后将最后一个隐层输出经过一个线性层变为期望的输出结果的维度,在本例中,有 18 维。

在这里插入图片描述
  
  我们输入的是一个名字,我们会将名字看成一个序列,比如 M a c l e a n Maclean Maclean

在这里插入图片描述

  而且对于我们输入的名字,它们的序列长短是不一样的。接下来我们看一下模型的处理过程。

在这里插入图片描述
  
  下面来看一下主要的循环是怎么用代码写的。

在这里插入图片描述
  

1. 准备数据

  我们拿到的数据都是名字字符串,第一步需要将它们转变为序列,列表中的每一个元素就是名字中欸定每一个字符。

在这里插入图片描述
  
  接下来就要做词典,因为名字中都是英文字符,所以我们可以使用 ASCII 码表作为它的词典,ASCII 中有 128 个字符,所以我们将长度设置为 128,然后求列表中每个元素对应的 ASCII 值。

在这里插入图片描述

  这个时候我们就将输入转换成数值序列了。实际上列表中每个数字代表的是一个独热向量,这个独热向量一共有 128 维。比如 77,它表示的向量除了第 77 个元素为 1,其余 127 个位置上均为 0。我们还会注意到一个问题,这些序列长短不一,所以我们要给每一个元素进行 padding,找出该序列中长度最长的序列长度,然后依次给较短的序列的填充上 0,做完 padding 之后,我们就能保证能够构成一个张量。

在这里插入图片描述
  
  以上就是关于名字的处理。
  
  接下来要处理 Country 这个字段。我们要将国家转成一个分类索引。

在这里插入图片描述
  
  下面我们用具体的代码表示名字数据集 NameDataset 是怎样构造的?

在这里插入图片描述
  
  接下来就是数据准备的工作:

在这里插入图片描述

  准备好数据之后,就是模型的设计:

在这里插入图片描述
  
  接下来,我们就来介绍一下什么是双向循环神经网络?

在这里插入图片描述
  
  我们原来的 RNN 图示如下,以 x_(N-1) 为例,将来它的输出只包含在它之前的序列信息。换句话说,它只考虑过去的信息,但是在有的时候,我们还需要考虑未来的信息,所以就出现了双向循环神经网络。

在这里插入图片描述
  

  那么双向的循环神经网络指的是沿着序列的方向计算一遍(forward)。

在这里插入图片描述
  
  还有一种就是反过来计算,然后将正向与反向算出来的隐层结果做拼接。

在这里插入图片描述
  
  最后的 output 是所有隐层的输出。

在这里插入图片描述
  
  但是 hidden 中只有两个元素:

在这里插入图片描述
  
  接下来看一下 forward 过程:首先会将 input 进行一个转置,转置之后 input 图示如下:

在这里插入图片描述
  
  forward 代码如下:

在这里插入图片描述
  
  下面再补充一下由名字转换成张量的过程:

在这里插入图片描述
  
  接下来看一下转换的代码:

在这里插入图片描述
  
  训练过程代码如下:

在这里插入图片描述
  
  测试过程代码如下:

在这里插入图片描述
  
  最后的测试结果如下:

在这里插入图片描述
  实际上,当 epoch = 20 时,性能已经达到最好。·

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值