前言

Dataset只是去告诉我们程序,我们的数据集在什么位置,数据集第一个数据给它一个索引0,它对应的是哪一个数据。

Dataloader就是把数据加载到神经网络当中,Dataloader所做的事就是每次从Dataset中取数据,至于怎么取,是由Dataloader中的参数决定的。

Dataloader使用

调用DataLoader包

from torch.utils.data import DataLoader

准备测试集数据

test_data = torchvision.datasets.CIFAR10("./dataset_transfrom",train=False,transform=torchvision.transforms.ToTensor())

设置Dataloader操作

test_loader = DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=0,drop_last=False)

batch_size=4 使得 img0, target0 = dataset[0]、img1, target1 = dataset[1]、img2, target2 = dataset[2]、img3, target3 = dataset[3],然后这四个数据作为Dataloader的一个返回      

查看测试集中第一张图片及其target

img, target = test_data[0]
print(img.shape)
print(target)

输出结果

可以看出测试集第一张图片为3通道,且大小为32*32

用for循环取出DataLoader打包好的四个数据

for data in test_loader:
    img, targets = data         
    print(img.shape)
    print(targets)

输出结果

每个data都是由4张图片组成,img.size 为 [4,3,32,32],四张32×32图片三通道,targets由四个标签组成  

完整代码如下

from torch.utils.data import DataLoader
import torchvision

test_data = torchvision.datasets.CIFAR10("./dataset_transform",train=False,transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=0,drop_last=False)

img, target = test_data[0]
print(img.shape)
print(target)

在Tensorboard中展示

每取一次数据为一个step

step = 0
for data in test_loader:
    img,target = data
    writer.add_images("test_data",img,step)
    step = step + 1

batch_size=4的效果

当把drop_last设为Ture时,最后一个step若不足一个batch_size,会直接舍去

完整代码

from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import torchvision

test_data = torchvision.datasets.CIFAR10("./dataset_transform",train=False,transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=0,drop_last=False)

writer = SummaryWriter("dataLoader")
step = 0
for data in test_loader:
    img,target = data
    writer.add_images("test_data",img,step)
    step = step + 1

writer.close()

Dataloader多轮次

设置两轮epoch

for epoch in range(2):

对不同Epoch命名

writer.add_images("Epoch:{}".format(epoch),img,step)

先设置shuffle=False的情况,即每轮epoch不洗牌

可以看出不同epoch中相同step的图片不变

再设置shuffle=True的情况,即每轮epoch洗牌

可以看出不同epoch中相同step的图片发生变化,在实际训练中通常设置shuffle=True

完整代码

from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import torchvision

test_data = torchvision.datasets.CIFAR10("./dataset_transform",train=False,transform=torchvision.transforms.ToTensor())

test_loader = DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=0,drop_last=False)

writer = SummaryWriter("dataLoader")
for epoch in range(2):
    step = 0
    for data in test_loader:
        img,target = data
        writer.add_images("Epoch:{}".format(epoch),img,step)
        step = step + 1

writer.close()

更多推荐