Membuat Dataset untuk Training Deep Learning – Mempersiapkan dataset untuk training deep learning merupakan langkah awal dalam proses pelatihan seperti menyusun direktori untuk menyimpan data. Sebenarnya dataset bawaan dari pytorch ada banyak biasanya sudah dalam bentuk kode untuk download dan tinggal pakai saja. Namun demikian kita juga harus membuat dataset tersendiri untuk melakukan uji coba. Ada banyak teknik yang digunakan seperti menggunakan seperator untuk membuat annotasi file.
Manajemen Dataset Pytorch
Kemudahan dalam menggunakan Pytorch yaitu manajemen dataset yang jelas. Secara umum kalian bisa membuat dataset dalam 2 cara yaitu
- Memanfaatkan class Dataset untuk membungkus data
- Langsung menggunakan Image Folder
Setelah object Dataset terbentuk, kalian langsung bisa memasukan kedalam class Data Loader yang didalamnya bisa kita setting ukuran batch, shuffle dataset, termasuk loading kedalam GPU.
Menggunakan Class Dataset
Class Dataset pada Pytorch adalah kelas yang membungkus sebuah dataset yang dibaca, mungkin kalian masih bingung cara menggunakan class tersebut, sesuai dokumentasi dari https://pytorch.org/tutorials/beginner/basics/data_tutorial.html yaitu ada 3 method yang wajib kalian deklarasikan dalam diberikan kode yaitu
- __init__()
- __len__()
- __getitem__()
Sebelum jauh membahas hal tersebut, kita buat dulu sebuah dataset dengan susunan direktori sebagai berikut
train/
├── cat/
│ ├── cat1.png
│ └── cat2.png
├── dog/
│ └── dog1.png
│ └── dog2.png
│ └── dog3.png
dataset diatas bisa kalian peroleh di https://www.kaggle.com/c/dogs-vs-cats/data nanti kalian pisahkan saja sendiri dalam folder diatas. Langkah awalnya yang paling gampang yaitu kita buat file *.csv untuk membaca lokasi file. Nanti kita buat tabel dengan 2 kolom yaitu
- file
- label diisi dengan cat=0, dan dog = 1
Kode dibawah ini digunakan untuk membaca file dalam folder dan menyimpannya dalam bentuk CSV yang disimpan dengan nama train_csv.csv
import pandas as pd import glob cat = glob.glob('train/cat/*.*') dog = glob.glob('train/cat/*.*') dataset_list = list() for c in cat: dataset_list.append({'file':c,'label':0}) for d in dog: dataset_list.append({'file':d,'label':1}) train_df = pd.DataFrame(dataset_list) train_df.to_csv (r'train_csv.csv', index = False, header=True)
nanti isinya sebagai berikut
file,label
train/cat\cat.0.jpg,0
train/cat\cat.1.jpg,0
train/cat\cat.2.jpg,0
train/cat\cat.3.jpg,0
train/cat\cat.4.jpg,0
train/cat\cat.0.jpg,1
train/cat\cat.1.jpg,1
train/cat\cat.2.jpg,1
train/cat\cat.3.jpg,1
train/cat\cat.4.jpg,1
Langkah selanjutnya yaitu membuat Transform untuk menyeragmkan ukuran size gambar diatas, yuk kita buat. Arti kode dibawah ini yaitu nanti pada saat proses baca gambar akan dibuat resize 224 x 224 kemudian lakukan normalisasi datanya
from torchvision import datasets, transforms as T transform= T.Compose([ T.Resize(size=(224,224)), T.ToTensor(), T.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]), ])
sekarang kita buat class untuk extend class Dataset, saya berikan nama DatasetKu. Oiya bila kalian masing bingung tentang konsep class OPP di Python, bisa baca buku yang saya terbitkan Buku Belajar Mudah Python dengan Package Open Source
from torch.utils.data import Dataset from PIL import Image import torch class DatasetKu(Dataset): def __init__(self,file_csv, transform=None): self.file = pd.read_csv(file_csv) self.transform = transform def __len__(self): return len(self.file) def __getitem__(self, index): img = Image.open(self.file['file'][index]).convert("RGB") label = self.file['label'][index] #dibuat tensor y_label = torch.tensor(float(label)) #dibuat tensor dan penerapan transform if self.transform is not None: img = self.transform(img) return (img, y_label)
Saya yakin kalian paham cara baca diatas! Yuk kita buat DataLoader serta instance class diatas
train_dataset = DatasetKu('train_csv.csv',transform = transform) batch_size = 1 train_loader = torch.utils.data.DataLoader(train_dataset,batch_size,shuffle=False)
Yup train_loader siap digunakan untuk pelatihan pada deep learning, bila kurang yakin kita coba iterasi saja
a,b = next(iter(train_loader))
a.shape
Out[57]: torch.Size([1, 3, 224, 224])
b.shape
Out[58]: torch.Size([1])
pada kode diatas artinya a berupa tensor dengan dimensi [1,3,224,224]. Tentu untuk menampilkan gambar kalian wajib mengubah tensor menjadi numpy
from matplotlib import pyplot as plt import numpy as np def imshow(img): img = img / 2 + 0.5 # unnormalize npimg = img.numpy() plt.imshow(np.transpose(npimg, (1, 2, 0))) plt.show()
Sedangkan untuk menampilkan gambar yaitu
a,b = next(iter(train_loader)) #tampilkan gambar imshow(a[0,:,:,:])
Menggunakan Image Folder
Selain Membuat Dataset untuk Training Deep Learning seperti diatas kalian bisa menggunakan cara tercepat tanpa ribet! karena pembuatan label dibuat otomatis oleh Pytorch.
import torch train_path = 'train' train_file = datasets.ImageFolder(train_path,transform=transform) batch_size = 1 train_loader = torch.utils.data.DataLoader(train_file,batch_size,shuffle=False)
Berikut label yang dibuat otomatis oleh pytorch
train_file.classes
Out[77]: [‘cat’, ‘dog’]
train_file.class_to_idx
Out[78]: {‘cat’: 0, ‘dog’: 1}
Sangat mudah bukan? nggak pakai ribet Cara lain Membuat Dataset untuk Training Deep Learning yang simple. Biasanya cara ini digunakan bila datanya sudah rapi, kalau cara yang pertama bila datanya harus dilakukan operasi tingkat lanjut seperti operasi pre proccesing berupa operasi morfologi atau hal lainnya