Learning
Tahap awal sebelum kita membangun sebuah jaringan saraf tiruan adalah mem-framing problem. Pada tahap ini kita menentukan apa masalah yang ingin diselesaikan dan bagaimana implementasi dari jaringan saraf dapat menyelesaikan masalah tersebut.Tentunya machine learning selalu membutuhkan data. Pada tahap awal kita perlu memahami data kita lebih lanjut.
Beberapa hal yang perlu diketahui adalah format dari data, jumlah sampel, apakah dataset merupakan masalah regresi/klasifikasi, dan berapa jumlah label.
Setelah kita memahami masalah, kemudian kita dapat mengembangkan sebuah MLP sebagai sebuah solusi.
Creating good feature and Building the model
Kode program yang akan diajarkan di sini bisa diunduh di tautan berikut ini, untuk membukanya upload berkasnya dari Google Colab.Pada latihan kali ini kita akan membuat sebuah model untuk mengklasifikasi gambar sebuah kamar dan memprediksi apakah kamar tersebut rapi atau berantakan. Pada akhir latihan Anda akan dapat menguji coba model ini dengan gambar kamar Anda sendiri. Keren, bukan?
Untuk dataset yang kita gunakan memiliki 200 buah sampel untuk data latih. Terdapat 100 sampel gambar ruangan rapi dan 100 sampel gambar ruangan berantakan.
Hal pertama yang perlu kita lakukan seperti biasa adalah mengimpor semua library yang dibutuhkan.
import tensorflow as tfKemudian pastikan versi TensorFlow yang Anda gunakan adalah versi 2 ke atas.
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator
print(tf.__version__)
Untuk mempersiapkan datanya Anda dapat mengetikkan kode berikut pada cell baru.
!wget --no-check-certificate \
https://dicodingacademy.blob.core.windows.net/picodiploma/ml_pemula_academy/messy-vs-clean-room.zip \
-O /tmp/messy_vs_clean_room.zip
Kode di bawah berfungsi untuk mengekstraksi data yang sebelumnya kita unduh. Lalu kita mendefinisikan nama direktori untuk data latih dan data validasi.
# melakukan ekstraksi pada file zip
import zipfile,os
local_zip = '/tmp/messy_vs_clean_room.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()
base_dir = '/tmp/images'
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'val')
Kita dapat melihat struktur data yang telah kita unduh di bawah. Dapat Anda lihat bahwa pada direktori data latih dan data validasi masing-masing memiliki sub-direktori clean dan messy. Setiap sub-direktori menyimpan gambar yang sesuai dengan nama sub-direktori tersebut.
Jadi, pada sub-direktori ‘clean’ terdapat gambar-gambar ruangan yang rapi dan pada sub-direktori ‘messy’ terdapat gambar-gambar ruangan yang berantakan.
os.listdir('/tmp/images/train')
os.listdir('/tmp/images/val')
Hal selanjutnya adalah kita membuat sub direktori untuk setiap kelas pada direktori latih dan direktori validasi. Pembuatan direktori di sini akan dipakai saat menggunakan objek image data generator.
# membuat direktori ruangan rapi pada direktori data trainingLangkah selanjutnya adalah kita membuat sebuah objek ImageDataGenerator untuk data training dan data testing.
train_clean_dir = os.path.join(train_dir, 'clean')
# membuat direktori ruangan berantakan pada direktori data training
train_messy_dir = os.path.join(train_dir, 'messy')
# membuat direktori ruangan rapi pada direktori data validasi
validation_clean_dir = os.path.join(validation_dir, 'clean')
# membuat direktori ruangan berantakan pada direktori data validasi
validation_messy_dir = os.path.join(validation_dir, 'messy')
Image data generator adalah sebuah fungsi yang sangat berguna untuk mempersiapkan data latih dan data testing yang akan diberikan ke model. Beberapa kemudahan yang disediakan Image data generator adalah, preprocessing data, pelabelan sampel otomatis, dan augmentasi gambar.
Kode di bawah menunjukkan proses augmentasi gambar pada setiap sampel di dataset. Augmentasi gambar adalah teknik untuk menciptakan data-data baru dari data yang telah ada.
Contoh augmentasi gambar adalah horizontal flip di mana gambar akan dibalikkan secara horizontal. Detail mengenai augmentasi gambar dengan image data generator dapat Anda temui di tautan berikut.
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
horizontal_flip=True,
shear_range = 0.2,
fill_mode = 'nearest')
test_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
horizontal_flip=True,
shear_range = 0.2,
fill_mode = 'nearest')
Lalu kita dapat menggunakan objek image data generator sebelumnya untuk mempersiapkan data latih yang akan dipelajari oleh model.
train_generator = train_datagen.flow_from_directory(
train_dir, # direktori data latih
target_size=(150, 150), # mengubah resolusi seluruh gambar menjadi 150x150 piksel
batch_size=4,
# karena kita merupakan masalah klasifikasi 2 kelas maka menggunakan class_mode = 'binary'
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
validation_dir, # direktori data validasi
target_size=(150, 150), # mengubah resolusi seluruh gambar menjadi 150x150 piksel
batch_size=4, # karena kita merupakan masalah klasifikasi 2 kelas maka menggunakan class_mode = 'binary'
class_mode='binary')
Setelah data telah siap,
kita bisa membangun arsitektur sebuah CNN. Sebuah CNN pada keras mirip dengan MLP untuk klasifikasi fashion MNIST yang kita bahas sebelumnya.
Perbedaannya hanya pada terdapatnya 2 lapis layer konvolusi dan max pooling. Anda tentu masih ingat bahwa fungsi dari layer konvolusi adalah untuk mengekstraksi atribut pada gambar.
Sedangkan layer max pooling berguna untuk mereduksi resolusi gambar sehingga proses pelatihan MLP lebih cepat.
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
Setelah membuat arsitektur dari CNN, jangan lupa untuk memanggil fungsi compile pada objek model, dan tentukan loss function serta optimizer.
model.compile(loss='binary_crossentropy',
optimizer=tf.optimizers.Adam(),
metrics=['accuracy'])
Setelah menentukan loss function dan optimizer pada CNN, kita dapat melatih model kita menggunakan metode fit.
Dengan menggunakan image data generator, kita tidak perlu memasukkan parameter gambar dan labelnya. Image data generator secara otomatis melabeli sebuah gambar sesuai dengan direktori di mana ia disimpan.
Contohnya sebuah gambar yang terdapat di direktori clean, secara otomatis akan diberi label “clean” oleh image data generator.
model.fit(
train_generator,
steps_per_epoch=25, # berapa batch yang akan dieksekusi pada setiap epoch
epochs=20,
validation_data=validation_generator, # menampilkan akurasi pengujian data validasi
validation_steps=5, # berapa batch yang akan dieksekusi pada setiap epoch
verbose=2)
Terakhir kita dapat langsung melihat hasil dari model yang telah kita buat. Kode di bawah memungkinkan kita untuk secara interaktif memilih sebuah berkas gambar, kemudian melakukan resize gambar dan mengubahnya menjadi larik numpy. Prediksi dari model kita:
import numpy as np
from google.colab import files
from keras.preprocessing import image
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline
uploaded = files.upload()
for fn in uploaded.keys():
# predicting images
path = fn
img = image.load_img(path, target_size=(150,150))
imgplot = plt.imshow(img)
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
images = np.vstack([x])
classes = model.predict(images, batch_size=10)
print(fn)
if classes==0:
print('clean')
else:
print('messy')
Prediksi dari model kita akan ditampilkan seperti di bawah. Keren bukan. Silakan foto kamar Anda sendiri dan lihat hasil prediksi dari model yang telah Anda buat.