Mengenal Functional API di Keras

"It’s fun and powerful, it feels like playing with LEGO bricks."
- François Chollet (The Creator of Keras)

Ketika mulai mendalami Deep Learning, kita biasanya memulai dengan membuat model sekuensial. Kelebihan dari model sekuensial adalah kemudahan dalam penggunaannya. Model sekuensial juga bisa memberikan hasil yang cukup baik pada banyak kasus, sehingga cocok dipelajari oleh orang-orang yang baru memulai pembelajarannya. Berikut contoh penulisan model secara sekuensial :

model = keras.Sequential(
    [
        keras.Input(shape=(50,), name="Input"),
        layers.Dense(32, activation="relu", name="layer1"),
        layers.Dense(64, activation="relu", name="layer2"),
        layers.Dense(10, activation='softmax', name="output"),
    ]
)

image.png Ilustrasi Model Sekuensial

Contoh Functional API

Meskipun dengan kelebihan-kelebihan di atas, model sekuensial memiliki sejumlah keterbatasan. Model ini hanya bisa memiliki satu input dan output. Dalam penerapannya, kita akan sering menemukan model yang memiliki topologi tidak linear, bahkan memiliki beberapa input dan output. Dalam kasus seperti inilah, mengetahui functional API sangat berguna. Berikut contoh penulisan model seperti gambar di atas menggunakan functional API :

inputs = keras.Input(shape=(50,), name="Input")
fitur = layers.Dense(128, activation="relu", name="layer1")(inputs)
fitur = layers.Dense(128, activation="relu", name="layer2")(fitur)
outputs = layers.Dense(10, activation="softmax", name='output')(fitur)
model = keras.Model(inputs=inputs, outputs=outputs)

Untuk membuat model kita bisa memulainya dengan membuat input node:

inputs = keras.Input(shape=(50,), name="Input")

Kita membuat node baru dengan memanggil layer pada input:

dense = layers.Dense(128, activation="relu")
fitur = dense(inputs)

Atau dengan cara penulisan lain seperti ini:

fitur = layers.Dense(128, activation="relu", name="layer1")(inputs)

Aktivitas ini layaknya menggambarkan panah dari input ke lapisan layer yang baru kita buat. Kita memasukkan input ke lapisan dense dan mendapatkan fitur sebagai output. Selanjutnya kita bisa membuat Model dengan menspesifikasikan input dan output dari model:

model = keras.Model(inputs=inputs, outputs=outputs)

Functional API untuk data non-linear

Sebagaimana telah disebutkan sebelumnya, functional API cocok untuk digunakan ketika kita ingin membuat model yang tidak linear atau memiliki beberapa input ataupun output. Contohnya misalkan kita ingin membuat model untuk memprediksi kelulusan siswa beserta jurusan kuliah yang cocok untuknya. Sebut saja model yang akan kita buat memiliki 2 buah input:

  • Nilai ujian sekolah.
  • Nilai rapot selama belajar.

Adapun output yang ingin diprediksi juga 2 yaitu:

  • Apakah siswa tersebut akan lulus atau tidak?
  • Jurusan yang cocok untuk siswa tersebut.

Kita bisa membuat model demikian dengan functional API:

jumlah_mapel = 50
jumlah_ujian = 5
jumlah_jurusan = 10

nilai_mapel = keras.Input(shape=(jumlah_mapel,), name="Nilai Mapel")
nilai_ujian = keras.Input(shape=(jumlah_ujian,), name="Nilai Ujian")

fitur = layers.Concatenate()([nilai_mapel, nilai_ujian])
fitur = layers.Dense(32, activation="relu")(fitur) 
fitur = layers.Dense(64, activation="relu")(fitur) 
fitur = layers.Dense(128, activation="relu")(fitur) 

kelulusan = layers.Dense(1, activation='sigmoid', name='kelulusan')(fitur)
jurusan = layers.Dense(jumlah_jurusan, activation='Softmax', name='jurusan')(fitur)

model = keras.Model(inputs=[nilai_mapel, nilai_ujian],
                    outputs=[kelulusan, jurusan])

image.png Model dengan multi input dan output

Membuat Nested Model

Kita bisa membuat model seakan-akan ia adalah sebuah layer dengan menerapkannya pada input ataupun output dari layer lain. Dengan memanggil model, selain menggunakan kembali arsitekturnya, kita juga menggunakan kembali bobotnya. Selain itu, model juga bisa terdiri atas beberapa sub-model. Berikut contoh menyatukan sekumpulan model menjadi satu model:

def get_model():
    inputs = keras.Input(shape=(128,))
    outputs = layers.Dense(1)(inputs)
    return keras.Model(inputs, outputs)


model1 = get_model()
model2 = get_model()
model3 = get_model()

inputs = keras.Input(shape=(128,), name="Input")
y1 = model1(inputs)
y2 = model2(inputs)
y3 = model3(inputs)
outputs = layers.average([y1, y2, y3], name='Output')
ensemble_model = keras.Model(inputs=inputs, outputs=outputs)

image.png Nested Model


Masih banyak contoh penggunaan dan manfaat lainnya dari Functional API yang tidak disebutkan dalam artikel ini, untuk melihat detail lebih lanjut kita bisa merujuk ke dokumentasi terkait di sini. Dengan Functional API, kita bisa membangun model berbagai bentuk serta cara yang fleksibel layaknya menyusun LEGO. Tipe model seperti ini akan banyak kita temui, dan dalam banyak kondisi juga kita akan membuat model Functional API nantinya. Demikian artikel ini, semoga bermanfaat, terima kasih dan selamat belajar. 😁