Convolution
Bei der Faltung wird ein kleiner Gewichtungskern über eine Eingabe verschoben, um eine Merkmalskarte zu erzeugen. Sie ist die zentrale Operation von CNNs. Hier geht es um Schrittweite, Padding und Varianten.
Eine Faltung ist eine Operation, bei der ein kleines Raster aus Gewichten, Kernel oder Filter genannt, über eine Eingabe geschoben und an jeder Position eine gewichtete Summe berechnet wird. In der Computer Vision (CV) ist die Eingabe ein Bild oder ein Stapel von Merkmalskarten. Jeder Kernel erzeugt eine Ausgabekarte, deren Werte dort hoch sind, wo sein Muster auftritt: an einer vertikalen Kante, in einem Texturausschnitt oder, tiefer in einem Netzwerk, in einem Teil eines Rads oder Gesichts. Von Hand entworfene Kernel werden seit Langem in der Bildverarbeitung zum Weichzeichnen, Schärfen und zur Kantenerkennung verwendet. In einem faltenden neuronalen Netzwerk (CNN) sind die Kernelwerte Modellgewichte, die während des Trainings gelernt werden. So entdeckt das Netzwerk seine eigenen Merkmalsdetektoren.
So funktioniert die Faltung#
An jeder Position liegt der Kernel über einem Ausschnitt der Eingabe. Jedes Kernelgewicht wird mit dem darunterliegenden Eingabewert multipliziert. Die Produkte werden addiert und um einen Bias ergänzt, um einen Ausgabewert zu erhalten. Wird der Kernel über die gesamte Höhe und Breite geschoben, entsteht eine zweidimensionale Ausgabekarte. Reale Eingaben haben mehrere Kanäle, etwa die roten, grünen und blauen Kanäle eines Bildes. Daher erstreckt sich jeder Kernel über alle Eingabekanäle: Ein 3×3-Kernel bei einer Eingabe mit 64 Kanälen enthält 3 × 3 × 64 = 576 Gewichte und erzeugt weiterhin nur einen Ausgabekanal. Eine Faltungsschicht wendet viele solcher Kernel an. Die Anzahl der Kernel legt die Anzahl der Ausgabekanäle fest. Eine Schicht mit 64 Eingabe- und 128 Ausgabekanälen und 3×3-Kerneln hat daher 3 × 3 × 64 × 128 = 73.728 Gewichte.
Derselbe Kernel wird an jeder Position wiederverwendet. Deshalb benötigen Faltungsschichten viel weniger Parameter als vollständig verbundene Schichten und erkennen ein in einer Bildecke gelerntes Muster auch überall sonst. Eine Verschiebung der Eingabe verschiebt die Ausgabe um denselben Betrag. Diese Eigenschaft heißt Translationsäquivarianz. Jeder Ausgabewert hängt nur von einer kleinen Nachbarschaft der Eingabe ab. Durch das Stapeln von Schichten wird das rezeptive Feld, das ein tiefer Ausgabewert zusammenfasst, von wenigen Pixeln auf den größten Teil des Bildes erweitert.
Bibliotheken für Deep Learning berechnen tatsächlich eine Kreuzkorrelation: Bei einer mathematischen Faltung wird der Kernel vor dem Verschieben umgedreht, bei PyTorchs Conv2d jedoch nicht. Da der Kernel gelernt wird, lernt das Netzwerk einfach die umgedrehten Gewichte. In der Praxis sind beide Verfahren austauschbar. GPU-Bibliotheken wie cuDNN formulieren Faltungen meist als große Matrixmultiplikationen um oder verwenden Winograd- oder FFT-basierte Algorithmen, die dasselbe Ergebnis schneller berechnen, als wenn der Kernel buchstäblich verschoben wird.
Schrittweite, Padding, Dilatation und Gruppen#
Vier Hyperparameter bestimmen die Form der Ausgabe einer Faltung und ihre Berechnungskosten:
- Schrittweite: Der Abstand zwischen Kernelpositionen. Bei einer Schrittweite von 2 wird jede zweite Position übersprungen und die Höhe und Breite der Ausgabe halbiert. Auf diese Weise verkleinern viele moderne CNNs die Auflösung.
- Padding: Zusätzliche Werte, üblicherweise Nullen, die am Rand der Eingabe hinzugefügt werden. Ein Padding von 1 sorgt dafür, dass die Ausgabe einer 3×3-Faltung bei Schrittweite 1 dieselbe Größe wie die Eingabe hat.
- Dilatation: Vergrößert die Abstände zwischen den Kernelpunkten. Ein 3×3-Kernel mit Dilatation 2 deckt so mit denselben neun Gewichten einen Bereich von 5×5 ab und vergrößert das rezeptive Feld ohne zusätzliche Kosten.
- Gruppen: Teilt die Kanäle in unabhängige Gruppen auf. Bei einer Gruppe pro Kanal filtert eine tiefenweise Faltung jeden Kanal einzeln. Eine anschließende punktweise 1×1-Faltung mischt die Kanäle. Dieses Paar heißt tiefenweise separierbare Faltung und wurde durch MobileNets für mobile Hardware bekannt.
Für eine Eingabe der Größe n, eine Kernelgröße k, ein Padding p, eine Schrittweite s und eine Dilatation d lautet die Ausgabegröße ⌊(n + 2p − d(k − 1) − 1) / s⌋ + 1. Das folgende Codebeispiel wendet vier Schichten an, die jeweils eine Merkmalskarte mit 64 Kanälen und einer Größe von 80×80 auf 128 Kanäle abbilden:
import torch
from torch import nn
x = torch.randn(1, 64, 80, 80) # a 64-channel, 80x80 feature map
# Four ways to map 64 input channels to 128 output channels
layers = {
"standard 3x3": nn.Conv2d(64, 128, kernel_size=3, padding=1, bias=False),
"stride 2": nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1, bias=False),
"dilation 2": nn.Conv2d(64, 128, kernel_size=3, padding=2, dilation=2, bias=False),
"depthwise separable": nn.Sequential(
nn.Conv2d(64, 64, kernel_size=3, padding=1, groups=64, bias=False), # one 3x3 filter per channel
nn.Conv2d(64, 128, kernel_size=1, bias=False), # 1x1 convolution mixes channels
),
}
for name, layer in layers.items():
params = sum(p.numel() for p in layer.parameters())
print(f"{name}: output {tuple(layer(x).shape)}, {params:,} weights")Die Standardschicht erzeugt eine Ausgabe der Größe (1, 128, 80, 80) und hat 73.728 Gewichte. Eine Schrittweite von 2 halbiert die Ausgabe auf (1, 128, 40, 40), bei unveränderter Anzahl an Gewichten. Eine Dilatation von 2 erhält die Größe 80×80 und 73.728 Gewichte, während jede Ausgabe einen Bereich von 5×5 erfasst. Das tiefenweise separierbare Faltungspaar erzeugt dieselbe Ausgabe (1, 128, 80, 80) mit nur 8.768 Gewichten, also etwa 8,4-mal weniger. YOLO26 verwendet beide Ansätze: Fünf 3×3-Faltungen mit Schrittweite 2 verkleinern ein Bild mit 640×640 Pixeln auf das 20×20-Raster seiner tiefsten Backbone-Merkmalskarte. Der Klassifizierungszweig des Detektionskopfs kombiniert tiefenweise 3×3- und punktweise 1×1-Faltungen, um den Rechenaufwand zu senken.
Faltungen in anderen Dimensionen#
- 1D-Faltung: Verschiebt sich entlang einer einzigen Achse und eignet sich für Audio-Wellenformen, Sensorsignale und Zeitreihen.
- 3D-Faltung: Ergänzt eine Tiefen- oder Zeitachse und eignet sich für Videoclips sowie Volumenscans wie CT und MRT in der medizinischen Bildanalyse.
- Transponierte Faltung: Verteilt jeden Eingabewert über eine größere Ausgabe und vergrößert Merkmalskarten in Segmentierungsmodellen wie U-Net. Mit eigenen gelernten Gewichten stellt sie die räumliche Größe wieder her, die eine Faltung mit Schrittweite reduziert hat.
Faltung und verwandte Operationen#
- Vollständig verbundene Schicht: Verbindet jede Eingabe mit jeder Ausgabe und verwendet für jede Verbindung ein eigenes Gewicht. Eine Faltung ist eine vollständig verbundene Schicht, die auf lokale Nachbarschaften beschränkt ist und deren Gewichte über Positionen hinweg gemeinsam nutzt.
- Pooling: Verschiebt wie eine Faltung ein Fenster über die Eingabe, wendet aber eine feste Regel an, etwa die Auswahl des Maximums, und verwendet keine gelernten Gewichte.
- Selbstaufmerksamkeit: Berechnet datenabhängige Gewichte zwischen allen Positionspaaren und verknüpft so weit auseinanderliegende Bildbereiche in einer einzigen Schicht. Eine Faltung wendet überall denselben festen Kernel an und erfasst nur ein lokales Fenster. Dadurch steigen ihre Kosten linear mit der Pixelanzahl.
- Bildfilterung: Klassische Filter wie die Gaußsche Unschärfe und der Sobel-Kantendetektor sind Faltungen mit festen, von Hand entworfenen Kerneln. Auch OpenCVs
filter2Dberechnet eine Korrelation, wie Bibliotheken für Deep Learning. Durch Umdrehen des Kernels entsteht eine echte Faltung.










