首先导入包,
%matplotlib inline
from mxnet.gluon import data as gdata
from matplotlib import pyplot as plt
import sys
import time
然后用Gluon的data
包来下载这个数据集。第一次调用时会自动从网上获取数据。
mnist_train = gdata.vision.FashionMNIST(train=True)
mnist_test = gdata.vision.FashionMNIST(train=False)
打印出正在下载的信息,
下载完成后,在相应的文件夹下有四个文件,
看一下训练集和测试集的数量,
len(mnist_train),len(mnist_test)
输出,
看一下样本图像的shape和dtype以及样本的label的shape和type,
feature, label = mnist_train[0]
feature.shape, feature.dtype
输出,
label, type(label), label.dtype
输出,
Fashion-MNIST中一共包括了10个类别,分别为t-shirt(T恤)、trouser(裤子)、pullover(套衫)、dress(连衣裙)、coat(外套)、sandal(凉鞋)、shirt(衬衫)、sneaker(运动鞋)、bag(包)和ankle boot(短靴)。下面将数值标签转成相应的文本标签。
def get_fashion_mnist_labels(labels):
text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat', 'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
return [text_labels[int(i)] for i in labels]
下面定义一个可以在一行显示多幅图像的函数,
def show_fashion_mnist(images, labels):
use_svg_display()
_, figs = plt.subplots(1, len(images), figsize=(12, 12))
for f, img, lbl in zip(figs, images, labels):
f.imshow(img.reshape((28, 28)).asnumpy())
f.set_title(lbl)
f.axes.get_xaxis().set_visible(False)
f.axes.get_yaxis().set_visible(False)
其中函数use_svg_display()的定义请参考链接:【MXNet】(九):NDArray实现一个简单的线性回归模型。
下面可视化一下训练数据集中前9个样本的图像内容和文本标签。
X, y = mnist_train[0:9]
show_fashion_mnist(X, get_fashion_mnist_labels(y))
还是采取每次读取一个batch数据的方式,这里用Gluon data模块中的DataLoader,每次读取一个样本数为batch_size
的小批量数据。同时DataLoader还允许使用多进程来加速数据读取。
另外,通过ToTensor
实例将图像数据从uint8格式变换成32位浮点数格式,并除以255使得所有像素的数值均在0到1之间。同时,ToTensor
实例还将图像通道从最后一维移到最前一维。通过数据集的transform_first
函数,将ToTensor
的变换应用在每个数据样本(图像和标签)的第一个元素,即图像之上。
batch_size =256
transformer = gdata.vision.transforms.ToTensor()
if sys.platform.startswith('win'):
num_workers = 0
else:
num_workers = 4
train_iter = gdata.DataLoader(mnist_train.transform_first(transformer), batch_size, shuffle=True, num_workers=num_workers)
test_iter = gdata.DataLoader(mnist_test.transform_first(transformer), batch_size, shuffle=False, num_workers=num_workers)
下面测试一下读取一遍训练数据要花多少时间,
start = time.time()
for X, y in train_iter:
continue
print('%.2f sec' % (time.time() - start))
输出,
这篇文章只是记录了读取数据的过程,训练的过程将在下篇文章的讲述。