Monday, April 08, 2019

Implementasi Deep Learning dengan Keras: Terminologi dasar

Berikut konsep deep learning dengan Keras dalam 30 detik (6 detik per baris membaca):
model = Sequential()
model.add(Dense(XX, input_dim=Y)
model.add(Dense(Z))
model.compile(loss='nama_loss_function', optimizer='nama_optimizer', metrics=['nama_metrik'])
model.fit(training_input, training_ouput, epochs=AA)

Terminologi penting (tak kenal maka tak paham?!):

Model: Tipe model yang digunakan. Ada dua: sekuensial dan functional API.
Contoh:
model = Sequential()

Dense: Menambahkan unit atau node beserta argumennya, dari satu layer ke layer selanjutnya. Dengan kata lain, "fully-connected layer", atau "feed forward network", atau "multi-layer perceptron".


Contoh:

model.add(Dense(32, input_dim=2)
Kode di atas membuat layer dengan jumlah 32 unit dan 16 unit input. Jumlah learnable parameternya adalah 16*32+32 = 544. Check dengan model.summary(). Jika kita tambahkan lagi,
model.add(32) 
Maka sekarang kita mempunyai dua layer yang masing-masing berisi 32 unit. Total learnabale parameternya adalah 544+ (32*32+32) = 1600. Check dengan kode yang telah diberikan di atas.

Compile: Mengkonfigurasi model untuk melatih data yang diberikan
Contoh:
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
Fit: Mencari hubungan input dan output data, dengan kata lain: membangun/melatih model.
Contoh:
model.fit(train_input, train_output, batch_size=16, epochs=500)

Empat terminologi di atas merupakan step dasar untuk melakukan training data dengan deep learning. Namun masing-masing terminologi memiliki argumen. Agar lengkap, berikut penjelasan singkat argumen-argmunen tersebut.

  • input_dim: dimensi input, contoh pada kasus XOR dibawah dimensinya adalah 2 (ukuran input (2 x 4). Selain dengan input_dim, bisa juga kita gunakan input_shape yang menunjukkan matriks input, misal input_shape=(2,4), yakni input dengan 2 dimensi, dimensi pertama berisi 2 node/unit/element, dan dimensi kedua berisi 4 elemen
  • loss: loss function yang digunakan, ada categorical_crossentropy, mse, dll
  • metrics: metrik yang digunakan untuk performansi, mirip dengan loss. Nilainya bisa akurasi('acc' atau 'accuracy), 'mae' (mean absolute error), dll.
  • batch_size: jumlah sampel data yang ditraining per batch dari layer ke layer. Misal dengan batch_size=10, sedangkan 1 data berisi 100 sampel, maka pertama akan diproses sampel ke-1 sampai dengan ke-10, kemudian sampel ke-11 sampai dengan ke 20, dst. Argument ini tidak mempengaruhi hasil dan bisa dihilangkan (pada data kecil).
  • epochs: jumlah epoch atau iterasi yang dilakukan

Implementasi pada XOR

Berikut adalah implemetasi terminologi Keras di atas pada permasalahan XOR.
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
import numpy as np

X = np.array([[1,1],[1,0],[0,1],[0,0]])
y = np.array([[0],[1],[1],[0]])

model = Sequential()
model.add(Dense(8, input_dim=2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.summary()

model.fit(X, y, epoch=500)
print(model.predict_proba(X).round())

Simpan skrip di atas dengan nama `keras_xor.py. Output kode diatas (seharusnya) adalah:
$ python3.6 keras_xor.py
[[0.]
 [1.]
 [1.]
 [0.]]
Sesuai dengan tabel kebenaran untuk XOR, yakni [0 1 1 0].

Jumlah learnable parameter
Pada contoh di atas jumlah learnable paramernya adalah
(2*8) + (8*1) + 8 + 1 = 33
dimana 2 merupakan jumlah dimensi input, 8 merupakan jumlah elemen hidden layer, dan 1 merupakan dimensi output layer. Dua angka terakhir merupakan bias pada dua layer terakhir: hidden dan output, yakni 8 dan 1. Jumlah learnable parameter ini bisa dikonfirmasi dengan model.summary()

Mencari nilai akurasi maksimal dan plot akurasi vs loss

Ada banyak cara menampilkankan nilai akurasi, yang saya sukai adalah sebagai berikut:
acc = hist.history['acc']
print(max(acc))

Perintah di atas akan menampilan nilai akurasi tertinggi (maksimum) yang dicapai oleh model. Bisa juga kita cari nilai rata-ratanya, `np.mean(acc)`, atau nilai minimalnya. Variabelnya pun juga bisa diganti dengan hasil training yakni `acc', bukan `val_acc`.

Untuk memplot hasil training gunakan module matplotlib.pyplot sebagai berikut,
import matplotlib.pyplot as plt
plt.plot(hist.history['acc'], label='acc')
plt.show()

Hasilnya adalah gambar berikut,
Plot akurasi (variabel: acc) dengan matplotlib

Terlihat pada gambar di atas, akurasi maksimum sudah dicapai dengak epoch sekitar 75 iterasi dari total 500 epoch.
Related Posts Plugin for WordPress, Blogger...