英译法案例 - 带注意力机制的解码器层测试代码
1 课程概览
本课讲解带注意力机制的解码器测试代码。流程:①获取数据加载器;②模型初始化(创建编码器和解码器,移动到设备);③从数据加载器获取样本;④编码过程(将英语句子编码为隐藏状态 C);⑤解码过程。强调 .to(device) 移动到指定设备的重要性。
2 核心概念与定义
- device:设备(CPU 或 GPU)。
- .to(device):将模型/张量移动到指定设备。
- 编码过程:将英语句子编码为隐藏状态(中间语义张量 C)。
- 解码过程:基于 C 生成法语句子。
3 模型与算法详解
测试流程
第一步:获取数据加载器对象
my_dataloader = get_dataloader()
第二步:模型初始化阶段
# 2.1 创建编码器对象
my_encoder = Encoder(input_size=2803, hidden_size=256).to(device)
# 2.2 创建解码器对象
my_decoder = AttnDecoder(output_size=4345, hidden_size=256).to(device)
第三步:推理阶段
# 3.1 从数据加载器获取一个样本
for i, (x, y) in enumerate(my_dataloader):
# 3.2 打印输入信息
print(x.shape, x) # 英语句子
print(y.shape, y) # 法语句子
# 3.3 编码过程
# 将英语句子编码成隐藏状态(中间语义张量 C)
encoder_output, hidden = my_encoder(x, hidden)
break # 只测试一批
参数说明
| 参数 | 值 | 说明 |
|---|---|---|
| input_size | 2803 | 英语词汇表大小 |
| output_size | 4345 | 法语词汇表大小 |
| hidden_size | 256 | 隐藏层维度 |
.to(device) 的重要性
如果不加
.to(device),只在环境切换,执行会报错。
- 模型需要移动到设备
- 张量也需要移动到设备
- 必须保持一致
4 数学原理与推导
本课为测试代码,无数学原理。
5 代码示例
import torch
def dm_test_attn_decoder():
"""测试带注意力机制的解码器"""
# 第一步:获取数据加载器对象
my_dataloader = get_dataloader()
# 第二步:模型初始化阶段
# 2.1 创建编码器对象
my_encoder = Encoder(
input_size=2803, # 英语词汇表大小
hidden_size=256 # 隐藏层维度
).to(device)
# 2.2 创建解码器对象
my_decoder = AttnDecoder(
output_size=4345, # 法语词汇表大小
hidden_size=256 # 隐藏层维度
).to(device)
# 第三步:推理阶段
# 3.1 从数据加载器获取一个样本
for i, (x, y) in enumerate(my_dataloader):
# 3.2 打印输入信息
print(f"英语句子形状: {x.shape}")
print(f"英语句子内容: {x}")
print(f"法语句子形状: {y.shape}")
print(f"法语句子内容: {y}")
# 3.3 编码过程
# 初始化隐藏状态
hidden = my_encoder.initHidden()
# 将英语句子编码成隐藏状态(中间语义张量 C)
encoder_output, hidden = my_encoder(x, hidden)
# 3.4 解码过程(后续实现)
# ...
break # 只测试一批
# 测试
if __name__ == "__main__":
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"当前设备: {device}")
dm_test_attn_decoder()
6 重难点与易错提醒
- ❗重点:模型初始化后必须
.to(device)移动到设备。 - ❗重点:编码器和解码器的 hidden_size 必须一致。
- ⚠️易错:不加
.to(device)只切环境会报错。 - ⚠️易错:编码器需要先初始化隐藏状态。
- 💡深入理解:编码过程将英语句子编码为隐藏状态(中间语义张量 C)。
7 课堂问答精选
Q1:为什么模型需要 .to(device)?
A:将模型移动到指定设备(CPU 或 GPU)。如果不加 .to(device),只在环境切换,执行会报错。模型和张量必须在同一设备上。
Q2:编码器和解码器的参数有什么区别?
A:编码器的 input_size 是英语词汇表大小(2803),解码器的 output_size 是法语词汇表大小(4345)。两者的 hidden_size 必须一致(256)。
Q3:测试代码的流程是什么?
A:①获取数据加载器;②模型初始化(创建编码器和解码器,移动到设备);③从数据加载器获取样本;④编码过程(将英语句子编码为隐藏状态 C);⑤解码过程。
Q4:编码过程做了什么?
A:将英语句子通过编码器编码为隐藏状态,即中间语义张量 C,传给解码器进行生成。
8 本课小结
- 流程:获取数据加载器 → 模型初始化 → 推理。
- 模型初始化:创建编码器和解码器,
.to(device)。 - 编码过程:英语句子 → 编码器 → 隐藏状态(C)。
- 参数:英语词汇表 2803,法语词汇表 4345,隐藏层 256。
.to(device)必须加,否则报错。
9 延伸思考
- 如何实现解码过程?
- 如何加入注意力机制?