Core Layers pada Keras, part 2

Mengenal Core Layers: Memahami apa itu Dense Layer beserta setiap parameternya

Heri Hermawan
11 min readDec 10, 2022

--

Halo semuanya!

Melanjutkan pembahasan sebelumnya pada kali ini saya akan membahas mengenai “Dense Layer” pada library Keras. Dense Layer merupakan lapisan yang terdiri dari unit-unit yang terhubung dengan semua unit pada lapisan sebelumnya. Secara sederhana, Dense Layer dapat dianggap sebagai lapisan fully-connected pada sebuah model neural network.

Fully-connected adalah sebuah istilah yang biasanya digunakan untuk menggambarkan sebuah lapisan pada sebuah model neural network. Lapisan yang fully-connected artinya setiap unit pada lapisan tersebut terhubung dengan semua unit pada lapisan sebelumnya.

Secara visual, lapisan fully-connected dapat ditunjukkan seperti ini:

   ┌──────┐       ┌──────┐
│ θ1 │ │ θ1 │
└──────┘ └──────┘
▲ ▲
│ │
└────┬────┬────┘
│ │
┌────┴────┴────┐
│ │
▼ ▼
┌──────┐ ┌──────┐
│ θ2 │ │ θ3 │
└──────┘ └──────┘
▲ ▲
│ │
└────┬────┬────┘
│ │
┌────┴────┴────┐
│ │
▼ ▼
┌──────┐ ┌──────┐
│ θ4 │ │ θ5 │
└──────┘ └──────┘

Pada ilustrasi di atas, terdapat 2 lapisan fully-connected. Lapisan pertama terdiri dari 2 unit, yaitu θ1 dan θ2. Lapisan kedua terdiri dari 3 unit, yaitu θ3, θ4, dan θ5. Setiap unit pada lapisan kedua terhubung dengan semua unit pada lapisan sebelumnya, yaitu θ1 dan θ2.

Lapisan fully-connected sangat berguna untuk mengolah data yang memiliki banyak fitur, karena setiap unit pada lapisan tersebut mampu menerima input dari semua fitur yang ada. Namun, jumlah unit yang banyak juga dapat mengakibatkan overfitting pada model, sehingga perlu diperhatikan dengan baik saat menentukan jumlah unit pada lapisan fully-connected.

Lapisan ini biasanya digunakan pada tahap akhir dari sebuah model, setelah mengalami proses pengolahan data oleh lapisan-lapisan sebelumnya.

Dense Layer biasanya digunakan untuk melakukan klasifikasi atau regresi pada data. Sebagai contoh, jika kita memiliki sebuah dataset gambar, maka Dense Layer dapat digunakan untuk mengklasifikasikan gambar tersebut ke dalam kategori yang sesuai (seperti kucing, anjing, atau burung).

Selain itu, Dense Layer juga dapat digunakan untuk melakukan prediksi pada data. Sebagai contoh, jika kita memiliki sebuah dataset harga saham, maka Dense Layer dapat digunakan untuk memprediksi harga saham pada hari mendatang berdasarkan harga saham pada hari-hari sebelumnya.

Jadi, Dense Layer biasanya digunakan pada tahap akhir dari sebuah model neural network untuk melakukan klasifikasi atau prediksi pada data.

Berikut ini adalah contoh penggunaan Dense Layer di Keras:

from keras.layers import Dense

# membuat sebuah Dense Layer dengan 10 unit
dense_layer = Dense(units=10)

Pada kode di atas, kita menggunakan Dense class dari keras.layers module untuk membuat sebuah Dense Layer dengan 10 unit.

Parameter yang dapat kita gunakan pada Dense layer diantaranya adalah:

Units

units, bertugas untuk menentukan jumlah unit pada lapisan tersebut. Biasanya, jumlah unit yang digunakan pada Dense Layer akan sesuai dengan jumlah fitur pada data yang akan kita olah. Sebagai contoh, jika kita memiliki dataset yang terdiri dari 1000 fitur, maka kita dapat menggunakan Dense Layer dengan 1000 unit untuk mengolah data tersebut.

Selain itu, jumlah unit juga dapat ditentukan berdasarkan jumlah kelas yang ada pada data. Sebagai contoh, jika kita memiliki dataset gambar yang terdiri dari 3 kelas (kucing, anjing, dan burung), maka kita dapat menggunakan Dense Layer dengan 3 unit untuk mengklasifikasikan gambar tersebut.

Jadi, parameter Unitspada Dense Layer digunakan untuk menentukan jumlah unit pada lapisan tersebut. Jumlah unit yang digunakan biasanya akan sesuai dengan jumlah fitur pada data atau jumlah kelas yang ada pada data.

