"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"),
]
)
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])
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)
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. 😁