英译法案例 - 构建数据集对象
1 课程概览
本课讲解构建数据集对象 MyPairsDataset,继承自 Dataset。实现三个方法:__init__(保存双语句子对、计算样本总数)、__len__(返回样本总数)、__getitem__(根据索引获取单个样本,修正索引值确保在有效范围内)。
2 核心概念与定义
- MyPairsDataset:自定义数据集类,继承自
Dataset。 - Dataset:PyTorch 的数据集基类。
- init:初始化函数,保存数据。
- len:返回样本总数。
- getitem:根据索引获取单个样本。
- 索引修正:确保索引在
[0, 样本总数-1]范围内。
3 模型与算法详解
数据集类结构
class MyPairsDataset(Dataset):
def __init__(self, my_pairs):
# 保存双语句子对
# 计算样本总数
def __len__(self):
# 返回样本总数
def __getitem__(self, index):
# 修正索引值
# 获取单个样本
三个方法详解
方法一:__init__(初始化)
- 保存双语句子对:
self.my_pairs = my_pairs - 计算样本总数:
self.n_samples = len(my_pairs)
方法二:__len__(样本总数)
- 返回样本总数:
return self.n_samples
方法三:__getitem__(获取单个样本)
- 修正索引值:确保在
[0, 样本总数-1]范围内 - 获取样本:
return self.my_pairs[index]
索引修正规则
索引不能小于 0
索引不能大于样本总数 - 1
示例:10 个样本,索引范围 [0, 9]
4 数学原理与推导
本课为数据集构建,无数学原理。
5 代码示例
from torch.utils.data import Dataset
class MyPairsDataset(Dataset):
"""数据集类,表示双语句子对"""
def __init__(self, my_pairs):
"""
初始化函数
:param my_pairs: 双语句子对 [[英文, 法文], ...]
"""
# 1. 保存双语句子对
self.my_pairs = my_pairs
# 2. 计算样本总数
self.n_samples = len(my_pairs)
def __len__(self):
"""返回样本总数"""
return self.n_samples
def __getitem__(self, index):
"""
获取单个样本
:param index: 索引
:return: 双语句子对 [英文, 法文]
"""
# 修正索引值,确保在有效范围内
index = index % self.n_samples # 确保在 [0, n_samples-1] 范围内
# 获取样本
return self.my_pairs[index]
# 测试
if __name__ == "__main__":
# 模拟数据
my_pairs = [
["i am a student", "je suis un étudiant"],
["hello world", "bonjour le monde"],
["how are you", "comment allez-vous"],
]
# 创建数据集对象
my_dataset = MyPairsDataset(my_pairs)
# 测试 __len__
print("样本总数:", len(my_dataset))
# 测试 __getitem__
for i in range(len(my_dataset)):
sample = my_dataset[i]
print(f"索引 {i}: 英文={sample[0]}, 法文={sample[1]}")
6 重难点与易错提醒
- ❗重点:数据集类继承自
Dataset,实现三个方法。 - ❗重点:
__init__保存数据并计算样本总数。 - ⚠️易错:索引修正确保在
[0, 样本总数-1]范围内。 - ⚠️易错:
__len__和__getitem__是魔法方法,外界用len()和[]触发。 - 💡深入理解:将数据集类写在外边,其他函数也能调用。
7 课堂问答精选
Q1:MyPairsDataset 类继承自哪个类?
A:继承自 Dataset(from torch.utils.data import Dataset)。
Q2:__init__ 方法做了哪些事?
A:①保存双语句子对(self.my_pairs = my_pairs);②计算样本总数(self.n_samples = len(my_pairs))。
Q3:__getitem__ 方法为什么要修正索引值?
A:确保索引在 [0, 样本总数-1] 范围内。索引不能小于 0,不能大于样本总数减 1。例如 10 个样本,索引范围是 [0, 9]。
Q4:__len__ 和 __getitem__ 什么时候触发?
A:__len__ 在外界用 len(对象) 时自动触发;__getitem__ 在外界用 对象[索引] 获取元素时自动触发。
8 本课小结
- 数据集类
MyPairsDataset继承自Dataset。 - 三个方法:
__init__、__len__、__getitem__。 __init__:保存数据,计算样本总数。__len__:返回样本总数。__getitem__:修正索引,获取单个样本。
9 延伸思考
- 如何将单词转换为索引?
- 如何构建数据加载器?