Saya menemukan
sebuah artikel di blog perusahaan School of Data dan memutuskan untuk memeriksa apa yang perpustakaan Fast.ai mampu pada dataset yang sama yang disebutkan dalam artikel. Di sini Anda tidak akan menemukan argumen tentang betapa pentingnya mendiagnosis pneumonia secara tepat waktu dan benar, apakah ahli radiologi akan diperlukan dalam kondisi perkembangan teknologi, apakah prediksi jaringan saraf dapat dianggap sebagai diagnosis medis, dll. Tujuan utamanya adalah untuk menunjukkan bahwa pembelajaran mesin di perpustakaan modern bisa sangat sederhana (secara harfiah memerlukan beberapa baris kode) dan memberikan hasil yang sangat baik. Mari kita ingat hasil dari artikel (presisi = 0,84, ingat = 0,96) dan lihat apa yang terjadi dengan kita.
Kami mengambil data untuk pelatihan
dari sini . Data tersebut adalah 5.856 x-ray yang didistribusikan dalam dua kelas - dengan atau tanpa tanda-tanda pneumonia. Tugas dari jaringan saraf adalah untuk memberi kita classifier biner berkualitas tinggi dari gambar X-ray untuk menentukan tanda-tanda pneumonia.
Kami mulai dengan mengimpor perpustakaan dan beberapa pengaturan standar:
%reload_ext autoreload %autoreload 2 %matplotlib inline from fastai.vision import * from fastai.metrics import error_rate import os
Selanjutnya, tentukan ukuran batch. Saat belajar pada GPU, penting untuk memilihnya sedemikian rupa sehingga memori Anda tidak penuh. Jika perlu, itu bisa dibelah dua.
bs = 64
Pembaruan Penting:Seperti yang benar dicatat dalam komentar di bawah ini, penting untuk secara jelas memantau data di mana model akan dilatih dan di mana kami akan menguji efektivitasnya. Kami akan melatih model dalam gambar di folder kereta dan val, dan memvalidasi dalam gambar di folder tes, mirip dengan apa yang dilakukan di
sini .
Kami menentukan jalur ke data kami
path = Path('storage/chest_xray') path.ls()
dan periksa apakah semua folder sudah ada (folder val telah dipindahkan untuk melatih):
Out: [PosixPath('storage/chest_xray/train'), PosixPath('storage/chest_xray/test')]
Kami sedang mempersiapkan data kami untuk "memuat" ke dalam jaringan saraf. Penting untuk dicatat bahwa di Fast.ai ada beberapa metode untuk mencocokkan label gambar. Metode from_folder memberi tahu kita bahwa label harus diambil dari nama folder tempat gambar berada.
Parameter ukuran berarti bahwa kami mengubah ukuran semua gambar ke ukuran 299x299 (algoritma kami bekerja dengan gambar persegi). Fungsi get_transforms memberi kita augmentasi gambar untuk meningkatkan jumlah data pelatihan (kami meninggalkan pengaturan default di sini).
np.random.seed(5) data = ImageDataBunch.from_folder(path, train = 'train', valid = 'test', size=299, bs=bs, ds_tfms=get_transforms()).normalize(imagenet_stats)
Mari kita lihat datanya:
data.show_batch(rows=3, figsize=(6,6))

Untuk memeriksanya, kami melihat kelas apa yang kami dapatkan dan distribusi kuantitatif gambar antara kereta dan validasi:
data.classes, data.c, len(data.train_ds), len(data.valid_ds)
Out: (['NORMAL', 'PNEUMONIA'], 2, 5232, 624)
Kami mendefinisikan model pelatihan berdasarkan arsitektur Resnet50:
learn = cnn_learner(data, models.resnet50, metrics=error_rate)
dan mulai belajar dalam 8 era berdasarkan
Kebijakan Satu Siklus :
learn.fit_one_cycle(8)

Kami melihat bahwa kami telah memperoleh akurasi 89% pada sampel validasi. Kami akan menuliskan bobot model kami untuk saat ini dan mencoba untuk meningkatkan hasilnya.
learn.save('step-1-50')
"Defrost" seluruh model, karena sebelum itu, kami melatih model hanya pada kelompok lapisan terakhir, dan bobot sisanya diambil dari model yang sudah dilatih sebelumnya di Imagenet dan “dibekukan”:
learn.unfreeze()
Kami mencari tingkat belajar yang optimal untuk terus belajar:
learn.lr_find() learn.recorder.plot()

Kami memulai pelatihan untuk 10 era dengan tingkat pembelajaran yang berbeda untuk setiap kelompok lapisan.
learn.fit_one_cycle(10, max_lr=slice(1e-6, 1e-4))

Kami melihat bahwa akurasi model kami sedikit meningkat menjadi 89,4% dalam sampel validasi.
Kami menuliskan bobotnya.
learn.save('step-2-50')
Bangun Matriks Kebingungan:
interp = ClassificationInterpretation.from_learner(learn) interp.plot_confusion_matrix()

Pada titik ini, kita ingat bahwa parameter akurasi saja tidak cukup, terutama untuk kelas yang tidak seimbang. Sebagai contoh, jika dalam kehidupan nyata pneumonia hanya terjadi pada 0,1% dari mereka yang menjalani pemeriksaan sinar-X, sistem hanya dapat memberikan tidak adanya pneumonia dalam semua kasus dan akurasinya akan berada pada level 99,9% dengan utilitas yang benar-benar nol.
Di sinilah peran Precision and Recall ikut berperan:
- TP - prediksi positif benar;
- TN - prediksi negatif benar;
- FP - prediksi positif salah;
- FN - Prediksi Negatif Salah.
Kami melihat bahwa hasil yang kami peroleh bahkan sedikit lebih tinggi daripada yang disebutkan dalam artikel. Dalam pekerjaan lebih lanjut pada tugas tersebut, perlu diingat bahwa mengingat kembali adalah parameter yang sangat penting dalam masalah medis, karena Kesalahan negatif palsu adalah yang paling berbahaya dari sudut pandang diagnosa (artinya kita bisa "mengabaikan" diagnosis berbahaya).