09 Softmax 回归 + 损失函数 + 图片分类数据集-P3

练习Fashion-MNIST 数据集

和书上(Hands-on Machine Learning with Scikit-Learning)Chpater3的理论知识一样,可结合一起看,但是书上Chapter3的MNIST数据集根本不能导入

import torch
import torchvision
from torch.utils import data
from torchvision import transforms
from d2l import  torch as d2l
from sklearn.datasets import fetch_openml
import matplotlib as mpl
import matplotlib.pyplot as plt
import os

d2l.use_svg_display()

由于最开始没有导入d2l.use_svg_display(),导致后面的Timer函数无法使用,报错

1.通过框架中的内置函数将FASHION-MNIST数据下载并读取到内存中

通过to tensor 把图像数据从pil类型变换成32位float ,再除以255,使得所有图像像素的数值都在 0到1 之间

trans = transforms.ToTensor() #把图片转成pytorch的tensor(最简单的预处理)
mnist_train = torchvision.datasets.FashionMNIST(root= '../data',train =True,transform=trans, download=True ) #从dataset里拿到train data,拿到的是pytorch的的tensor
mnist_test = torchvision.datasets.FashionMNIST(root='../data',train=False,transform=trans,download=True) #测试数据是用来模型好坏的数据集,不参与训练,train=False

print('Test data len:',len(mnist_test))
print('Train data len:',len(mnist_train))

打印的结果:

Test data len: 10000
Train data len: 60000
Fashion-MNIST由10个类别的图像组成, 每个类别由训练数据集(train dataset)中的6000张图像 和测试数据集(test dataset)中的1000张图像组成。
因此,训练集和测试集分别包含60000和10000张图像。 测试数据集不会用于训练,只用于评估模型性能。d

打印第一张图片:

print(mnist_train[0][0].shape) 
#torch.Size([1, 28, 28]),黑白图片,rgb的channel=1,图片的长和宽都是28
#打印第一张图片,即便minist_train[0][0]

2.定义可视化数据集的函数(这一步和上一次做人工数据集一样)

def get_fashion_mnist_labels(labels): #返回FASHION-MNIST数据集的文本标签
    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
                   'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
    #数据集里有10个类别
    return [text_labels[int(i)]for i in labels]

3.我们现在可以创建一个函数来可视化这些样本。

def show_images(imgs,num_rows,num_cols,titles=None,scale=1.5):
    #用matplotlip来画图
    figsize = (num_cols * scale,num_rows * scale)
    _,axes = d2l.plt.subplots(num_rows,num_cols,figsize=figsize)
    axes = axes.flatten()
    for i, (ax,img) in enumerate(zip(axes,imgs)):
        if torch.is_tensor(img):
            ax.imshow(img.numpy())
            #图片张量tensor
        else:
            #PIL图片
            ax.imshow(img)
        ax.axes.get_xaxis().set_visible(False)
        ax.axes.get_yaxis().set_visible(False)
        if titles:
            ax.set_title(titles[i])
    return axes

#以下是训练数据集中前几个样本的图像及其相应的标签。
X,y = next(iter(data.DataLoader(mnist_train,batch_size = 18)))

plt_img = show_images(X.reshape(18, 28, 28), 2, 9, titles=get_fashion_mnist_labels(y))
plt.show()

构造了pytorch的数据集以后,放进一个dataloader里,指定一个batch size,就会拿到一个大小为固定数字的,一个批量数据
用iter函数构造一个interate以后,用next获得第一个小批量,记为X和y
虽然数据发生了变化,但是和之前人工数据的练习本质一样
因为channel不用了,把X Reshape成一个number of examples,宽和高不变,还是28
在画图的时候画2行,每一行9张图片,每个图片的标号就是之前的label
之前图片显示不出因为没有plt.show()这一行代码,matplt画图函数不会用
https://zhuanlan.zhihu.com/p/109245779
#读取一小批量数据,大小为batch size
batch_size = 256


def get_dataloader_workers():
    #定义了一个小函数,小函数返回的值是4,4是读取数据的进程数,自己选择大小
    return 4


timer = d2l.Timer()
#用来测试速度的函数
for X,y in train_iter_py: #访问所有的batch
    continue
print(f'{timer.stop():2f} sec')
练习,使用不同的进程数,来看这个时间的变化
batch_size =256, return = 5, 2.793629 sec
batch_size =256, return = 55,12.512462 sec
*因为cpu的关系,Our suggested max number of worker in current system is 12
batch_size =256, return = 1,5.642448 sec

你可能感兴趣的:(李沐机器学习,分类,回归,机器学习)