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:
- Transfer Learning untuk Gambar — konsep freeze, head baru, dan fine-tuning yang kita praktikkan.
- Arsitektur CNN — blok convolution dan pooling pada backbone.
- Training Loop — cetakan pelatihan yang dipakai ulang di keempat skrip.
- Penyimpanan dan Pemuatan Model
— mekanisme
state_dictuntuk memindahkan bobot backbone.
Perilaku Akhir yang Dituju #
Empat skrip di src/ membentuk satu alur eksperimen yang dijalankan berurutan dari folder proyek:
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 strategiRingkasan hasilnya (tabel lengkap dibahas pada Bagian 4):
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 7365Dengan 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 #
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 proyekSeluruh 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:
- Bagian 1 — Memilih Model Pretrained: membangun backbone “pretrained” pada tugas A dan memahami kriteria pemilihan model.
- Bagian 2 — Menyiapkan Dataset: mengambil 30 sampel tugas B dengan seed tetap agar semua skrip melihat data yang sama.
- Bagian 3 — Fine-Tuning Model: membekukan backbone, memasang head baru, dan melatih head saja.
- 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.
Bangun backbone CNN terlatih pada tugas A (digit 0-4) sebagai pengganti model pretrained unduhan, lalu pahami kriteria pemilihannya.
Buka → # Bagian 2: Menyiapkan DatasetAmbil 30 sampel latih tugas B (digit 5-9) dengan seed tetap, periksa sebaran kelasnya, dan pahami mengapa semua skrip harus melihat data yang sama.
Buka → # Bagian 3: Fine-Tuning ModelBekukan seluruh parameter backbone dengan requires_grad=False, pasang head baru untuk tugas B, lalu latih head saja pada 30 sampel.
Buka → # Bagian 4: Membandingkan HasilLatih arsitektur yang sama dari bobot acak, lalu bandingkan transfer learning versus dari nol pada dua anggaran epoch dalam satu tabel hasil nyata.
Buka → # Buka → # Buka →