Activation

activationbertugas untuk menentukan Activation yang digunakan pada lapisan tersebut. Activation adalah sebuah fungsi yang digunakan untuk mengubah output dari sebuah unit pada sebuah lapisan menjadi nilai yang dapat diproses oleh lapisan selanjutnya. Activation biasanya digunakan untuk mengatur distribusi data agar lebih sesuai dengan kebutuhan model.

Beberapa Activation yang biasa digunakan pada Dense Layer adalah relu, sigmoid, dan tanh. Untuk menggunakan Activation pada Dense Layer, kita dapat menambahkan parameter activation pada saat membuat lapisan tersebut. Saya akan coba bahas di artikel selanjutnya mengenai Activation yang ada. (Update: ada disini)

Contoh penggunaannya adalah seperti ini:

from keras.layers import Dense

# membuat sebuah Dense Layer dengan 10 unit, menggunakan Activation relu
dense_layer = Dense(units=10, activation='relu')

Pada kode di atas, kita menggunakan Activation relu pada Dense Layer yang kita buat. Kita juga dapat menggunakan Activation lain, seperti sigmoid atau tanh, dengan mengganti nilai dari parameter activation.

Selain itu, Activation juga dapat membantu mengurangi masalah vanishing gradient pada model neural network. Masalah ini terjadi ketika gradien yang dihasilkan oleh lapisan terluar menjadi sangat kecil sehingga tidak dapat lagi diperbaharui oleh lapisan dalam. Dengan menggunakan Activation yang tepat, kita dapat menjaga gradien agar tetap berukuran besar sehingga dapat diperbaharui oleh lapisan dalam.

Vanishing gradien adalah sebuah masalah yang terjadi pada sebuah model deep learning, di mana nilai gradient (turunan) dari sebuah fungsi terhadap sebuah parameter menjadi sangat kecil sehingga tidak dapat digunakan untuk meng-update nilai parameter tersebut. Hal ini dapat menyebabkan model tidak dapat belajar dengan efektif, atau bahkan tidak dapat belajar sama sekali. Vanishing gradien sering terjadi pada model deep learning yang memiliki banyak layer, karena gradient dari setiap layer akan terus berkurang saat dikalikan dengan gradient dari layer sebelumnya.

Untuk menentukan Activation yang tepat, biasanya kita akan mencoba beberapa Activation dan menentukan yang paling sesuai dengan data dan tujuan dari model yang kita buat.

Jadi, parameter activation pada Dense Layer digunakan untuk menentukan Activation yang digunakan pada lapisan tersebut. Activation biasanya digunakan untuk mengatur distribusi data agar lebih sesuai dengan kebutuhan model.

Use bias

use_biasbertugas untuk menentukan apakah lapisan tersebut menggunakan bias atau tidak. Bias adalah sebuah nilai yang ditambahkan pada output dari sebuah unit pada sebuah lapisan. Bias ini digunakan untuk mengatur output dari unit tersebut agar lebih sesuai dengan kebutuhan model.

Bias biasanya digunakan bersama dengan bobot (weight) pada sebuah unit untuk menghasilkan output yang diinginkan. Nilai bobot dan bias tersebut akan diperbaharui secara bersamaan selama proses pelatihan model.

Untuk menentukan apakah Dense Layer menggunakan bias atau tidak, kita dapat menambahkan parameter use_bias pada saat membuat lapisan tersebut. Nilai default dari parameter ini adalah True, yang artinya Dense Layer akan menggunakan bias. Namun, jika kita ingin lapisan tersebut tidak menggunakan bias, kita dapat mengganti nilai dari parameter use_bias menjadi False.

Contoh penggunaannya adalah seperti ini:

from keras.layers import Dense

# membuat sebuah Dense Layer dengan 10 unit, tidak menggunakan bias
dense_layer = Dense(units=10, use_bias=True)

Pada kode di atas, kita membuat sebuah Dense Layer dengan 10 unit yang menggunakan bias. Namun, ada juga kasus dimana penggunaan bias dapat menyebabkan masalah pada model neural network. Salah satu contohnya adalah jika data yang kita gunakan memiliki skewness yang tinggi. Pada kasus seperti ini, penggunaan bias dapat menyebabkan model menjadi tidak akurat atau bahkan tidak dapat belajar sama sekali.

