Deep Learning dalam 6 Baris dengan Fastai dan Pytorch

Sebelumnya maaf semisal judulnya agak “heboh” dan terkesan click-bait 😀 tapi di artikel ini beneran saya ingin menunjukkan bahwa deep learning, khususnya image classification dengan CNN sebenarnya dapat dengan mudah dilakukan hanya dengan 6 baris kode berikut menggunakan library Fastai dan Pytorch:

dibuat menggunakan https://carbon.now.sh, versi raw ada di bawah

Artikel ini berfokus pada pengenalan singkat tentang fastai dan juga penjelasan tentang kode di atas. Tutorial lebih detail dan mendalam tentang fastai insyaAllah akan kami coba buat di artikel lain.

Berawal dari Pytorch vs Tensorflow

Sebelum kita masuk lebih dalam tentang Fastai, kita akan me-refresh singkat tentang library atau framework di deep learning. Bagi yang belum tahu, ada dua library besar yang saat ini cukup sering digunakan, yakni Pytorch dan Tensorflow. Pytorch dibuat oleh Facebook sedangkan Tensorflow oleh Google. Keduanya memiliki beragam fitur yang mendukung deep learning, salah satunya Autograd yang pernah saya bahas di artikel ini. Nah, sering kali bagi yang baru belajar deep learning akan bertanya:

Pilih pakai Pytorch atau Tensorflow?

Jawaban salah

Tensorflow itu lebih mudah dipelajari dan digunakan daripada Pytorch. Itu jawaban yang sering saya dengar. Kenapa salah? karena saya yakin kebanyakan orang yang jawab itu dia bukan sedang membandingkan Tensorflow yang murni, melainkan library tambahan yang berada di atas Tensorflow, yakni Keras. Tensorflow yang murni bisa dibilang lumayan ribet juga loh untuk dipelajari dan digunakan (apalagi pas masih versi 1.x di tahun 2019)

Jadi sekilas sejarah, dulu library deep learning itu memang susah-susah pemakaiannya (low-level). Library generasi awal, Theano, bahkan ngodingnya harus “jungkir balik” alur mikirnya. Karenanya, dibutuhkan library lagi di atasnya yang high-level (mudah dipahami dan digunakan) namun tetap terintegrasi dengan library yang low-level, lahirlah salah satunya Keras. Sekarang Keras sudah sangat terintegerasi dengan Tensorflow bahkan tidak perlu di-install terpisah. Tutorial Tensorflow-Keras pernah saya tuliskan di sini.

Jawaban benar
dari salah satu developer utama Pytorch

Saat ini bisa dibilang Pytorch dan Tensorflow (khususnya versi 2) sangat mirip. Keduanya sama-sama smoothly bisa digunakan untuk hampir kebanyakan kebutuhan riset dan sehari-hari. Jadi apapun librarynya silakan pilih saja, dan yang terpenting, kuasai dulu sebelum coba library lain.

Kembali ke Jawaban yang salah di atas, ketika kita membandingkan Keras dengan Pytorch maka bisa dibilang kurang apple-to-apple. Karena Keras pada dasarnya adalah high-level library sedangkan Pytorch adalah low-level library, jadi jelas Keras terlihat lebih mudah pemakaiannya. Nah, di artikel ini saya akan jelaskan salah satu high-level library paling populer untuk Pytorch, yakni Fastai.

Apa itu Fastai

Fast.ai sebenarnya lebih cocok jika dibilang sebagai nama organisasi riset deep learning. Saya pertama kali dengar nama Fast.ai dari course yang mereka sediakan di sini dengan motto khasnya “Making neural nets uncool again“. Btw, course deep learning yang mereka sediakan sangat bagus, detail, mendalam, namun tetap mudah diikuti jadi wajib dicoba baik untuk pemula ataupun yang sudah berpengalaman.

Nah, selain course, fast.ai juga membuat sebuah library fastai yang dibangun di atas Pytorch. Secara ringkas, library fastai memiliki tujuan yang mirip dengan Keras, yakni menyediakan high-level API untuk pembuatan deep learning di atas library / framework yang telah ada (Pytorch dan Tensorflow). Library ini yang saya gunakan di artikel ini. Seperti yang telah saya tunjukkan di atas, dengan fastai kita bisa mengimplementasikan CNN untuk klasifikasi citra hanya dalam 6 baris kode.

Penjelasan Kode

Oke, kita masuk ke kodenya:

from fastai.vision.all import *
trainloader = ImageDataLoaders.from_folder("train/", valid_pct=0.2, item_tfms=Resize(224))
testloader = trainloader.test_dl(get_image_files("test/"), with_labels=True)
learn = cnn_learner(trainloader, resnet18, metrics=error_rate) 
learn.fine_tune(3) 
print(accuracy(*learn.get_preds(dl=testloader)))

Kode di atas adalah kode yang memang minimalis, menggunakan banyak parameter defaultnya, karena saya hanya menunjukkan betapa simpelnya fastai. Tetapi dengan 6 baris kode tersebut akurasi model yang dihasilkan sangatlah baik. Bisa jadi ada beberapa pengaturan atau sintaks yang mungkin perlu ditambahkan nantinya.

Oke pertama-tama kita akan import library-nya:

from fastai.vision.all import *

Di fastai, fungsi-fungsi dikelompokkan tergantung domain apa yang akan dikerjakan. Ada 4 domain utama yang disediakan fastai saat ini, yakni vision, text, tabular, dan colaborative filtering (untuk sistem rekomendasi). Karena kita ingin membuat proyek deep learning untuk citra, kita cukup import semua yang ada di vision.all. Walaupun dikelompokkan untuk pada 4 kasus di atas, fastai juga tetap punya fungsi-fungsi umum yang bisa digunakan di beragam kasus.

