Einheiten:
Die Menge an "Neuronen" oder "Zellen" oder was auch immer die Schicht enthält.
Es ist eine Eigenschaft jeder Ebene, und ja, es hängt mit der Ausgabeform zusammen (wie wir später sehen werden). In Ihrem Bild haben Sie mit Ausnahme der Eingabeebene, die sich konzeptionell von anderen Ebenen unterscheidet, Folgendes:
- Versteckte Schicht 1: 4 Einheiten (4 Neuronen)
- Versteckte Ebene 2: 4 Einheiten
- Letzte Schicht: 1 Einheit
Formen
Formen sind Konsequenzen der Konfiguration des Modells. Formen sind Tupel, die angeben, wie viele Elemente ein Array oder Tensor in jeder Dimension hat.
Beispiel: Eine Form (30,4,10)
bedeutet ein Array oder einen Tensor mit 3 Dimensionen, die 30 Elemente in der ersten Dimension, 4 in der zweiten und 10 in der dritten enthalten und insgesamt 30 * 4 * 10 = 1200 Elemente oder Zahlen enthalten.
Die Eingabeform
Was zwischen den Schichten fließt, sind Tensoren. Tensoren können als Matrizen mit Formen gesehen werden.
In Keras ist die Eingabeebene selbst keine Ebene, sondern ein Tensor. Dies ist der Starttensor, den Sie an die erste verborgene Ebene senden. Dieser Tensor muss dieselbe Form haben wie Ihre Trainingsdaten.
Beispiel: Wenn Sie 30 Bilder mit 50 x 50 Pixel in RGB (3 Kanäle) haben, ist die Form Ihrer Eingabedaten (30,50,50,3)
. Dann muss Ihr Eingangsschichttensor diese Form haben (siehe Details im Abschnitt "Formen in Keras").
Jeder Ebenentyp erfordert die Eingabe mit einer bestimmten Anzahl von Dimensionen:
Dense
Ebenen erfordern Eingaben als (batch_size, input_size)
- oder
(batch_size, optional,...,optional, input_size)
- 2D-Faltungsschichten benötigen Eingaben wie folgt:
- bei Verwendung von
channels_last
:(batch_size, imageside1, imageside2, channels)
- bei Verwendung von
channels_first
:(batch_size, channels, imageside1, imageside2)
- 1D-Windungen und wiederkehrende Schichten werden verwendet
(batch_size, sequence_length, features)
Jetzt müssen Sie nur noch die Eingabeform definieren, da Ihr Modell sie nicht kennen kann. Nur Sie wissen das, basierend auf Ihren Trainingsdaten.
Alle anderen Formen werden automatisch basierend auf den Einheiten und Besonderheiten jeder Ebene berechnet.
Beziehung zwischen Formen und Einheiten - Die Ausgabeform
Bei gegebener Eingabeform sind alle anderen Formen Ergebnisse von Ebenenberechnungen.
Die "Einheiten" jeder Schicht definieren die Ausgabeform (die Form des Tensors, der von der Schicht erzeugt wird und der die Eingabe der nächsten Schicht ist).
Jeder Layertyp funktioniert auf eine bestimmte Weise. Dichte Schichten haben eine Ausgabeform basierend auf "Einheiten", Faltungsschichten haben eine Ausgabeform basierend auf "Filtern". Es basiert jedoch immer auf einer Ebeneneigenschaft. (Informationen zur Ausgabe der einzelnen Ebenen finden Sie in der Dokumentation.)
Lassen Sie uns zeigen, was mit "dichten" Ebenen passiert. Dies ist der in Ihrem Diagramm gezeigte Typ.
Eine dichte Schicht hat eine Ausgabeform von (batch_size,units)
. Ja, Einheiten, die Eigenschaft der Ebene, definieren auch die Ausgabeform.
- Versteckte Ebene 1: 4 Einheiten, Ausgabeform :
(batch_size,4)
.
- Versteckte Ebene 2: 4 Einheiten, Ausgabeform :
(batch_size,4)
.
- Letzte Schicht: 1 Einheit, Ausgabeform :
(batch_size,1)
.
Gewichte
Gewichte werden vollständig automatisch basierend auf den Eingabe- und Ausgabeformen berechnet. Auch hier funktioniert jeder Layertyp auf eine bestimmte Weise. Die Gewichte sind jedoch eine Matrix, die in der Lage ist, die Eingabeform durch eine mathematische Operation in die Ausgabeform umzuwandeln.
In einer dichten Schicht multiplizieren Gewichte alle Eingaben. Es ist eine Matrix mit einer Spalte pro Eingabe und einer Zeile pro Einheit, aber dies ist für grundlegende Arbeiten oft nicht wichtig.
Wenn auf dem Bild jeder Pfeil eine Multiplikationszahl hätte, würden alle Zahlen zusammen die Gewichtsmatrix bilden.
Formen in Keras
Zuvor gab ich ein Beispiel für 30 Bilder, 50 x 50 Pixel und 3 Kanäle mit einer Eingabeform von (30,50,50,3)
.
Da die Eingabeform die einzige ist, die Sie definieren müssen, fordert Keras sie in der ersten Ebene an.
In dieser Definition ignoriert Keras jedoch die erste Dimension, nämlich die Stapelgröße. Ihr Modell sollte mit jeder Stapelgröße umgehen können, daher definieren Sie nur die anderen Dimensionen:
input_shape = (50,50,3)
#regardless of how many images I have, each image has this shape
Optional oder wenn dies für bestimmte Modelltypen erforderlich ist, können Sie die Form mit der Stapelgröße über batch_input_shape=(30,50,50,3)
oder übergeben batch_shape=(30,50,50,3)
. Dies beschränkt Ihre Trainingsmöglichkeiten auf diese einzigartige Chargengröße und sollte daher nur verwendet werden, wenn dies wirklich erforderlich ist.
In beiden Fällen haben Tensoren im Modell die Chargendimension.
Selbst wenn Sie verwendet haben input_shape=(50,50,3)
, wenn Keras Ihnen Nachrichten sendet oder wenn Sie die Modellzusammenfassung drucken, wird diese angezeigt (None,50,50,3)
.
Die erste Dimension ist die Stapelgröße, None
da sie je nach Anzahl der Beispiele für das Training variieren kann. (Wenn Sie die Stapelgröße explizit definiert haben, wird anstelle von die von Ihnen definierte Nummer angezeigt. None
)
Wenn Sie in fortgeschrittenen Arbeiten tatsächlich direkt an den Tensoren arbeiten (z. B. innerhalb von Lambda-Schichten oder in der Verlustfunktion), ist die Dimension der Chargengröße vorhanden.
- Wenn Sie also die Eingabeform definieren, ignorieren Sie die Stapelgröße:
input_shape=(50,50,3)
- Bei Operationen direkt an Tensoren wird die Form wieder hergestellt
(30,50,50,3)
- Wenn Keras Ihnen eine Nachricht sendet, ist die Form
(None,50,50,3)
oder (30,50,50,3)
, je nachdem, welche Art von Nachricht es Ihnen sendet.
Dim
Und was ist am Ende dim
?
Wenn Ihre Eingabeform nur eine Dimension hat, müssen Sie sie nicht als Tupel, sondern als Skalarzahl input_dim
angeben.
In Ihrem Modell, in dem Ihre Eingabeebene drei Elemente enthält, können Sie eines der beiden folgenden Elemente verwenden:
input_shape=(3,)
- Das Komma ist erforderlich, wenn Sie nur eine Dimension haben
input_dim = 3
Wenn Sie sich jedoch direkt mit den Tensoren befassen, wird häufig angegeben dim
, wie viele Dimensionen ein Tensor hat. Zum Beispiel hat ein Tensor mit Form (25, 10909) zwei Dimensionen.
Definieren Sie Ihr Bild in Keras
Keras hat zwei Möglichkeiten: Sequential
Modelle oder die funktionale API Model
. Ich mag es nicht, das sequentielle Modell zu verwenden, später müssen Sie es sowieso vergessen, weil Sie Modelle mit Zweigen wollen.
PS: Hier habe ich andere Aspekte wie Aktivierungsfunktionen ignoriert.
Mit dem sequentiellen Modell :
from keras.models import Sequential
from keras.layers import *
model = Sequential()
#start from the first hidden layer, since the input is not actually a layer
#but inform the shape of the input, with 3 elements.
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input
#further layers:
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer
Mit dem funktionalen API-Modell :
from keras.models import Model
from keras.layers import *
#Start defining the input tensor:
inpTensor = Input((3,))
#create the layers and pass them the input tensor to get the output tensor:
hidden1Out = Dense(units=4)(inpTensor)
hidden2Out = Dense(units=4)(hidden1Out)
finalOut = Dense(units=1)(hidden2Out)
#define the model's start and end points
model = Model(inpTensor,finalOut)
Formen der Tensoren
Denken Sie daran, dass Sie beim Definieren von Ebenen die Stapelgrößen ignorieren:
- inpTensor:
(None,3)
- hidden1Out:
(None,4)
- hidden2Out:
(None,4)
- finalOut:
(None,1)
input_shape=
Parameter bleibt offen: Auf welche Dimension bezieht sich der erste Wert des Arguments? Ich sehe Dinge wieinput_shape=(728, )
, also bezieht sich das erste Argument in meinen Gedanken auf Spalten (fest) und das zweite auf Zeilen (frei zu variieren). Aber wie passt das zu Pythons Zeilenreihenfolge der Arrays?