torchvision menyediakan dataset klasik yang dapat dimuat dengan satu pemanggilan kelas. Topik ini menjalankan MNIST hingga menghasilkan keluaran nyata, lalu menyinggung CIFAR-10 secara konseptual sebagai dataset bawaan lain yang polanya sama. Konstruksi Dataset dan DataLoader yang sudah dikenal dapat langsung diuji dengan data nyata tanpa menyiapkan file data apa pun.
torchvision.datasets dan lokasi cache#
Modul torchvision.datasets menyediakan kelas untuk dataset citra yang umum digunakan, antara lain MNIST, FashionMNIST, dan CIFAR10. Setiap kelas mengunduh datanya pada pemanggilan pertama, menyimpannya ke dalam cache, dan membaca cache itu pada pemanggilan berikutnya. Parameter root menentukan letak folder cache: dengan root='./data', MNIST menempatkan file mentahnya di ./data/MNIST/raw/. Parameter download=True memerintahkan pengunduhan bila data belum ada, sedangkan download=False melempar error bila cache kosong. Pemanggilan dengan data yang sudah lengkap berjalan senyap, tanpa keluaran apa pun.
Membaca MNIST#
Kelas datasets.MNIST memuat 60.000 citra tulisan tangan untuk pelatihan dan 10.000 untuk pengujian, masing-masing berupa citra keabuan 28x28 piksel dengan label digit 0 sampai 9. Tanpa parameter transform, satu item berupa citra PIL beserta label bilangan bulat. Dengan transform=transforms.ToTensor(), citra langsung dikonversi menjadi tensor berbentuk , yaitu satu channel keabuan dengan tinggi dan lebar 28. Konstruksi berikut memuat kedua subset sekaligus dari cache.
import torch
from torchvision import datasets, transforms
train = datasets.MNIST(
root="./data",
train=True,
download=True,
transform=transforms.ToTensor(),
)
test = datasets.MNIST(root="./data", train=False, download=True)
print("Jumlah citra train:", len(train))
print("Jumlah citra test :", len(test))
citra, label = train[0]
print("Shape satu citra :", tuple(citra.shape))
print("dtype satu citra :", citra.dtype)
print("Label citra pertama:", label)
print("Distribusi label train:", torch.bincount(train.targets).tolist())Jumlah citra train: 60000
Jumlah citra test : 10000
Shape satu citra : (1, 28, 28)
dtype satu citra : torch.float32
Label citra pertama: 5
Distribusi label train: [5923, 6742, 5958, 6131, 5842, 5421, 5918, 6265, 5851, 5949]Keluaran memperlihatkan pemeriksaan yang rutin dilakukan pada dataset baru: jumlah item, shape satu item, dan labelnya. Baris terakhir menggunakan atribut targets, yaitu tensor label yang disiapkan torchvision untuk dataset bawaannya, kemudian torch.bincount menghitung jumlah citra per kelas tanpa menelusuri item satu per satu. Distribusi yang hampir seimbang seperti ini membuat akurasi menjadi metrik yang cukup adil untuk MNIST.
CIFAR-10#
CIFAR-10 adalah dataset klasifikasi citra yang karakternya berbeda dari MNIST. Dataset ini memuat 50.000 citra latih dan 10.000 citra uji berukuran 32x32 piksel dengan tiga channel warna, sehingga tensor satu citranya berbentuk setelah ToTensor. Labelnya terdiri atas sepuluh kelas, yaitu pesawat, mobil, burung, kucing, rusa, anjing, katak, kuda, kapal, dan truk. Ukurannya kecil sehingga eksperimen berjalan cepat, tetapi kelasnya sulit dibedakan. Dataset ini dengan demikian menjadi tolok ukur yang jujur untuk model klasifikasi citra.
# tidak-dijalankan
# Unduhan CIFAR-10 berukuran sekitar 170 MB dan melebihi batas waktu verifikasi sandbox.
from torchvision import datasets, transforms
transformasi = transforms.ToTensor()
train = datasets.CIFAR10(root="./data", train=True, download=True, transform=transformasi)
test = datasets.CIFAR10(root="./data", train=False, download=True, transform=transformasi)
print("Jumlah citra train:", len(train))
citra, label = train[0]
print("Shape satu citra:", tuple(citra.shape))
print("Label citra pertama:", label)Pola kode CIFAR-10 persis sama dengan MNIST, hanya nama kelas dan isinya yang berbeda. Setelah unduhan selesai, keluarannya berupa jumlah item dan shape satu citra, tanpa kejutan lain. Unduhan hanya perlu dilakukan sekali, karena pemanggilan berikutnya membaca cache di folder root yang sama.
Kesalahan umum#
Cache dianggap kosong karena root berubah. Menjalankan skrip dari folder kerja yang berbeda membuat root='./data' menunjuk folder lain, sehingga torchvision mengunduh ulang seluruh dataset. Perbaikannya dengan menjalankan skrip dari folder yang sama atau menetapkan root ke jalur tetap, misalnya jalur absolut ke folder proyek.
Mengharapkan tensor tanpa memasang transform. Tanpa parameter transform, satu item MNIST berupa citra PIL, sehingga pemanggilan tuple(citra.shape) melempar AttributeError karena citra PIL tidak memiliki atribut shape. Perbaikannya dengan memasang transform=transforms.ToTensor() pada konstruktor dataset, sebagaimana contoh di atas.
download=False pada cache yang kosong. Pemanggilan semacam itu melempar error bahwa dataset tidak ditemukan, dan pemula sering menyalahkan kode yang sebenarnya benar. Perbaikannya dengan menggunakan download=True pada pemanggilan pertama, atau memastikan folder cache memang sudah terisi sebelum menggunakan download=False.
Ringkasan#
torchvision.datasetsmenyediakan kelas dataset siap unduh. Parameterrootmenentukan folder cache, sedangkandownload=Truehanya mengunduh bila data belum ada.- MNIST berisi 60.000 citra latih dan 10.000 citra uji keabuan 28x28. Dengan
ToTensor, satu item berbentuk beserta label digit. - CIFAR-10 memuat 50.000 citra latih berwarna 32x32 dengan sepuluh kelas dan pola penggunaan yang sama dengan MNIST.
- Atribut
targetsmemuat seluruh label sebagai satu tensor, sehingga distribusi kelas dapat dihitung cepat dengantorch.bincount.
Referensi#
- torch.utils.data — PyTorch Docs
— dokumentasi
Datasetbawaan dan kontrak yang digunakan torchvision. - Learn the Basics — PyTorch Tutorials — seri tutorial dasar resmi yang memuat bagian dataset dan transformasi torchvision.