Program ini akan melatih model untuk mengenali 100 kelas objek berbeda dari gambar berukuran kecil (32x32 piksel). Saya akan menjelaskan tujuan program, struktur kode, dan membedah setiap bagian secara rinci.
Penjelasan Program
Tujuan Program: Program ini bertujuan untuk membangun, melatih, dan mengevaluasi model CNN untuk mengklasifikasikan gambar dari dataset CIFAR-100, yang berisi 60.000 gambar berwarna (50.000 untuk pelatihan, 10.000 untuk pengujian) dengan 100 kelas berbeda (misalnya, apel, sepeda, kucing). Model ini menggunakan TensorFlow untuk membangun arsitektur CNN yang mampu mengekstrak fitur visual dari gambar dan mengklasifikasikannya dengan akurat.
Mengapa CNN? CNN sangat efektif untuk tugas computer vision karena mampu mendeteksi pola spasial (seperti tepi, tekstur, atau bentuk) melalui lapisan konvolusi dan pooling, yang cocok untuk dataset gambar kompleks seperti CIFAR-100.
Dataset: CIFAR-100 adalah dataset standar yang kompleks karena memiliki banyak kelas (100 kelas) dan gambar beresolusi rendah, yang menantang model untuk menangkap fitur yang relevan.
Apa Itu Dataset CIFAR-100?
CIFAR-100 adalah dataset gambar berwarna yang digunakan untuk tugas computer vision, khususnya klasifikasi gambar. Berikut detailnya:
Ukuran Dataset:
- 60.000 gambar berwarna (RGB) berukuran 32x32 piksel.
- Dibagi menjadi 50.000 gambar untuk pelatihan dan 10.000 gambar untuk pengujian.
Kelas:
- 100 kelas berbeda, masing-masing berisi 600 gambar (500 untuk pelatihan, 100 untuk pengujian).
- Kelas-kelas ini dikelompokkan ke dalam 20 superkelas (misalnya, superkelas "hewan besar" mencakup kelas seperti gajah, singa, dll.).
Struktur Label:
- Setiap gambar memiliki dua label: label "fine" (1 dari 100 kelas spesifik, seperti apel, kucing) dan label "coarse" (1 dari 20 superkelas).
Contoh Kelas:
- Fine: apel, sepeda, kucing, dll.
- Coarse: buah, kendaraan, mamalia, dll.
- Kompleksitas: CIFAR-100 lebih kompleks daripada CIFAR-10 karena jumlah kelas yang lebih banyak dan resolusi gambar yang rendah, membuatnya menantang untuk klasifikasi akurat.
Dataset ini tersedia langsung di TensorFlow (tensorflow.keras.datasets.cifar100) atau PyTorch (torchvision.datasets.CIFAR100), sehingga Anda tidak perlu mengunduhnya secara manual.
Kodingan Python :
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np
from tensorflow.keras.datasets import cifar100
# 1. Memuat dataset CIFAR-100
(x_train, y_train), (x_test, y_test) = cifar100.load_data(label_mode='fine')
# Normalisasi data (skala piksel dari 0-255 ke 0-1)
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# Daftar nama kelas (100 kelas)
class_names = [
'apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle', 'bicycle', 'bottle',
'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel', 'can', 'castle', 'caterpillar', 'cattle',
'chair', 'chimpanzee', 'clock', 'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',
'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster', 'house', 'kangaroo', 'keyboard',
'lamp', 'lawn_mower', 'leopard', 'lion', 'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain',
'mouse', 'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear', 'pickup_truck', 'pine_tree',
'plain', 'plate', 'poppy', 'porcupine', 'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket',
'rose', 'sea', 'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake', 'spider',
'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table', 'tank', 'telephone', 'television', 'tiger', 'tractor',
'train', 'trout', 'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman', 'worm'
]
# 2. Visualisasi beberapa gambar dari dataset
plt.figure(figsize=(15, 4))
for i in range(10):
plt.subplot(2, 5, i+1)
plt.imshow(x_train[i])
plt.title(f"{class_names[y_train[i][0]]} ({y_train[i][0]})")
plt.axis('off')
plt.suptitle("10 Contoh Gambar dari CIFAR-100")
plt.show()
# 3. Augmentasi data untuk pelatihan
train_datagen = ImageDataGenerator(
rotation_range=15,
width_shift_range=0.1,
height_shift_range=0.1,
horizontal_flip=True,
zoom_range=0.1
)
train_datagen.fit(x_train)
# 4. Membangun arsitektur model CNN
model = models.Sequential([
# Lapisan konvolusi pertama
layers.Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3)),
layers.BatchNormalization(),
layers.Conv2D(32, (3, 3), activation='relu', padding='same'),
layers.BatchNormalization(),
layers.MaxPooling2D((2, 2)),
layers.Dropout(0.25),
# Lapisan konvolusi kedua
layers.Conv2D(64, (3, 3), activation='relu', padding='same'),
layers.BatchNormalization(),
layers.Conv2D(64, (3, 3), activation='relu', padding='same'),
layers.BatchNormalization(),
layers.MaxPooling2D((2, 2)),
layers.Dropout(0.25),
# Lapisan konvolusi ketiga
layers.Conv2D(128, (3, 3), activation='relu', padding='same'),
layers.BatchNormalization(),
layers.Conv2D(128, (3, 3), activation='relu', padding='same'),
layers.BatchNormalization(),
layers.MaxPooling2D((2, 2)),
layers.Dropout(0.25),
# Flatten dan lapisan dense
layers.Flatten(),
layers.Dense(512, activation='relu'),
layers.BatchNormalization(),
layers.Dropout(0.5),
layers.Dense(100, activation='softmax') # 100 kelas untuk CIFAR-100
])
# 5. Mengompilasi model
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Menampilkan ringkasan model
model.summary()
# 6. Melatih model dengan augmentasi
batch_size = 64
history = model.fit(
train_datagen.flow(x_train, y_train, batch_size=batch_size),
epochs=8,
validation_data=(x_test, y_test),
steps_per_epoch=len(x_train) // batch_size
)
# 7. Mengevaluasi model
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"\nAkurasi pada data uji: {test_acc:.4f}")
# 8. Visualisasi hasil pelatihan
plt.figure(figsize=(12, 4))
# Plot akurasi
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Akurasi Pelatihan')
plt.plot(history.history['val_accuracy'], label='Akurasi Validasi')
plt.title('Akurasi Model')
plt.xlabel('Epoch')
plt.ylabel('Akurasi')
plt.legend()
# Plot loss
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Loss Pelatihan')
plt.plot(history.history['val_loss'], label='Loss Validasi')
plt.title('Loss Model')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()
# 9. Prediksi dan visualisasi hasil pada data uji
predictions = model.predict(x_test[:10])
plt.figure(figsize=(15, 4))
for i in range(10):
plt.subplot(2, 5, i+1)
plt.imshow(x_test[i])
predicted_label = np.argmax(predictions[i])
true_label = y_test[i][0]
plt.title(f"Pred: {class_names[predicted_label]}\nTrue: {class_names[true_label]}")
plt.axis('off')
plt.suptitle("Prediksi pada 10 Gambar Uji")
plt.show()
HASIL :
Epoch 1/8
/usr/local/lib/python3.11/dist-packages/keras/src/trainers/data_adapters/py_dataset_adapter.py:121: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.
781/781 ━━━━━━━━━━━━━━━━━━━━ 455s 573ms/step - accuracy: 0.0742 - loss: 4.5615 - val_accuracy: 0.2055 - val_loss: 3.3738
self._interrupted_warning()
781/781 ━━━━━━━━━━━━━━━━━━━━ 20s 25ms/step - accuracy: 0.1875 - loss: 3.1215 - val_accuracy: 0.2010 - val_loss: 3.4069
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 341ms/step
No comments:
Post a Comment