dyb læring til påvisning af lungebetændelse fra røntgenbilleder

sidder fast bag Betalingsvæggen? Klik her for at læse hele historien med min ven Link!risikoen for lungebetændelse er enorm for mange, især i udviklingslande, hvor milliarder står over for energifattigdom og er afhængige af forurenende former for energi. Den der vurderer, at over 4 millioner for tidlige dødsfald forekommer årligt fra husholdnings luftforureningsrelaterede sygdomme, herunder lungebetændelse. Over 150 millioner mennesker bliver smittet med lungebetændelse på årsbasis, især børn under 5 år. I sådanne regioner kan problemet forværres yderligere på grund af manglen på medicinske ressourcer og personale. For eksempel findes der i Afrikas 57 nationer et hul på 2,3 millioner læger og sygeplejersker. For disse populationer betyder præcis og hurtig diagnose alt. Det kan garantere rettidig adgang til behandling og spare meget tiltrængt tid og penge for dem, der allerede oplever fattigdom.

dette projekt er en del af brystet røntgenbilleder (lungebetændelse) afholdt på Kaggle.

Byg en algoritme til automatisk at identificere, om en patient lider af lungebetændelse eller ej ved at se på røntgenbilleder af brystet. Algoritmen skulle være ekstremt nøjagtig, fordi menneskers liv står på spil.

Miljø og værktøjer

  1. scikit-lær
  2. keras
  3. numpy
  4. pandaerne
  5. matplotlib

Data

datasættet kan downloades fra kaggle hjemmeside, som kan findes her.

hvor er koden?

lad os komme i gang med koden uden meget ado. Det komplette projekt på github kan findes her.

lad os starte med at indlæse alle biblioteker og afhængigheder.

næste viste jeg nogle normale og lungebetændelsesbilleder for bare at se på, hvor meget forskellige de ser ud fra det blotte øje. Nå ikke meget!

sample images

derefter delte jeg datasættet i tre sæt-tog, validering og testsæt.

næste jeg skrev en funktion, hvor jeg gjorde nogle data augmentation, fodret uddannelse og test sæt billeder til netværket. Jeg har også lavet etiketter til billederne.

udøvelsen af dataforstørrelse er en effektiv måde at øge størrelsen på træningssættet. Forøgelse af træningseksemplerne gør det muligt for netværket at “se” mere diversificerede, men stadig repræsentative datapunkter under træningen.

så definerede jeg et par datageneratorer: en til træningsdata og den anden til valideringsdata. En datagenerator er i stand til at indlæse den krævede mængde data (en mini — batch af billeder) direkte fra kildemappen, konvertere dem til træningsdata (fodret til modellen) og træningsmål (en vektor af attributter-overvågningssignalet).

til mine eksperimenter indstiller jeg normaltbatch_size = 64. Generelt skal en værdi mellem 32 og 128 fungere godt. Normalt skal du øge/formindske batchstørrelsen i henhold til beregningsressourcer og modelens præstationer.

derefter definerede jeg nogle konstanter til senere brug.

det næste trin var at bygge modellen. Dette kan beskrives i de følgende 5 trin.

  1. jeg brugte fem konvolutionsblokke bestående af konvolutionslag, maks.pooling og batch-normalisering.
  2. oven på det brugte jeg et fladlag og fulgte det med fire fuldt tilsluttede lag.
  3. også imellem har jeg brugt dropouts til at reducere overmontering.
  4. aktiveringsfunktion var Relu overalt bortset fra det sidste lag, hvor det var Sigmoid, da dette er et binært klassificeringsproblem.
  5. jeg har brugt Adam som optimerings-og cross-entropi som tabet.

før træning er modellen nyttig til at definere en eller flere tilbagekald. Temmelig praktisk en, er: ModelCheckpoint og EarlyStopping.

  • ModelCheckpoint: når træning kræver meget tid for at opnå et godt resultat, kræves der ofte mange iterationer. I dette tilfælde er det bedre at gemme en kopi af den bedst mulige model kun, når en epoke, der forbedrer metrics, slutter.
  • Tidligtstop: nogle gange kan vi under træning bemærke, at generaliseringsgabet (dvs.forskellen mellem Trænings-og valideringsfejl) begynder at stige i stedet for at falde. Dette er et symptom på overfitting, der kan løses på mange måder (reduktion af modelkapacitet, stigende træningsdata, dataforstørrelse, regulering, frafald osv.). Ofte er en praktisk og effektiv løsning at stoppe træningen, når generaliseringsgabet bliver værre.

tidlig stop

næste trænede jeg modellen til 10 epoker med en batchstørrelse på 32. Bemærk, at en højere batchstørrelse normalt giver bedre resultater, men på bekostning af højere beregningsbyrde. Nogle undersøgelser hævder også, at der er en optimal batchstørrelse for de bedste resultater, som kunne findes ved at investere lidt tid på hyper-parameter tuning.

lad os visualisere tab og nøjagtighed plots.

nøjagtighed vs epoke | tab vs epoke

indtil videre så godt. Modellen konvergerer, hvilket kan observeres fra faldet i tab og valideringstab med epoker. Det er også i stand til at nå 90% valideringsnøjagtighed på kun 10 epoker.

lad os plotte forvirringsmatricen og få nogle af de andre resultater også som præcision, tilbagekaldelse, F1 score og nøjagtighed.

CONFUSION MATRIX ------------------

]
TEST METRICS ----------------------
Accuracy: 91.02564102564102%
Precision: 89.76190476190476%
Recall: 96.66666666666667%
F1-score: 93.08641975308642
TRAIN METRIC ----------------------
Train acc: 94.23

modellen er i stand til at opnå en nøjagtighed på 91,02%, hvilket er ret godt i betragtning af størrelsen af data, der bruges.

konklusioner

selvom dette projekt langt fra er afsluttet, men det er bemærkelsesværdigt at se succesen med dyb læring i så forskellige virkelige verdensproblemer. Jeg har demonstreret, hvordan man klassificerer positive og negative lungebetændelsesdata fra en samling røntgenbilleder. Modellen blev lavet fra bunden, som adskiller den fra andre metoder, der er stærkt afhængige af overførselsindlæringsmetode. I fremtiden kunne dette arbejde udvides til at opdage og klassificere røntgenbilleder bestående af lungekræft og lungebetændelse. At skelne røntgenbilleder, der indeholder lungekræft og lungebetændelse, har været et stort problem i nyere tid, og vores næste tilgang bør være at tackle dette problem.



Skriv et svar

Din e-mailadresse vil ikke blive publiceret.