Skewness adalah sebuah istilah yang digunakan untuk menggambarkan ketidakseimbangan pada sebuah distribusi data. Skewness dapat didefinisikan sebagai ketidakseimbangan yang terjadi antara nilai-nilai data yang terletak di sebelah kiri (left) dan kanan (right) dari nilai tengah (median) atau rata-rata (mean).

Skewness dapat terjadi karena adanya outlier atau karena adanya faktor-faktor lain yang mempengaruhi distribusi data. Skewness yang terlalu tinggi dapat menyebabkan masalah pada model neural network, seperti overfitting atau underfitting. Oleh karena itu, perlu diperhatikan dengan baik ketika menganalisa distribusi data.

Untuk mengukur skewness pada data, kita dapat menggunakan rumus skewness, yaitu:

skewness = (mean - median) / standard deviation

Untuk mengatasi masalah ini, kita dapat menggunakan normalisasi pada data sebelum melakukan pelatihan model. Dengan melakukan normalisasi, kita dapat menghilangkan skewness pada data sehingga model dapat belajar dengan lebih baik. Selain itu, kita juga dapat mencoba menggunakan Activation yang tepat untuk mengurangi efek dari skewness pada data dan bisa juga dengan tidak menggunakan bias.

Jadi, parameter use_bias pada Dense Layer digunakan untuk menentukan apakah lapisan tersebut menggunakan bias atau tidak. Bias biasanya digunakan bersama dengan bobot pada sebuah unit untuk menghasilkan output yang diinginkan. Nilai default dari parameter ini adalah True, yang artinya Dense Layer akan menggunakan bias.

Kernel initializer

kernel_initializer bertugas untuk menentukan metode yang digunakan untuk menginisialisasi bobot (weight) pada lapisan tersebut. Bobot (weight) adalah sebuah nilai yang digunakan oleh sebuah unit untuk menghasilkan output yang diinginkan. Bobot ini akan diperbaharui secara bersamaan dengan bias selama proses pelatihan model.

Untuk menginisialisasi bobot pada Dense Layer, kita dapat menggunakan parameter kernel_initializer. Nilai default dari parameter ini adalah glorot_uniform, yang artinya bobot akan diinisialisasi dengan metode Glorot Uniform.

Contoh penggunaannya adalah seperti ini:

from keras.layers import Dense

# membuat sebuah Dense Layer dengan 10 unit, menggunakan metode he_normal untuk inisialisasi bobot
dense_layer = Dense(units=10, kernel_initializer='he_normal')

Pada kode di atas, kita menggunakan metode he_normal untuk menginisialisasi bobot pada Dense Layer yang kita buat. Kita juga dapat menggunakan metode lain, seperti random_uniform atau glorot_uniform, dengan mengganti nilai dari parameter kernel_initializer. Untuk penjelasan setiap metode, akan saya buat artikel sendiri agar artikel ini tidak bertambah lebih panjang. (Update: ada disini)

Pemilihan metode untuk menginisialisasi bobot pada Dense Layer sangat penting karena dapat mempengaruhi hasil dari pelatihan model. Metode yang tepat dapat membantu model belajar dengan lebih cepat dan menghasilkan hasil yang lebih baik. Namun, jika kita salah dalam memilih metode, model dapat mengalami masalah seperti overfitting atau underfitting.

Selain itu, kita juga dapat menggunakan metode kustom untuk menginisialisasi bobot pada Dense Layer. Untuk melakukan ini, kita dapat menggunakan fungsi keras.initializers.Constant untuk menentukan nilai awal dari bobot pada lapisan tersebut.

Contoh penggunaannya adalah seperti ini:

from keras.layers import Dense
from keras.initializers import Constant

# menentukan nilai awal bobot sebesar 0
initializer = Constant(value=0)

# membuat sebuah Dense Layer dengan 10 unit, menggunakan metode kustom untuk inisialisasi bobot
dense_layer = Dense(units=10, kernel_initializer=initializer)

Pada kode di atas, kita menggunakan metode kustom untuk menginisialisasi bobot pada Dense Layer. Kita menentukan nilai awal bobot sebesar 0 menggunakan fungsi keras.initializers.Constant dan menggunakannya sebagai nilai dari parameter kernel_initializer.

Selain itu, kita juga perlu memperhatikan distribusi data yang kita gunakan. Jika data memiliki skewness yang tinggi, maka kita perlu melakukan normalisasi terlebih dahulu sebelum melakukan pelatihan model. Dengan melakukan normalisasi, kita dapat menghilangkan skewness pada data sehingga model dapat belajar dengan lebih baik.

