全球人名分类案例 - 测试 RNN 模型
1 课程概览
本课测试搭建好的 RNN 模型。流程包括:实例化模型、准备数据、给模型喂数据。测试时使用真实数据(如"欧阳"等人名),验证模型能否正常前向传播。
2 核心概念与定义
- 模型实例化:创建模型对象并传入参数。
- 前向传播测试:验证模型能否正常处理输入数据。
- 批次维度(Batch Dimension):RNN 输入需要
(seq_len, batch, input_size)三维形状。
3 模型与算法详解
测试流程
- 实例化 RNN 对象:传入
input_size=57、hidden_size=128、output_size=18 - 准备数据:人名转换为 one-hot 编码
- 初始化隐藏状态:
h0 = torch.zeros(1, 1, 128) - 前向传播:
output, hn = model(input, h0) - 查看输出形状:
output形状为(1, 18)
输入数据形状
| 数据 | 形状 | 说明 |
|---|---|---|
| input | (seq_len, 57) | 人名的 one-hot 编码 |
| input(添加批次后) | (seq_len, 1, 57) | RNN 输入 |
| h0 | (1, 1, 128) | 初始隐藏状态 |
| output | (1, 18) | 国家分类结果 |
| hn | (1, 1, 128) | 最后隐藏状态 |
模型结构验证
RNN(57, 128) → Linear(128, 18) → LogSoftmax
4 数学原理与推导
前向传播
$$H_t = \tanh(W_{ih} X_t + W_{hh} H_{t-1} + b_h)$$
$$Y = \text{LogSoftmax}(W_{hy} H_{last} + b_y)$$
输出形状推导
- 输入:$(L, 1, 57)$
- RNN 输出:$(L, 1, 128)$
- 取最后时间步:$(1, 128)$
- 全连接层:$(1, 18)$
- LogSoftmax:$(1, 18)$
5 代码示例
import torch
from 模型文件 import MyRNN
def dm_test_my_rnn():
# 1. 实例化 RNN 对象
my_rnn = MyRNN(
input_size=57, # 词向量维度(字符表大小)
hidden_size=128, # 隐藏层维度
output_size=18, # 输出维度(国家数量)
n_layers=1 # RNN 层数
)
# 打印模型结构
print("MyRNN:", my_rnn)
# 输出:
# RNN(57, 128)
# Linear(128, 18)
# LogSoftmax(dim=1)
# 2. 准备数据(人名的 one-hot 编码)
# 例如 "欧阳" → 6 个字符 → (6, 57)
# 这里用随机数据演示
input = torch.randn(6, 57) # seq_len=6, input_size=57
# 3. 初始化隐藏状态
hidden = my_rnn.initHidden() # (1, 1, 128)
# 4. 前向传播
output, hn = my_rnn(input, hidden)
# 5. 查看输出形状
print("output shape:", output.shape) # torch.Size([1, 18])
print("hn shape:", hn.shape) # torch.Size([1, 1, 128])
# 6. 查看输出内容
print("output:", output)
print("hn:", hn)
# 运行测试
dm_test_my_rnn()
输出示例
MyRNN: MyRNN(
(rnn): RNN(57, 128)
(linear): Linear(in_features=128, out_features=18, bias=True)
(softmax): LogSoftmax(dim=1)
)
output shape: torch.Size([1, 18])
hn shape: torch.Size([1, 1, 128])
6 重难点与易错提醒
- ❗重点:测试流程:实例化 → 准备数据 → 初始化隐藏状态 → 前向传播。
- ⚠️易错:输入数据需要是
(seq_len, input_size)形状,forward内部会添加批次维度。 - ⚠️易错:隐藏状态形状为
(num_layers, batch, hidden_size)。 - 💡深入理解:
output形状为(batch, output_size),即(1, 18)。 - 💡深入理解:测试时使用真实数据,而非随机生成的数据。
7 课堂问答精选
Q1:测试 RNN 模型的流程是什么?
A:①实例化模型对象;②准备输入数据(人名的 one-hot 编码);③初始化隐藏状态;④前向传播;⑤查看输出形状和内容。
Q2:为什么 forward 中要给 input 添加批次维度?
A:因为外部传入的 input 形状为 (seq_len, input_size),而 RNN 需要的形状为 (seq_len, batch, input_size),所以在 forward 中用 unsqueeze(1) 添加批次维度。
Q3:output 和 hn 的形状是什么?
A:output 形状为 (1, 18),即 1 个样本的 18 个国家的对数概率。hn 形状为 (1, 1, 128),即最后一个时间步的隐藏状态。
8 本课小结
- 测试流程:实例化 → 准备数据 → 初始化隐藏状态 → 前向传播。
- 输入形状:
(seq_len, input_size),forward内部添加批次维度。 - 隐藏状态形状:
(num_layers, batch, hidden_size)。 - 输出形状:
(batch, output_size)=(1, 18)。 - 测试时使用真实数据验证模型。
9 延伸思考
- 如何将人名转换为 one-hot 编码?
- 如何从输出概率中获取预测的国家?