Pytorch中TensorDataset和DataLoader用法

        我们在Pytorch中通常使用torch.utils模块进行数据操作,其中TensorDataset是 PyTorch 中的一个工具类,用于将一组张量包装成一个数据集。DataLoader则是对数据进行采样、分割等操作,将数据划分为许多组特征张量+对应标签的形式。

        具有划分小批量的功能DataLoader提供了一个简单的方式来迭代地加载数据集,它可以接受任意形式的数组、张量作为输入,并把他们一次性转换为神经网络可以接入的tensor类型

TensorDataset

主要特性

TensorDataset可以将多个张量打包成一个数据集,其中每个张量包含相同数量的元素。将最外面的维度一致的tensor进行打包,也就是将第一个维度一致的tensor进行打包。

TensorDataset允许你使用索引和切片来访问数据,这使得它的行为类似于一个标准的 Python 列表或数组。

示例

引用自:三、数据集打包—TensorDataset-CSDN博客

from torch.utils.data import TensorDataset
import torch
from torch.utils.data import DataLoader

data_a = torch.tensor(
[[11, 22, 33], [44, 55, 66], [77, 88, 99], [11, 22, 33], [44, 55, 66], [77, 88, 99], [11, 22, 33], [44, 55, 66],[77, 88, 99], [11, 22, 33], [44, 55, 66], [77, 88, 99]])
data_b = torch.tensor([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2])
train_ids = TensorDataset(data_a, data_b)
# 切片输出
print(train_ids[0:2])
print('#' * 30)
# 循环取数据
for x_train, y_label in train_ids:
    print(x_train, y_label)
# DataLoader进行数据封装
print('#' * 30)
train_loader = DataLoader(dataset=train_ids, batch_size=4, shuffle=True)
for i, data in enumerate(train_loader, 1):  # 注意enumerate返回值有两个,一个是序号,一个是数据(包含训练数据和标签)
    x_data, label = data
    print('batch:{0} x_data:{1} label: {2}'.format(i, x_data, label))   # y data (torch tensor)

索引和切片操作

import torch
from torch.utils.data import TensorDataset, DataLoader

# 示例特征和标签张量
features = torch.tensor([[1, 2], [3, 4], [5, 6]])
labels = torch.tensor([0, 1, 0])

# 创建 TensorDataset
dataset = TensorDataset(features, labels)

# 获取第一个样本
first_sample = dataset[0]

# 获取前两个样本
first_two_samples = dataset[:2]

DataLoader

主要特性

  1. 批处理(Batching):DataLoader允许您以批次的形式加载数据,这对于内存效率和训练速度都非常关键。

  2. 打乱数据(Shuffling):在每个 epoch 开始时,DataLoader可以选择性地打乱数据,这有助于减少模型的过拟合。

  3. 并行加载(Parallelism):DataLoader可以使用多个工作进程来并行加载数据,从而提高数据加载的速度。

  4. 自定义数据加载: 它允许使用自定义的数据集类(只要其继承自torch.utils.data.Dataset),几乎可以加载任何类型的数据。

主要参数

  1. Dataset:加载的数据集
  2. batch_size:每个批次加载的样本数。较大的batch_size可以提高内存利用率和加速训练,但也可能导致内存不足。
  3. shuffle:指定是否在每个 epoch 开始时随机打乱数据。对于训练数据,通常设置为True以减少模型过拟合。
  4. num_workers:用于数据加载的子进程数。更多的num_workers可以加快数据加载速度,但也会增加内存消耗。
  5. drop_last:如果数据集大小不能被batch_size整除,设置为True时将丢弃最后一个不完整的批次,反之则保留。
  6. sampler:定义从数据集中抽取样本的策略。如果指定,则shuffle必须为False。
from torch.utils.data import DataLoader

# 假设我们有一个数据集对象
dataset = MyDataset(...)  # MyDataset 是一个继承自 torch.utils.data.Dataset 的类

# 创建 DataLoader
batchdata = DataLoader(dataset            # 加载的数据集
                        , batch_size=32     # 每个批次加载的样本数
                        , shuffle=True      # 是否随机打乱数据
                        , num_workers=4)    # 数据加载的子进程数

len(batchdata) #查看具体被分了多少个batch

#可以使用.datasets查看数据集相关的属性
len(batchdata.dataset) #总共有多少数据

batchdata.dataset[0] #查看其中一个样本

batchdata.dataset[0][0]#一个样本的特征张量

batchdata.dataset[0][1]#一个样本的标签

#属性batch_size,查看现在的batch_size是多少
batchdata.batch_size

迭代数据

使用DataLoader的一般模式是在训练循环中迭代它:(两种循环方式都可以)

for batch_idx, (x, y) in enumerate(data_loader):
    # 在这里处理数据和目标
    # 例如,将数据和目标移至 GPU,然后进行模型的前向和后向传播
for data, target in data_loader:

        batch_idx是当前批次的索引号,它是一个整数,从 0 开始计数。每次循环迭代时batch_idx会自动增加。

        (x, y)是一个元组,其中x和y分别代表当前批次中的数据和标签。

        x通常是一个张量(Tensor),包含了一批样本数据。在深度学习中,这些样本数据可能是图像、文本、声音片段或其他类型的输入数据。x可以理解成三维或二维数据通过循环不断从data_loader中提出。

        y也是一个张量,包含了与 x中每个样本相对应的标签或目标值。在监督学习中,这些标签用于训练模型,使其能够从输入数据 x预测出正确的输出。

        这个循环的过程可以理解为一张张图片的数据‘x’提取后送入神经网络进行训练,后由‘y’进行损失计算。

结合使用

data_loader = DataLoader(dataset, batch_size=2, shuffle=True)

for batch_idx, (batch_features, batch_labels) in enumerate(data_loader):
    # 在这里处理每个批次的数据
    pass

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`TensorDataset`和`DataLoader`是PyTorch用于构建数据集和数据加载器的工具,用于方便地对数据进行批量处理和训练。 `TensorDataset`可以将多个张量作为输入,并将它们组合成一组数据。例如,我们可以将训练数据集的输入张量和目标张量分别作为输入,构造一个`TensorDataset`对象,如下: ```python train_dataset = TensorDataset(input_tensor, target_tensor) ``` 这里的`input_tensor`和`target_tensor`是两个张量,它们的第一个维度必须相同,表示它们对应的样本数相同。 `DataLoader`用于将数据集按照指定的批量大小进行分批,方便进行训练。例如,我们可以使用以下代码创建一个数据加载器,将上面构造的数据集分成每批2个样本: ```python train_dataloader = DataLoader(train_dataset, batch_size=2) ``` 这里的`train_dataset`是上面构造的数据集,`batch_size`表示每批包含的样本数。 使用`DataLoader`可以方便地对数据进行迭代,例如: ```python for batch_input, batch_target in train_dataloader: # 对每个批次的输入进行处理 ... ``` 这里的`batch_input`和`batch_target`表示每个批次的输入和目标张量,它们的形状为`(batch_size, ...)`,其`...`表示张量的其他维度。我们可以对每个批次的输入进行处理,例如进行前向计算和反向传播等操作。 总之,`TensorDataset`和`DataLoader`是PyTorch非常常用的数据处理工具,可以方便地对数据进行批量处理和训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值