Pytorch Membuat Dataset untuk Training Deep Learning

By | November 27, 2022
Print Friendly, PDF & Email
2,263 Views

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

  1. Memanfaatkan class Dataset untuk membungkus data
  2. 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

See also  Linear Regression dengan Konsep Gradient Descent

Leave a Reply