RNN笔记(刘二大人)

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训练链接

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
刘二大人,PyTorch中的RNN(循环神经网络)是一种用于处理序列数据的模型。RNN Cell是RNN的基本单元,它通过线性层将n维输入映射到m维输出。在PyTorch中,可以使用torch.nn.RNNCell来创建RNN Cell,指定输入大小(input_size)和隐藏状态大小(hidden_size)\[1\]。 以下是一个使用RNN Cell的示例代码: ```python import torch batch_size = 1 seq_len = 3 input_size = 4 hidden_size = 2 cell = torch.nn.RNNCell(input_size=input_size, hidden_size=hidden_size) dataset = torch.randn(seq_len, batch_size, input_size) hidden = torch.zeros(batch_size, hidden_size) for idx, input in enumerate(dataset): print('=' * 20, idx, '=' * 20) print('Input size:', input.shape) hidden = cell(input, hidden) print('Outputs size:', hidden.shape) print(hidden) ``` 在这个示例中,我们创建了一个RNN Cell,并使用一个随机生成的数据集进行计算。通过循环遍历数据集中的每个输入,我们可以看到RNN Cell的输出和隐藏状态的变化\[1\]。 除了RNN Cell,PyTorch还提供了其他类型的RNN模型,如LSTM和GRU,它们在处理长序列和解决梯度消失问题方面更有效。如果你对优化和交叉熵的应用感兴趣,可以使用torch.nn.CrossEntropyLoss作为损失函数,并使用torch.optim.Adam作为优化器\[2\]。 另外,如果你想了解如何在PyTorch中使用卷积神经网络(CNN),可以参考以下示例代码: ```python import torch input = \[3, 4, 6, 5, 7, 2, 4, 6, 8, 2, 1, 6, 7, 8, 4, 9, 7, 4, 6, 2, 3, 7, 5, 4, 1\] input = torch.Tensor(input).view(1, 1, 5, 5) conv_layer1 = torch.nn.Conv2d(1, 1, kernel_size=3, padding=1, bias=False) conv_layer2 = torch.nn.Conv2d(1, 1, kernel_size=3, stride=2, bias=False) kernel = torch.Tensor(\[1, 2, 3, 4, 5, 6, 7, 8, 9\]).view(1, 1, 3, 3) conv_layer1.weight.data = kernel.data conv_layer2.weight.data = kernel.data output1 = conv_layer1(input) output2 = conv_layer2(input) print(output1) print(output2) ``` 在这个示例中,我们创建了两个卷积层(conv_layer1和conv_layer2),并使用给定的输入进行计算。输出结果将显示在控制台上\[3\]。 希望这些信息对你有帮助!如果你还有其他问题,请随时提问。 #### 引用[.reference_title] - *1* *3* [【B站_刘二大人pytorch深度学习实践】笔记作业代码合集](https://blog.csdn.net/m0_58586235/article/details/129478545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [刘二大人PyTorch-循环神经网络(RNN)—基础篇](https://blog.csdn.net/weixin_44981126/article/details/127173783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值