Pytorch torch.utils.data.dataloader.default_collate 先容

[复制链接]
发表于 2025-9-30 02:40:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
torch.utils.data.dataloader.default_collate 是 PyTorch 中 DataLoader 默认的 collate_fn 函数,用于将一个批次的样本数据归并成张量(Tensor)或其他布局化数据格式。以下是关于 default_collate 的详细先容:
1. 功能

default_collate 的紧张功能是将一个批次的样本数据(通常是列心情势)递归地打包成张量。它会根据数据的布局自动处置惩罚以下几种情况:

  •         标量:将标量打包成张量。
  •         列表或元组:将列表或元组递归打包成张量。
  •         字典:将字典的键值对分别打包成张量。
  •         NumPy 数组:将 NumPy 数组转换为 PyTorch 张量。
  •         其他范例:假如无法处置惩罚,会抛出 TypeError。
2. 默认举动

以下是 default_collate 的默认举动示例:
2.1 标量

假如样本数据是标量,default_collate 会将它们打包成一个张量:
  1. import torch
  2. from torch.utils.data.dataloader import default_collate
  3. data = [1, 2, 3, 4]
  4. batch = default_collate(data)
  5. print(batch)  # 输出: tensor([1, 2, 3, 4])
复制代码
2.2 列表或元组

假如样本数据是列表或元组,default_collate 会递归地将它们打包成张量:
  1. data = [[1, 2], [3, 4], [5, 6]]
  2. batch = default_collate(data)
  3. print(batch)  # 输出: tensor([[1, 2], [3, 4], [5, 6]])
复制代码
2.3 字典

假如样本数据是字典,default_collate 会将字典的键值对分别打包成张量:
  1. data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "b": 6}]
  2. batch = default_collate(data)
  3. print(batch)  # 输出: {'a': tensor([1, 3, 5]), 'b': tensor([2, 4, 6])}
复制代码
2.4 NumPy 数组

假如样本数据是 NumPy 数组,default_collate 会将其转换为 PyTorch 张量:
  1. import numpy as np
  2. data = [np.array([1, 2]), np.array([3, 4]), np.array([5, 6])]
  3. batch = default_collate(data)
  4. print(batch)  # 输出: tensor([[1, 2], [3, 4], [5, 6]])
复制代码
3. 范围性

固然 default_collate 很强大,但它有一些范围性:

  •         无法处置惩罚变长序列:假如样本数据是变长的(比方差异长度的序列),default_collate 会直接抛堕落误。这种情况下须要自界说 collate_fn。
  •         无法处置惩罚自界说数据格式:假如样本数据是自界说的复杂布局(比方嵌套的字典或列表),default_collate 大概无法精确处置惩罚。
4. 自界说 collate_fn

假如 default_collate 无法满意需求,可以通过自界说 collate_fn 来实现更机动的数据处置惩罚。比方,处置惩罚变长序列时,可以使用 torch.nn.utils.rnn.pad_sequence 来添补序列:
  1. import torch
  2. from torch.utils.data import DataLoader, Dataset
  3. class MyDataset(Dataset):
  4.     def __init__(self):
  5.         self.data = [[1, 2], [3, 4, 5], [6], [7, 8, 9, 10]]
  6.     def __len__(self):
  7.         return len(self.data)
  8.     def __getitem__(self, idx):
  9.         return self.data[idx]
  10. def custom_collate_fn(batch):
  11.     sequences = [torch.tensor(seq) for seq in batch]
  12.     padded_sequences = torch.nn.utils.rnn.pad_sequence(sequences, batch_first=True)
  13.     return padded_sequences
  14. dataset = MyDataset()
  15. dataloader = DataLoader(dataset, batch_size=2, collate_fn=custom_collate_fn)
  16. for batch in dataloader:
  17.     print(batch)
  18.     # 输出:
  19.     # tensor([[1, 2, 0],
  20.     #         [3, 4, 5]])
  21.     # tensor([[6, 0, 0],
  22.     #         [7, 8, 9]])
复制代码
5. 总结


  •         default_collate 是 PyTorch 中 DataLoader 的默认 collate_fn,用于将样本数据打包成张量。
  •         它可以处置惩罚标量、列表、元组、字典和 NumPy 数组等数据范例。
  •         假如数据具有特殊布局(如变长序列或自界说格式),须要自界说 collate_fn 来机动处置惩罚。
通过明白 default_collate 的举动,可以更好地决定是否须要自界说 collate_fn 来满意特定需求。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表