Kategori
Artificial Intellegence Machine Learning

Praktek Machine Learning (TensorFlow)

Silahkan pelajari terlebih dahulu terkait dengan teori machine learning

dan juga berbagai macam teknik machine learning

Dataset yang dipakai haruslah dataset berikut : rockpaperscissors, dataset dapat diunduh pada kaggle

https://www.kaggle.com/datasets/drgfreeman/rockpaperscissors

Petunjuk Pengerjaan

  • Dataset harus dibagi menjadi train set dan validation set.
  • Ukuran validation set harus 40% dari total dataset (data training memiliki 1314 sampel, dan data validasi sebanyak 874 sampel).
  • Harus mengimplementasikan augmentasi gambar.
  • Menggunakan image data generator.
  • Model harus menggunakan model sequential.
  • Pelatihan model tidak melebihi waktu 30 menit.
  • Program dikerjakan pada Google Colaboratory.
  • Akurasi dari model minimal 85%.

Google Colab

Dengan bantuan Google Colab, kita dapat menggunakan bahasa pemrograman python dan library seperti tensorflow, keras, dan lain-lain. Pilih New Notebook

https://colab.research.google.com/

Rename nama file dengan RockPaperScissors (boleh yang lain) kemudian pilih Files, dan pilih Upload to session storage. Upload dataset yang sudah di download dari Kaggle : archive.zip (305 MB)


Mengakses Dataset

Mengekstrak file zip

import os                                                                         #Mengimpor modul os mengakses folder data
import zipfile                                                                    #Mengimpor modul zipfile untuk membaca file zip

local_zip = '/content/archive.zip'                                                #Mendefinisikan file zip yang akan diekstrak 
zip_ref = zipfile.ZipFile(local_zip, 'r')                                         #Mengekstrak file zip
zip_ref.extractall('/content/')                                                   #Menempatkan file hasil ekstrak zip
zip_ref.close()                                                                   #Menghentikan fungsi zip.ref

Menyiapkan folder untuk data gambar Gunting, Batu, Kertas

import os                                                                         #Mengimpor modul os mengakses folder data
fold_gunting = os.path.join('/content/scissors')                                  #Mendefinisikan Folder Training untuk gambar Gunting
fold_batu= os.path.join('/content/rock')                                          #Mendefinisikan Folder Training untuk gambar Batu
fold_kertas = os.path.join('/content/paper')                                      #Mendefinisikan Folder Training untuk gambar Kertas

print('Jumlah total gambar gunting:', len(os.listdir(fold_gunting)))              #Menampilkan jumlah gambar di dalam folder Gunting
print('Jumlah total gambar batu:', len(os.listdir(fold_batu)))                    #Menampilkan jumlah gambar di dalam folder Batu
print('Jumlah total gambar kertas:', len(os.listdir(fold_kertas)))                #Menampilkan jumlah gambar di dalam folder Kertas

print("Menampilkan nama file gambar:")                                     
file_gunting = os.listdir(fold_gunting)                                           #Mendaftar file di dalam folder gunting
print("Gunting:",file_gunting[:5])                                                #Menampilkan nama 5 file pertama di dalam folder gunting

file_batu = os.listdir(fold_batu)                                                 #Mendaftar file di dalam folder batu
print("Batu:",file_batu[:5])                                                      #Menampilkan nama 5 file pertama di dalam folder batu

file_kertas = os.listdir(fold_kertas)                                             #Mendaftar file di dalam folder kertas
print("Kertas:",file_kertas[:5])                                                  #Menampilkan nama 5 file pertama di dalam folder kertas

Menampilkan gambar Gunting, Batu, Kertas dalam satu tampilan

%matplotlib inline

import matplotlib.pyplot as plt                                                   #Mengimpor modul matplotlib
import matplotlib.image as mpimg

nrows = 3                                                                         #Jumlah baris tampilan gambar
ncols = 4                                                                         #Jumlah baris tampilan gambar

pic_index = 0                                                                     #Index awal untuk iterasi gambar

fig = plt.gcf()
fig.set_size_inches(ncols * 4, nrows * 3)                                         #Mengatur gambar output matplotlib, dan ukurannya agar menjadi 4*6 gambar

