pytorch中数据的加载!🍧

pytorch中数据的加载

1.TensorDataset

TensorDataset是PyTorch中的一个类,用于创建一个张量数据集,它可以将多个张量打包成一个数据集。通常情况下,这个数据集会用于数据加载器(DataLoader)中,以便于对张量数据进行批处理、随机采样等操作。

TensorDataset的常见用法是将特征张量和标签张量打包在一起,然后将它们传递给DataLoader,以便于对数据进行迭代访问。在每次迭代中,DataLoader会返回一个批量的特征张量和对应的标签张量。

下面是一个示例代码,演示了如何使用TensorDataset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import torch
from torch.utils.data import TensorDataset, DataLoader

# 假设有特征张量 features 和标签张量 labels
features = torch.randn(100, 5) # 100个样本,每个样本包含5个特征
labels = torch.randint(0, 2, (100,)) # 100个样本的二元标签

# 创建一个TensorDataset对象,将特征张量和标签张量打包在一起
dataset = TensorDataset(features, labels)

# 创建一个DataLoader,用于对数据进行批处理和随机采样
batch_size = 32
data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 遍历数据加载器,对数据进行迭代访问
for batch_features, batch_labels in data_loader:
# 这里可以对每个批量的特征和标签进行处理
print("Batch Features:", batch_features.shape)
print("Batch Labels:", batch_labels.shape)

在这个示例中,TensorDataset被用来将特征张量和标签张量打包在一起,然后通过DataLoader对数据进行批处理和随机采样。DataLoader每次返回一个由特征和标签组成的批量。

结果:

1
2
3
4
5
6
7
8
Batch Features: torch.Size([32, 5])
Batch Labels: torch.Size([32])
Batch Features: torch.Size([32, 5])
Batch Labels: torch.Size([32])
Batch Features: torch.Size([32, 5])
Batch Labels: torch.Size([32])
Batch Features: torch.Size([4, 5])
Batch Labels: torch.Size([4])

2.RandomSampler

RandomSampler是PyTorch中的一个采样器(Sampler),用于在数据集中进行随机采样。在PyTorch中,它通常与DataLoader一起使用,用于生成mini-batches,以便进行训练或评估。

RandomSampler的工作原理如下:

  1. 初始化时,RandomSampler接收一个数据集(如PyTorch的Dataset对象)作为参数,并确定要采样的数据集大小(即数据集的长度)。
  2. 在每个epoch开始时,RandomSampler会随机打乱数据集的索引。
  3. 在训练或评估过程中,当DataLoader从数据集中获取mini-batch时,它会使用RandomSampler生成的随机索引来选择数据样本。这样可以确保每个epoch中的mini-batches都是随机的,从而增加模型的泛化能力和训练的多样性。

总之,RandomSampler通过在每个epoch开始时重新打乱数据集索引,以确保每个mini-batch的样本是随机选择的,从而帮助模型更好地学习数据的分布特征。

具体用法:

1
2
3
4
5
6
train_data = TensorDataset(torch.LongTensor(input_ids).to(device),
torch.LongTensor(target_ids).to(device))

train_sampler = RandomSampler(train_data)
train_dataloader = DataLoader(train_data, sampler=train_sampler, batch_size=batch_size)
return input_lang, output_lang, train_dataloader

3.DataLoader

在 PyTorch 中,DataLoader 是一个用于加载数据的实用工具,通常用于训练神经网络模型时。它可以自动批处理、并行加载数据以及数据打乱,提高了数据加载的效率。下面是一个简单的示例,演示如何使用 DataLoader:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import torch
from torch.utils.data import DataLoader, Dataset

# 假设你有一个自定义的数据集类
class CustomDataset(Dataset):
def __init__(self, data):
self.data = data

def __len__(self):
return len(self.data)

def __getitem__(self, index):
return self.data[index]

# 创建一个示例数据集
data = [i for i in range(100)]

# 创建数据集实例
dataset = CustomDataset(data)

# 定义 DataLoader 参数
batch_size = 10
shuffle = True

# 创建 DataLoader 实例
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=shuffle)

# 遍历 DataLoader 获取数据批次
for batch in dataloader:
print(batch)

在这个示例中:

  • 首先定义了一个 CustomDataset 类,该类继承自 torch.utils.data.Dataset,并实现了 __len____getitem__ 方法,其中 __len__ 返回数据集的大小,__getitem__ 根据给定索引返回对应的数据样本。
  • 创建了一个示例数据集 data,并使用 CustomDataset 类创建了一个数据集实例 dataset
  • 定义了 DataLoader 的参数,包括 batch_size(批量大小)和 shuffle(是否在每个 epoch 中打乱数据)。
  • 使用 DataLoader 类创建了一个数据加载器实例 dataloader
  • 最后,通过遍历 dataloader,可以逐批获取数据。

tips:

在 PyTorch 中,samplershuffle 是 DataLoader 的两个重要参数,它们在控制数据加载时起着不同的作用。

  1. shuffle
    • shuffle 参数是一个布尔值,用于指定是否在每个 epoch 中对数据进行随机打乱。
    • shuffle=True 时,数据会在每个 epoch 开始时被随机打乱,这有助于模型更好地学习数据的分布,防止模型对数据的顺序产生依赖。
    • 如果 shuffle=False,则数据不会被打乱,按照原始顺序被加载。
  2. sampler
    • sampler 参数用于指定数据采样器对象,允许用户自定义数据的采样方式。
    • 默认情况下,当没有指定 sampler 参数时,DataLoader 会使用 SequentialSampler,它按顺序返回数据样本的索引。
    • 另一方面,如果你想要自定义采样逻辑,比如实现自己的采样器对象或者使用带权重的采样方式,你可以通过指定 sampler 参数来实现这一目的。

在实践中,通常情况下会将 shuffle=True 以打乱数据顺序,从而增加模型的泛化能力,特别是在训练深度学习模型时。而 sampler 参数则允许更进一步的自定义数据加载方式,比如处理不均衡的数据集或者实现特殊的采样逻辑。


pytorch中数据的加载!🍧
https://yangchuanzhi20.github.io/2024/02/21/人工智能/Pytorch/基础知识/pytorch中数据的加载/
作者
白色很哇塞
发布于
2024年2月21日
许可协议