Stapelt de beeldgegevens voor training
Om een neuraal netwerk raamwerk voor model training te kunnen gebruiken, kunnen we alle 28 x 28 = 784 waarden in een kolom stapelen. De gestapelde kolom voor het eerste record ziet er als volgt uit: (met x_train.reshape(1,784)
):
Dan kunnen we het model trainen met een standaard neuraal netwerk zoals weergegeven in figuur (B). Elk van de 784 waarden is een knooppunt in de inputlaag. Maar wacht, hebben we niet veel informatie verloren toen we de gegevens stapelden? Ja. De ruimtelijke en temporele relaties in een beeld zijn weggegooid. Dit is een groot verlies van informatie. Laten we eens kijken hoe de Convolutionele Autoencoders de ruimtelijke en temporele informatie kunnen behouden.
Waarom zijn de Convolutionele Autoencoders geschikt voor beeldgegevens?
We zien een enorm verlies van informatie bij het in plakken verdelen en stapelen van de gegevens. In plaats van de gegevens te stapelen, houden de Convolutie Autoencoders de ruimtelijke informatie van de ingevoerde beeldgegevens zoals zij zijn, en extraheren voorzichtig informatie in wat de Convolutie laag wordt genoemd. Figuur (D) laat zien dat een plat 2D-beeld wordt geëxtraheerd tot een dik vierkant (Conv1), vervolgens overgaat in een lange kubus (Conv2) en nog een langere kubus (Conv3). Dit proces is bedoeld om de ruimtelijke relaties in de gegevens te behouden. Dit is het codeerproces in een Autoencoder. In het midden bevindt zich een volledig aangesloten autoencoder waarvan de verborgen laag uit slechts 10 neuronen bestaat. Daarna komt het decoderingsproces dat de kubussen afvlakt tot een 2D plat beeld. De encoder en de decoder zijn symmetrisch in figuur (D). Ze hoeven niet symmetrisch te zijn, maar de meeste beoefenaars nemen deze regel gewoon over, zoals uitgelegd in “Anomalie Detectie met Autoencoders gemakkelijk gemaakt”.
Hoe werken de Convolutionele Autoencoders?
De bovenstaande data-extractie lijkt magisch. Hoe werkt dat eigenlijk? Het gaat om de volgende drie lagen: De convolutielaag, de reLu-laag en de poolinglaag.
- De Convolutielaag
De convolutiestap creëert vele kleine stukjes die de feature maps of kenmerken worden genoemd, zoals de groene, rode of marineblauwe vierkantjes in afbeelding (E). Deze vierkantjes behouden de relatie tussen pixels in het invoerbeeld. Laat elk kenmerk door het originele beeld scannen zoals in figuur (F). Dit proces bij het produceren van de scores wordt filteren genoemd.
Na het scannen van het originele beeld, levert elk kenmerk een gefilterd beeld op met hoge scores en lage scores, zoals te zien is in afbeelding (G). Als er een perfecte overeenkomst is, is er een hoge score in dat vakje. Als er een lage match of geen match is, is de score laag of nul. In het rode vierkant zijn bijvoorbeeld vier gebieden in het oorspronkelijke beeld gevonden die een perfecte overeenkomst met het kenmerk vertonen, dus de scores zijn hoog voor die vier gebieden.
Meer filters betekent meer kenmerken die het model kan extraheren. Meer kenmerken betekent echter een langere trainingstijd. U wordt dus geadviseerd een zo klein mogelijk aantal filters te gebruiken om de kenmerken te extraheren.
1.1 Padding
Hoe bepalen de kenmerken de overeenkomst? Een hyper-parameter is Padding die twee mogelijkheden biedt: (i) het oorspronkelijke beeld opvullen met nullen om het kenmerk te laten passen, of (ii) het deel van het oorspronkelijke beeld dat niet past laten vallen en het geldige deel behouden.
1.2 Strides
De convolutielaag bevat nog een parameter: de Stride. Het is het aantal pixels dat over de input matrix verschuift. Als de stride 1 is, verschuiven de filters 1 pixel per keer. We zullen het in onze Keras code zien als een hyper-parameter.
2. ReLUs Step
De Rectified Linear Unit (ReLU) is de stap die hetzelfde is als de stap in de typische neurale netwerken. Het corrigeert elke negatieve waarde tot nul om te garanderen dat de wiskunde zich correct gedraagt.
3. Max Pooling Layer
Pooling krimpt de beeldgrootte. In figuur (H) wordt een venster van 2 x 2, de poolgrootte genoemd, door elk van de gefilterde beelden gescand en wordt de maximumwaarde van dat venster van 2 x 2 toegewezen aan een vierkant van 1 x 1 in een nieuw beeld. Zoals geïllustreerd in figuur (H), is de maximumwaarde in het eerste venster van 2 x 2 een hoge score (rood), zodat de hoge score wordt toegewezen aan het vierkant van 1 x 1.
Naast het nemen van de maximumwaarde zijn er nog andere, minder gebruikelijke poolingmethoden, zoals de Average Pooling (het nemen van de gemiddelde waarde) of de Sum Pooling (de som).
Na het poolen wordt een nieuwe stapel kleinere gefilterde beelden geproduceerd. Nu splitsen we de kleinere gefilterde beelden en stapelen ze in een lijst zoals weergegeven in figuur (J).
Model in Keras
De bovenstaande drie lagen zijn de bouwstenen in het convolutieneuraal netwerk. Keras biedt de volgende twee functies:
Je kunt veel convolutielagen bouwen in de Convolution Autoencoders. In Figuur (E) zijn er drie lagen met de labels Conv1, Conv2 en Conv3 in het coderingsgedeelte. Dus zullen we dienovereenkomstig bouwen.
- De code onder
input_img = Input(shape=(28,28,1)
verklaart dat de 2D invoerafbeelding 28 bij 28 is. - Dan bouwt het de drie lagen Conv1, Conv2 en Conv3.
- Merk op dat Conv1 binnen Conv2 ligt en Conv2 binnen Conv3.
- De
padding
specificeert wat er moet gebeuren als de filter niet goed bij de invoerafbeelding past.padding='valid'
betekent het laten vallen van het deel van het beeld wanneer het filter niet past;padding='same'
vult het beeld met nullen om het beeld te laten passen.
Daarna gaat het verder met het decoderingsproces. Dus het decode
deel hieronder heeft alle gecodeerde en gedecodeerde.
De Keras api vereist de verklaring van het model en de optimalisatie methode:
-
Model(inputs= input_img,outputs= decoded)
: Het model zal alle lagen die nodig zijn in de berekening van de outputsdecoded
gegeven de invoergegevensinput_img
.compile(optimizer='adadelta',loss='binary_crossentropy')
: De optimalisator voert optimalisaties uit zoals de gradiënt decent dat doet. De meest voorkomende zijn stochastic gradient decent (SGD), Adapted gradient (Adagrad), en Adadelta dat een uitbreiding is van Adagrad. Zie de Keras optimizer documentatie voor de details. De verliesfuncties zijn te vinden in de Keras-verliezendocumentatie.
Hieronder train ik het model met x_train als zowel de invoer als de uitvoer. De batch_size
is het aantal monsters en de epoch
is het aantal iteraties. Ik specificeer shuffle=True
om te eisen dat de train data voor elk tijdperk wordt geschud.
We kunnen de eerste tien originele afbeeldingen en de voorspellingen voor dezelfde tien afbeeldingen afdrukken.
Hoe bouw je een Convolutie Autoencoder voor beeldruisonderdrukking?
Het idee van beeldruisonderdrukking is om een model te trainen met gegevens met ruis als invoer, en de overeenkomstige heldere gegevens als uitvoer. Dit is het enige verschil met het bovenstaande model. Laten we eerst ruis aan de gegevens toevoegen.
De eerste tien ruisige beelden zien er als volgt uit:
Dan trainen we het model met de ruisige gegevens als invoer, en de schone gegevens als uitvoer.
Tot slot drukken we de eerste tien afbeeldingen met ruis af, evenals de overeenkomstige afbeeldingen die zijn ontdaan van ruis.
De notebook is beschikbaar via deze link.
Zijn er voorgetrainde CNNs Code die ik kan gebruiken?
Ja. Als u geïnteresseerd bent in het leren van de code, heeft Keras verschillende vooraf getrainde CNN’s, waaronder Xception, VGG16, VGG19, ResNet50, InceptionV3, InceptionResNetV2, MobileNet, DenseNet, NASNet, en MobileNetV2. Vermeldenswaard is deze grote beelddatabase ImageNet die u kunt bijdragen of downloaden voor onderzoeksdoeleinden.