Problem
Permasalahan yang kita angkat sebagai contoh adalah fungsi matematik sederhana berikut,$$ f(x) = 2x + 3 $$
Dimana $x$ merupakan input dan $f(x)$ merupakan nilai output. Misal, kita ingin membuat model yang bisa memberikan prediksi nilai $f(x)$ diberikan nilai input $x$ dimana sebelumnya model kita latih dengan range nilai $x$ yang diberikan. Model deep learning ini akan kita implementasikan dengan Keras.
Implementasi
Implementasi deep learning ini akan mengikuti pola yang saya tulis disini: https://bagustris.blogspot.com/2019/04/implementasi-deep-learning-dengan-keras.html
Input-Output data
Input-output data, sesuai persamaan di atas, didefinisikan dalam python numpy sebagai berikut.import numpy as np x_train = np.arange(0, 10.01, 0.01) y_train = 2*x_train + 3 #**2 + 3
Model
Untuk membuat model, kita buat fungsi `build_model`. Model yang kita bangun terdiri dari tiga layer: 2 dense (fully connected) layer dan satu output layer. Input layer akan masuk pada dense layer pertama. Model tersebut bisa kita gambarkan sebagai berikut.Berikut fungsi `build_model` untuk membangun model seperti gambar di atas.
def build_model(): # create model model = Sequential() model.add(Dense(128, input_dim=1, activation='relu')) model.add(Dense(128, activation='relu')) #model.add(Dropout(0.5)) model.add(Dense(1)) #kernel_initializer='normal' # compile model model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mae']) return model
Model summary
Untuk memanggil dan meresume hasil buil_model tersebut, dua perintah berikut dapat digunakan.model = build_model() model.summary()
Training model
Untuk melatih model, digunakan instance .fit. Kita gunakan batch size sebanyak 16 dan epoch sebanyak 20 kali. Sebanyak 30% dari traininig data kita gunakan untuk validation/development. Untuk mengukur performance, kita gunakan mean absolte error (mae), dan kita tampilkan nilai minimumnya.hist = model.fit(x_train, y_train, epochs=20, batch_size=16, validation_split=0.3) print(min(hist.history['val_mean_absolute_error']))
Evaluasi
Untuk mengaluasi model, model.evaluate bisa kita gunakan, atau langsung kita gunakan model untuk memprediksi nilai yang kita inginkan. Misal kira ingin memprediksi nilai f(x) dari x=4 sehingga hasilnya adalah 2*4+3 = 11, dan untuk x=9 maka f(x) = 2*9+3=21.# evaluate model loss, score = model.evaluate([4, 11], [8, 22]) # Or directly predict value of test data pred_4_11 = model.predict([4, 11]) print(pred_4_11)
Output error dan prediksi dari kode di atas adalah sebagai berikut,
MAE = 0.14173693306422314 Prediksi = [[11.000016] [25.405918]]
Error yang didapat (mean absolute error, MAE) cukup kecil, dan hasil prediksinya cukup mendekati nilai sebenarnya. Untuk input x=4 maka f(x) seharusnya 2*4+3=11, sedang untuk x=11, f(x) = 2*11+3 = 25. Sedangkan hasil prediksinya adalah 11.00 dan 25.40.
Perbedaan dengan permasalahan klasifikasi
Perbeedaan implementasi regresi dan klasifikasi terletak pada layer terakhir: baik jumlahnya maupun fungsi aktivasinya. Jika output hanya satu, maka banyaknya node/unit pada layer terahir juga satu. Khusus untuk regresi, kita tidak perlu mendefinisikan fungsi aktivasi yang digunakan, alias fungsi yang dipakai adalah linear (default dense layer pada keras). Pada permasalahan klasifikasi, umumnya fungsi yang dipakai di layer terakhir adalah softmax.
Sesedarhana itu. Kode lengkapnya ada di bawah ini.
# Simple keras for regression task import numpy as np from keras.models import Sequential, Model from keras.layers import Dense, Dropout x_train = np.arange(0, 10.01, 0.01) y_train = 2*x_train + 3 #**2 + 3 def build_model(): # create model model = Sequential() model.add(Dense(128, input_dim=1, activation='relu')) model.add(Dense(128, activation='relu')) #model.add(Dropout(0.5)) model.add(Dense(1)) #kernel_initializer='normal' # compile model model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mae']) return model model = build_model() model.summary() # train model, use 30% of train data for validation/development hist = model.fit(x_train, y_train, epochs=20, batch_size=16, validation_split=0.3) print(min(hist.history['val_mean_absolute_error'])) # Evaluate model loss, score = model.evaluate([4, 11], [8, 22]) # Or directly predict value of test data pred_4_11 = model.predict([4, 11]) print(pred_4_11)
Bonus Track:
Untuk menggambar diagram alir dari layer ke layer, gunakan perintah berikut:from keras.utils import plot_model plot_model(model,show_shapes=True, show_layer_names=False, to_file='model_regresi.png')
Hasilnya adalah sebagai berikut. Sangat intuitif untuk memahami model yang digunakan.
No comments:
Post a Comment
Your comments here/Silahkan komentar disini...