pic_index += 4                                                                    #Index tambah bertambah 4 setiap baris
gbr_tampil_gunting  = [os.path.join(fold_gunting, fname)                          #Menampilkan gambar gunting
                      for fname in file_gunting[pic_index-4:pic_index]]
gbr_tampil_batu     = [os.path.join(fold_batu, fname)                             #Menampilkan gambar batu
                      for fname in file_batu[pic_index-4:pic_index]]
gbr_tampil_kertas   = [os.path.join(fold_kertas, fname)                           #Menampilkan gambar kertas
                      for fname in file_kertas[pic_index-4:pic_index]]

for i, img_path in enumerate(gbr_tampil_gunting+gbr_tampil_batu+gbr_tampil_kertas):
  sp = plt.subplot(nrows, ncols, i + 1)                                           #Mengatur subplot; indeks subplot dimulai dari 1
  sp.axis('Off')                                                                  #Tidak menampilkan Gridlines

  img = mpimg.imread(img_path)
  plt.imshow(img)

plt.show()

Menggunakan Image Generator

import tensorflow as tf                                                           #Mengimpor modul tensorflow 
import keras_preprocessing                                                        #Mengimpor modul keras 
from keras_preprocessing import image                                             #Mengimpor keras_preprocessing untuk gambar  
from keras_preprocessing.image import ImageDataGenerator                          #Mengimpor Image Generator

Melakukan Augmentasi & Pemisahan Data menjadi Training dan Validation

Data dikelompokkan menjadi Data Training dan Data Validasi, masing masing folder tersebut masih juga terbagi ke dalam folder Gunting, Batu, dan Kertas untuk melakukan pelabelan menggunakan Image Generator, skema nya adalah sebagai berikut:

BASIS_DIR = "/content/rps-cv-images/"                                             #Menyiapkan folder utama
training_datagen = ImageDataGenerator(                                            #Image generator
      rescale = 1./255,                                                           #Menormalisasi data
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>AUGMENTASI<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	    rotation_range=40,                                                          #Menerapkan skenario rotasi gambar hingga 40 derajat          
      width_shift_range=0.2,                                                      #Menerapkan skenario pelebaran gambar hingga hingga sebanyak 0.2 dari ukuran asli
      height_shift_range=0.2,                                                     #Menerapkan skenario peninggian gambar hingga hingg sebanyak 0.2 dari ukuran asli
      shear_range=0.2,                                                            #Menerapkan skenario pemangkasan gambar gambar hingga sebanyak 0.2 dari ukuran asli 
      zoom_range=0.2,                                                             #Menerapkan skenario zoom gambar hingga sebesar 0.2 
      horizontal_flip=True,                                                       #Menerapkan skenario putar balik gambar secara horizontal 
      fill_mode='nearest',                                                        #Mengisi piksel yang kosong dengan nilai piksel terdekat 
#>>>>>>>>>>>MEMECAH DATA MENJADI DATA TRAINING DAN DATA VALIDASI<<<<<<<<<<<<<<<<      
      validation_split=0.2                                                        #80% Data Training, 20% Data Validasi
      )

Pelabelan data menggunakan Image Data Generator berdasarkan Folder

train_generator = training_datagen.flow_from_directory(                           #Generator data training
	BASIS_DIR,                                                                      #Folder target untuk digenerasi
	target_size=(150,150),                                                          #Mengubah resolusi seluruh gambar menjadi 150x150 piksel
	class_mode='categorical',                                                       #Kelas data kategori untuk klasifikasi multivariabel
  shuffle=True,                                                                   
  subset='training'                                                               #Untuk data training
  )

validation_generator = training_datagen.flow_from_directory(                      #Generator data validasi
	BASIS_DIR,                                                                      #Folder target untuk digenerasi
	target_size=(150,150),                                                          #Mengubah resolusi seluruh gambar menjadi 150x150 piksel
	class_mode='categorical',                                                       #Kelas data kategori untuk klasifikasi multivariabel
  shuffle=True,
  subset='validation'                                                             #Untuk data validasi
  )

Membangun Model Jaringan Saraf Tiruan

Model yang digunakan adalah model Sequential

