特别注意:DataLoader 返回的迭代器是无尽的,依据如下 (CHATGPT3.5)
DataLoader 返回的迭代器默认情况下是无尽的,因为它会无限地循环遍历数据集,以提供批量的数据。在训练神经网络时,通常会使用无尽的迭代器来循环遍历数据集,直到达到指定的训练 epoch 数量或其他停止条件。如果你想要控制迭代器的结束,可以通过设置 DataLoader 的参数 num_epochs 或者在你的训练循环中设置停止条件来实现。例如,在 PyTorch 中,你可以使用 torch.utils.data.DataLoader 的参数 num_epochs 来指定遍历数据集的次数。
torch.utils.data.DataLoader 是一个用来读取 .jsonl 文件的包
它会返回一个可迭代对象,这个对象的每一项是一个 “dict” 类型的数据,储存着 .jsonl 文件的每一行 json 对象
不一定是 “dict” 类型的数据,只是 python 在处理 json 文件时通常使用 dict 类型处理,实际上,也可以是元组或者其它的数据类型
一个寻常的使用用例如下:
# 1. 首先定义如下的一个类
class JSONLDataset(Dataset):# 当你创建一个类的新实例时,__init__方法会被自动调用,用来初始化实例的属性。def __init__(self, file_path):self.data = []with open(file_path, 'r', encoding='utf-8') as f:# .jsonl 的文件的每一行使用 json.loads 去加载它for line in f:self.data.append(json.loads(line.strip()))# 使用 len(这个类的对象) 时,会返回 __len__ 函数返回的东西def __len__(self):return len(self.data)# 使用 这个类的对象[integer] 时,会返回 __getitem__ 函数返回的东西def __getitem__(self, idx):return self.data[idx]# 2. 使用这个类,从 'train.jsonl' 读取训练集数据
train_dataset = JSONLDataset('train.jsonl')# 3. 使用 train_dataset 和 DataLoader,把 .jsonl 中的数据批次化处理,每 batch_size(如32) 个数据为一个批次
train_data_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)# 4. 打印这个可迭代对象里的数据
for batch in train_data_loader:print("=============================== start ================================")print(type(batch))print(batch)print("=============================== end ================================")
一个不太寻常的使用用例如下,我们用 DataLoader 来批次化处理内置数据集 SST2
train_iter = SST2(split="train")
dataloader = DataLoader(train_iter, batch_size=8, shuffle=False, collate_fn=collate_batch
)
经过验证,这里的 dataloader 中的每一项都是 tuple 类型