trainloader = ImageDataLoaders.from_folder("train/", valid_pct=0.2, item_tfms=Resize(224))
testloader = trainloader.test_dl(get_image_files("test/"), with_labels=True)

Langkah selanjutnya adalah membuat objek DataLoader. Konsep data loader adalah konsep yang umum digunakan di Pytorch. Intinya sebuah objek yang menghandle hampir semua keperluan data, seperti splitting train-validasi, preprocess, pembagian mana fitur mana label, dsb.

Jika format dataset citra kita sudah “standar” dalam folder dengan struktur seperti ini:

train/
  kelas_1/
     citra_103.png
     citra_22.png
     ...
  kelas_2/
     citra_123.png
     citra_324.png
     ...
  ...

Maka kita bisa menggunakan fungsi `ImageDataLoaders.from_folder` untuk secara otomatis me-load data. Perlu dicatat, fastai bisa dibilang hampir mewajibkan untuk penggunaan data validasi, ketika tidak kita sediakan maka fastai yang akan otomatis melakukan split dataset. Pada contoh di atas ada parameter valid_pct=0.2 yang artinya 20% data akan dipilih secara random untuk validation. Sedangkan parameter item_tfms digunakan untuk proses transformasi data. Pada kode diatas, kita beri nilai Resize(224) yang artinya setiap citra akan di-resize ukurannya menjadi 224×224.

Pada baris kedua kita membuat data loader lagi kali ini untuk data test atau data pengujian. Di sini saya meng-“copy” proses yang terjadi pada trainloader tapi untuk kebutuhan test menggunakan fungsi trainloader.test_dl()dan menginfokan untuk menggunakan get_image_files() untuk me-load data citra. Kita juga menggunakan parameter with_labels=True untuk memberi tahu agar testloader menyimpan info label dari data test untuk menghitung akurasi.

Khusus untuk pengguna windows! sampai tulisan ini dibuat, ada bug yang membuat kita perlu menambahkan parameter num_workers=0 di kedua fungsi loader di atas, sehingga akan tampak seperti berikut:

trainloader = ImageDataLoaders.from_folder("train/", valid_pct=0.2, item_tfms=Resize(224), num_workers=0)
testloader = trainloader.test_dl(get_image_files("test/"), with_labels=True, num_workers=0)

Langkah selanjutnya kita akan membuat model CNN kita. Mungkin tepatnya bukan membuat, melainkan kita akan menggunakan pretrained model CNN yang sudah tersedia alias kita akan melakukan transfer learning:

learn = cnn_learner(trainloader, resnet18, metrics=error_rate) 

Pada kode di atas kita membuat objek learner yang menggunakan pretrained model ResNet18 dengan data train dari trainloader. Kita juga menginfokan pada learner untuk menampilkan error_rate di log nantinya.

Setelah itu kita cukup jalankan perintah berikut untuk memulai proses pelatihan dengan fine tuning sebanyak 3 epoch (dalam pengaturan default, tepatnya 1 epoch dalam keadaan freeze, dan 3 epoch dalam keadaan semua layer unfreeze):

learn.fine_tune(3) 

Salah satu yang saya suka dari fastai juga adalah ketika proses training berjalan, progress barnya menarik (baca: info yang ditampilkan lengkap dan cukup untuk jadi log)

Kalau pakai jupyter lebih bagus lagi

Dan dilanjut dengan menampilkan akurasi ke data test menggunakan fungsi get_preds(). Fungsi tersebut akan mengoutputkan dua nilai dalam bentuk tuple, yakni prediksi dan target/label seharusnya. Sedangkan fungsi accuracy juga bawaan dari fastai untuk menampilkan akurasi diketahui nilai prediksi dan target.

print(accuracy(*model.get_preds(dl=testloader)))

Tanda * digunakan untuk “memecah” elemen-elemen tuple untuk menjadi parameter di sebuah fungsi.

Hasilnya?

Saya menggunakan data yang sama pada tutorial CNN menggunakan Pytorch. Hanya dengan 3 epoch dan 6 baris kode akurasi model dari datatest mencapai 89.17%! Padahal di artikel sebelumnya kita hanya dapat di sekitar 70% 😀

Tutorial Lebih Lanjut

Bagi teman-teman yang tertarik dengan fastai, bisa banget untuk langsung lanjut memperdalam library ini. InsyaAllah kami berencana untuk membuat artikel lain yang membahas fastai lebih lanjut, tapi tidak tahu juga kapan akan publish 😀 jadi bisa mulai belajar mandiri dari sumber belajar berikut:

  • Course fastai : saya rekomendasikan tonton 2-3 video dulu agar terbayang gambaran umumnya. Sebagai catatan, course ini tidak hanya membahas teknis tetapi juga banyak sisi teorinya, menarik!
  • Official Tutorial fastai: tapi sejujurnya saya kurang merekomendasikan, dulu belajar dari sini ngerasa agak kesulitan memahami “kenapa-kenapa” nya 🙁
  • Walk With Fastai: dibuat oleh Zach Mueller (bukan official fastai), berisi course-course yang cocok untuk temen-temen yang ingin fokus ke sisi praktiknya. Saya sangat terbantu dengan walk with fastai, sangat melengkapi course dan tutorial resmi dari fastai 😀

Sekian, semoga bermanfaat! jadi mau pakai library apa untuk proyek deep learning selanjutnya?


Cover Photo by Arie Wubben on Unsplash

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

Leave a Reply