文章目录
- 一、认识dataloader
- 二、DataLoader整合数据集
- 三、使用DataLoader展示图片方法
- 四、去除结尾不满足batch_size设值图片的展示
一、认识dataloader
DataLoader 用于封装数据集,并提供批量加载数据的迭代器。它支持自动打乱数据、多线程数据加载等功能。dataset只是告诉我们数据集在一个什么位置,而dataloader则可以把数据加载到神经网络当中。dataloader就相当于在dataset当中去取数据,怎么取。
dataset就相当于一副牌,而dataloader就相当于每次从dataset这幅牌堆中怎么抽牌,是一次性抽5张牌,用左手抽还是右手抽。相对而言dataloader就是方法。
二、DataLoader整合数据集
将4个数据中的img 和 target 分别封装起来,称为imgs,targets
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
#准备的测试数据集
test_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=0,drop_last=False)
#测试数据集中第一张图片及target
img, target = test_data[0]
print(img.shape)
print(target)
for data in test_loader:
imgs, targets = data
print(imgs.shape)
print(targets)
test_loader = DataLoader(
dataset=test_data, # 指定要加载的数据集
batch_size=4, # 指定每个批次的大小为4,4表示从数据集中取4个数据
shuffle=True, # 设置为True表示在每个epoch开始时打乱数据。一个epoch意味着数据加载器将整个数据集按照指定的顺序(可能是随机的,如果设置了shuffle=True)遍历一次。
num_workers=0, # 指定加载数据时使用的子进程数,0表示在主进程中加载数据
drop_last=False # 设置为False表示即使最后一个批次的数据量小于batch_size也会加载,True则不加载
)
print(imgs.shape)
表示打印批次中图像张量的形状,例如(4, 3, 32, 32),表示有4张图像,每张图像有3个颜色通道,大小为32x32像素
运行结果:
在机器学习中,这样的张量通常用来表示分类任务中的标签。例如,在 CIFAR-10 数据集中,每个图像都有一个与之对应的标签,表示图像中物体的类别。CIFAR-10 数据集包含10个类别,每个类别用一个数字(0到9)来表示。
在这个例子中,tensor([3, 3, 7, 1]) 可能表示一个包含4张图像的批次,每张图像的标签分别是:
第一张图像的标签是 3
第二张图像的标签也是 3
第三张图像的标签是 7
第四张图像的标签是 1
三、使用DataLoader展示图片方法
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
#准备的测试数据集
test_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data,batch_size=64,shuffle=True,num_workers=0,drop_last=False)
#测试数据集中第一张图片及target
img, target = test_data[0]
print(img.shape)
print(target)
writer = SummaryWriter("dataloader")
# 初始化一个变量step,用于记录当前的步骤或批次编号
step = 0
# 使用add_images方法将当前批次的图像写入TensorBoard日志
# "test_data"是图像在TensorBoard中的标签,imgs是要记录的图像张量,step是当前的步骤编号
for data in test_loader:
imgs, targets = data
writer.add_images("test_data", imgs, step)
# 每次迭代后,步骤编号增加1
step = step + 1
writer.close()
运行结果:
四、去除结尾不满足batch_size设值图片的展示
将drop_last 设置为True,就可以去除末尾不满足batch_size设值的照片
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
#准备的测试数据集
test_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor())
test_loader = DataLoader(dataset=test_data, batch_size=64,shuffle=True,num_workers=0,drop_last=True)
#测试数据集中第一张图片及target
img, target = test_data[0]
print(img.shape)
print(target)
writer = SummaryWriter("dataloader")
# 初始化一个变量step,用于记录当前的步骤或批次编号
step = 0
# 使用add_images方法将当前批次的图像写入TensorBoard日志
# "test_data"是图像在TensorBoard中的标签,imgs是要记录的图像张量,step是当前的步骤编号
for data in test_loader:
imgs, targets = data
writer.add_images("test_data_drop_last", imgs, step)
# 每次迭代后,步骤编号增加1
step = step + 1
writer.close()
运行结果:
如下面的照片,刚好满足batch_size设值。