不同于MNIST手写数据集,Fashion-MNIST数据集包含了10个类别的图像,分别是:t-shirt(T恤),trouser(牛仔裤),pullover(套衫),dress(裙子),coat(外套),sandal(凉鞋),shirt(衬衫),sneaker(运动鞋),bag(包),ankle boot(短靴)。
这里通过mxnet中gluon的data包来下载这个数据集,第一次调用时将自动从网上下载获取数据。默认的保存位置为:C:\Users\Username\.mxnet\datasets\fashion-mnist\
目录(Linux系统估计也在主目录下的类似目录中),共包含四个文件,分别为:
train-images-idx3-ubyte
train-labels-idx1-ubyte
t10k-images-idx3-ubyte
t10k-labels-idx1-ubyte
因为是国外的网站,没有代理的话下载速度很慢,所以可以通过手动下载并并将其移动至上述目录:
train
指定获取训练数据集还是测试数据集。
from mxnet.gluon import data as gdata
# 通过gluon的data包下载数据集
mnist_train = gdata.vision.FashionMNIST(train=True)
mnist_test = gdata.vision.FashionMNIST(train=False)
查阅mxnet的官方文档,可以看到vision
中预定义了以下几种数据集:
训练数据集每个类别含有6000个样本,测试数据集每个类别含有1000个样本,一共有10个类别,故而训练数据集共60000个样本,测试数据集共10000个样本。
图像是一个28*28
的像素数组,每个像素的值为0~255之间的8位无符号整数(uint8),使用三维NDArray存储,最后一维表示通道个数。由于为灰度图像,故通道数为1。
# 10个类别,训练集和测试集每个类别分别6000样本和1000样本
print(len(mnist_train), len(mnist_test))
# 数据集形状
feature, lable = mnist_train[0]
print(feature.shape, feature.dtype)
print(lable, lable.dtype)
首先定义一个函数,根据数值标签获取字符串标签:
# 将数据集的数值标签转换为文本标签, 参数是一个list
def get_fasion_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]
定义函数,在一行中绘制数据代表的可视化结果:
import gluonbook as gb
import pylab
# 同一行画出图片和标签
def show_fashion_mnist(images, labels):
gb.use_svg_display()
# _表示忽略不使用的变量
_, figs = gb.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_xaxis().set_visible(False)
pylab.show() # PyCharm 2018中绘图
# 画图示例
X, y = mnist_train[0:9]
show_fashion_mnist(X, get_fasion_mnist_labels(y))
使用gluon中的DataLoader来读取数据,它可以允许使用多进程来加速数据的读取(windows暂时不支持)。下面通过num_workers
设置读取数据的进程数。
ToTensor
类将图像数据从uint8转换为32位浮点数格式,并且除以255使得所有的像素值分布于[0,1]。ToTensor
类还将图像通道从最后一维移到最前面一维上来,这将方便在卷积神经网络中进行计算。通过数据集的transform_first
函数,我们将ToTensor
的变换应用在每个数据样本(图像和标签)的第一个元素,即图像之上。
import sys
import time
# 读取小批量数据
batch_size = 256
transformer = gdata.vision.transforms.ToTensor()
if sys.platform.startswith('win'):
# 0表示不使用额外的进程读取数据
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))
我电脑上的数据读取时间:
改变batch_size
的值,看看数据的读取性能会有何影响?
# coding=utf-8
# author: BebDong
# 2018/12/18
from mxnet.gluon import data as gdata
import gluonbook as gb
import pylab
import sys
import time
# 将数据集的数值标签转换为文本标签
def get_fasion_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):
gb.use_svg_display()
# _表示忽略不使用的变量
_, figs = gb.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_xaxis().set_visible(False)
pylab.show()
# 通过gluon的data包下载数据集
mnist_train = gdata.vision.FashionMNIST(train=True)
mnist_test = gdata.vision.FashionMNIST(train=False)
# 10个类别,训练集和测试集每个类别分别6000样本和1000样本
print(len(mnist_train), len(mnist_test))
# 数据集形状
feature, lable = mnist_train[0]
print(feature.shape, feature.dtype)
print(lable, lable.dtype)
print(get_fasion_mnist_labels([lable]))
# 画图示例
X, y = mnist_train[0:9]
# show_fashion_mnist(X, get_fasion_mnist_labels(y))
# 读取小批量数据
batch_size = 256
transformer = gdata.vision.transforms.ToTensor()
if sys.platform.startswith('win'):
# 0表示不使用额外的进程读取数据
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))
本文为《动手学深度学习》的学习笔记,原书链接:http://zh.diveintodeeplearning.org/chapter_deep-learning-basics/fashion-mnist.html
代码中的gluonbook
包是这本书籍封装的工具包,它把书中描述的将来会复用的所有方法进行了封装。如果您并未按照书中给出的配置文件搭建环境,那可以点击这里单独下载gluonbook包,并将其移动至恰当的位置。