我是靠谱客的博主 笨笨滑板,最近开发中收集的这篇文章主要介绍RNN笔记(刘二大人)pytorch中构建RNN的第一种方法:RNNcell:pytorch中构建RNN的第二种方法:RNN:小实践举例(RNN和RNNCell)添加了embedding的RNNLSTM实践举例GRU训练实践,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

RNN计算过程
在这里插入图片描述
RNNcell的具体计算过程
在这里插入图片描述

pytorch中构建RNN的第一种方法:RNNcell:

在这里插入图片描述

  1. 初始化定义的时候,只有两个参数:input_size、hidden_size
  2. 实际使用的时候,也有两个参数,input张量、hidden张量
    其中input张量的大小为batch_size * input_size
    hidden张量的大小为batch_size * hidden_size
    返回值为一个新的hidden张量,大小为batch_size * hidden_size
    在这里插入图片描述

pytorch中构建RNN的第二种方法:RNN:

  1. 构造初始化时,参数有3个:input_size、hidden_size、num_layers(有多少个RNNcell层)
    !!!注意numlayers和seqSize的区别:
    1. numlayers是指RNNcell处理的层数(比如下图中的RNNcell只有一行,那就只有一层),不是RNNcell的个数
    2. seqSize是指自变量x的个数,比如一句话有多少个token
  2. 实际调用时:
    1. 有两个输入参数,input张量、hidden张量
      input张量的大小为(seqSize * Batch * input_size)
      hidden张量的大小为(numlayers * batch * hidden_size)
    2. 有两个输出参数,output张量、hidden张量
      output张量对应h1 - hn的所有hidden张量的综合(大小为:seqSize * batch * hidden_size )
      hidden张量就是最后的hn张量(大小为:num_layers * batch * hidden_size)

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

小实践举例(RNN和RNNCell)

任务:seq2seq(把hello单词转化成ohlol)
在这里插入图片描述
具体过程:
在这里插入图片描述
参数:

  1. input_size = 4,input的字母有多少种,那么每一个token的one_hot向量的维度就是多少
  2. output_size = 4,同样output的字母有多少种,那么每一个token的one_hot向量的维度就是多少,那么hidden_size = output_size = 4
  3. seqSize = 5,因为hello有5个字母
  4. batch = 1,因为目前只有这一个单词

完整代码见链接:
RNN、RNNcell代码基础篇
注意想不通的一点是cross-entropy的两个输入(预测的向量,真实的y值)
二者的维度不同!
下图中的标注部分是一个token的one-hot预测向量、和其对应的真实y值,这样就直接cross-entropy了,有什么不明白的(笨!)
在这里插入图片描述

!!!!!注意RNN和RNNcell的cross-entropy的区别,在于

  1. RNNCell是一个one-hot对应一个数字label
  2. 而RNN是多个one-hot向量组成的序列,对应一个由多个label数字组成的label序列
    在这里插入图片描述

添加了embedding的RNN

多了两个地方的修改

  1. 在RNN之前,添加embedding
  2. 在RNN之后,添加线性层
    在这里插入图片描述

1、embedding的作用,就是把高维的、稀疏的one-hot的张量进行压缩处理,让其变成低纬的密集的矩阵(数据降维)(就是把input_size映射到embedding_size)

embedding层其实就是一个矩阵,它的两个输入为:
1. num_embeddings:就是input的size(矩阵的长)
2. embedding_dim:就是output的size(矩阵的宽)

2、线性层的作用
有时候hidden_size = output_size,但是有时候hidden_size不等于output_size,此时我们用线性层把RNN输出的hidden_size映射到output_size

具体代码链接:RNN、RNNcell代码基础篇

注意点:

  1. input的张量必须是long类型(为了embedding)
  2. input不再需要把输入转化为one-hot向量,embedding会自动转
  3. 注意设置标准的x_data和y_data的格式:
idx2char = ['e','l','h','o'] 
x_data = [[2,0,1,1,3]] #(batch, seq_len) list
y_data = [3,2,1,3,1] # #(batch * seq_len)

LSTM实践举例

方法1:手动敲一份LSTM的模型出来
具体原理也可以看这里的链接
手写LSTM模型的实践代码

方法2:直接用LSTM的接口,LSTM的参数说明
LSTM使用的官方文档
parameter参数部分和RNN几乎一模一样
不同的是input和output
LSTM的输入有3个(input,(h0,c0))
输出也有3个(output,(hn,cn))

修改的过程就是在原有的RNN+embedding基础上修改两个地方:
在这里插入图片描述
修改完成的代码链接:
具体代码链接:LSTM训练链接

GRU训练实践

原理+参数说明见官方文档:
GRU说明
具体到使用上来,只要把RNN+embedding那个版本的代码的RNN模型改成GRU即可

(GRU的原理很像LSTM,但是调用方式很像RNN。没有像LSTM一样的c0向量,输出也没有c0)
具体代码链接:GRU训练链接

最后

以上就是笨笨滑板为你收集整理的RNN笔记(刘二大人)pytorch中构建RNN的第一种方法:RNNcell:pytorch中构建RNN的第二种方法:RNN:小实践举例(RNN和RNNCell)添加了embedding的RNNLSTM实践举例GRU训练实践的全部内容,希望文章能够帮你解决RNN笔记(刘二大人)pytorch中构建RNN的第一种方法:RNNcell:pytorch中构建RNN的第二种方法:RNN:小实践举例(RNN和RNNCell)添加了embedding的RNNLSTM实践举例GRU训练实践所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部