Wie ein Netz Muster in Bildern findet
Eine Faltung (englisch Convolution) schiebt einen kleinen Filter über eine Reihe oder ein Bild und rechnet an jeder Stelle eine Summe. So findet ein Netz Kanten, Sprünge und Muster.
Faltungsnetze erkennen damit Gesichter, Ziffern und Fehler auf Fotos. Wir rechnen sie hier von Hand an den Ausleihzahlen einer Woche.
Am Ende dieser Lektion
Notiz
Ich kann erklären, wie eine Faltung mit einem Filter Muster in einem Raster findet.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Filter | eine kleine Liste von Gewichten, die über die Daten gleitet | [-1, 1] |
| Faltung | der Filter gleitet über die Daten und bildet an jeder Stelle eine Summe | |
| Merkmalskarte | die Liste der Ergebnisse einer Faltung | |
| Pooling | mehrere Nachbarwerte zu einem zusammenfassen | |
| Raster | Zahlen in Zeilen und Spalten, zum Beispiel ein Bild |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Filter gleitet Schritt für Schritt
Ein Filter ist eine kurze Liste von Gewichten. Er liegt zuerst auf den ersten Werten. Jeder Wert wird mit dem Gewicht darunter multipliziert, und alles wird addiert.
Dann rückt der Filter um eine Stelle weiter und rechnet erneut. Die Ergebnisse bilden die Merkmalskarte. Der Filter [-1, 1] rechnet immer den Nachfolger minus den Wert davor: Er findet Sprünge.
Beispiel: Filter [-1, 1] über sieben Tage
| Stelle | Werte darunter | Rechnung | Ergebnis |
|---|---|---|---|
| 1 | 1 und 1 | -1 + 1 | 0 |
| 2 | 1 und 2 | -1 + 2 | 1 |
| 3 | 2 und 6 | -2 + 6 | 4 |
| 4 | 6 und 6 | -6 + 6 | 0 |
| 5 | 6 und 2 | -6 + 2 | -4 |
| 6 | 2 und 1 | -2 + 1 | -1 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Faltung in Python
# Ausleihen einer Woche in Hundert und ein Filter, der Sprünge findet.
reihe = [1, 1, 2, 6, 6, 2, 1]
filter = [-1, 1]
ergebnis = []
for start in range(len(reihe) - len(filter) + 1):
summe = 0
for k in range(len(filter)):
summe = summe + filter[k] * reihe[start + k]
ergebnis.append(summe)
print(ergebnis)
# Ändern Sie den Filter in [1, 1] und starten Sie erneut.
Die ersten drei Stellen nachrechnen
docker exec jupyter python3 -c "print([-1 * 1 + 1 * 1, -1 * 1 + 1 * 2, -1 * 2 + 1 * 6])"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Im Bild gleitet der Filter in zwei Richtungen
Ein Bild ist ein Raster aus Zahlen, zum Beispiel Helligkeiten von 0 bis 1. Der Filter ist dann ebenfalls ein kleines Raster, hier 2 mal 2.
Er gleitet nach rechts und nach unten. An jeder Stelle werden vier Produkte addiert. Im Beispiel liegt links eine dunkle und rechts eine helle Fläche. Der Filter findet die senkrechte Kante.
Beispiel: eine senkrechte Kante
| Zeile | Bild (4 Spalten) | Merkmalskarte mit Filter links -1, rechts 1 |
|---|---|---|
| 1 | 0, 0, 1, 1 | 0, 2, 0 |
| 2 | 0, 0, 1, 1 | 0, 2, 0 |
| 3 | 0, 0, 1, 1 | 0, 2, 0 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Pooling verkleinert die Merkmalskarte
Beim Pooling fasst man Nachbarwerte zusammen. Beim Max-Pooling mit Größe 2 behält man von je zwei Werten den größeren.
Aus [0, 1, 4, 0, -4, -1] wird [1, 4, -1]. Die Karte wird halb so lang, und es bleibt nur das stärkste Signal. Ein Filter hat außerdem immer gleich viele Gewichte, egal wie groß das Bild ist.
Ein Filter gegen eine volle Schicht
docker exec jupyter python3 -c "print(28 * 28 * 10 + 10, 3 * 3 + 1)"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein Netz müsse den Filter vorher raten. Der Filter besteht aber aus Gewichten, und das Netz lernt sie beim Training selbst. Wir haben [-1, 1] nur gewählt, damit die Rechnung leicht bleibt.