Continue as Suhardi
Save
Assalamualaikum, Setelah lama tidak menulis artikel dan tutorial, akhirnya diriku ke-
pikiran juga buat nulis ini karena ini cukup penting sih tapi kadang suka lupa, jadi
akhirnya cari-cari lagi materi tentang ini di internet, jadi daripada nanti diriku mencari-
cari lagi dan bingung sendiri mungkin sebaiknya bikin tutorial nya saja sekalian. Biar tidak
bingung.dan di sini tensorflow yang digunakan adalah tensorflow 2.1 yang terbaru. sudah
tidak menggunakan keras lagi. Kemudian mari kita masuk ke outline nya dulu.
• Mempersiapkan dataset
• Meng-Compile Model
• Model Training
• Model Save
• Model Evaluation
Jika membutuhkan pendalaman lebih lanjut mengenai image classification kalian bisa
mengunjungi Youtube/ Cari di Google. Pasti sudah banyak sih referensi nya. Dan tujuan
dari menulis ini adalah karena tensorflow sudah mengeluarkan versi 2.x maka sudah
saatnya upgrade dari yang sebelumnya menggunakan keras menjadi tf.keras dan
dalam prosesnya modul tf.keras ini lebih efisien dibandingkan dengan sebelumnya.
• Google Account untuk mengakses Google Colab (Pake di lokal juga bisa)
• Scikit-learn
Mempersiapkan Data-set
Ya kita siapkan dulu data-setnya, Di sini kita gunakan contoh gambar/ image bunga dari
kaggle saja biar enak untuk datanya bisa klik di sini .
Pertama tama kita extract terlebih dahulu datanya, lalu treedir nya akan seperti ini. saat
data pertama kali di extract.
└── flowers
├── daisy
├── dandelion
├── flowers
│ ├── daisy
│ ├── dandelion
│ ├── rose
│ ├── sunflower
│ └── tulip
├── rose
├── sunflower
└── tulip
Dalam proses yang pertama ini, kita ingin membagi datanya menjadi 3 bagian. yaitu train,
test, dan validation. dengan proporsi (80,10,10).
Kemudian, pada proses ini kita ingin membagi datanya menjadi seperti ini.
├── dataset
│ ├── test
│ │ ├── daisy
│ │ ├── dandelion Open in app Get started
│ │ ├── rose
│ │ ├── sunflower
│ │ └── tulip
│ ├── train
│ │ ├── daisy
│ │ ├── dandelion
│ │ ├── rose
│ │ ├── sunflower
│ │ └── tulip
│ └── validation
│ ├── daisy
│ ├── dandelion
│ ├── rose
│ ├── sunflower
│ └── tulip
# Batch size
batch_size = 16
# Epoch
epoch = 10
Fungsi tersebut merupakan Image data generator sehingga kita mengenerate data image
dari sebuah file / folder yang telah kita buat sebelumnya. pada bagian ini kita dapat
menentukan generator / augmentasi seperti apa yang dapat dilakukan.
Pertama tama kita mendefinisikan terlebih dahulu bagaimana transformasi data yang
akan digunakan.
• target size = dimensi dari citra yang akan digunakan dalam proses training
• batch size = banyaknya citra yang dimasukan dalam setiap steps training.
# categorical = 1,2,3,4,5
• shuffle = data didalam folder tersebut diacak sehingga tidak sesuai urutan yang ada
seperti urutan alfabetik.
• Input_shape = merupakan dimensi dari gambar yang akan kita gunakan/ input dari
citra
• Include top = adalah perintah untuk menyertakan apakah model yang digunakan
akan disertakan dengan top layer dari arsitektur network tersebut atau misalkan top
network tersebut memiliki 3 node yaitu : flatten layer, layer dengan 1024 node dan
fungsi aktivasinya, lalu prediction node dimana jumlah node sesuai dengan
banyaknya jumlah kelas.
Dikarenakan jumlah kelas pada imagenet adalah 1000 maka ini tidak cocok dengan
jumlah kelas yang kita miliki yaitu hanya 5. sehingga include top di sini adalah false.
• Weights = adalah bobot dari masing-masing layer yang sudah di training berdasarkan
bobot imagenet. Kita juga bisa meniadakan ini dengan menggunakan None Namun
ketika tidak menggunakan pre-trained weight proses training kita akan lebih lama
karena initial value dari weight nya random sehingga perlu banyak penyesuaian
terhadap data yang akan kita gunakan.
Setelah berhasil maka base-model sudah terbentuk dan selanjutnya adalah menambahkan
top layer yang akan kita definisikan karena kita set false pada base model di atas.
Bisa kita lihat bahwa top layer yang kita definisikan sudah masuk kedalam model. Dan
model bisa kita compile sehingga dapat digunakan untuk training.
Compile model
Pada proses ini kita meyusun model menjadi siap dilakukan proses training. Dimana
variabel yang digunakan adalah-
sebagai berikut:
• loss = adalah metode pengukuran nilai loss berdasarkan pada nilai apa. karena
Membuat flow datanya kita menggunakan categorical sehingga pada nilai loss ini kita
juga menggunakan categorical loss.
Open in app Get started
• Metrics = Nilai matriks yang diukur pada project ini kita menggunakan nilai akurasi
sebagai nilai pengukurannya. Untuk lainnya bisa baca di sini
Visualisasi Model
Kita bisa memvisualisasikan model menggunakan perintah berikut.
model_viz = tf.keras.utils.plot_model(model,
to_file='model.png',
show_shapes=True,
show_layer_names=True,
rankdir='TB',
expand_nested=True,
dpi=55)
model_viz
EPOCH = 5
history = model.fit(x=train_data,
steps_per_epoch=len(train_generator),
epochs=EPOCH,
validation_data=val_data,
validation_steps=len(val_generator),
shuffle=True,
verbose = 1)
Dimana:
• X = merupakan data generator yang sudah kita proses sehingga menjadi tf-data ini
merupakan data training.
• Steps per epoch merupakan banyaknya steps / langkah untuk menyelesaikan 1 epoch,
disini 1 steps merupakan 1 batch_size / 1 batch_size adalah 16 citra, seperti yang
sudah di definisikan diatas.
• Verbose =menampilkan progress bar dimana 1 karena kita dapat melihat proses dan
hasil dari setiap steps seperti gambar dibawah nanti.
Mari kita tunggu sampai proses training selesai. Dari hasil diatas bisa kita baca bahwa
akurasi pada data training adalah 0.70 dan nilai lossnya adalah 0.91, Kemudian untuk
data validasinya adalah 0.544 dan nilai lossnya adalah 2.388. Namun ini baru iterasi
pertama. Sehingga kita bisa menunggu untuk iterasi berikutnya / hingga model selesai
dilatih dengan 5 iterasi.
Dan hasil training nya adalah seperti itu, Hasil tersebut rupanya tidak bagus ternyata
untuk model ini. Di mana
Dimana nilai loss pada data validasi adalah cenderung tidak stabil. Sehingga bisa dibilang
model ini overfit terhadap data training namun belum tentu. Perlu percobaan lebih lanjut
apakah model ini overfit atau tidak.
Open in app Get started
Begitu juga dengan nilai akurasi nya. Di mana nilai akurasi untuk data validasi cenderung
tidak stabil sehingga model ini kurang baik. Maka diperlukan penelitian lebih lanjut untuk
mencari model yang terbaik. Bisa dilakukan training ulang atau mengganti dengan model
/ network yang baru.
MODEL_BASE_PATH = "model"
PROJECT_NAME = "medium_project"
SAVE_MODEL_NAME = "model.h5"
save_model_path = os.path.join(MODEL_BASE_PATH, PROJECT_NAME,
SAVE_MODEL_NAME)
if os.path.exists(os.path.join(MODEL_BASE_PATH, PROJECT_NAME)) ==
False:
os.makedirs(os.path.join(MODEL_BASE_PATH, PROJECT_NAME))
Model pertama merupakan model.h5 yang tanpa optimizer dan model2.h5 adalah model
dengan optimizer didalamnya. Sehingga perbedaannya adalah 3 kali lipat dari model
tanpa optimizer. ini sangat menghemat penyimpanan.
loss, acc =
model.evaluate(test_data,steps=len(test_generator),verbose=0)
print('Accuracy on training data: {:.4f} \nLoss on training data:
{:.4f}'.format(acc,loss),'\n')
loss, acc =
model.evaluate(test_data,steps=len(test_generator),verbose=0)
print('Accuracy on test data: {:.4f} \nLoss on test data:
{:.4f}'.format(acc,loss),'\n')
Dari hasil tersebut dilihat bahwa model cukup stabil di kedua data sehingga dapat
disarankan untuk melakukan training lagi atau dapat mencari algoritma / model yang
lain seperti inception_v2 ataupun inception_resnet.
Untuk kode lengkapnya, bisa dilihat di notebook ini pada notebook ini saya contohkan juga
menggunakan efficient-net dimana efficient net merupakan model yang terbaik pada
#SOTA-1 Image-net.
Open in app Get started
import requests
from io import BytesIO
# Parameters
input_size = (150,150) # Bisa kalian ganti
#define labels
labels = ['daisy', 'dandelion', 'rose', 'sunflower', 'tulip']
Dimana kita input kan sesuai dengan nilai yang sama seperti pada saat proses training.
untuk label nya bisa kita urutkan sesuai dengan abjad atau pada saat proses training. label
nya disimpan seperti gambar berikut :
Lalu selanjutnya adalah mendefinisikan fungsi pre-process, dimana fungsi ini adalah
mengubah sebuah citra menjadi sebuah array yang cocok untuk masuk kedalam model
Open in app Get started
yang sudah kita latih.
def preprocess(img,input_size):
nimg = img.convert('RGB').resize(input_size, resample= 0)
img_arr = (np.array(nimg))/255
return img_arr
def reshape(imgs_arr):
return np.stack(imgs_arr, axis=0)
fungsi diatas merupakan fungsi mengubah image menjadi array dimana image diubah
menjadi frormat RGB kemudian dilakukan resize dengan metode interpolasi Nearest-
neighbor default dari library tersebut.
Setelah itu melakukan reshape array yang awalnya adalah 3 dimensi, menjadi 4 dimensi,
atau bisa disebut tensor.
Kemudian selanjutnya adalah melakukan load model yang sudah di training. Load model
tersebut dapat lakukan dengan menggunakan perintah berikut.
MODEL_PATH = 'model/medium_project/model.h5'
model = load_model(MODEL_PATH,compile=False)
Setelah model yang sudah dilatih telah berhasil dimuat. maka selanjutnya adalah
melakukan prediksi terhadap sebuah gambar. Misalnya kita memiliki contoh gambar
berikut :
Open in app Get started
219 9
Lalu kemudian perintahnya adalah sebagai berikut:
# read image
im = Image.open('contoh_prediksi.jpg')
X = preprocess(im,input_size)
X = reshape([X])
y = model.predict(X)
Di mana, pada perintah di atas kita membuka image / citra . Kemudian, kita melakukan
Get the Medium
preprocess app menjadi sebuah numpy.array yang kemudian direshape menjadi sebuah
imagenya
Open in app Get started
tensor. Setelah itu memprediksi termasuk bunga apakah gambar tersebut.
Hasilnya adalah seperti gambar diatas. Variabel y merupakan nilai dari hasil prediksi yang
menghasilkan banyak nilai. Di mana nilai-nilai tersebut adalah nilai dari masing-masing
kategori.
Kemudian kita mencari nilai ter-besarnya, yaitu pada kolom ke 4 yang merupakan kelas tulip
berdasarkan label yang sudah di definisikan di atas. dan dengan nilai probabilitas ~0.91-.
Untuk kode lengkap pada proses prediksi, dapat dilihat pada notebook berikut.
Open in app Get started