【深度学习】数据准备

深度学习的数据准备

完成一个深度学习的项目需要的四个步骤:

  1. Prepare the data(准备数据)
  2. Build the model(建立模型)
  3. Train the model(训练模型)
  4. Analyze the model’s results(分析模型的结果)

准备数据

准备数据将遵循ETL过程

  1. extract(提取)
  2. transform(转换)
  3. load(加载)

我们从数据源提取数据,再将数据转换为理想的格式,然后将数据加载到一个合适的结构中进行查询和分析,需要引入的包如下:

import torch
import torchvision
import torchvision.transforms as transforms
  1. torch是顶级的pytorch包和张量库
  2. torchvision是一个提供对流行的数据集、模型架构和计算机视觉的图像转换的访问的包
  3. torchvision.transforms 接口使我们能够访问图像处理的通用转换

torchvision包让我们可以接触以下资源:

  1. Datasets(like MNIST and Fashion-MNIST)
  2. Models
  3. Transforms
  4. Utils

在准备数据时,最终的目标是遵循ETL过程:

  1. Extract - 从源获取Fashion MNIST数据
  2. Transform - 将图像数据转换成一个pytorch张量
  3. Load - 将数据放入一个使其易于访问的对象中

在完成上述内容时,pytorch为我们提供了两个类:

  1. Dataset(数据集)
  2. DataLoader(数据加载器)

Dataset类是表示数据集的抽象类,数据加载器封装数据集并提供对底层数据的访问。

由于需要使用数据集,所以我们需要一个继承了Dataset类的新类(非必须)来实现其中的抽象方法:

import torch
import torchvision
import torchvision.transforms as transforms
import torch.utils.data as data
import pandas as pd
import numpy as np

class OHLC(data.Dataset):
    def __init__(self, csv_file):
        self.data = pd.read_csv(csv_file)
        
    def __getitem__(self, index):
        r = self.data.iloc[index]
        label = torch.tensor(r.is_up_day, dtype=torch.long)
        sample = self.normailze(torch.tensor([r.open, r.high, r.low, r.close]))
        return sample, label
    
    def __len__(self):
        return len(self.data)

以torchvision为基础的Fashion-MNIST数据集类继承了Dataset类并实现了其中的抽象方法。因此,在实际操作中,我们通常使用Fashion-MNIST数据集类即可

什么是MNIST

MNIST数据集是经修改的国家标准与技术研究所数据库,是一个著名的手写数字数据集,通常用于机器学习的图像处理系统的培训。NIST代表国家标准与技术研究所。

MNIST中的M代表modified,这是因为有一个原始的NIST数字数据集被修改为MNIST。

在这里插入图片描述

MNIST因数据集的使用频率而闻名,其主要有两个原因:

  1. 初学者使用它是因为它很容易
  2. 研究人员用它来衡量(比较)不同的模型。

该数据集由70000张手写数字图像组成,图像分割如下:

  • 60000张训练图像
  • 10000张测试图像

这些图片最初是由美国人口普查局员工和美国高中生创作的。

什么是Fashion-MNIST

Fashion MNIST顾名思义就是一个时装项目的数据集。具体而言,数据集包含以下十类时尚项目:

在这里插入图片描述

数据集的示例如下所示:

在这里插入图片描述

MNIST与Fashion-MNIST的关系

Fashion-MNIST数据集名称中包含MNIST的原因是创建者试图用Fashion-MNIST替换MNIST。MNIST已经得到了广泛的应用,图像识别技术也有了很大的改进,以至于人们认为数据集过于简单。这就是创建Fashion MNIST数据集的原因。Fashion-MNIST的存在是为了让向PyTorch这样的框架可以通过改变获取数据的URL来添加Fashion-NMIST数据集,可以说PyTorch的Fashion-MNIST只是扩展了MNIST数据集并覆盖了其URL。

代码演示

(1)提取和转换数据

import torch
import torchvision
import torchvision.transforms as transforms

train_set = torchvision.datasets.FashionMNIST(
    root='./data/FashionMNIST'                  # 提取
    ,train=True
    ,download=True
    ,transform=transforms.Compose([             # 转换
        transforms.ToTensor()
    ])
)

其中,第一个参数root是路径,这是数据所在磁盘的位置,第二个参数train设置为true,表明将数据用作训练集,第三个参数download设置为true,表明如果数据没有出现在指定的文件路径,则进行下载,最后一个参数transform,这里传递了一个转换组合,这些转换应该在数据集元素上执行,因为我们想把图像转换成张量,所以,我们用内置的ToTensor变换。

(2)在数据加载器对象中封装数据

train_loader = torch.utils.data.DataLoader(
    train_set, batch_size=10                    # 加载
)

其中,batch_size指定批处理大小。

(3)访问训练集中的数据

import matplotlib.pyplot as plt
sample = next(iter(train_set))
image, label = sample
print(image.shape)
plt.imshow(image.squeeze(), cmap='gray')

显示结果:

torch.Size([1, 28, 28])

在这里插入图片描述

如果在jupyter notebook中使用plt.imshow函数,出现内核挂掉(内存不足),导致图片无法显示,可加入如下代码:

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

上面是处理单个数据的情况,接下来是利用数据加载器,处理批量数据:

batch = next(iter(train_loader))
print(len(batch))
print(type(batch))
images, labels =batch
print(images.shape)
print(labels.shape)

显示结果:

2
<class 'list'>
torch.Size([10, 1, 28, 28])
torch.Size([10])

接着,可以使用torchvision.utils.make_grid函数一次性画出整批图像:

grid = torchvision.utils.make_grid(images, nrow=10)   # nrow指定显示在每行的图片数(这个根据batch的大小来设置)

plt.figure(figsize=(15,15))
plt.imshow(np.transpose(grid, (1,2,0)))

print('labels:',labels)

显示结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zzy_NIC/article/details/119578204