RNN 代码 - 修改句子长度
1 课程概览
本课演示如何修改 RNN 模型的句子长度参数。将 seq_len 从 1 改为 20,对应的输入数据形状和输出形状发生变化。核心要点:修改任一参数时,需同步修改相关参数。
2 核心概念与定义
- 句子长度(seq_len):输入序列的时间步数,即句子中的单词数。
- 参数联动:修改一个参数时,相关的输入输出形状需同步修改。
3 模型与算法详解
修改句子长度的流程
- 修改
seq_len:从 1 改为 20 - 修改输入数据形状:
(1, 3, 5)→(20, 3, 5) - 修改
h0形状:保持不变(1, 3, 6) - 查看输出形状:
output从(1, 3, 6)→(20, 3, 6)
参数变化对比
| 参数 | 修改前 | 修改后 |
|---|---|---|
| seq_len | 1 | 20 |
| input 形状 | (1, 3, 5) | (20, 3, 5) |
| h0 形状 | (1, 3, 6) | (1, 3, 6) |
| output 形状 | (1, 3, 6) | (20, 3, 6) |
| hn 形状 | (1, 3, 6) | (1, 3, 6) |
关键观察
output形状随seq_len变化hn形状不变(始终是最后一个时间步)hn等于output[-1](最后一个时间步的输出)
4 数学原理与推导
输入输出关系
输入形状:$(L, N, H_{in})$
输出形状:$(L, N, H_{out})$
其中:
- $L$:序列长度(seq_len)
- $N$:批次大小(batch)
- $H_{in}$:输入特征维度
- $H_{out}$:隐藏状态维度
5 代码示例
import torch
import torch.nn as nn
# 1. 定义 RNN 模型(参数不变)
rnn = nn.RNN(input_size=5, hidden_size=6, num_layers=1)
# 2. 修改句子长度:从 1 改为 20
seq_len = 20 # 修改句子长度
# 3. 创建输入数据(形状变化)
# 修改前:(1, 3, 5)
# 修改后:(20, 3, 5)
input = torch.randn(seq_len, 3, 5) # 20 个时间步,3 个批次,5 个特征
# 4. 初始化隐藏状态(形状不变)
h0 = torch.zeros(1, 3, 6) # 1 层,3 个批次,6 个隐藏状态
# 5. 前向传播
output, hn = rnn(input, h0)
# 6. 查看输出形状
print("output shape:", output.shape) # torch.Size([20, 3, 6])
print("hn shape:", hn.shape) # torch.Size([1, 3, 6])
# 7. 验证 hn 等于 output 的最后一个时间步
print("output[-1]:", output[-1])
print("hn:", hn)
# 两者内容相同(科学计数法表示)
输出示例
output shape: torch.Size([20, 3, 6])
hn shape: torch.Size([1, 3, 6])
6 重难点与易错提醒
- ❗重点:修改
seq_len时,输入数据形状的第一个维度要同步修改。 - ⚠️易错:
h0的形状不随seq_len变化,保持(num_layers, batch, hidden_size)。 - 💡深入理解:
output形状随seq_len变化,hn形状不变。 - 💡深入理解:
hn记录的是最后一个时间步的隐藏状态,等于output[-1]。 - 💡深入理解:无论修改哪个参数,只需同步修改相关的输入输出形状即可。
7 课堂问答精选
Q1:修改句子长度时,哪些形状需要同步修改?
A:输入数据的形状需要同步修改。seq_len 从 1 改为 20,输入形状从 (1, 3, 5) 变为 (20, 3, 5)。h0 形状不变。
Q2:修改句子长度后,output 和 hn 的形状如何变化?
A:output 形状从 (1, 3, 6) 变为 (20, 3, 6),随 seq_len 变化。hn 形状保持 (1, 3, 6) 不变。
Q3:hn 和 output 的关系是什么?
A:hn 是最后一个时间步的隐藏状态,等于 output[-1]。两者内容相同,只是表示方式不同(可能用科学计数法)。
8 本课小结
- 修改
seq_len:输入形状的第一个维度同步修改。 h0形状:不随seq_len变化。output形状:随seq_len变化。hn形状:不随seq_len变化。hn等于output[-1]。
9 延伸思考
- 如何根据实际任务选择合适的句子长度?
- 句子长度过长会对 RNN 训练产生什么影响?