0


从零构建自己的神经网络————数据集篇

一、数据集

如果在此之前,你已经对神经网络的概念有所了解的话,相信你一定明白数据集的重要性。好的数据集决定着你的模型的好坏,不过这并不是我们这篇文章所要讨论的事情。今天我们所要说的是如何导入数据集。
从数据集的来源不同,我们对数据集的导入分为两种:

1.从第三方库中导入

使用PyTorch内置的数据集类(如torchvision.datasets.ImageFolder、torchvision.datasets.CIFAR10等),这些类提供了访问常见数据集的简单方法。
下面是一个加载CIFAR10数据集的示例代码

import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 定义数据预处理
transform = transforms.Compose([transforms.ToTensor(),
     transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])# 加载CIFAR10数据集
trainset = datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
testset = datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)

本着负责认真的态度,作者在这里有必要认真讲解下这段代码的详细含义,不过在这之前我们需要思考一下几个问题,这对学习很重要:
我们导入的数据集是图片数据集,怎么将一张图片用代码表示?

这时可能会有人说用像素值形成一个矩阵
对的,没错确实如此,
不过只有黑白照片才可以用一个像素矩阵表示,我们生活中大多数图片有颜色的,这就需要了解所谓的颜色通道,常见的是RGB三种(当然还有其他的颜色通道),我们以RGB为例:
一张彩色的图片有三个颜色通道-------由三个颜色(red,green,blue)矩阵表示,那很明显一个像素矩阵是表示不了的,所以得用三个矩阵来表示。
然而,当你把图像用三个矩阵表示出来并输入计算机中,计算机怎么知道这是一个彩色的图片而不是三个黑白图呢?

这里们需要引入一个新的数据形式,张量(tensor);跟标量、向量、矩阵这种常见的结构一样,张量也是一种数学中的一种数据形式。
在神经网络中,张量(tensor)是一种常用的数据形式,图像用作张量来存储。
②该如何对数据集进行划分?
因为我们不能拿全部的数据集用来训练,所以需要对数据集进行划分,我们希望在导入数据集中就能自动划分,而无需手动划分。

以下是对上述代码的详细解释:

# 定义数据预处理
transform = transforms.Compose([transforms.ToTensor(),
     transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])#函数介绍
     transforms.Compose 函数,用于将多个变换组合成一个可调用的变换对象。
       预处理常用的变换包括对图像进行缩放、裁剪、旋转、归一化等操作,以便更好地适应训练模型
     #参数列表:
         transforms.ToTensor()表示将图片转换成向量
         transforms.Normalize() 则是将每个通道的像素值减去均值(在这里是 0.5)并除以标准差
         (在这里也是 0.5),以使得每个通道的像素值都在 -1 到 1 之间。

# 加载CIFAR10数据集
trainset = datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)#以下是参数列表
                  root:数据集下载位置
                  train:表示是否为训练集,true表示是训练集,false的话一般是测试集
                  transform:参数指定了如何对数据进行预处理(或变换),此处参数指定了在上方所写的预处理方式
        #至此,我们得到名为trainset的变量,它是一个包含 CIFAR-10 训练集的 torchvision.datasets.CIFAR10 对象,其中包含了处理后的图像数据和对应的标签。

testset = datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)

接下来,我们试着打印下训练集:
打印结果

2.导入本地的数据集

如果已经下载好了,或者自己标注的数据集,我们则需要导入本地数据集

自定义数据集类,这个方法适用于加载自己的数据集。下面是一个示例代码,后面再做详细解释:

import torchvision
LOAD_CIFAR =True
DOWNLOAD_CIFAR =True

train_data = torchvision.datasets.CIFAR10(
    root='./data/',
    train=True,
    transform=torchvision.transforms.ToTensor(),
    download=DOWNLOAD_CIFAR,)

老样子,为了更好理解,我们需要考虑几个问题(不过在这之前我希望您能先自己想想):

①怎么将多个图片(几千,甚至几万张)导入代码中,并存储起来?
我们并不是将图片都读入代码中,我们只是将图片对应的文件地址以及标签对应的名字分别写入图片列表列表和标签列表中。
具体代码在本文不在书写,请参考其他文章。

②图片数据集往往是有标注的,但是图片不能写文字,所以怎么将标注和图片一一对应?
将图片和标注一一对应可以通过两种方式实现:

1.文件名对应法

一种常见的方法是将图片文件名与标注文件名保持一致或者有一定的规律。例如,可以将图片文件命名为1.jpg,2.jpg,3.jpg等,对应的标注文件命名为1.txt,2.txt,3.txt等。这样可以通过文件名的对应关系来将图片和标注一一对应。

2.数据库存储法

另一种方法是将图片和标注数据存储到数据库中。每张图片都有一个唯一的标识符(比如图片的文件名或者数据库中的id),在数据库中与该图片对应的标注数据也被存储在同一行中,这样可以确保图片和标注一一对应

③怎么区分数据集和训练集合?
这里需要用到一个函数

CustomDataset是一个自定义的数据集类,它的构造函数需要两个参数:txt_path和transform。其中,txt_path是包含数据集信息的文本文件的路径,transform是对数据集进行预处理的函数或变换。

train_dataset = CustomDataset(txt_path='./train.txt', transform=transform)
test_dataset = CustomDataset(txt_path='./test.txt', transform=transform)

③怎么使用这些数据集?因为我们不可能一张一张的调用吧,最好想上方代码中一样,交给一个对象管理
开发者自然想到这个问题,为此提供了一个专门的数据类数据**加载器(DataLoader)**,这个类很重要,神经网络训练都是使用这个类,其主要用于将数据集分批加载到内存中,以便在训练过程中更高效地处理数据。
以下是代码实例:

dataloader = DataLoader(dataset, batch_size=3, shuffle=True)#其参数含义如下
            dataset是一个PyTorch的数据集对象,它包含了整个数据集。
               batch_size=3:每个批次中包含3个数据样本。
            shuffle=True:每次获取批次数据时是否对数据集进行随机打乱操作,这样可以增加模型的鲁棒性,
                   防止模型对数据的顺序产生过拟合。
DataLoader是PyTorch中一个用于加载数据的工具类,它能够将数据集中的数据转换成批次的数据,方便机器学习模型的训练。

因此,这段代码的含义是创建一个能够将dataset中的数据分批次加载的数据加载器,每个批次包含3个随机排列的数据样本。


本文转载自: https://blog.csdn.net/weixin_44984007/article/details/129464830
版权归原作者 泪眼问花~ 所有, 如有侵权,请联系我们删除。

“从零构建自己的神经网络————数据集篇”的评论:

还没有评论