一、PyTorch的torchvision内置数据集介绍
我们前面的文章里谈到的数据集是我们自己找的一些自定义数据集。那么在Pytorch中存在2种数据集(Dataset),即内置数据集(Built-in dataset)和自定义数据集(Custom dataset)。该2种数据集在使用时有所区别,我们之前课程里学习的就是自定义数据集,这里就不多讲了。
而pytorch的内置数据集(Built-in dataset)是由pytorch的torchvision这个库提供的,我们可以直接在代码中下载下来使用,包含了各种各样的机器训练所需要的数据集类型
1、首先去官网了解一下
官方文档在这:torchvision — Torchvision 0.19 documentation
这是最新的pytorch官方文档,可能每一年都会变,目前2024年最新版的就是这样
往下滑,找到这里【Dataset】的【Built-in dataset】,这个就是内置数据集的官方文档
然后就能看到各种各样的数据集,看不懂可以下载一下网页翻译的插件,或者用微信的截图,可以实时翻译任何界面的英文
然后大概整体介绍一下我们常用的一些数据集:
- MNIST:手写数字图像数据集,用于图像分类任务。
- CIFAR:包含10个类别、60000张32x32的彩色图像数据集,用于图像分类任务。
- COCO:通用物体检测、分割、关键点检测数据集,包含超过330k个图像和2.5M个目标实例的大规模数据集。
- ImageNet:包含超过1400万张图像,用于图像分类和物体检测等任务。
- Penn-Fudan Database for Pedestrian Detection and Segmentation:用于行人检测和分割任务的数据集。
- STL-10:包含100k张96x96的彩色图像数据集,用于图像分类任务。
- Cityscapes:包含5000张精细注释的城市街道场景图像,用于语义分割任务。
- SQUAD:用于机器阅读理解任务的数据集。
其他的比较复杂以后再说,目前就这些可以了解一下,比如点进去CIFAR10可以看到,是一个对图片物品的识别
点击MNIST,这是来自各个人的手写文字的图片数据集
2、了解数据集的三大分类:训练集、验证集、测试集
数据集具体分为三大类:训练集、验证集、测试集
我们可以用以前读书时的上课知识、课后练习题、期末考试来比喻这三类数据集:
假设我们有已知的T1、T2、T3三个点,对应的 “坐标” 是数据集里【带有标签的样本对】:(x1, y1)、(x2, y2)、(x3, y3),x代表输入、y代表标签
这两个坐标会分别得到两个点T1、T2数据,当我们用这两个数据进行机器训练时就会得到一个函数式(假设):y = ax + b,那么这个【y = ax + b】就是【模型】
然后我们当我们把T3的【x3】输入,根据【模型】:【y = ax + b】得出 【】,这个 【】是机器模型训练得到的结果,而我们已知的T3坐标是【x3,y3】(就比如说 [0013035.jpg] 这个图片对应的是 [蚂蚁] 这个标签)
那么现在将【】与【y3】进行对比,就可以得出这个模型的好坏。
然后我们刚刚知道,(x1, y1)、(x2, y2)参与了模型训练,因此就是【训练集】;而(x3, y3)没有参与训练,只是在最后对(x1, y1)、(x2, y2)训练出来的模型进行测试,他就是【测试集】
【训练集】与【测试集】有严格划分,训练集只参与训练,相当于我们做的课后练习、模拟试卷,而测试集只参与测试,相当于高考试卷,你总不能把高考题直接给学生做了再参加高考吧?
那么【验证集】又是什么?
我们前面的例子里,训练机器模型的时候,我们根据T1、T2获得了【y=ax+b】这么个模型式子,那么a、b就是【参数】
在实际机器训练中,我们还需要一种参数叫【超参数】,它考虑得是更加精细的方面的可能,通过调整这些超参数,才能让模型更加精确、误差更小
但是随着业务越来越复杂,需要调整的超参数越来越多、越来越难,人为调整已经不太适用
那么就产生了【验证集】,借助它可以获得【最优超参数组合】
【训练集】产生模型,【验证集】评估模型并找出一组最有超参数,然后再交给【训练集】产出新的模型......如此反复,最终将最优化的模型交给【测试集】测试
3、pytorch下载并使用数据集
回到代码 ,现在我们先用【CIFAR-10】这个数据集为例子讲解,点开官方文档,这次点左边不要点右边
然后可以看到,【CIFAR-10】这个数据集需要传入这么几个参数,具体作用我写在图片了
执行一下代码进行下载:
import torchvision
# 这里我们设置train_set是训练集数据、test_set是测试集数据
# 然后因为我根目录已经有一个"dataset"目录放自定义数据集了,我就指定在根目录再创一个文件夹叫“dataset2”,用来放下载的内置数据集
# 然后【训练集】的train参数设置为true,【测试集】就是false,最后允许下载
train_set = torchvision.datasets.CIFAR10("./dataset2", train=True, download=True)
test_set = torchvision.datasets.CIFAR10("./dataset2", train=False, download=True)
(网速因人而异吧,我这个巨特么慢)
那么有迅雷或者百度网盘的超级会员的可以试一下去迅雷或者百度网盘下载,然后复制粘贴进项目里就行了,没有的话其实也是一样,可以安心下载完挂后台去干别的了,至少一小时起步
感谢,来自该博主文章:CIFAR-10 / CIFAR-100数据集(官网/网盘下载)_cifar100pytorch下载-CSDN博客
链接:百度网盘 请输入提取码
提取码:uwis
N万年之后......终于下载安装完毕,那么而我们在下载的代码下面输出一下数据集看看就会发现成功了,这里注意,即使我们下载完了数据集,这两句代码还是要留着,download参数也不用换成False,因为它会自动检测已经下载存在,就不会重复下载了
import torchvision
# 这里我们设置train_set是训练集数据、test_set是测试集数据
# 然后因为我根目录已经有一个"dataset"目录放自定义数据集了,我就指定在根目录再创一个文件夹叫“dataset2”,用来放下载的内置数据集
# 然后【训练集】的train参数设置为true,【测试集】就是false,最后允许下载
train_set = torchvision.datasets.CIFAR10("./dataset2", train=True, download=True)
test_set = torchvision.datasets.CIFAR10("./dataset2", train=False, download=True)
# 打印训练集和测试集的数据量
print(train_set[0])
然后在PyTorch的内置数据集中,无论是CIFAR-10、MNIST还是其他数据集,当你索引数据集对象时,都会返回一个元组,其中第一个元素是【数据】,第二个元素是【标签的索引】。
那么我们知道python可以多个变量同时接收多个返回值,那么就可以设两个变量来接收【数据】和【标签的索引】,变量名随便起,比如:
那么我们将代码放到【python控制台】运行的话,就会看到数据集有这么个属性:【classes】,这个属性是列表list,而我们刚刚获取到的【标签的索引】就是对应【classes】列表里的索引,那么【数据集.classes[ 标签的索引 ]】就可以获取到【标签】了
4、结合transforms,把数据集转化成transforms的tensor型数据
transform有个函数叫【Compose】,它可以将多个操作组合起来,相当于打包,然后形成一个操作流程,一次性依次对图像进行所有操作
例如,假设你有一个图像,你想要先将其转换为灰度图像,然后再将其大小调整为32x32。你可以使用【torchvision.transforms.Compose】
来组合这两个转换操作:
from torchvision import transforms
# 创建两个转换操作
to_grayscale = transforms.Grayscale(num_output_channels=1) # 调灰度的操作
resize = transforms.Resize((32, 32)) # 裁剪图像大小的操作
# 组合这两个转换操作,现在就能用它代表这两个操作了
transform = transforms.Compose([to_grayscale, resize])
# 使用组合的转换操作对图像一次性进行两个操作转换
image = transform(image)
那么有了【transform转换操作】之后,翻看上面我们讲过,pytorch的【CIFAR-10】接收的参数里有一个叫【transform=?】,就是用来接收【transform转换操作】的,在两个 “下载代码” 那里的第三个参数位置加上【transform = transform转换操作】
train_set = torchvision.datasets.CIFAR10("./dataset2", train=True, transform=dataset_transfrom, download=True)
test_set = torchvision.datasets.CIFAR10("./dataset2", train=False, transform=dataset_transfrom, download=True)
5、最后结合tensorboard打印一下图像
既然现在图像数据集已经成了tensor类型数据,那就可以用tensorboard打印一下图像了
完整代码:
import torchvision
from torch.utils.tensorboard import SummaryWriter
# torchvision.transforms.Compose是一个函数,它可以将多个图像转换操作组合在一起
dataset_transfrom = torchvision.transforms.Compose([
torchvision.transforms.ToTensor() # 将图像转换为【tensor(张量)】操作
# 还可以添加一些裁剪、转灰度......等等图像操作
])
# 这里我们设置train_set是训练集数据、test_set是测试集数据
# 然后因为我根目录已经有一个"dataset"目录放自定义数据集了,我就指定在根目录再创一个文件夹叫“dataset2”,用来放下载的内置数据集
# 然后【训练集】的train参数设置为true,【测试集】就是false,并开启transform数据转换,最后允许下载
train_set = torchvision.datasets.CIFAR10("./dataset2", train=True, transform=dataset_transfrom, download=True)
test_set = torchvision.datasets.CIFAR10("./dataset2", train=False, transform=dataset_transfrom, download=True)
# 输出一些tensor类型的数据集数据
print(train_set[0])
# 最后利用tensorboard打印出照片
write = SummaryWriter("CIFAR-10")
for i in range(10):
# 遍历10张图片
img, target = train_set[i]
write.add_image("【CIFAR-10】_img", img, i)
write.close()
记得关闭上一个tensorboard的终端