.. _sec_fashion_mnist:
İmge Sınıflandırma Veri Kümesi
==============================
İmge sınıflandırması için yaygın olarak kullanılan veri kümelerinden
biri MNIST veri kümesidir :cite:`LeCun.Bottou.Bengio.ea.1998`. Bir
kıyaslama veri kümesi olarak iyi bir çalışma gerçekleştirmiş olsa da,
günümüz standartlarına göre basit modeller bile %95'in üzerinde
sınıflandırma doğruluğu elde ettiğinden daha güçlü modeller ile daha
zayıf olanları ayırt etmek için uygun değildir. Bugün, MNIST bir
kıyaslama ölçütü olmaktan çok makullük (sanity) kontrolü işlevi görüyor.
Biraz daha ileriye gitmek için, önümüzdeki bölümlerdeki tartışmamızı
niteliksel olarak benzer, ancak nispeten karmaşık olan 2017'de piyasaya
sürülen Fashion-MNIST veri kümesine odaklayacağız
:cite:`Xiao.Rasul.Vollgraf.2017`.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
%matplotlib inline
import sys
from d2l import mxnet as d2l
from mxnet import gluon
d2l.use_svg_display()
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
%matplotlib inline
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
from d2l import torch as d2l
d2l.use_svg_display()
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
%matplotlib inline
import tensorflow as tf
from d2l import tensorflow as d2l
d2l.use_svg_display()
.. raw:: html
.. raw:: html
Veri Kümesini Okuma
-------------------
Fashion-MNIST veri kümesini çerçevemizdeki yerleşik işlevler
aracılığıyla indirebilir ve belleğe okuyabiliriz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
mnist_train = gluon.data.vision.FashionMNIST(train=True)
mnist_test = gluon.data.vision.FashionMNIST(train=False)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
# 'ToTensor', imge verilerini PIL türünden 32 bit kayan virgüllü sayı tensörlerine
# dönüştürür. Tüm sayıları 255'e böler, böylece tüm piksel değerleri 0 ile 1 arasında olur.
trans = transforms.ToTensor()
mnist_train = torchvision.datasets.FashionMNIST(
root="../data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(
root="../data", train=False, transform=trans, download=True)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
mnist_train, mnist_test = tf.keras.datasets.fashion_mnist.load_data()
.. raw:: html
.. raw:: html
Fashion-MNIST, her biri eğitim veri kümesinde 6000 görsel ve test veri
kümesinde 1000 görsel ile temsil edilen 10 kategorideki görsellerden
oluşur. Eğitim için değil, model performansını değerlendirmek için bir
*test veri kümesi* (veya *test kümesi*) kullanılır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
len(mnist_train), len(mnist_test)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(60000, 10000)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
len(mnist_train), len(mnist_test)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(60000, 10000)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
len(mnist_train[0]), len(mnist_test[0])
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(60000, 10000)
.. raw:: html
.. raw:: html
Her girdi imgesinin yüksekliği ve genişliği 28 pikseldir. Veri
kümesinin, kanal sayısı 1 olan gri tonlamalı görsellerden oluştuğuna
dikkat edin. Kısaca, bu kitapta yüksekliği :math:`h` genişliği :math:`w`
piksel olan herhangi bir imgenin şekli :math:`h \times w` veya
(:math:`h`, :math:`w`)'dir.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
mnist_train[0][0].shape
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(28, 28, 1)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
mnist_train[0][0].shape
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
torch.Size([1, 28, 28])
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
mnist_train[0][0].shape
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(28, 28)
.. raw:: html
.. raw:: html
Fashion-MNIST'teki görseller şu kategorilerle ilişkilidir: Tişört,
pantolon, kazak, elbise, ceket, sandalet, gömlek, spor ayakkabı, çanta
ve ayak bileği hizası bot. Aşağıdaki işlev, sayısal etiket indeksleri ve
metindeki adları arasında dönüştürme yapar.
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def get_fashion_mnist_labels(labels): #@save
"""Fashion-MNIST veri kümesi için metin etiketleri döndürün."""
text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
return [text_labels[int(i)] for i in labels]
Şimdi bu örnekleri görselleştirmek için bir işlev oluşturabiliriz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5): #@save
"""Görsellerin bir listesini çizin"""
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
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5): #@save
"""Görsellerin bir listesini çizin"""
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):
# Tensor Image
ax.imshow(img.numpy())
else:
# PIL Image
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
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5): #@save
"""Görsellerin bir listesini çizin"""
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.numpy())
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
.. raw:: html
Eğitim veri kümesindeki ilk birkaç örnek için görseller ve bunlara
karşılık gelen etiketler (metin olarak) aşağıdadır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
X, y = mnist_train[:18]
print(X.shape)
show_images(X.squeeze(axis=-1), 2, 9, titles=get_fashion_mnist_labels(y));
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(18, 28, 28, 1)
.. figure:: output_image-classification-dataset_e45669_65_1.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
X, y = next(iter(data.DataLoader(mnist_train, batch_size=18)))
show_images(X.reshape(18, 28, 28), 2, 9, titles=get_fashion_mnist_labels(y));
.. figure:: output_image-classification-dataset_e45669_68_0.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
X = tf.constant(mnist_train[0][:18])
y = tf.constant(mnist_train[1][:18])
show_images(X, 2, 9, titles=get_fashion_mnist_labels(y));
.. figure:: output_image-classification-dataset_e45669_71_0.svg
.. raw:: html
.. raw:: html
Minigrup Okuma
--------------
Eğitim ve test kümelerinden okurken hayatımızı kolaylaştırmak için
sıfırdan bir tane oluşturmak yerine yerleşik veri yineleyiciyi
kullanıyoruz. Her yinelemede, bir yineleyicinin her seferinde grup
(``batch_size``) boyutundaki bir veri minigrubunu okuduğunu hatırlayın.
Ayrıca eğitim verisi yineleyicisi için örnekleri rastgele
karıştırıyoruz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
batch_size = 256
def get_dataloader_workers(): #@save
"""Windows dışında, verileri okumak için 4 işlem kullanın."""
return 0 if sys.platform.startswith('win') else 4
# 'ToTensor', görsel verilerini uint8'den 32-bit kayan virgüllü sayıya dönüştürür.
# Tüm sayıları 255'e böler, böylece tüm piksel değerleri 0 ile 1 arasında olur.
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
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
batch_size = 256
def get_dataloader_workers(): #@save
"""Verileri okumak için 4 işlem kullanın."""
return 4
train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True,
num_workers=get_dataloader_workers())
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
batch_size = 256
train_iter = tf.data.Dataset.from_tensor_slices(
mnist_train).batch(batch_size).shuffle(len(mnist_train[0]))
.. raw:: html
.. raw:: html
Eğitim verilerini okurken geçen süreye bakalım.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
timer = d2l.Timer()
for X, y in train_iter:
continue
f'{timer.stop():.2f} sec'
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'1.90 sec'
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
timer = d2l.Timer()
for X, y in train_iter:
continue
f'{timer.stop():.2f} sec'
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'2.25 sec'
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
timer = d2l.Timer()
for X, y in train_iter:
continue
f'{timer.stop():.2f} sec'
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'0.29 sec'
.. raw:: html
.. raw:: html
Her Şeyi Bir Araya Getirme
--------------------------
Şimdi Fashion-MNIST veri kümesini alan ve okuyan
``load_data_fashion_mnist`` fonksiyonunu tanımlıyoruz. Hem eğitim kümesi
hem de geçerleme kümesi için veri yineleyicileri döndürür. Ek olarak,
imgeleri başka bir şekle yeniden boyutlandırmak için isteğe bağlı bir
argüman kabul eder.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def load_data_fashion_mnist(batch_size, resize=None): #@save
"""Fashion-MNIST veri kümesini indirin ve ardından belleğe yükleyin."""
dataset = gluon.data.vision
trans = [dataset.transforms.ToTensor()]
if resize:
trans.insert(0, dataset.transforms.Resize(resize))
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
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def load_data_fashion_mnist(batch_size, resize=None): #@save
"""Fashion-MNIST veri kümesini indirin ve ardından belleğe yükleyin."""
trans = [transforms.ToTensor()]
if resize:
trans.insert(0, transforms.Resize(resize))
trans = transforms.Compose(trans)
mnist_train = torchvision.datasets.FashionMNIST(
root="../data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(
root="../data", train=False, transform=trans, download=True)
return (data.DataLoader(mnist_train, batch_size, shuffle=True,
num_workers=get_dataloader_workers()),
data.DataLoader(mnist_test, batch_size, shuffle=False,
num_workers=get_dataloader_workers()))
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def load_data_fashion_mnist(batch_size, resize=None): #@save
"""Fashion-MNIST veri kümesini indirin ve ardından belleğe yükleyin."""
mnist_train, mnist_test = tf.keras.datasets.fashion_mnist.load_data()
# Tüm piksel değerleri 0 ile 1 arasında olacak şekilde tüm sayıları 255'e bölün,
# en sonunda bir grup boyutu ekleyin. Ayrıca etiketi int32'ye çevirin.
process = lambda X, y: (tf.expand_dims(X, axis=3) / 255,
tf.cast(y, dtype='int32'))
resize_fn = lambda X, y: (
tf.image.resize_with_pad(X, resize, resize) if resize else X, y)
return (
tf.data.Dataset.from_tensor_slices(process(*mnist_train)).batch(
batch_size).shuffle(len(mnist_train[0])).map(resize_fn),
tf.data.Dataset.from_tensor_slices(process(*mnist_test)).batch(
batch_size).map(resize_fn))
.. raw:: html
.. raw:: html
Aşağıda, ``resize`` bağımsız değişkenini belirterek
``load_data_fashion_mnist`` işlevinin görseli yeniden boyutlandırma
özelliğini test ediyoruz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
train_iter, test_iter = load_data_fashion_mnist(32, resize=64)
for X, y in train_iter:
print(X.shape, X.dtype, y.shape, y.dtype)
break
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(32, 1, 64, 64) (32,)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
train_iter, test_iter = load_data_fashion_mnist(32, resize=64)
for X, y in train_iter:
print(X.shape, X.dtype, y.shape, y.dtype)
break
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
torch.Size([32, 1, 64, 64]) torch.float32 torch.Size([32]) torch.int64
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
train_iter, test_iter = load_data_fashion_mnist(32, resize=64)
for X, y in train_iter:
print(X.shape, X.dtype, y.shape, y.dtype)
break
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(32, 64, 64, 1) (32,)
.. raw:: html
.. raw:: html
Artık ilerleyen bölümlerde Fashion-MNIST veri kümesiyle çalışmaya
hazırız.
Özet
----
- Fashion-MNIST, 10 kategoriyi temsil eden resimlerden oluşan bir giyim
sınıflandırma veri kümesidir. Bu veri kümesini, çeşitli sınıflandırma
algoritmalarını değerlendirmek için sonraki bölümlerde kullanacağız.
- Yüksekliği :math:`h` genişliği :math:`w` piksel olan herhangi bir
imgenin şeklini :math:`h \times w` veya (:math:`h`, :math:`w`) olarak
saklarız.
- Veri yineleyiciler, verimli performans için önemli bir bileşendir.
Eğitim döngünüzü yavaşlatmaktan kaçınmak için yüksek performanslı
hesaplamalardan yararlanan iyi uygulanmış veri yineleyicilerine
güvenin.
Alıştırmalar
------------
1. ``batch_size`` değerini (örneğin 1'e) düşürmek okuma performansını
etkiler mi?
2. Veri yineleyici performansı önemlidir. Mevcut uygulamanın yeterince
hızlı olduğunu düşünüyor musunuz? İyileştirmek için çeşitli
seçenekleri keşfediniz.
3. Çerçevenin çevrimiçi API belgelerine bakın. Başka hangi veri kümeleri
mevcuttur?
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html