Jaringan Saraf Tiruan Sederhana Menggunakan Tensorflow 2.x

Ini adalah artikel “versi lain” dari tulisan sebelumnya di sini. Sebagian besar artikel akan sama, namun pada artikel ini kita akan coba membuat jaringan saraf tiruan sederhana menggunakan Tensorflow 2.x. Tensorflow 2.x atau tensorflow versi 2, merupakan tensorflow versi terbaru yang membawa konsep yang berbeda dengan Tensorflow versi sebelumnya. Bagi yang masih bingung tentang JST dan mau memahami bagaimana JST bekerja bisa buka artikel berikut.

Dataset

Kita akan menggunakan dataset Iris yang sudah cukup populer. Dataset ini berisi data dari 150 Bunga Iris yang berasa dari 3 spesies berbeda. Diberikan 4 buah fitur / ciri, yakni panjang kelopak (sepal length), lebar kelopak (sepal width), panjang mahkota (petal length), dan lebar mahkota (petal width), lalu kita akan mencoba untuk mengklasifikasikan bunga tersebut adalah spesies apa.

iris set

Saya telah memisahkan dataset aslinya menjadi dua file, satu untuk training, dan satu untuk testing. File csv dataset tersebut dapat di download di sini: training set dan test set.

Implementasi Jaringan Saraf Tiruan

Arsitektur

Melihat dataset yang ada, dapat kita simpulkan untuk arsitektur jaringan saraf tiruan kita membutuhkan 4 buah neuron input (fitur) dan 3 buah neuron output (spesies). Kita akan coba menggunakan sebuah hidden layer dengan jumlah neuron hidden layer sebanyak 3. Ilustrasinya tampak sebagai berikut:

Pre-Processing

Pelatihan dilakukan menggunakan data latih iris_train.csv. Ada sebuah tahapan yang perlu dilakukan sebelum memulai tahapan pelatihan. Tahapan ini disebut pre-processing. Ada banyak hal yang bisa dilakukan pada tahapan ini, tetapi pada tutorual ini saya hanya akan melakukan pre-processing berupa mengubah nilai yang masih string menjadi integer.

Contohnya pada kolom species, kita ubah “Iris-setosa” menjadi 0, “Iris-versicolor” menjadi 1, dan “Iris-virginica” menjadi 2. Kita lakukang ini menggunakan Pandas:

Selain itu, untuk memudahkan diubah juga tipe dari penyimpanan data train tersebut. Yang awalnya adalah Dataframe (karena di-load menggunakan pandas) diubah menjadi Numpy array.

Selanjutnya kita pisahkan data tersebut menjadi dua array. Array pertama adalah array fitur, berupa matrix berukuran 120×4 (120 data dengan masing-masing 4 fitur) sedangkan array kedua adalah label, berupa sebuah array 1 dimensi berukuran 120×1 (120 data dengan masing-masing 1 label bernilai antara 0, 1, atau 2)

Selain itu, yang perlu diperhatikan, Tensorflow meminta input label adalah berupa one-hot encoding. Data di atas masih menyimpan label (pada variabel ytrain) dalam bentuk integer. Kita perlu ubah nilai ytrain terlebih dahulu dengan perintah berikut:

Tensorflow 2.x

Sebelum mulai menggunakan Tensorflow, import semua package yang dibutuhkan. Atur juga seed random agar nilai random tetap sama setiap run-nya.

Membuat Model

Setelah data siap, langkah selanjutnya dalam proses pembuatan JST adalah membuat arsitektur/modelnya. Jika menggunakan Tensorflow 2.x langkah ini dilakukan dengan cara membuat sebuah class (mirip dengan PyTorch).

Contoh di bawah adalah sebuah class bernama Net yang merupakan sebuah arsitektur JST dengan 4 neuron pada layer input, 3 neuron pada hidden layer, dan 3 neuron pada layer output.

Pada bagian __init__ kita perlu mendefinisikan layer apa saja yang akan digunakan. Pada kasus ini kita hanya akan menggunakan layer Dense dari Keras (Fully-Connected Layer). Fungsi Dense di sini mewakili sebuah layer. Variabel self.d1 mewakili hidden layer pertama yang berisi 3 neuron, dan variabel self.d2 mewakili layer output. Tensorflow 2.x memungkinkan kita untuk membangun arsitektur tanpa perlu menspesifikasikan ukuran input.Pada kode di atas, tampak juga fungsi aktivasi yang digunakan pada masing-masing layer, yakni ReLU dan Softmax.

Bagian call sama seperti fungsi forward pada PyTorch, di dalamnya menunjukkan bagaimana proses forward propagation terjadi terhadap input data x.

Mendefinisikan Algoritma Optimasi dan Loss Function

Kita tentukan algoritma optimasi apa yang akan kita gunakan pada JST kita. Algoritma optimasi adalah istilah yang digunakan untuk merujuk algoritma yang digunakan untuk memperbaiki eror pada JST. Ada banyak algoritma di Tensorflow yang bisa digunakan. Kali ini, kita akan gunakan Stochastic Gradient Descent (SGD) dengan learning rate sebesar 0.01.

Tentukan juga metode untuk menghitung eror yang akan kita gunakan. Untuk kasus ini kita akan menggunakan metode Cross-Entropy.

Alur Pelatihan

Kita sudah menyiapkan data, membuat model, dan menentukan algoritma-algoritma yang akan kita gunakan. Sekarang saatnya melatih model. Kita latih model dengan data xtrain. Untuk setiap epoch, ada beberapa langkah utama dalam proses pelatihan menggunakan PyTorch:

  1. Inputkan data ke model untuk mendapatkan output model
  2. Hitung eror antara output dengan label
  3. Hitung gradient eror dengan tape.gradient()
  4. Update bobot menggunakan algoritma optimasi

Jika dikodekan maka akan tampak sebagai berikut (dengan contoh menggunakan 50 epoch):

Output yang dihasilkan adalah nilai loss atau eror tiap epoch, seperti di bawah:

Jika diperhatikan proses training kita bisa dibilang berhasil karena setelah 50 epoch nilai loss berhasil turun.

Kita bisa mengecek berapa akurasi model terhadap data train dengan menambahkan kode berikut:

Ketika program ini saya run di Google Colab dengan versi Tensorflow 2.1 diperoleh akurasi pada data train adalah 66.667%

Alur Pengujian

Untuk memastikan seberapa baik model kita, maka kita perlu menguji model kita menggunakan data yang berbeda dengan data latih. Kita lakukan pengujian menggunakan iris_test.csv. Potongan kode berikut sama dengan kode-kode di atas sebelumnya, hanya saja kita menggunakan data tes.

Di komputer saya, hasil akurasi data tes adalah sebesar 60.0%, sedikit lebih kecil dari pada akurasi data train. Hal ini wajar karena model JST hanya melihat data train saat dilatih.

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.

Sekian, semoga bermanfaat, kode lengkap dapat dilihat di sini

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

Leave a Reply