Ich gehe davon aus durch C1
, C2
usw. Sie Faltungs Schichten bedeuten, und P1
, P2
Sie mittlere Pooling Schichten und FC
Mittel vollständig miteinander verbundenen Schichten.
Wir können den für einen Vorwärtsdurchlauf erforderlichen Speicher wie folgt berechnen:
Ein Bild
Wenn Sie mit float32-Werten arbeiten, folgen Sie dem oben von @Alexandru Burlacu bereitgestellten Link:
Input
: 50 x 50 x 3 = 7.500 = 7,5 K.
C1
: 50 x 50 x 32 = 80.000 = 80 K.
P1
: 25 x 25 x 32 = 20.000 = 20 K.
C2
: 25 x 25 x 64 = 40.000 = 40 K.
P2
: 12x12x64 = 9,216 = 9,2K <- Dies ist ein Problem (und meine Annäherung ist hier eine sehr handgewellte Vermutung). Anstatt mit 50, 25, '12 .5 'zu arbeiten, wäre es sinnvoller, mit Vielfachen von 32 zu arbeiten. Ich habe gehört, dass die Arbeit mit Vielfachen von 32 auch unter dem Gesichtspunkt des Speichers effizienter ist. Der Grund, warum dies eine schlechte Idee ist, ist, dass 2x2-Pooling den Raum nicht richtig aufteilt, soweit ich das beurteilen kann. Fühlen Sie sich frei, mich zu korrigieren, wenn ich falsch liege.
FC
: 1 × 500 = 500 = 0,5 K.
Output
: 1 x 10 = 10 = 0,01 K (so gut wie nichts)
Gesamtspeicher: 7,5 KB + 80 KB + 20 KB + 40 KB + 0,5 KB = 157,2 KB * 4 Byte = 628,8 KB
Das ist für ein Bild.
Minibatch
Wenn Sie mit einer Minibatch-Größe von 64 arbeiten, lesen Sie 64 davon gleichzeitig in den Speicher und führen die Vorgänge alle zusammen aus, wobei Sie alles wie folgt skalieren:
Input
: 64 x 50 x 50 x 3 = 480.000 = 480 K = 0,48 M.
C1
: 64 x 50 x 50 x 32 = 5.120.000 = 5,12 M.
P1
: 64 x 25 x 25 x 32 = 1.280.000 = 1,28 M.
C2
: 64 x 25 x 25 x 64 = 2.560.000 = 2,56 M.
P2
: 64 × 12 × 12 × 64 = 589.824 = 590 K = 0,59 M.
FC
: 64 x 500 = 32.000 = 32 K = 0,032 M.
Output
: 1x10x64 = 640 = 0,64K = 0,00064M (es ist uns egal, das ist winzig)
Gesamtspeicher: 10 MB x 4 Byte ~ 40 MB (ich sage ungefähr, weil die Website auch einen ungefähren Wert angibt)
EDIT: Ich habe die Website falsch gelesen, sorry.
Laut der Website erfordert ein Rückwärtsdurchlauf etwa das Dreifache, da Folgendes gespeichert werden muss:
die Aktivierungen und zugehörigen Gradienten für jedes Neuron - diese sind gleich groß;
die Gradienten der Gewichte (Parameter), die die gleiche Größe wie die Parameter haben;
der Wert des Impulses, wenn Sie ihn verwenden;
eine Art verschiedenes Gedächtnis (ich verstehe diesen Teil nicht)
C1
oben,50x50x32
aber das wären nur die Werte für die Layer-Aktivierungskarten. Was ist mit den gelernten Werten (32x3x3
) im Kernel selbst?Vielleicht gibt Ihnen dieser Link eine Erklärung, wie Sie die Speichernutzung eines beliebigen neuronalen Netzwerks berechnen. Im folgenden Link wird die Speichernutzung des VGGNet-Modells erläutert. Klicken Sie hier und scrollen Sie etwas nach unten))
quelle
Während des Trainings eines convNet wird Folgendes benötigt:
Eine gute grobe Annäherung ist die Anzahl der Parameter x 3 x 4 (wenn Sie 32-Bit-Float verwenden) Bytes
Nun berechnen Sie die Anzahl der Parameter folgendermaßen:
Summieren Sie nun einfach die Anzahl aller Parameter und verwenden Sie die von mir erwähnte Formel.
quelle