Upload
vuongnga
View
231
Download
4
Embed Size (px)
Citation preview
Simple ANN (Multilayer Perceptron) dengan “Keras”
Alfan F. Wicaksono
Fakultas Ilmu Komputer
Universitas Indonesia
Disclaimer
• Ini bukan tutorial untuk mempelajari ANN & Deep Learning secara detail.
• Tujuan tutorial ini adalah memahami “kulit” dari ANN dan bisa menggunakan tool “Keras” untuk mengaplikasikannya.
Tips
Jika memang ingin mendalami Deep Learning dan bisa mengikutitutorial Deep Learning yang tersedia, tahap awal adalahmemahami dengan baik 5 topik berikut:
• Optimasi dengan gradient descent/ascent & algoritma lain
• Linear Regression
• Logistic Regression
• Multilayer Neural Networks
• Konsep Backpropagation
Tools
• https://keras.io/
– Sebuah tool untuk membangun arsitektur deep learning dengan cukup mudah.
Logistic Regression
Berbeda dengan Linear Regression, Logistic Regressiondigunakan untuk permasalahan Binary Classification. Jadi outputyang dihasilkan adalah diskrit ! (1 atau 0), (ya atau tidak).
Misal, diberikan 2 hal:
1. Unseen data x yang ingin diprediksi labelnya, yaitu y.
2. Model logistic regression dengan parameter θ0, θ1, …, θn
yang sudah ditentukan.
9 September 2016 5
z
n
i
iinn
ez
xyPxyP
xxxxyP
1
1)(
);|1(1);|0(
)()...();|1(1
0110
Logistic Regression
Bisa digambarkan dalam bentuk “single neuron”.
9 September 2016 6
z
n
i
iinn
ez
xyPxyP
xxxxyP
1
1)(
);|1(1);|0(
)()...();|1(1
0110
x1
x2
x3
+1
θ1
θ2
θ3
θ0
Dengan fungsi sigmoid sebagai activation function
How to learn the parameters ?
Logistic Regression
Merupakan sebuah Linear Model ! Garis pemisah adalah garislurus !
9 September 2016 7
A non-linearly separable data
Logistic Regression
Merupakan sebuah Linear Model ! Garis pemisah adalah garislurus !
9 September 2016 8
Cocok untuk data di bawah ??
Neural Network: Non-Linear Model
Multilayer Neural Network (Multilayer Perceptron)
Misal, ada 3-layer NN, dengan 3 input unit, 2 hidden unit, dan 2output unit.
9 September 2016 10
x1
x2
x3
+1
+1
𝑊11(1)
𝑊21(1)
𝑊12(1)
𝑊22(1)
𝑊13(1)
𝑊23(1)
𝑏1(1) 𝑏2
(1)
𝑊11(2)
𝑊12(2)
𝑊21(2)
𝑊22(2)
𝑏1(2) 𝑏2
(2)
W(1), W(2), b(1), b(2) adalah parameter !
Multilayer Neural Network, Cara Melakukan Prediksi
Misal, untuk activation function, kita gunakan fungsi hyperbolictangent.
Untuk menghitung output di hidden layer:
9 September 2016 11
)tanh()( xxf
)1(
23
)1(
232
)1(
221
)1(
21
)2(
2
)1(
13
)1(
132
)1(
121
)1(
11
)2(
1
bxWxWxWz
bxWxWxWz
)(
)(
)2(
2
)2(
2
)2(
1
)2(
1
zfa
zfa
Ini hanyalah perkalian matrix !
)1(
2
)1(
1
3
2
1
)1(
23
)1(
22
)1(
21
)1(
13
)1(
12
)1(
11)1()1()2(
b
b
x
x
x
WWW
WWWbxWz
Multilayer Neural Network, Cara Melakukan Prediksi
Jadi, Proses feed-forward secara keseluruhan hinggamenghasilkan output di kedua output unit adalah:
9 September 2016 12
)(ax )(
)(
)3()3(
,
)2()2()2()3(
)2()2(
)1()1()2(
zsoftmaxh
baWz
zfa
bxWz
bW
Learning Parameters? See Backpropagation Algorithm !
ANN dengan Keras
Misal, ini fully-connected
Input: 779 unit
256 unit
64 unitOutput: 10 unit
ANN dengan Keras Sequential API
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential()
model.add(Dense(output_dim=256, input_dim=779))
model.add(Activation("relu"))
model.add(Dense(output_dim=64))
model.add(Activation("relu"))
model.add(Dense(output_dim=10))
model.add(Activation("softmax"))
Dense Layer
Dense Layer
Dense Layer
(num_samples, 779)
(num_samples, 256)
(num_samples, 64)
(num_samples, 10)
Kompilasi Model
from keras.optimizers import SGD
model.compile(loss='categorical_crossentropy', \
optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True), \
metrics=['accuracy'])
Dalam proses estimasi parameter pada ANN, kita perlu loss-function. Tujuanestimasi parameter melalui data adalah mencari nilai parameter sehingga loss-function kita menjadi minimal.
“categorical_crossentropy” adalah loss-function yang sering digunakanseandainya ada minimal 2 output unit pada layer terakhir.
Gradient Descent (GD): salah satu optimizer yang digunakan
Problem: carilah nilai x sehingga fungsi f(x) = 2x4 + x3 – 3x2 mencapaititik local minimum.
Misal, kita pilih x dimulai dari x=2.0:
9 September 2016 16
Local minimum
Algoritma GD konvergen padatitik x = 0.699, yang merupakan local minimum.
Training/Estimasi Parameter dengan Data
model.fit(X_train, Y_train, \
nb_epoch=50, \
batch_size=32, \
verbose=1, \
validation_data=(X_test, Y_test))
EPOCH: banyaknya iterasi yang dilakukan oleh Stochastic Gradient Descent (atauOptimizer yang lain) untuk mencari parameter yang meminimalkan loss-function.
Evaluasi & Prediksi
#Evaluasi di testing data, menggunakan akurasi
loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=32)
print (loss_and_metrics)
#Prediksi kelas dari data baru (unseen data)
classes = model.predict_classes(X_test, batch_size=32)
#Nilai probabilitas masing-masing kelas
proba = model.predict_proba(X_test, batch_size=32)
Apa yang perlu di-import sejauh ini?
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
Data MNIST Kita
• Kita akan gunakan kembali data MNIST berformat SVMLIB yang diberikan di tutorial sebelumnya
• Perlu import beberapa tools dari Scikit-Learn & numpy:
from sklearn.datasets import load_svmlight_file
from sklearn import preprocessing
from sklearn.cross_validation import train_test_split
import numpy as np
One-Hot Vector
#toOneHot(np.array([0,3,1]), n)
#convert [0,3,1] to one-hot vector -> [[1, 0, 0, 0, ...],
# [0, 0, 0, 1, ...],
# [0, 1, 0, 0, ...]]
def toOneHot(np_array1d, n_labels):
np_array1d = np_array1d.astype(int)
np_array2d = np.zeros((np_array1d.shape[0], n_labels))
np_array2d[np.arange(np_array1d.shape[0]), np_array1d] = 1
return np_array2d
Load Data & Preprocess
#load dataset in svmlib format
X, y = load_svmlight_file("dataset1.txt")
X = X.toarray()
y = toOneHot(y, 10) # label ada 10 di MNIST data
#scaling to [0,1]
min_max_scaler = preprocessing.MinMaxScaler()
X_scaled = min_max_scaler.fit_transform(X)
#split train-testing
X_train, X_test, Y_train, Y_test = train_test_split(X_scaled, y, test_size=0.3)
Dengan Keras Functional API
from keras.layers import Input, Dense
from keras.models import Model
# mengembalikan tensor
inputs = Input(shape=(779,))
# callable pada sebuah tensor, dan mengembalikan tensor
x = Dense(256, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)
# model dengan 1 Input layer dan 3 Dense layers
model = Model(input=inputs, output=predictions)
model.compile(optimizer='sgd',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(X_train, Y_train) # starts training
Belajar Sendiri …
• Keras Sequential API:– https://keras.io/getting-started/sequential-model-
guide/
• Keras Functional API:– https://keras.io/getting-started/functional-api-guide/
• Daftar layer pada keras:– https://keras.io/– [warning] Butuh belajar tentang teori Deep Learning
dahulu
Simpan Arsitektur Model
#save as json
json_string = model.to_json()
print(json_string)
#save as yaml
yaml_string = model.to_yaml()
print(yaml_string)
Rekonstruksi Model
from models import model_from_json
from models import model_from_yaml
json_string = model.to_json()
model = model_from_json(json_string)
yaml_string = model.to_yaml()
model = model_from_yaml(yaml_string)
Melihat Parameter/Weight Model
weights = model.get_weights()
#bisa set weights
#shape sama dengan yang dikembalikan di atas
model.set_weights(weights)
Visualisasi Layer
Plot graf dari model, dan menyimpan di sebuahfile citra
from keras.utils.visualize_util import plot
plot(model, to_file='model.png')
Simpan & Baca Parameter Model
Harus ada modul untuk mendukung baca-tuliske file HDF5
model.save_weights('parameter_model.h5')
model.load_weights('parameter_model.h5')