Convolutional Neural Network (CNN) menggunakan PyTorch

Artikel ini akan langsung berfokus pada implementasi Convolutional Neural Network (CNN) menggunakan PyTorch. Bagi yang ingin memperdalam teori dibalik CNN terlebih dahulu bisa baca pada link artikel sebelumnya yang berisi kumpulan sumber belajar CNN dan jika ingin memperdalam PyTorch, juga bisa baca artikel sebelumnya tentang PyTorch.

Dataset

Kita akan menggunakan Convolutional Neural Network untuk mengklasifikasi citra barang-barang yang ada di sebuah toko (Freiburg Groceries Dataset). Dataset dan code bisa didownload di repository berikut.

Dataset yang digunakan jumlahnya akan lebih sedikit dari dataset asli agar mempercepat proses pelatihan. Dataset pada repo yang kita gunakan hanya terdiri dari 5 kelas, yakni citra produk Susu (MILK), Air mineral (WATER), soda (SODA), jus (JUICE), dan cuka (VINEGAR), dengan sekitar 900-an gambar untuk pelatihan dan 120 gambar untuk pengujian. Semua citra berukuran sama, yakni 256×256 pixel.

Convolutional Neural Network Data
salah satu citra dengan kelas “MILK”

Kita akan menggunakan dataset yang ada pada folder “train” untuk pelatihan dan yang ada pada folder “test” untuk pengujian. Pada tutorial ini kita masih belum menggunakan teknik validasi seperti menggunakan data validasi atau cross-validation.

Pengolahan Dataset di PyTorch

Untuk pengolahan citra ada dua package dari python yang bisa kita gunakan, yakni torchvision.datasets dan torchvision.transforms

Datasets dan Transforms

Kita gunakan datasets untuk memudahkan proses pembacaan data. Dengan struktur folder seperti yang ada di repo (terkelompok untuk setiap kelas) maka dengan datasets kita bisa menyimpan data beserta label dengan mudah. Sedangkan transforms kita gunakan untuk pengolahan awal dataset.

Pada contoh di atas, saya baca dataset pada folder train dan test menggunakan datasets.ImageFolder() lalu masing-masingnya kita beri pengolahan yang telah saya definisikan. Misalnya pada data train, pengolahan yang saya lakukan menggunakan train_transform:

  1. crop citra menjadi ukuran 150×150
  2. lalu secara random beberapa data saya rotasi 5 derajat
  3. beberapa data juga secara random saya cerminkan secara horizontal
  4. saya ubah citra menjadi tensor 3D (3 x 150 x 150)
  5. saya normalisasi masing-masing channel sehingga rata-rata dan standar deviasinya bernilai 0.5

Setelah terbaca menggunakan datasets maka citra-citra kita akan ter-sebagai objek torch.datasets yang mirip dengan list of tuple. Setiap tuple bagian pertama adalah tensor citra, dan bagian kedua adalah label citra tersebut.

Objek datasets tersebut, kita ubah bentuknya menjadi DataLoader untuk memudahkan proses batch.

Implementasi Convolutional Neural Network

Ada 3 bagian utama dalam implementasi CNN menggunakan PyTorch:

  1. Class Model / Arsitektur CNN
  2. Alur pelatihan
  3. Alur pengujian

Arsitektur CNN

Kita akan menggunakan model CNN dengan dua convolutional layer dan sebuah fully connected layer. Dengan detail parameter setiap layer sebagai berikut:

Conv1
K = 4
S = 1
P = 0
FM = 16
ReLU
Pool1
Max
K = 3
S = 2
P = 0
Conv2
K = 3
S = 1
P = 0
FM = 32
ReLU
Pool2
Max
K = 3
S = 2
P = 0
Fully
Connected
N = 512
ReLU
Dropout
Output
N = 5

K = kernel size, S = stride, P = padding, FM = feature map, N = jumlah neuron, Max = MaxPooling

Pembuatan model pada PyTorch dilakukan dengan menyusun urutan layer dan perhitungan yang akan terjadi. Model yang digunakan biasanya dalam bentuk Class dengan sebuah fungsi forward(x) untuk menghitung proses forward propagation

Sebelum mendefinsikan model beberapa library perlu yang diimport untuk pembentukan model, yakni:

Lalu untuk membuat modelnya kita buat dengan mendefinisikan class berikut:

Angka 39200 pada kode di atas adalah banyak neuron/fitur yang menjadi input FullyConnected layer. Dihitung dengan menggunakan rumus konvolusi berikut empat kali (Conv1 sampai Pool2) pada masing-masing dimensinya:

$$ FiturAkhir =\frac{FiturAwal – K + 2P}{S} + 1 $$

Setelah class tersebut jadi, untuk membuat model kita cukup membuat sebuah objek baru dari class tersebut

Alur Pelatihan

Proses pelatihan dilakukan akan per batch dengan bantuan DataLoader. Kita definisikan terlebih dahulu algoritma dan parameter pelatihan:

Karena kita akan menggunakan GPU, maka jangan lupa juga pindahkan model kita ke GPU dengan cara berikut:

Setelahnya alur pelatihan dilakukan menggunakan kode di bawah. Dapat diperhatikan ada dua iterasi yang terjadi, iterasi pertama untuk banyak epoch sedangkan iterasi kedua menunjukkan proses backpropagation yang dilakukan setiap mini-batch dari data training (trainloaders).

Jika tidak terjadi masalah maka akan tampak nilai rata-rata eror akan terus menurun dan rata-rata akurasi akan terus meningkat. Saya melakukan pelatihan di laptop saya ASUS A455L dengan GPU Nvidia 920m, lama pelatihan untuk 20 iterasi tidak sampai setengah jam.

Alur Pengujian

Setelah model selesai dilatih, maka kita akan uji dengan data test. Data test yang belum kita gunakan ini saya pilih secara acak dari masing-masing kelas dan tidak ada di data train.

Proses pengujian tidak beda banyak dengan pelatihan, kita cukup memastikan tidak terjadi backpropagation ataupun update bobot pada saat pengujian. Hal ini dilakukan dengan mengubah status model menjadi eval() dan menghapus bagian backprop.

Jika kode di atas dijalankan akan menampilkan akurasi model kita. Di laptop saya akurasi yang muncul adalah sekitar 70%. Akurasi ini sudah lebih “cerdas” daripada sekadar menebak kelas secara random. Akurasi ini sudah cukup bagus menurut saya mengingat data yang cukup sulit dan model yang sangat simpel.

Apakah akurasi ini masih bisa ditingkatkan? insyaAllah.. silakan coba ganti-ganti arsitektur dan parameter untuk mendapatkan akurasi yang lebih baik (disebut Tuning Parameter). Misalnya dengan mengubah algoritma, jumlah neuron, atau banyak epoch. Beberapa eksperimen harus dilakukan untuk menjadikan akurasi kita benar-benar baik dan valid.

Kita akan coba meningkatkan akurasi model kita dengan beberapa teknik di artikel selanjutnya 🙂

About the author

Rian Adam

View all posts

Leave a Reply