Jadi, parameter ini bertugas untuk menentukan metode yang digunakan untuk menginisialisasi bobot (weight) pada lapisan tersebut. Pemilihan metode yang tepat untuk menginisialisasi bobot pada Dense Layer sangat penting karena dapat mempengaruhi hasil dari pelatihan model. Kita juga dapat menggunakan metode kustom untuk menginisialisasi bobot pada Dense Layer dengan menggunakan fungsi keras.initializers.Constant. Kita juga perlu memperhatikan distribusi data yang kita gunakan dan melakukan normalisasi jika diperlukan.

Bias initializer

bias_initializer biasanya digunakan untuk menentukan nilai awal dari bias dalam layer tersebut. Bias adalah nilai yang ditambahkan ke hasil dari operasi matrix multiplication antara input dan weight pada layer tersebut. Bias bertujuan untuk memodifikasi hasil akhir dari operasi tersebut, sehingga dapat memberikan kontribusi yang lebih besar atau lebih kecil terhadap hasil akhir.

Matrix multiplication atau dot product adalah salah satu operasi aritmatika yang dilakukan pada matriks. Operasi ini menghasilkan suatu matriks baru dengan jumlah kolom dan baris yang sama dengan matriks sebelumnya. Matrix multiplication dilakukan dengan mengalikan setiap elemen dari matriks pertama dengan elemen yang memiliki posisi yang sama pada matriks kedua, lalu menjumlahkan hasil perkalian tersebut.

Contoh sederhana dari matrix multiplication adalah sebagai berikut:

import numpy as np

# Matrix A dengan ukuran 3x2
A = np.array([[1, 2],
[3, 4],
[5, 6]])

# Matrix B dengan ukuran 2x3
B = np.array([[7, 8, 9],
[10, 11, 12]])

# Kalikan matriks A dan B
C = np.dot(A, B)

# Tampilkan matriks hasil perkalian
print(C)

# [[ 27 30 33]
# [ 61 68 75]
# [ 95 106 117]]

Catatan: matriks hasil perkalian hanya dapat dikalikan jika jumlah kolom dari matriks pertama sama dengan jumlah baris dari matriks kedua. Dalam contoh di atas, karena matrix A memiliki 2 kolom dan matrix B memiliki 2 baris, kita dapat melakukan perkalian matriks.

Contoh kode dalam Python untuk menentukan nilai awal dari bias pada Dense Layer adalah sebagai berikut:

import tensorflow as tf
from keras.models import Sequential

model = tf.keras.Sequential()

# Menambahkan Dense layer dengan 10 unit dan bias_initializer = "zeros"
model.add(tf.keras.layers.Dense(10, bias_initializer="zeros"))

Di sini, nilai awal dari bias dalam layer tersebut diinisialisasi dengan nilai 0 (zero). Ada beberapa nilai awal yang dapat digunakan untuk bias_initializer, seperti zeros untuk mengisi bias dengan nilai 0,ones untuk mengisi bias dengan nilai 1, atau menggunakan instance dari kelas tf.keras.initializers.Constantuntuk menentukan nilai awal yang diinginkan.

Berikut ini adalah contoh kode untuk menentukan nilai awal bias menggunakan instance dari kelas tersebut:

# Membuat instance dari kelas Initializer
bias_initializer = tf.keras.initializers.Constant(value=1.0)

# Menambahkan Dense layer dengan 10 unit dan bias_initializer = bias_initializer
model.add(tf.keras.layers.Dense(10, bias_initializer=bias_initializer))

Di sini, nilai awal dari bias dalam layer tersebut diinisialisasi dengan nilai 1.0 menggunakan instance dari kelas tf.keras.initializers.Constant. Kita dapat mengganti nilai tersebut sesuai dengan kebutuhan dan tujuan dari model deep learning yang kita bangun.

Kernel regularizer

kernel_regularizer berfungsi untuk mencegah overfitting pada model yang dibuat. Overfitting terjadi ketika model terlalu spesifik terhadap data training yang digunakan, sehingga ketika diaplikasikan pada data baru hasilnya tidak akurat.

Kernel regularizer biasanya diterapkan dengan menambahkan sebuah penalty pada bobot (weight) yang digunakan pada dense layer. Penambahan penalty ini akan memaksa bobot-bobot tersebut untuk tidak terlalu besar, sehingga model menjadi lebih general dan dapat bekerja dengan baik pada data baru.

Berikut ini adalah contoh kode dalam python yang menggunakan parameter kernel_regularizer pada sebuah dense layer :

from keras.regularizers import l1

# Membuat dense layer dengan kernel regularizer
dense_layer = keras.layers.Dense(64, kernel_regularizer=l1(0.001))

