前提
文章目录
【PyTorch】深度学习PyTorch环境配置及安装【详细清晰】
【PyTorch】深度学习PyTorch加载数据
【PyTorch】关于Tensorboard的简单使用
【PyTorch】关于Transforms的简单使用
文章目录
- ``前提``文章目录
- 数据集简介
- 程序中下载数据集
- 读取数据集
- 结合transform进行读取数据集
- dataloader
- batch_size的参数测试
- drop_last的参数测试
- shuffle的参数测试
数据集简介
pytorch官网:https://pytorch.org/
cifar数据集网址:https://pytorch.org/vision/0.9/datasets.html#cifar
程序中下载数据集
使用CIFAR10数据集 按ctrl+p可以提示括号内需要输入什么参数
root:希望数据集存放在什么位置;
train 默认为true,为true表示该数据集为训练集 为false表示该数据集为测试集;
download: 为true就是让它进行一个下载
import torchvision
# 训练数据集
train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, download=True)
# 测试数据集
test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, download=True)
运行程序,可以看到如下图,说明已经开始下载了
下载速度慢的解决办法:
直接点击蓝色的下载链接进行下载或者将蓝色的下载链接放在迅雷里面进行下载
coco数据集大概30多个G,这个CIFAR数据集才一百多兆,比较时候练手
下载完毕!
读取数据集
import torchvision
# 训练数据集
train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, download=True)
# 测试数据集
test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, download=True)
# 查看数据集
print(test_set[0]) # (<PIL.Image.Image image mode=RGB size=32x32 at 0x27E68307FA0>, 3) # 图片组成部分 第一个是图片 第二个是target
print(test_set.classes) # ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
img, target = test_set[0]
print(img) # <PIL.Image.Image image mode=RGB size=32x32 at 0x27E21B660E0>
print(target) # 3 实际上对应的就是test_set.classes的第4个也就是cat,因为它是从0开始算的,说明这张图片对应的是猫
print(test_set.classes[target]) # cat
# 展示图片 PIL的Image可以直接show
img.show()
数据集的图片比较小,只有32x32的像素
展示图片结果:
结合transform进行读取数据集
import torchvision
# PIL图片类型需要转为tensor类型
from torch.utils.tensorboard import SummaryWriter
dataset_transform = torchvision.transforms.Compose([
torchvision.transforms.ToTensor()
])
# 训练数据集
train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, transform=dataset_transform, download=True)
# 测试数据集
test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=dataset_transform, download=True)
# # 查看数据集
# print(test_set[0]) # (<PIL.Image.Image image mode=RGB size=32x32 at 0x27E68307FA0>, 3) # 图片组成部分 第一个是图片 第二个是target
# print(test_set.classes) # ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
#
# img, target = test_set[0]
# print(img) # <PIL.Image.Image image mode=RGB size=32x32 at 0x27E21B660E0>
# print(target) # 3 实际上对应的就是test_set.classes的第4个也就是cat,因为它是从0开始算的,说明这张图片对应的是猫
# print(test_set.classes[target]) # cat
# # 展示图片
# img.show()
# print(test_set[0]) # tensor类型的 表明可以用tensorboard进行显示
writer = SummaryWriter("p10")
for i in range(10):
img, target = test_set[i]
writer.add_image("test_set", img, i)
writer.close()
运行程序后,打开终端,用tensorboard进行读取
dataloader
dataset:是一堆数据集,不知道里面每一张数据的内容
dataloader:将数据集加载到神经网络当中,做的是每次去dataset去取数据,每次取多少,怎么取,是由dataloader当中的参数设置的
dataloader官网:https://pytorch.org/docs/1.8.1/data.html?highlight=dataloader#torch.utils.data.DataLoader
常见参数设置
- batch_size:每次取数据取的数量
- shuffle:打乱数据,为true打乱顺序和原来
不一样
,false打乱顺序和原来一样
- num_workers:多进程进行加载 默认为0,表示用主进程进行加载 ,有时候在Windows会有一些问题,num_workers>0,有时候在Windows下会出现一些错误
- drop_last:对于取整数据集剩余除不尽的数据集的个数是采用舍去还是不舍去,为true舍去,false不舍去
示例测试:
batch_size的参数测试
import torchvision.datasets
from torch.utils.data import DataLoader
# 准备测试数据集
from torch.utils.tensorboard import SummaryWriter
test_data = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor())
# batch_size=4每次从数据集中取4张进行打包
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) # torch.Size([3, 32, 32])
print(target) # 3
writer = SummaryWriter("dataloader")
step = 0
for data in test_loader:
imgs, targets = data
# print(imgs.shape) # torch.Size([4, 3, 32, 32]) 4张图片 3通道 32x32的图片
# print(targets) # tensor([9, 6, 5, 7]) ; 9, 6, 5, 7这些数字是随机抓取的target
writer.add_images("test_data", imgs, step) #注意这里是add_images有一个s的
step += 1
writer.close()
drop_last的参数测试
修改代码
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)
writer.add_images("test_data_drop_last", imgs, step)
shuffle的参数测试
shuffle为False测试:
第一次取的顺序和第二次取的顺序不打乱
,是取得顺序是一样的
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=False, num_workers=0, drop_last=True)
for epoch in range(2): # epoch 取值0、1 shuffle=False两轮摸一样的。不打乱
step = 0
for data in test_loader:
imgs, targets = data
writer.add_images("Epoch:{}".format(epoch), imgs, step)
step += 1
shuffle为True测试:
第一次取的顺序和第二次取的顺序会进行一个打乱
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)
全部代码:
import torchvision.datasets
from torch.utils.data import DataLoader
# 准备测试数据集
from torch.utils.tensorboard import SummaryWriter
test_data = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor())
# batch_size=4每次从数据集中取4张进行打包
#test_loader = DataLoader(dataset=test_data, batch_size=4, shuffle=True, num_workers=0, drop_last=False)
# test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=True)
# test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=False, num_workers=0, drop_last=True)
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) # torch.Size([3, 32, 32])
print(target) # 3
writer = SummaryWriter("dataloader")
for epoch in range(2): # epoch 取值0、1 shuffle=False两轮摸一样的。不打乱
step = 0
for data in test_loader:
imgs, targets = data
# print(imgs.shape) # torch.Size([4, 3, 32, 32]) 4张图片 3通道 32x32的图片
# print(targets) # tensor([9, 6, 5, 7]) ; 9, 6, 5, 7这些数字是随机抓取的target
# writer.add_images("test_data", imgs, step)
# writer.add_images("test_data_drop_last", imgs, step)
writer.add_images("Epoch:{}".format(epoch), imgs, step)
step += 1
writer.close()