.. raw:: html
.. raw:: html
.. raw:: html
.. _sec_fashion_mnist:
Bộ dữ liệu Phân loại Ảnh (Fashion-MNIST)
========================================
.. raw:: html
Ở :numref:`sec_naive_bayes`, chúng ta đã huấn luyện bộ phân loại Naive
Bayes, sử dụng bộ dữ liệu MNIST được giới thiệu vào năm 1998
:cite:`LeCun.Bottou.Bengio.ea.1998`. Mặc dù MNIST từng là một bộ dữ
liệu tốt để đánh giá xếp hạng (*benchmark*), các mô hình đơn giản theo
tiêu chuẩn ngày nay cũng có thể đạt được độ chính xác phân loại lên tới
95%. Điều này khiến nó không phù hợp cho việc phân biệt độ mạnh yếu của
các mô hình. Ngày nay, MNIST được dùng trong các phép kiểm tra sơ bộ hơn
là dùng để đánh giá xếp hạng. Để cải thiện vấn đề này, chúng ta sẽ tập
trung thảo luận trong các mục tiếp theo về một bộ dữ liệu tương tự nhưng
phức tạp hơn, đó là bộ dữ liệu Fashion-MNIST
:cite:`Xiao.Rasul.Vollgraf.2017` được giới thiệu vào năm 2017.
.. code:: python
%matplotlib inline
from d2l import mxnet as d2l
from mxnet import gluon
import sys
d2l.use_svg_display()
.. raw:: html
Tải về Bộ dữ liệu
-----------------
.. raw:: html
Cũng giống như với MNIST, Gluon giúp việc tải và nạp bộ dữ liệu
FashionMNIST vào bộ nhớ trở nên dễ dàng với lớp ``FashionMNIST`` trong
``gluon.data.vision``. Các cơ chế của việc nạp và khám phá bộ dữ liệu sẽ
được hướng dẫn ngắn gọn bên dưới. Vui lòng tham khảo
:numref:`sec_naive_bayes` để biết thêm chi tiết về việc nạp dữ liệu.
.. code:: python
mnist_train = gluon.data.vision.FashionMNIST(train=True)
mnist_test = gluon.data.vision.FashionMNIST(train=False)
.. raw:: html
FashionMNIST chứa các hình ảnh thuộc 10 lớp, mỗi lớp có 6000 ảnh trong
tập huấn luyện và 1000 ảnh trong tập kiểm tra. Do đó, tập huấn luyện và
tập kiểm tra sẽ chứa tổng cộng lần lượt 60000 và 10000 ảnh.
.. code:: python
len(mnist_train), len(mnist_test)
.. parsed-literal::
:class: output
(60000, 10000)
.. raw:: html
Các ảnh trong Fashion-MNIST tương ứng với các lớp: áo phông, quần dài,
áo thun, váy, áo khoác, dép, áo sơ-mi, giày thể thao, túi và giày cao
gót. Hàm dưới đây giúp chuyển đổi các nhãn giá trị số thành tên của từng
lớp.
.. code:: python
# Saved in the d2l package for later use
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]
.. raw:: html
Chúng ta có thể tạo một hàm để minh hoạ các mẫu này.
.. code:: python
# Saved in the d2l package for later use
def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):
"""Plot a list of images."""
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)):
ax.imshow(img.asnumpy())
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
if titles:
ax.set_title(titles[i])
return axes
.. raw:: html
Dưới đây là các hình ảnh và nhãn tương ứng của chúng (ở dạng chữ) từ một
vài mẫu đầu tiên trong tập huấn luyện.
.. code:: python
X, y = mnist_train[:18]
show_images(X.squeeze(axis=-1), 2, 9, titles=get_fashion_mnist_labels(y));
.. figure:: output_fashion-mnist_vn_b0ad82_11_0.svg
.. raw:: html
.. raw:: html
.. raw:: html
Đọc một Minibatch
-----------------
.. raw:: html
Để đọc dữ liệu từ tập huấn luyện và tập kiểm tra một cách dễ dàng hơn,
chúng ta sử dụng một ``DataLoader`` có sẵn thay vì tạo từ đầu như đã làm
ở :numref:`sec_linear_scratch`. Nhắc lại là ở mỗi vòng lặp, một
``DataLoader`` sẽ đọc một minibatch của tập dữ liệu với kích thước
``batch_size``.
.. raw:: html
Trong quá trình huấn luyện, việc đọc dữ liệu có thể gây ra hiện tượng
nghẽn cổ chai hiệu năng đáng kể, trừ khi mô hình đơn giản hoặc máy tính
rất nhanh. Một tính năng tiện dụng của ``DataLoader`` là khả năng sử
dụng đa tiến trình (*multiple processes*) để tăng tốc việc đọc dữ liệu.
Ví dụ, chúng ta có thể dùng 4 tiến trình để đọc dữ liệu (thông qua
``num_workers``). Vì tính năng này hiện tại không được hỗ trợ trên
Windows, đoạn mã lập trình dưới đây sẽ kiểm tra nền tảng hệ điều hành để
đảm bảo rằng chúng ta không làm phiền những người dùng Windows với các
thông báo lỗi sau này.
.. code:: python
# Saved in the d2l package for later use
def get_dataloader_workers(num_workers=4):
# 0 means no additional process is used to speed up the reading of data.
if sys.platform.startswith('win'):
return 0
else:
return num_workers
.. raw:: html
Dưới đây, chúng ta chuyển đổi dữ liệu hình ảnh từ uint8 sang số thực dấu
phẩy động (*floating point number*) 32 bit với lớp ``ToTensor``. Ngoài
ra, bộ chuyển đổi sẽ chia tất cả các số cho 255 để các điểm ảnh có giá
trị từ 0 đến 1. Lớp ``ToTensor`` cũng chuyển kênh hình ảnh từ chiều cuối
cùng sang chiều thứ nhất để tạo điều kiện cho các tính toán của mạng
nơ-ron tích chập được giới thiệu sau này. Thông qua hàm
``transform_first`` của tập dữ liệu, chúng ta có thể áp dụng phép biến
đổi ``ToTensor`` cho phần tử đầu tiên của mỗi ví dụ (một ví dụ chứa hai
phần tử là ảnh và nhãn).
.. code:: python
batch_size = 256
transformer = gluon.data.vision.transforms.ToTensor()
train_iter = gluon.data.DataLoader(mnist_train.transform_first(transformer),
batch_size, shuffle=True,
num_workers=get_dataloader_workers())
.. raw:: html
Hãy cùng xem thời gian cần thiết để hoàn tất việc đọc dữ liệu huấn
luyện.
.. code:: python
timer = d2l.Timer()
for X, y in train_iter:
continue
'%.2f sec' % timer.stop()
.. parsed-literal::
:class: output
'5.45 sec'
.. raw:: html
.. raw:: html
.. raw:: html
.. raw:: html
.. raw:: html
Kết hợp Tất cả lại với nhau
---------------------------
.. raw:: html
Bây giờ, chúng ta sẽ định nghĩa hàm ``load_data_fashion_mnist`` để nạp
và đọc bộ dữ liệu Fashion-MNIST. Hàm này sẽ trả về các iterator cho dữ
liệu của cả tập huấn luyện và tập kiểm định. Thêm nữa, nó chấp nhận một
tham số tùy chọn để thay đổi kích thước hình ảnh đầu vào.
.. code:: python
# Saved in the d2l package for later use
def load_data_fashion_mnist(batch_size, resize=None):
"""Download the Fashion-MNIST dataset and then load into memory."""
dataset = gluon.data.vision
trans = [dataset.transforms.Resize(resize)] if resize else []
trans.append(dataset.transforms.ToTensor())
trans = dataset.transforms.Compose(trans)
mnist_train = dataset.FashionMNIST(train=True).transform_first(trans)
mnist_test = dataset.FashionMNIST(train=False).transform_first(trans)
return (gluon.data.DataLoader(mnist_train, batch_size, shuffle=True,
num_workers=get_dataloader_workers()),
gluon.data.DataLoader(mnist_test, batch_size, shuffle=False,
num_workers=get_dataloader_workers()))
.. raw:: html
Dưới đây, chúng ta xác nhận rằng kích thước hình ảnh đã được thay đổi.
.. code:: python
train_iter, test_iter = load_data_fashion_mnist(32, (64, 64))
for X, y in train_iter:
print(X.shape)
break
.. parsed-literal::
:class: output
(32, 1, 64, 64)
.. raw:: html
Giờ chúng ta đã sẵn sàng để làm việc với bộ dữ liệu FashionMNIST trong
các mục tiếp theo.
.. raw:: html
.. raw:: html
.. raw:: html
Tóm tắt
-------
.. raw:: html
- Fashion-MNIST là một tập dữ liệu phân loại trang phục bao gồm các
hình ảnh đại diện cho 10 lớp.
- Chúng ta sẽ sử dụng tập dữ liệu này trong các mục và chương tiếp theo
để đánh giá các thuật toán phân loại khác nhau.
- Chúng ta lưu trữ kích thước của mỗi hình ảnh với chiều cao :math:`h`
chiều rộng :math:`w` điểm ảnh dưới dạng :math:`h \times w` hoặc
``(h, w)``.
- Iterator cho dữ liệu là nhân tố chính để đạt được hiệu suất cao. Hãy
sử dụng các iterator được lập trình tốt để tận dụng khả năng chạy đa
tiến trình, tránh làm chậm vòng lặp huấn luyện.
.. raw:: html
Bài tập
-------
.. raw:: html
1. Việc giảm ``batch_size`` (ví dụ xuống 1) có ảnh hưởng tới tốc độ đọc
dữ liệu hay không?
2. Với người dùng không sử dụng Windows, hãy thử thay đổi
``num_workers`` để xem nó ảnh hưởng đến hiệu năng đọc dữ liệu như thế
nào. Vẽ đồ thị hiệu năng tương ứng với số tiến trình được sử dụng.
3. Sử dụng tài liệu MXNet để xem các bộ dữ liệu có sẵn khác trong
``mxnet.gluon.data.vision``.
4. Sử dụng tài liệu MXNet để xem những phép biến đổi nào có sẵn trong
``mxnet.gluon.data.vision.transforms``.
.. raw:: html
.. raw:: html
.. raw:: html
Thảo luận
---------
- `Tiếng Anh `__
- `Tiếng Việt `__
Những người thực hiện
---------------------
Bản dịch trong trang này được thực hiện bởi:
- Đoàn Võ Duy Thanh
- Nguyễn Lê Quang Nhật
- Vũ Hữu Tiệp
- Lê Khắc Hồng Phúc
- Phạm Hồng Vinh
- Phạm Minh Đức