- Berapa ukuran batch_size optimal: 16, 32, 64 atau 128?
- Berapa epoch optimal untuk menjalankan model deep learning: 10, 20, 50 atau 100?
- Apa optimizer terbaik untuk deep learning model ini: atam, rmsprop, atau adadelta...?
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:
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 cartopy
In that case, I used Python 3.6 in user environment, not root.
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
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%.
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:
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:
Untuk mengekstrak delta-delta dari MFCC:
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:
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:
Cek panjang vektor x.flatten sebagai berikut:
Update:
2019-04-22: Selain dengan `flatten`, konversi ke 1D dilakukan dengan ravel dan ini cara lebih cepat.
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):
Contoh:
Compile: Mengkonfigurasi model untuk melatih data yang diberikan
Contoh:
Contoh:
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.
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:
Kita ingin menggabungkan dua list tersebut sehingga menjadi seperti ini:
Maka, kita dapat menggunakan skrip 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])
Subscribe to:
Posts (Atom)