Melatih CNN dari nol butuh data dan waktu; proyek ini membuktikan bahwa bobot yang sudah terlatih pada tugas lain bisa menjadi titik awal yang jauh lebih hemat. Kita menyiapkan “model pretrained” tanpa unduhan — sebuah backbone CNN yang dilatih pada tugas A (digit 0-4) — kemudian memakainya untuk tugas B (digit 5-9) yang hanya memiliki 30 sampel latih. Sebagai pembanding yang jujur, arsitektur yang sama juga dilatih dari bobot acak, lalu keduanya dievaluasi dengan anggaran epoch yang sama sehingga nilai transfer learning terukur angka demi angka.

Strategi tanpa unduhan ini mengikuti pola chapter Transfer Learning untuk Gambar : dalam praktik nyata Anda cukup mengganti sumber bobotnya dengan torchvision.models (misalnya ResNet18) — alur muat-bekukan-ganti head-latih tetap sama persis. Seluruh eksperimen berjalan di CPU dalam hitungan detik per skrip, seeded penuh, dan hasilnya identik setiap eksekusi.

Prasyarat #

Sebelum masuk ke pengerjaan, pastikan materi berikut sudah dikuasai:

Perilaku Akhir yang Dituju #

Empat skrip di src/ membentuk satu alur eksperimen yang dijalankan berurutan dari folder proyek:

bash
python3 src/pretrained.py     # latih backbone tugas A (digit 0-4)
python3 src/transfer.py       # bekukan backbone, latih head tugas B
python3 src/dari_nol.py       # pembanding: arsitektur sama, dari nol
python3 src/bandingkan.py     # tabel hasil kedua strategi

Ringkasan hasilnya (tabel lengkap dibahas pada Bagian 4):

text
strategi               epoch akurasi uji      param dilatih      param total
transfer (backbone beku)    10       0.835               2565             7365
dari nol                  10       0.680               7365             7365
transfer (backbone beku)    40       0.880               2565             7365
dari nol                  40       0.890               7365             7365

Dengan anggaran 10 epoch, transfer learning unggul 0.155 akurasi sambil hanya melatih 2.565 parameter — sekitar sepertiga dari parameter yang harus dilatih model dari nol. Ketika anggaran dinaikkan ke 40 epoch, model dari nol berhasil menyusul; itulah pelajaran jujur proyek ini: keunggulan transfer learning paling besar justru ketika data dan anggaran pelatihan sangat terbatas.

Struktur Berkas #

text
transfer-learning-dengan-model-pretrained/
├── _index.md
├── bagian/                      # empat tahap pengerjaan
│   ├── memilih-model-pretrained/
│   ├── menyiapkan-dataset/
│   ├── fine-tuning-model/
│   └── membandingkan-hasil/
├── data/
│   └── README.md                # strategi "pretrained" tanpa unduhan
├── src/
│   ├── pretrained.py            # latih backbone tugas A + util bersama
│   ├── transfer.py              # freeze + head baru + latih head
│   ├── dari_nol.py              # pembanding dari bobot acak
│   ├── bandingkan.py            # tabel hasil dua anggaran epoch
│   └── __init__.py
├── tests/
│   ├── test_backbone.py         # uji bentuk, parameter, save-load
│   └── test_freeze.py           # uji requires_grad False + gradien
└── laporan/
    └── LAPORAN.md               # template laporan proyek

Seluruh berkas pada src/, tests/, dan data/ dapat diunduh dari bagian Berkas Sumber di bawah halaman ini dan setiap bagian pengerjaan.

Tahapan Pengerjaan #

Proyek dikerjakan dalam empat bagian berurutan, dan setiap bagian menghasilkan kode yang benar-benar dapat dijalankan:

  1. Bagian 1 — Memilih Model Pretrained: membangun backbone “pretrained” pada tugas A dan memahami kriteria pemilihan model.
  2. Bagian 2 — Menyiapkan Dataset: mengambil 30 sampel tugas B dengan seed tetap agar semua skrip melihat data yang sama.
  3. Bagian 3 — Fine-Tuning Model: membekukan backbone, memasang head baru, dan melatih head saja.
  4. Bagian 4 — Membandingkan Hasil: menyusun tabel transfer vs dari nol pada dua anggaran epoch.

Mulailah dari Bagian 1 karena keputusan arsitektur backbone di sana menentukan apa yang bisa dibekukan pada Bagian 3 dan apa yang adil dibandingkan pada Bagian 4.