Friday, April 26, 2019

Menggunakan GridSearchCV untuk optimasi hyperparameter pada Keras

Salah satu permasalahan pada pembangunan (development) model deep learning adalah mencari hyperparameter optimal. Contohnya sebagai berikut:
  1. Berapa ukuran batch_size optimal: 16, 32, 64 atau 128?
  2. Berapa epoch optimal untuk menjalankan model deep learning: 10, 20, 50 atau 100?
  3. Apa optimizer terbaik untuk deep learning model ini: atam, rmsprop, atau adadelta...?
Dan masih banyak hiperparameter lainnya yang bisa dioptimasi: Dropout, jumlah node, jumlah layer, fungsi aktivasi apa yang digunakan, dan lain-lainnya. Habis waktu kita jika digunakan untuk trial-error mencoba mengganti satu-satu parameter tersebut untuk mencari model terbaik. Salah satu solusi dari permasalahan ini adalah dengan menggunakanGridSearch.

Thursday, April 25, 2019

How-to: Install cartopy on Ubuntu 16.04 using pip3

Cartopy is a Python package designed to make drawing maps for data analysis and visualisation as easy as possible.

It is a python package. Hence, the best way to install is by using pip. Here is how on Ubuntu 16.04

Requirements:
$ # install geos
$ sudo apt install libgeos++-dev
$ # install proj
$ sudo apt install libproj-dev

Install cartopy
$ # clone github repo
$ git clone https://github.com/SciTools/cartopy.git
$ # cd ke repo
$ cd cartopy
$ # install from source
$ python3.6 setup.py install --user

In that case, I used Python 3.6 in user environment, not root.

Sunday, April 21, 2019

Start-end silence removal dengan Librosa

Start-end silence removal

Start-end silence removal merupakan teknik untuk menghilangkan suara silence di awal dan akhir utterances (sinyal wicara). Teknik ini dilatarbelakangi bahwa kebanyakan silence berada pada awal dan akhir pembicaraan.

Dengan library librosa, menghilangkan silence pada awal dan akhir kalimat ini cukup mudah sebagai berikut,
import librosa
x, fs = librosa.load('Ses01F_impro01_F000.wav')  # ganti dengan nama file wav kamu
xt, ind = librosa.effects.trim(x, top_db=30)

