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 #
python3 src/latih_cnn.pyOutput yang Dihasilkan:
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.ptCNN 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):
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 | BENARNilai 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:
| Pertanyaan | Hasil nyata |
|---|---|
| CNN dari nol, 72 gambar latih | akurasi uji 0.917 |
| Dari nol, hanya 24 gambar | akurasi uji 0.667 |
| Transfer (pra-latih 48, kepala baru) | akurasi uji 0.875 |
| Kelas paling sulit | burung (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.