Erklärung der Keras-Eingabe: Eingabeform, Einheiten, Stapelgröße, Dim usw.

262

Für jede Keras Schicht ( LayerKlasse), erklären kann jemand wie man den Unterschied zwischen verstehen input_shape, units, dimetc.?

In der Dokumentation heißt es beispielsweise units, die Ausgabeform einer Ebene anzugeben.

Im Bild des neuronalen Netzes unten hidden layer1hat 4 Einheiten. Wird dies direkt auf das unitsAttribut des LayerObjekts übertragen? Oder entspricht unitsin Keras die Form jedes Gewichts in der verborgenen Schicht multipliziert mit der Anzahl der Einheiten?

Kurz gesagt, wie versteht / visualisiert man die Attribute des Modells - insbesondere die Ebenen - mit dem Bild unten? Geben Sie hier die Bildbeschreibung ein

Vogelscheuche
quelle

Antworten:

412

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, Noneda 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_dimangeben.

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: SequentialModelle 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)
Daniel Möller
quelle
7
Eine Frage zum input_shape=Parameter bleibt offen: Auf welche Dimension bezieht sich der erste Wert des Arguments? Ich sehe Dinge wie input_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?
Maxim.K
17
Dieses Komma erzeugt keine zweite Dimension. Es ist nur eine Python-Notation zum Erstellen einer tuple, die nur ein Element enthält. input_shape(728,)ist das gleiche wie batch_input=(batch_size,728). Dies bedeutet, dass jede Probe 728 Werte hat.
Daniel Möller
@ DanielMöller: Könnten Sie bitte etwas näher auf den Unterschied zwischen "Eingabeelementen" und "Dimensionen" eingehen? Ich würde denken, dass das obige Diagramm eine dreidimensionale Eingabeebene hat, wodurch dim = 3 wird. Ich frage mich also, was mir hier fehlt, weil ich sehe, dass Sie schreiben, dass die Eingabe eindimensional ist ...
Helen
1
Ein Vektor hat eine Dimension, aber viele Elemente. Es hat Form (n,) ---- Eine Matrix hat zwei Dimensionen, Dimension 0 hat m Elemente, Dimension 1 hat n Elemente, insgesamt mxn Elemente, Form (m, n). Wenn Sie sich einen "Würfel" vorstellen, der in kleine Würfel unterteilt ist, wobei jeder kleine Würfel Daten enthält, wäre dies 3D mit mxnxo-Elementen und der Form (m, n, o).
Daniel Möller
2
@ Prinz, die Reihenfolge ist wichtig. Sie können Keras für die Verwendung von data_format = 'channels_first'oder konfigurieren data_format='channels_last'. Ich empfehle, immer Kanäle zuletzt zu verwenden (Keras 'Standard). Es ist besser mit allen anderen Ebenen kompatibel.
Daniel Möller
11

Eingabedimension geklärt:

Keine direkte Antwort, aber ich habe gerade festgestellt, dass das Wort Input Dimension verwirrend genug sein kann. Seien Sie also vorsichtig:

Es (nur die Wortdimension) kann sich beziehen auf:

a) Die Dimension der Eingabedaten (oder des Streams), z. B. # N der Sensorachsen zum Strahlen des Zeitreihensignals oder des RGB-Farbkanals (3): vorgeschlagenes Wort => "InputStream-Dimension"

b) Die Gesamtzahl / Länge der Eingabemerkmale (oder der Eingabeebene) (28 x 28 = 784 für das MINST-Farbbild) oder 3000 in den FFT-transformierten Spektrumswerten oder

"Eingabeebene / Eingabemerkmaldimension"

c) Die Dimensionalität (Anzahl der Dimensionen) der Eingabe (normalerweise 3D, wie in Keras LSTM erwartet) oder (#RowofSamples, #of Senors, #of Values ​​..) 3 ist die Antwort.

"N Dimensionalität der Eingabe"

d) Die SPEZIFISCHE Eingabeform (z. B. (30,50,50,3) in diesen nicht verpackten Eingabebilddaten oder (30, 250, 3), wenn entpackte Keras:

Keras hat seine input_dim bezieht sich auf die Dimension der Eingabeebene / Anzahl der Eingabe-Features

model = Sequential()
model.add(Dense(32, input_dim=784))  #or 3 in the current posted example above
model.add(Activation('relu'))

In Keras LSTM bezieht es sich auf die gesamten Zeitschritte

Der Begriff war sehr verwirrend, ist richtig und wir leben in einer sehr verwirrenden Welt !!

Ich finde, eine der Herausforderungen beim maschinellen Lernen besteht darin, mit verschiedenen Sprachen oder Dialekten und Terminologien umzugehen (wenn Sie beispielsweise 5-8 sehr unterschiedliche Versionen von Englisch haben, müssen Sie über sehr hohe Kenntnisse verfügen, um mit verschiedenen Sprechern zu sprechen). Wahrscheinlich ist dies auch in Programmiersprachen so.

r Poon
quelle