model = tf.keras.models.Sequential([                                              #Membentuk model sequential
                                                                                  #Bentuk input adalah gambar dengan ukuran 150x150 dengan 3 byte warna
    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)), #Layer Konvolusi pertama
    tf.keras.layers.MaxPooling2D(2, 2),
    
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),                         #Layer Konvolusi kedua
    tf.keras.layers.MaxPooling2D(2,2), 
    
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),                         #Layer Konvolusi ketiga
    tf.keras.layers.MaxPooling2D(2,2),
    
    tf.keras.layers.Flatten(),                                                    #Layer input untuk Deep Learning Neural Network
    tf.keras.layers.Dropout(0.5),
    
    tf.keras.layers.Dense(128, activation='relu'),                                #Hiden layer pertama dengan 512 neuron
    
    tf.keras.layers.Dense(512, activation='relu'),                                #Hiden layer kedua dengan 512 neuron
    
    tf.keras.layers.Dense(3, activation='softmax')                                #Layer output
])

model.summary()                                                                   #Menampilkan summary model

Melatih Model Jaringan Saraf Tiruan

history=model.fit(
    train_generator,                                                              #Data training hasil generasi
    steps_per_epoch=4,                                                            #Jumlah batch yang akan dieksekusi pada setiap epoch
    epochs=25,                                                                    #Jumlah perulangan komputasi(epoch)
    validation_data=validation_generator,                                         #Menampilkan akurasi pengujian data validasi
    validation_steps=4,                                                           #Jumlah batch yang akan dieksekusi pada setiap epoch
    verbose=2
    )

Ploting Akurasi Training dan Validasi

Melihat pergerakan besaran nilai akurasi Training dan Validasi

import matplotlib.pyplot as plt                                                   #Mengimpor modul matplotlib
acc = history.history['accuracy']                                                 #Nilai akurasi training
val_acc = history.history['val_accuracy']                                         #Nilai akurasi validasi
loss = history.history['loss']                                                    #Nilai loss training
val_loss = history.history['val_loss']                                            #Nilai loss validasi

epochs = range(len(acc))                                                          #Jumlah epoch

plt.plot(epochs, acc, 'r', label='Akurasi Training ')                             #Plot nilai akurasi training                     
plt.plot(epochs, val_acc, 'b', label='Akurasi Validasi')                          #Plot nilai akurasi validasi
plt.title('Akurasi Training dan Validasi')                                        #Menamai gambar
plt.legend(loc=0)                                                                 #Menampilkan legenda
plt.figure()                                                                      
plt.show()

Uji Coba Model Klasifikasi Gambar Tangan Gunting, Batu, Kertas

Melakukan simulasi klasifikasi, mengunggah gambar dan model menentukan apakah gambar tersebut merupakan gambar tangan yang membentuk Gunting, Batu, atau Kertas

import numpy as np                                                                #Mengimpor modul numpy
from google.colab import files                                                    #Mengimpor modul import file
from keras.preprocessing import image                                             #Mengimpor modul keras_preprocessing untuk gambar

uploaded = files.upload()                                                         #Mengunggah gambar yang akan dikenali model

for fn in uploaded.keys():

  path = fn
  img = image.load_img(path, target_size=(150, 150))                              #Mengubah ukuran gambar menjadi 150x150 piksel
  imgplot = plt.imshow(img)                                                       #Menampilkan gambar yang diunggah
  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][0]==1:
    print('Tangan Ini Menunjukkan bentuk KERTAS')                                 #Jika gambar tangan membentuk Kertas, tampilkan tulisan "Kertas"
  elif classes[0][1]==1:
    print('Tangan Ini Menunjukkan bentuk BATU')                                   #Jika gambar tangan membentuk Batu, tampilkan tulisan "Batu"
  elif classes[0][2]==1:
    print('Tangan Ini Menunjukkan bentuk GUNTING')                                #Jika gambar tangan membentuk Gunting, tampilkan tulisan "Gunting"
  else:
    print('Tidak Diketahui')                                                      #Jika gambar yang diunggah selain gambar tangan yang diinginkan, tampilkan "Tidak Diketahui"

Pada tahap ini kita telah berhasil memasukkan objek baru bergambar gunting, dan machine learning berhasil mengidentifikasi bahwa gambar tersebut memang gunting dengan tingkat akurasi 100%.

Pelajari lebih lanjut tentang Praktek Machine Learning dengan Teachable Machine :

Ref : [1][2][3][4][5]