Vollständig verbundene Schichtgewichtsmaße in TensorFlow ConvNet

8

Ich habe dieses Beispiel entlang programmiert eines Faltungsnetzes in TensorFlow und ich bin durch diese Zuweisung von Gewichten verwirrt:

%Vor%

Woher wissen wir, dass die Gewichtsmatrix "wd1" 7 x 7 x 64 Zeilen haben sollte?

Es wird später verwendet, um die Ausgabe der zweiten Faltungsschicht neu zu gestalten:

%Vor%

Nach meiner Mathematik hat die Pooling-Schicht 2 (conv2-Ausgang) 4 x 4 x 64 Neuronen.

Warum ändern wir uns auf [-1, 7 * 7 * 64]?

    
jfbeltran 07.01.2016, 18:24
quelle

2 Antworten

15

Von Anfang an:

Die Eingabe _X hat die Größe [28x28x1] (die Batch-Dimension wird ignoriert). Ein 28x28 Graustufenbild.

Der erste Faltungslayer verwendet PADDING=same , also gibt er einen 28x28 Layer aus, der dann an ein max_pool mit k=2 übergeben wird, was jede Dimension um einen Faktor zwei reduziert, was zu einem 14x14 räumlichen Layout führt. conv1 hat 32 Ausgänge - der vollständige pro-Beispiel-Tensor ist nun [14x14x32] .

Dies wird in conv2 wiederholt, was 64 Ausgaben hat, was zu einem [7x7x64] führt.

tl; dr: Das Bild beginnt als 28x28 und jeder maxpool reduziert es in jeder Dimension um den Faktor zwei. 28/2/2 = 7.

    
dga 07.01.2016, 20:30
quelle
1

Diese Frage erfordert, dass Sie ein gutes Verständnis für tiefe Lernfaltungen haben.

Grundsätzlich wird jede Faltungsschicht, die Ihr Modell besitzt, die transversale Fläche der Faltungs-Pyramide reduzieren. Diese Reduzierung wird durch die Schritte convolution stride und max_pooling stride erreicht. Und um die Dinge zu komplizieren, haben wir zwei Optionen basierend auf dem PADDING.

Option 1 - PADDING='SAME'

%Vor%

Option 2 - PADDING='VALID'

%Vor%

Für EACH Convolution und Max Pooling müssen Sie eine neue out_height und out_width berechnen. Dann multiplizieren Sie am Ende der Faltungen out_height , out_width und die Tiefe Ihrer letzten Faltungsschicht. Das Ergebnis dieser Multiplikation ist die Ausgabe-Feature-Map-Größe, die die Eingabe Ihrer ersten vollständig verbundenen Ebene ist.

In Ihrem Beispiel hatten Sie wahrscheinlich nur PADDING='SAME' , einen Faltungsschritt von 1 und einen maximalen Pooling-Schritt von 2, zweimal . Am Ende musste man alles nur durch 4 (1,2,1,2) teilen.

Weitere Informationen finden Sie unter tensorflow-API

    
Thomio 03.10.2016 23:19
quelle