Het lukt mij niet om de 'eisen' van het model in de code vast te leggen. Ik besluit eerst maar iets eenvoudiger te gaan: Een "convolutional autoencoder". Klinkt goed, niet waar? Zo'n encoder is er normaliter op gerecht om een afbeelding op basis van zo weinig mogelijke informatie, weer opnieuw op te bouwen. In de kaggle competitie 2018 Data science bowl gaat het echter om celkernen herkennen. Lijkt mij ook een goede optie.
Ik ga uit van een eenvoudiger model dat hier wordt uitgelegd.
input_img = Input(shape=(28, 28, 1)) # adapt this if using `channels_first` image data format x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img) x = MaxPooling2D((2, 2), padding='same')(x) x = Conv2D(32, (3, 3), activation='relu', padding='same')(x) encoded = MaxPooling2D((2, 2), padding='same')(x) # at this point the representation is (7, 7, 32) x = Conv2D(32, (3, 3), activation='relu', padding='same')(encoded) x = UpSampling2D((2, 2))(x) x = Conv2D(32, (3, 3), activation='relu', padding='same')(x) x = UpSampling2D((2, 2))(x) decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x) autoencoder = Model(input_img, decoded) autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')Ook deze blijkt echter erg gevoelig voor aanpassing van de parameters. Op zich logisch omdat elke stap (modellaag) meebepalend is voor de output grootte die, voor deze doelstelling, uiteraard gelijk moet zijn aan de input-grootte. (Ik vergelijk afbeeldingen met een even groot masker).
Ik besluit door het toevoegen van 2 dense layers (en een flatten layer) het tussenformaat en het eindformaat te fixeren. De dense layer is een 1 dimensionale 'full connected' layer die zorgt voor een definieerbaar tussenformaat of eindformaat. Dat lijkt wel aardig te werken alleen krijg ik al snel een memory error. De flatten layer naar de 160x160 (formaat van de afbeeldingen) resulteert in teveel parameters. De oplossing is om er een extra, kleinere 'dense-layer' aan toe te voegen.
Nu blijft het programma in ieder geval lopen. Er worden echter maar een viertal verbeterde modellen gevonden. Daarna blijft het 'stil'.
Ivm de 'dense' layer bij de output van het model heb ik de maskers 'plat moeten slaan'. In plaats van 160 x 160 is het nu een groot array van 25600. Dat zou denk ik niet erg moeten zijn omdat er in de eindlaag toch iets meer met de afbeeldingsstructuur wordt gedaan. Wellicht dat ik de autoencoder moet loslaten en gewoon naar een uitgebreider convolutional model moet gaan met ook op het einde een dense layer.
Ik pak er een van de Keras site zelf. Het zogenaamde VGG-like convnet . Met 2x2 convolutional layers opgevolgd per laag door een pooling layer en een dropout layer. Uiteindelijk sluit het af met 2 dense layers. Kijk dat zou ook bij mijn probleem moeten passen!
Ook hier vindt het algoritme slechts enkele verbeteringen in de eerste ronde waarna het ook weer 'zwijgt'. Ik begrijp nog niet hoe dat mogelijk is. Er zou toch af en toe toevallig een iets betere oplossing gevonden moeten worden?!
Geen opmerkingen:
Een reactie posten