dinsdag 25 september 2018

To meta data or not to meta data ... that is the question

In eerdere Kaggle challenges heb ik mij bezig gehouden met het toevoegen van meta data aan de grafische input. Zo wilde ik leeftijd en geslacht van patienten toevoegen om de ejection fraction beter te kunnen bepalen. Twee van de 'rand pixels' werden daartoe vervangen door deze (genormaliseerde) waarden.  Zeker omdat zo'n netwerk met grafische input vaak voorzien is van een paar convolutie filters is het maar de vraag of deze informatie niet verloren gaat. Ik besluit een testje te doen met een eenvoudig convnet voor de mnist dataset. Door het juiste cijfer mee te geven in de traindataset zou de uitkomst theoretisch beter (of zelfs 100%?) moet zijn.
Voorbeelden mnist dataset 28x28 pixels

Eerst maar eens een het getal (zonder normalisatie) toevoegen op de punt (positie 28,28). Daar zit zelden of nooit onderscheidende informatie bij de cijfers.  Dit geeft een verrassende verslechtering van de nn prestaties:

('Score without metadata (loss/accuracy)', ['0.0265522748606435', '0.9922'])

('Score with metadata (loss/accuracy)', ['6.4423234634399416', '0.5369'])

Ik heb echter de meta data niet in de evaluatie gegevens meegegeven. Dat moet natuurlijk wel voor een eerlijk beeld. Dat kan de veel slechtere uitkomst verklaren. Als ik ze ook hier in meegeef is het resultaat als volgt:

('Score without metadata', ['0.0265522748606435', '0.9922'])

('Score with metadata', ['0.006079227873333753', '0.9984'])

Kijk, dat lijkt te werken!


Ik heb nu de waarde 0 .. 9 meegegeven op 'pixel' 28,28. De range van de matrix is echter 0 .. 255. Wat zou het effect zijn als ik de waardes meer daarmee in lijn breng? Bijv 0 .. 180 (met 20 vermenigvuldigen).

('Score without metadata', ['0.0265522748606435', '0.9922'])

('Score with metadata', ['0.0069435946228191365', '0.9982'])

Gek genoeg worden de resultaten ietsjes slechter. Maar niet veel.

Nu eens kijken of de locatie van de 'metadata pixel' veel uitmaakt. Ik zet ze nu ongeveer in het midden op positie 14,14.

('Score without metadata', ['0.0265522748606435', '0.9922'])

('Score with metadata', ['0.005850896729745045', '0.9987'])

Het lijkt zelfs beter te worden! Zou dat komen door het wegblijven van de rand? Nog een poging op pixel positie 3,3.  :

('Score without metadata', ['0.0265522748606435', '0.9922'])

('Score with metadata', ['0.0046265300370462', '0.9992'])

We naderen de 100% !!!! Vreemd? Misschien zit pixel 3,3 (feitelijk 4,4) niet op een relevante plaatst en zit toch ver genoeg van de rand af.

En als ik de waardes 2x aan de afbeeldingen toevoeg? Pixel 3,3 en 27,27 (28,28)

('Score without metadata', ['0.0265522748606435', '0.9922'])

('Score with metadata', ['0.004015776414667153', '0.999'])

In dezelfde ordegrootte. Met deze hoge scorings-percentages zie je ook natuurlijk niet veel verschil meer. Ik kijk nog even wat het effect is na 15 epochs ipv de tot nu toe gebruikte 10. Daarbij vul ik alleen pixel 3,3 (4,4).

('Score without metadata', ['0.0265522748606435', '0.9922'])

('Score with metadata', ['0.001790371450677344', '0.9995'])

Toch weer wat beter. Zeker de loss duikt van .0046 naar .0017.

Overall conclusie: Het toevoegen van metadata aan afbeeldingen kan zeker nuttig zijn mits de metadata uiteraard mede bepalend is voor de uitkomst. Ze 'vergaan' niet door het gebruik van convnet layers. Het is alleen beter om een positie te kiezen die iets van de rand af zit en die (meestal) niet onderscheidend is voor de afbeelding zelf. De data zelf hoeft niet daartoe perse te worden genormaliseerd. In ieder geval niet als de data 'in de buurt' van de overige waardes ligt. 







Geen opmerkingen:

Een reactie posten