torch.utils.data.DataLoader中的next(iter(train_dataloader))

在做实验时,我们常常会使用用开源的数据集进行测试。而Pytorch中内置了许多数据集,这些数据集我们常常使用DataLoader类进行加载。
如下面这个我们使用DataLoader类加载torch.vision中的FashionMNIST数据集。

from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt

training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor()
)

test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor()
)

我们接下来定义Dataloader对象用于加载这两个数据集:

train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)

那么这个train_dataloader究竟是什么类型呢?

print(type(train_dataloader))  # <class 'torch.utils.data.dataloader.DataLoader'>

我们可以将先其转换为迭代器类型。

print(type(iter(train_dataloader)))# <class 'torch.utils.data.dataloader._SingleProcessDataLoaderIter'>

然后再使用next(iter(train_dataloader))从迭代器里取数据,如下所示:

train_features, train_labels = next(iter(train_dataloader))
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img = train_features[0].squeeze()
label = train_labels[0]
plt.imshow(img, cmap="gray")
plt.show()
print(f"Label: {label}")
可以看到我们成功获取了数据集中第一张图片的信息,控制台打印:
Feature batch shape: torch.Size([64, 1, 28, 28])
Labels batch shape: torch.Size([64])
Label: 2

图片可视化显示如下:
在这里插入图片描述
不过有读者可能就会产生疑问,很多时候我们并没有将DataLoader类型强制转换成迭代器类型呀,大多数时候我们会写如下代码:

for train_features, train_labels in train_dataloader: 
    print(train_features.shape) # torch.Size([64, 1, 28, 28])
    print(train_features[0].shape) # torch.Size([1, 28, 28])
    print(train_features[0].squeeze().shape) # torch.Size([28, 28])
    
    img = train_features[0].squeeze()
    label = train_labels[0]
    plt.imshow(img, cmap="gray")
    plt.show()
    print(f"Label: {label}")

可以看到,该代码也能够正常迭代训练数据,前三个样本的控制台打印输出为:

torch.Size([64, 1, 28, 28])
torch.Size([1, 28, 28])
torch.Size([28, 28])
Label: 7
torch.Size([64, 1, 28, 28])
torch.Size([1, 28, 28])
torch.Size([28, 28])
Label: 4
torch.Size([64, 1, 28, 28])
torch.Size([1, 28, 28])
torch.Size([28, 28])
Label: 1

那么为什么我们这里没有显式将Dataloader转换为迭代器类型呢,其实是Python语言for循环的一种机制,一旦我们用for ... in ...句式来迭代一个对象,那么Python解释器就会偷偷地自动帮我们创建好迭代器,也就是说

for train_features, train_labels in train_dataloader:

实际上等同于

for train_features, train_labels in iter(train_dataloader):

更进一步,这实际上等同于

train_iterator = iter(train_dataloader)
try:
    while True:
        train_features, train_labels = next(train_iterator)
except StopIteration:
    pass
推而广之,我们在用Python迭代直接迭代列表时:
for x in [1, 2, 3, 4]:
其实Python解释器已经为我们隐式转换为迭代器了:
list_iterator = iter([1, 2, 3, 4])
try:
    while True:
        x = next(list_iterator)
except StopIteration:
    pass
  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
torch.utils.data.dataloader.DataLoader,常用的一些函数包括: 1. `__init__(self, dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None)`:这个函数是DataLoader类的构造函数,用于初始化DataLoader对象。它接受多个参数,包括dataset(数据集),batch_size(批处理大小),shuffle(是否打乱数据顺序),sampler(采样器),num_workers(用于加载数据的线程数),等等。 2. `__iter__(self)`:这个函数返回一个迭代器对象,用于在训练过程逐个获取数据。在这个函数内部,会调用DataLoaderIter类的构造函数,返回一个DataLoaderIter对象。 3. `__len__(self)`:这个函数返回数据集的总样本数。 4. `sampler`:这个属性是一个用于采样数据的对象。可以使用它来实现自定义的数据采样逻辑,或者使用默认的RandomSampler来进行随机采样。 5. `batch_sampler`:这个属性是一个用于批处理采样的对象。可以使用它来实现自定义的批处理采样逻辑,或者使用默认的BatchSampler来进行批处理采样。 6. `collate_fn`:这个属性是一个用于将单个样本组合成批次的函数。可以使用它来实现自定义的批处理逻辑,或者使用默认的collate_fn来进行默认的批处理。 7. `pin_memory`:这个属性指定是否将Tensor数据存储在固定内存,以提高数据加载效率。 8. `drop_last`:这个属性指定是否丢弃最后一个不完整的批次,如果设置为True,则会丢弃最后一个不满足batch_size的批次。 以上是一些常用的函数和属性,当然还有其他一些函数和属性可以根据具体需求来使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值