Bias regularizer

bias_regularizer berfungsi untuk mencegah overfitting pada model deep learning dengan menambahkan penalti pada bobot bias layer. Ini berarti bahwa bobot bias dalam layer akan disesuaikan agar menghasilkan nilai yang lebih kecil, yang dapat membantu mencegah overfitting.

Berikut ini adalah contoh kode dalam Python yang menunjukkan bagaimana kita dapat menentukan lapisan padat dengan menggunakan bias regularizer:

from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l2

model = Sequential()

dense_layer = Dense(units=10, bias_regularizer=l2(0.01))
model.add(dense_layer)

Perbedaan utama antara regulerisasi L1 dan L2 adalah cara mereka mengurangi bobot (weight) pada model deep learning. Regulerisasi L1 mengurangi bobot dengan menambahkan penalti absolut bobot ke fungsi loss model. Sedangkan regulerisasi L2 mengurangi bobot dengan menambahkan penalti kuadrat bobot ke fungsi loss model.

Activity Regularizer

activity_regularizer berfungsi untuk mengatur atau mengurangi overfitting pada sebuah model. Contohnya, kita dapat menambahkan parameter activity_regularizer pada Dense Layer dalam sebuah model deep learning dengan menggunakan Keras seperti ini:

from keras.regularizers import l1

model = Sequential()
model.add(Dense(64, activation='relu', activity_regularizer=l1(0.001)))

Pada contoh di atas, kita menggunakan regularisasi L1 dengan konstanta 0.001 pada Dense Layer pertama dari model. Ini akan mengurangi overfitting pada model dengan memaksa output activation dari lapisan tersebut untuk memiliki nilai yang lebih kecil.

Kernel constraint

kernel_constraint berfungsi untuk membatasi nilai-nilai dalam matriks kernel dan, dengan demikian, membatasi kompleksitas dari model. Contohnya, kita dapat menambahkan parameter kernel_constraint pada Dense Layer dalam sebuah model deep learning seperti ini:

from keras.constraints import max_norm

model = Sequential()
model.add(Dense(64, activation='relu', kernel_constraint=max_norm(3)))

Pada contoh di atas, kita menggunakan constraint max_norm dengan nilai 3 pada Dense Layer pertama dari model. Ini akan membatasi setiap vektor dalam matriks kernel lapisan tersebut untuk memiliki norma maksimum 3, yang akan membatasi kompleksitas dari model.

Norma maksimum adalah salah satu jenis norma vektor, yang mengukur panjang vektor dengan mengambil nilai maksimum dari setiap komponen vektor tersebut. Misalnya, jika kita memiliki vektor v = [1, 2, 3], maka norma maksimum dari vektor tersebut adalah 3, yaitu nilai maksimum dari setiap komponennya. Norma maksimum sering digunakan dalam konstrain pada lapisan “Dense” dalam sebuah model deep learning untuk membatasi kompleksitas dari model.

Bias constraint

bias_constraint berfungsi untuk mengatur batasan (constraint) pada bias yang digunakan pada layer tersebut. Bias merupakan sebuah parameter yang digunakan pada dense layer yang berguna untuk menentukan seberapa besar pengaruh dari sebuah neuron dalam mempengaruhi output dari layer tersebut.

Bias constraint biasanya digunakan untuk mengontrol overfitting pada sebuah model deep learning. Overfitting terjadi ketika model deep learning terlalu mempelajari data training sehingga tidak bisa menghasilkan performa yang baik pada data testing. Dengan mengatur batasan pada bias, kita dapat membatasi bagaimana model deep learning menggunakan bias sehingga model tersebut tidak menjadi terlalu kompleks dan mengurangi risiko overfitting.

Berikut ini adalah contoh kode dalam python yang menggunakan bias constraint pada sebuah dense layer:

from keras.layers import Dense

model = Sequential()
model.add(Dense(units=128, activation='relu', bias_constraint=max_norm(3)))

Di sini, kita menggunakan bias constraint bernama “max_norm” dengan nilai 3 pada sebuah dense layer dengan 128 unit. Ini berarti bahwa bias yang digunakan pada dense layer tersebut tidak boleh melebihi nilai 3

Penutup

Itulah penjelasan setiap parameter yang ada pada Dense Layer yang bisa digunakan pada Keras. Karena panjangnya pembahasan ini maka akan saya buat beberapa bagian, selanjutnya saya akan coba bahas Activation layer yang ada pada Core Layer.

Semoga artikel ini bermanfaat untuk kita semua dalam memahami Core Layer pada Keras dan penggunaannya.

--

--