Untuk melihat hasilnya, kita ceck panjang sinyal atau kita plot (bisa juga didengarkan suaranya dengan library sounddevice.

In [12]: len(x)
Out[12]: 42900

In [15]: len(xt)
Out[15]: 24576

Hasil plotnya adalah sebagai berikut:
figure()
subplot(211); plot(x)
subplot(212); plot(xt)


Perlu dicatat, karena saya menggunakan ipython --pylab, saya tidak perlu menuliskan plt.* untuk mengakses library matplotlib. Selain menghasilkan output `xt`, fungsi librosa.effects.trim yang digunakan untuk menghilangkan silence ini juga memberikan indeks (start, end) dimana sinyal xt diambil.

Perhatikan gambar di atas, yang ditandai dengan elips warna oranye adalah sinyal silence yang ingin kita hilangkan, sedangkan, didalam kotak merah adalah sinyal yang ingin kita ambil. Parameter utama untuk menghilangkan silence ini adalah threshold (dB).

Friday, April 19, 2019

Ekstraksi fitur MFCC dan zero paddingnya dengan library LIBROSA

Mel frequency cepstral coefficient, disingkat MFCC, masih merupakan fitur yang paling banyak digunakan pada pemrosesan sinyal wicara, khususnya pengenalan sinyal wicara. Untuk mengekstrak fitur MFCC, salah satu tool yang paling banyak digunakan adalah librosa. Tulisan berikut merupakan paparan singkat untuk mengekstrak fitur MFCC dari set sinyal wicara dalam sebuah direktori.

Instalasi
pip3 install --user librosa

Workflow
Misalkan dalam direktory saat ini (`./`), kita memiliki 30 file wav sinyal wicara. Dari 30 file tersebut, tiap file akan kita ekstrak 20 MFCC per frame/window (dari default librosa). Karena panjang tiap file berbeda, maka bentuk/ukuran variabel MFCC untuk tiap file tersebut berbeda, misalnya: (20, 44), (20, 193) dan (20, 102).  Karena default window size atau hopsize (n_fft) dari librosa adalah 2048 (25ms) dengan 512 hop length /stride (10 ms overlap), maka untuk file suara dengan durasi 2 detik banyaknya frame mffc yang didapat adalah,

output _length = (seconds) * (sample rate) / (hop_length)
output_length = 2 * 22050/512 = 87 --> (20, 87)

Jika panjang file 3 detik maka panjang output_length adalah,

output_length = 3 * 22050/512 = 130 --> (20, 130)

Variabel lebar window and stride untuk memproses MFCC pada librosa bisa dikontrol dengan argumen n_fft dan hop_length. Misal n_fft = int(sr/40), hop_lenghth=int(sr/100) untuk lebar window 25 ms dan hop length (geser ke kanan) sebesar 10 ms. Perhatikan gambar berikut untuk lebih jelasnya, K adalah lebar window (n_fft) dan Q adalah stride atau hop length (disebut juga hop size). Pada beberapa literatur sinyal sistem, variabel pergeseran antar window memakai nilai % overlap yang pada gambar dibawah disimbolkan dengan 0. Jika default hop_length=512 dan n_fft = 2048, maka overlap defaultnya adalah 75%.

Windowing: window length, hop size, and its overlap.


Jadi, by default MFCC yang dihasilkan oleh librosa berbeda ukurannya bergantung pada ukuran file input. Padahal, agar bisa diproses oleh deep learning, kita inginkan panjang semua variabel MFCC tersebut sama, misal (20, 100). Jika kurang kita zero-paddingkan, jika lebih kita potong sampai 100 sample sehingga menjadi (20, 100). Karena input deeplearning berupa (sample, fitur), bentuk (20, 100) kita transpose menjadi (100, 20). Tujuan akhir kita adalah memperoleh bentuk dari variabel fitur berupa (30, 100, 20) yang siap dimasukkan pada arsitektur deep learning.

Berikut caranya:
import os
import librosa

lenmin = 100

mfcc =[]
for i in os.listdir('.'):
    x_i, sr = librosa.load(i, sr=None)
    mfcc_i = librosa.feature.mfcc(x_i, sr)
    if mfcc_i.shape[1] < lenmin:
        mfcc_i = np.hstack((mfcc_i, np.zeros((mfcc_i.shape[0], lenmin-mfcc_i.shape[1]))))
    mfcc_i = mfcc_i[:,:lenmin]
    mfcc.append(mfcc_i.T)

mfcc = np.array(mfcc)
Cek ukuran variable mfcc dengan:
In [1]: np_mfcc.shape
Out[1]: (30, 100, 20)

Mengekstrak Delta dan Delta-delta MFCC
Pada banyak aplikasi pemrosesan sinyal wicara, tidak hanya MFCC yang dipakai sebagai fitur, namun juga perbedaan antar koefisien MFCC (delta) dan perbedaan antar delta MFCC (delta-delta). Librosa menyediakan fungsi untuk mengekstrak kedua fitur tersebut.

Untuk mengekstrak delta MFCC dari MFCC:
delta = librosa.feature.delta(mfcc)

Untuk mengekstrak delta-delta dari MFCC:
deltad = librosa.feature.delta(MFCC, order=2)

Zero padding dengan Tensorflow 

Ada cara yang lebih singkat untuk zero padding, yakni dengan tensorflow. Dengan tensorflow, kita hanya butuh satu perintah (dan satu baris jika memungkinkan). Contoh jika kita mempunyai list MFCC dengan ukuran seperti [(100, 20), (28, 20), (53,20), ...]. Semua MFCC tersebut kita rubah menjadi ukuran (100, 200) dengan cara berikut.

import tensorflow as tf
mfcc_padded = tf.keras.preprocessing.sequence.pad_sequence(mfcc, maxlen=100, dtype=float)
Dimana mfcc_list merupakan list MFCC yang berbeda-beda ukuran dan hasilnya, mfcc_padded, merupakan list MFCC yang kesemuanya berukuran (100, 20) melalui teknik zero padding.

Tuesday, April 09, 2019

Python: konversi array ND ke 1D

Misal kita memiliki matriks sebagai berikut:

In [4]: x = np.arange(9.).reshape(3, 3)
In [5]: x
Out[5]: array([[0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.]])
Apabila kita cari tahu panjang dan bentuk vektor x

In [6]: x.shape                                                                 
Out[6]: (3, 3)
In [179]: len(x)
Out[179]: 3

In [180]: x.size
Out[180]: 9

Artinya, kita memiliki array 3D (N-dimensional atau ND) dengan panjang 3 baris dan total berisi 9 elemen. Kita ingin merubah matrix 3x3 tersebut menjadi matrikx 1x9 (atau 9x1). Berikut caranya:

x.flatten()

Cek panjang vektor x.flatten sebagai berikut:

len(x.flatten())

Update:
2019-04-22: Selain dengan `flatten`, konversi ke 1D dilakukan dengan ravel dan ini cara lebih cepat.

Monday, April 08, 2019

Implementasi Deep Learning dengan Keras: Terminologi dasar

Berikut konsep deep learning dengan Keras dalam 30 detik (6 detik per baris membaca):
model = Sequential()
model.add(Dense(XX, input_dim=Y)
model.add(Dense(Z))
model.compile(loss='nama_loss_function', optimizer='nama_optimizer', metrics=['nama_metrik'])
model.fit(training_input, training_ouput, epochs=AA)

Terminologi penting (tak kenal maka tak paham?!):

Model: Tipe model yang digunakan. Ada dua: sekuensial dan functional API.
Contoh:
model = Sequential()

Dense: Menambahkan unit atau node beserta argumennya, dari satu layer ke layer selanjutnya. Dengan kata lain, "fully-connected layer", atau "feed forward network", atau "multi-layer perceptron".


Contoh:

model.add(Dense(32, input_dim=2)
Kode di atas membuat layer dengan jumlah 32 unit dan 16 unit input. Jumlah learnable parameternya adalah 16*32+32 = 544. Check dengan model.summary(). Jika kita tambahkan lagi,
model.add(32) 
Maka sekarang kita mempunyai dua layer yang masing-masing berisi 32 unit. Total learnabale parameternya adalah 544+ (32*32+32) = 1600. Check dengan kode yang telah diberikan di atas.

Compile: Mengkonfigurasi model untuk melatih data yang diberikan
Contoh:
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
Fit: Mencari hubungan input dan output data, dengan kata lain: membangun/melatih model.
Contoh:
model.fit(train_input, train_output, batch_size=16, epochs=500)

Empat terminologi di atas merupakan step dasar untuk melakukan training data dengan deep learning. Namun masing-masing terminologi memiliki argumen. Agar lengkap, berikut penjelasan singkat argumen-argmunen tersebut.

Thursday, April 04, 2019

Numpy: Menggabungkan dua list menjadi N x 2 vektor

Misalkan kita memiliki dua list sebagai berikut:

kata = ["Bagus!", "Ampuh!", "cantik!", "Mantap!", "Cakep!", 
        "Jelek", "Rusak", "Nol", "Omong kosong", "Busuk", "Tidak"]
label = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]

Kita ingin menggabungkan dua list tersebut sehingga menjadi seperti ini:
array([['Bagus!', '1'],
       ['Ampuh!', '1'],
       ['cantik!', '1'],
       ['Mantap!', '1'],
       ['Cakep!', '1'],
       ['Jelek', '0'],
       ['Rusak', '0'],
       ['Nol', '0'],
       ['Omong kosong', '0'],
       ['Busuk', '0'],
       ['Tidak', '0']])

Maka, kita dapat menggunakan skrip berikut:
kata_label = hstack([np.array(kata, ndmin=2).T, np.array(label, ndmin=2).T])
Related Posts Plugin for WordPress, Blogger...