一、DataLoader的使用
Dataloader就是从Dataset中去取数据,每次取多少就看自己设置的参数。
dataset没有默认值;batch_size的值为每次加载的数据为多少;shuffle的值为前后世代的加载数据是否一样,需不需要“洗牌”;num_workers的值为多个进程加载,默认为0,就是在一个主程序中进行加载,但有时在windows下会有问题。如果报错BrokenPipeError时,就可以考虑将num_worker设置为0;drop_last,如果batch size不能整除的话,当值设置为True时就舍去最后一个batch,如果为False时就不舍去。
示范:
import torchvision
from torch.utils.data import DataLoader
# 只取他的测试集
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)
结果:
torch.Size([3, 32, 32])
3
运行如下代码:
import torchvision
from torch.utils.data import DataLoader
# 只取他的测试集
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)
# 取出dataloader中的一个返回
for data in test_loader:
imgs, targets = data
print(imgs.shape)
print(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=64, shuffle=True, num_workers=0, drop_last=False)
# 测试数据集中第一张图片及target
img, target = test_data[0]
print(img.shape)
print(target)
# 取出dataloader中的一个返回
writer = SummaryWriter("dataloader")
step = 0
for data in test_loader:
imgs, targets = data
# print(imgs.shape)
# print(targets)
writer.add_images("test_data", imgs, step)
step = step + 1
writer.close()
再打开tensorboard,结果如下:
最后一个step的图片不是8x8的了,因为我的drop_last设置为False了,保留了最后一个不被整除的batch,接下来再对它设置为True,并把shufle设置为False
结果如下:
可以看出,它只有155个step了,最后一个八列两行的batch省去了,并且前后两个世代的每个step加载的图片一样。将shuffle的值改为Ture就会不一样了。