传统RNN模型笔记:输入数据长度变化的结构解析

一、案例背景

本案例通过PyTorch的nn.RNN构建单隐藏层RNN模型,重点展示RNN对变长序列数据的处理能力(序列长度从1变为20),帮助理解RNN的输入输出逻辑。

二、核心代码与结构拆解

python 复制代码
def dm_rnn_for_sequencelen():
    # 1. 定义RNN模型
    rnn = nn.RNN(5, 6, 1)  # input_size=5, hidden_size=6, num_layers=1
    
    # 2. 准备输入数据
    input = torch.randn(20, 3, 5)  # 序列长度=20,批次大小=3,输入维度=5
    
    # 3. 初始化隐状态
    h0 = torch.randn(1, 3, 6)  # 层数×方向=1,批次大小=3,隐藏层维度=6
    
    # 4. 前向传播
    output, hn = rnn(input, h0)
    
    # 输出结果
    print('output形状--->', output.shape)  # torch.Size([20, 3, 6])
    print('hn形状--->', hn.shape)          # torch.Size([1, 3, 6])
    print('模型结构--->', rnn)             # RNN(5, 6)

三、关键参数详解

1. 模型定义参数(nn.RNN)

参数 含义 本案例取值 说明
input_size 输入特征维度 5 每个时间步的输入向量维度(如单词的 embedding 维度)
hidden_size 隐藏层输出维度 6 每个时间步的隐状态向量维度
num_layers 隐藏层层数 1 单隐藏层结构,简化计算

2. 输入数据格式(input)

  • 形状:[sequence_length, batch_size, input_size]
  • 本案例:[20, 3, 5]
    • 20:序列长度(sequence_length),每个样本包含20个时间步(如一句话有20个单词);
    • 3:批次大小(batch_size),一次并行处理3个样本;
    • 5:输入特征维度 ,与模型定义的input_size一致。

3. 初始隐状态(h0)

  • 形状:[num_layers × num_directions, batch_size, hidden_size]
  • 本案例:[1, 3, 6]
    • 1:num_layers × num_directions(1层+单向RNN);
    • 3:与输入的batch_size一致,每个样本对应一个初始隐状态;
    • 6:与模型定义的hidden_size一致,初始隐状态的维度。

四、输出结果解析

1. output(所有时间步的隐藏层输出)

  • 形状:[sequence_length, batch_size, hidden_size]
  • 本案例:[20, 3, 6]
    • 包含每个时间步、每个样本的隐藏层输出(20个时间步×3个样本×6维向量);
    • 体现RNN对序列的"逐步处理"特性,保留所有中间结果。

2. hn(最后一个时间步的隐状态)

  • 形状:[num_layers × num_directions, batch_size, hidden_size]
  • 本案例:[1, 3, 6]
    • 仅包含最后一个时间步(第20步)、每个样本的隐状态;
    • 因单隐藏层,hn与output的最后一个时间步结果完全一致。

五、核心结论:RNN对变长序列的适应性

  • 序列长度可灵活变化 :只要输入特征维度(input_size)和批次大小(batch_size)不变,RNN可处理任意长度的序列(如示例1中长度=1,本案例中长度=20)。
  • 输出形状随序列长度调整 :output的第一个维度始终等于输入序列长度,体现RNN对时序数据的动态处理能力。

六、类比理解

将RNN比作"逐字阅读的处理器":

  • 输入:3篇文章(batch_size=3),每篇20个单词(sequence_length=20),每个单词用5维向量表示(input_size=5);
  • 处理过程:每读一个单词(时间步),结合上一步的记忆(隐状态),更新当前记忆(6维向量,hidden_size=6);
  • 输出:output是每读一个单词时的记忆记录,hn是读完最后一个单词的最终记忆。
相关推荐
cao23337 小时前
关于 y0 y1 yn 变量名冲突说法的指正
笔记
结局无敌15 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
在所不辞兄15 小时前
为什么神经网络对对抗扰动和分布偏移往往比较脆弱,而人类感知相对更鲁棒?
人工智能·深度学习·神经网络·机器学习
~patience~15 小时前
WAV 逆向分析工具使用笔记
笔记
滴啦嘟啦哒15 小时前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身
xier_ran15 小时前
【infra之路】AI 编译器学习笔记(十三):AI 编译器全景——TVM、XLA、IREE 与其他
人工智能·笔记·学习
连山齐名15 小时前
ai应用开发的学习笔记
服务器·笔记·学习
乔旭伟16 小时前
中小厂生产管理系统选型笔记:驱动方式、主线链路与成本结构
笔记·需求分析·规格说明书
xier_ran16 小时前
【infra之路】AI 编译器学习笔记(十四):为什么要 tiling,以及矩阵计算单元的“固定“
人工智能·笔记·学习
szxinmai主板定制专家16 小时前
储能 EMS、微网控制器选型:RK3588、RK3576、RK3568+FPGA 怎么选?多网、多 CAN、EMC 设计权衡
人工智能·深度学习·机器学习·fpga开发·工业网关·rk3576·电力网关