练习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