Bagian eksperimen transfer learning telah menunjukkan keunggulan fitur yang dibekukan; kini kita kembali ke skenario utama proyek — CNN yang dilatih dari nol pada seluruh 72 gambar latih — dan membaca hasilnya secara menyeluruh. Bagian penutup ini menjalankan src/latih_cnn.py sampai akhir, memeriksa akurasi per kelas, menjalankan src/prediksi.py pada sampel nyata, lalu merangkum seluruh proyek ke dalam laporan.

Hasil Pelatihan dari Nol #

bash
python3 src/latih_cnn.py

Output yang Dihasilkan:

text
data       : 72 latih, 24 uji (16x16 grayscale, 3 kelas)
model      : CNN 8-16 channel (9571 parameter)
pelatihan  : Adam lr=0.001, batch 16, 15 epoch

epoch  1 | loss latih 1.1026 | akurasi uji 0.333
epoch  5 | loss latih 1.0757 | akurasi uji 0.625
epoch 10 | loss latih 0.9779 | akurasi uji 0.750
epoch 15 | loss latih 0.6814 | akurasi uji 0.917

akurasi uji akhir: 0.917

akurasi per kelas:
  kucing :  8/8
  ikan   :  8/8
  burung :  6/8

checkpoint tersimpan: /tmp/model_cnn_hewan.pt

CNN mencapai akurasi uji 0.917 — 22 dari 24 gambar benar. Rincian per kelas menunjukkan pola yang informatif: kucing dan ikan dikenali sempurna, sedangkan dua gambar burung salah. Kelas burung memang paling “sederhana” bentuknya — badan bulat kecil, paruh, dan ekor yang masing-masing hanya beberapa piksel — sehingga paruh yang mengecil karena jitter skala mudah tertutup derau. Pada dataset sekecil ini, dua kesalahan dari 24 uji berarti akurasi bergerak dalam satuan 0.042 per gambar; pembacaan angka selalu perlu disertai jumlah sampelnya.

Inferensi pada Sampel Uji #

Checkpoint yang tersimpan dimuat kembali oleh src/prediksi.py, yang menyusun ulang data uji dengan seed sama lalu memprediksi delapan gambar pertama:

Output yang Dihasilkan (python3 src/prediksi.py):

text
checkpoint : /tmp/model_cnn_hewan.pt
sampel     : 8 gambar pertama data uji

sampel # 0 | label burung  | prediksi burung  | keyakinan 0.422 | BENAR
sampel # 1 | label kucing  | prediksi kucing  | keyakinan 0.607 | BENAR
sampel # 2 | label ikan    | prediksi ikan    | keyakinan 0.361 | BENAR
sampel # 3 | label kucing  | prediksi kucing  | keyakinan 0.667 | BENAR
sampel # 4 | label kucing  | prediksi kucing  | keyakinan 0.581 | BENAR
sampel # 5 | label burung  | prediksi burung  | keyakinan 0.394 | BENAR
sampel # 6 | label ikan    | prediksi ikan    | keyakinan 0.454 | BENAR
sampel # 7 | label burung  | prediksi burung  | keyakinan 0.385 | BENAR

Nilai keyakinan (softmax) berkisar 0.36-0.67 — jauh dari 0.99 seperti pada proyek digit. Hal ini wajar untuk tiga kelas dengan derau: probabilitas terbagi ke tiga kelas dan model yang benar-benar yakin justru patut dicurigai overfitting pada data segenggam ini. Nama kelas tercetak berkat konstanta NAMA_KELAS yang ikut disimpan di checkpoint, sehingga skrip inferensi tidak perlu mengulang definisi kelasnya.

Merangkum Proyek #

Seluruh rantai proyek kini tertutup dan dapat diulang dari nol dengan tiga perintah — python3 data/generate_data.py, python3 src/latih_cnn.py, python3 src/latih_transfer.py — ditutup uji otomatis python3 tests/test_dataset.py dan python3 tests/test_model.py yang masing-masing diakhiri SEMUA TEST LULUS. Tabel berikut merangkum temuan inti proyek:

PertanyaanHasil nyata
CNN dari nol, 72 gambar latihakurasi uji 0.917
Dari nol, hanya 24 gambarakurasi uji 0.667
Transfer (pra-latih 48, kepala baru)akurasi uji 0.875
Kelas paling sulitburung (6/8)

Dari dua proyek pertama kita membawa satu pola yang makin lama makin jelas: kualitas model dibaca dari confusion dan kesalahannya, bukan hanya satu angka akurasi. Proyek berikutnya, Klasifikasi Penyakit Tanaman , melangkah lebih jauh — kesalahan prediksi tidak hanya dibaca, tetapi dianalisis sampai ke sampel individual yang salah.