WEBVTT

00:03.520 --> 00:08.080
Das ist ein Flugzeug, eine Katze, ein Hund und ein Auto.

00:08.880 --> 00:12.720
Eine solche Zuordnung von Bildern zu bestimmten Klassen kann für die

00:12.720 --> 00:17.100
konventionelle Art des Programmierens eine wahre Herausforderung sein.

00:17.720 --> 00:20.740
Nicht so für unsere Modelle des maschinellen Lernens.

00:21.640 --> 00:25.400
Für die Bildklassifikation kommen die Convolutional Neural Networks,

00:25.460 --> 00:27.640
kurz CNNs, zum Einsatz.

00:27.640 --> 00:32.340
Grundsätzlich können aber auch einfache neuronale Netze verwendet

00:32.340 --> 00:36.860
werden, welche lediglich Schichten mit einfachen Neuronen verwenden.

00:37.920 --> 00:42.900
Solche Netze bezeichnet man dann als Multilayer Perceptrons, kurz

00:42.900 --> 00:43.640
MLPs.

00:44.640 --> 00:48.540
In diesem Video werden wir uns zuerst ansehen, wie wir

00:48.540 --> 00:54.340
Bildklassifikationsmodelle mit CNNs und MLPs aufbauen können und

00:54.340 --> 00:56.900
welches Verfahren die besseren Ergebnisse liefert.

00:57.800 --> 01:01.620
Außerdem werden wir versuchen, die Genauigkeit unserer Ergebnisse

01:01.620 --> 01:04.260
durch Data Augmentation noch weiter zu erhöhen.

01:05.120 --> 01:08.780
Als Grundlage unseres Trainings verwenden wir den Cypher-10-Datensatz.

01:09.420 --> 01:13.260
Dieser ist im Bereich des maschinellen Lernens weit verbreitet und

01:13.260 --> 01:17.000
enthält 50.000 Bilder aus 10 unterschiedlichen Klassen.

01:17.920 --> 01:20.120
Einige davon haben wir soeben schon gesehen.

01:21.160 --> 01:25.220
Ziel unserer Machine Learning Modelle soll es also sein, diese 10

01:25.220 --> 01:27.340
Klassen korrekt klassifizieren zu können.

01:27.980 --> 01:31.800
Zur Erinnerung, Bilder sind nichts anderes als eine Zusammensetzung

01:31.800 --> 01:36.640
von Pixeln, die sich aus den drei Farben Rot, Grün und Blau

01:36.640 --> 01:37.440
zusammensetzen.

01:38.280 --> 01:43.240
Jeder dieser Farben kann dabei einen Wert zwischen 0 und 255

01:43.240 --> 01:43.720
einnehmen.

01:44.560 --> 01:48.420
Zusammengesetzt zu einem Bild ergibt sich so eine dreidimensionale

01:48.420 --> 01:51.920
Matrix, die die Anordnung der Pixel im Bild definiert.

01:52.820 --> 01:57.360
Beginnen wir nun als erstes mit dem Aufbau des MLP-Modells.

01:58.260 --> 02:00.880
Hierbei begegnen wir zunächst einem Problem.

02:01.800 --> 02:05.820
Die Dense Layer der MLPs können nur mit eindimensionalen Eingängen

02:05.820 --> 02:06.280
umgehen.

02:07.360 --> 02:11.440
Von daher muss die dreidimensionale Matrix des Bildes zunächst

02:11.440 --> 02:12.540
konvertiert werden.

02:12.540 --> 02:18.760
Das geht in Keras mit einem Flatten Layer, der als erster Layer im MLP

02:18.760 --> 02:21.980
gleich hinter der Eingangsschicht eingefügt werden muss.

02:22.600 --> 02:26.800
Der Dense Layer erhält so vom Flatten Layer eine eindimensionale

02:26.800 --> 02:32.140
Matrix, mit der er wie mit einem normalen numerischen Eingang umgehen

02:32.140 --> 02:32.480
kann.

02:33.440 --> 02:38.380
In der Praxis kann dieses Array allerdings sehr lang werden, wenn das

02:38.380 --> 02:40.780
Bild eine hohe Auflösung besitzt.

02:40.780 --> 02:44.120
Dadurch hat auch der Flatten Layer viele Neuronen.

02:45.040 --> 02:49.160
Diese müssen alle mit den Neuronen der ersten Schicht verbunden sein,

02:49.620 --> 02:53.140
was eine Vielzahl an Verbindungen und Gewichten bedeutet.

02:54.400 --> 02:57.820
Das Netz ist also sehr komplex, was unter anderem mit einer langen

02:57.820 --> 02:59.520
Trainingszeit einhergeht.

03:00.800 --> 03:04.720
Lassen Sie uns nun ein solches Multi-Layer Perceptron-Modell für die

03:04.720 --> 03:06.860
Bildklassifikation in Keras implementieren.

03:06.860 --> 03:11.980
Dazu definieren wir zunächst unsere Eingangsschicht und legen die

03:11.980 --> 03:16.540
Struktur der Einträge im Datensatz mit dem Parameter Shape fest.

03:17.660 --> 03:21.660
Anschließend fügen wir den Flatten Layer hinzu, sodass die darauf

03:21.660 --> 03:25.500
folgenden Schichten mit einem eindimensionalen Eingang arbeiten.

03:26.200 --> 03:30.660
Nun kommen wir zum wichtigsten Teil unseres Netzes, den versteckten

03:30.660 --> 03:30.980
Schichten.

03:30.980 --> 03:34.480
Hier ist eine Vielzahl an Kombinationen möglich.

03:35.140 --> 03:39.360
Wir entscheiden uns allerdings der Einfachheit halber für zwei Dense

03:39.360 --> 03:45.220
Layer mit jeweils 256 Neuronen und der ReLU als Aktivierungsfunktion.

03:46.260 --> 03:49.500
Zudem müssen wir noch die Ausgangsschicht definieren.

03:50.140 --> 03:55.140
Hier wählen wir als Aktivierungsfunktion die Softmax-Funktion, um im

03:55.140 --> 03:59.160
Ausgang den gewünschten Wahrscheinlichkeitsfaktor zu erhalten.

04:00.000 --> 04:04.580
Zudem ist es wichtig, dass wir hier die richtige Neuronenanzahl

04:04.580 --> 04:05.040
wählen.

04:05.660 --> 04:09.420
Da wir zwischen 10 Klassen unterscheiden wollen, muss unsere

04:09.420 --> 04:11.880
Ausgangsschicht 10 Neuronen besitzen.

04:13.520 --> 04:17.960
Eingangs- und Ausgangsschicht werden nun noch in ein Keras-Modell

04:17.960 --> 04:22.160
eingefügt und fertig ist unser Multi-Layer Perceptron-Modell für die

04:22.160 --> 04:23.040
Bildklassifikation.

04:23.740 --> 04:27.960
Nun wollen wir als nächstes unser CNN-Modell in Keras aufbauen.

04:27.960 --> 04:33.840
Im Gegensatz zu MLP können CNNs mit dreidimensionalen Matrizen

04:33.840 --> 04:34.340
umgehen.

04:35.140 --> 04:38.740
Deswegen benötigen wir hier am Eingang keine Flatten-Layer.

04:39.840 --> 04:44.640
Zunächst einmal müssen wir auch bei den CNNs die Eingangsschicht mit

04:44.640 --> 04:47.360
der Struktur des Datensatzes initialisieren.

04:48.460 --> 04:53.000
Dieser fügen wir dann die versteckten Schichten des CNNs hinzu.

04:54.000 --> 04:57.500
Auch hier ist eine Vielzahl an Kombinationen möglich.

04:58.460 --> 05:03.120
Um es einfach zu halten, wählen wir zweimal eine Kombination aus

05:03.120 --> 05:04.780
Faltungs - und Polienschichten.

05:05.940 --> 05:10.120
Für dieses Beispiel nehmen wir an, dass die Überparameter schon

05:10.120 --> 05:11.020
optimiert wurden.

05:12.010 --> 05:16.580
Deswegen wählen wir bei der ersten Faltungsschicht eine Filteranzahl

05:16.580 --> 05:22.820
von 6, wobei jeder dieser Filter wie für CNNs typisch eine Größe von

05:22.820 --> 05:24.400
3x3 aufweist.

05:25.740 --> 05:29.500
Faltungsschichten erwarten ebenfalls einen Padding als Parameter.

05:30.420 --> 05:33.500
Was das bedeutet, versteht man hier mit diesem Beispiel.

05:34.460 --> 05:39.180
Nullen werden am Rand des Eingangs vor der Faltung hinzugefügt, damit

05:39.180 --> 05:43.980
der Ausgang der ersten Faltungsschicht die gleiche Höhe und Breite wie

05:43.980 --> 05:45.500
der Eingang besitzt.

05:45.780 --> 05:50.180
Wird der Padding nicht verwendet, wird das Bild nach jeder Schicht

05:50.180 --> 05:54.260
immer kleiner, was je nach Anwendung zu Problemen in der Genauigkeit

05:54.260 --> 05:55.480
des Netzes führen kann.

05:56.600 --> 06:01.020
Wollen wir den Padding verwenden, setzen wir diese Parameter auf Same

06:01.020 --> 06:04.380
wie in unserem Code, sonst auf Valid.

06:04.380 --> 06:08.000
Außerdem verwenden wir als Aktivierungsfunktion die Relu.

06:09.020 --> 06:13.180
Auf die Faltungsschicht folgt dann eine Pulling-Schicht, die uns dabei

06:13.180 --> 06:15.580
hilft, unwichtige Informationen zu entfernen.

06:16.440 --> 06:19.500
Hier wählen wir die typische Größe von 2x2.

06:20.720 --> 06:25.120
Mit Stride können wir dabei die Schrittgröße festlegen, mit der der

06:25.120 --> 06:27.480
Filter über den Eingang geschoben wird.

06:28.600 --> 06:32.080
Dadurch wird auch die Größe des Ausgangs festgelegt.

06:32.080 --> 06:38.840
Eine Stride von 2x2 bedeutet eine Schrittgröße von 2 in die x-Richtung

06:38.840 --> 06:41.160
und von 2 in die y-Richtung.

06:42.220 --> 06:45.900
Bei der zweiten Faltungsschicht wählen wir ähnliche Einstellungen wie

06:45.900 --> 06:46.880
bereits bei der ersten.

06:47.460 --> 06:49.900
Allerdings erhöhen wir hier die Zahl der Filter.

06:50.520 --> 06:54.580
Das ist typisch für Sendends, da die erste Faltungsschicht in der

06:54.580 --> 06:58.980
Regel einfach Formen wie Kanten erkennen sollen, während die späteren

06:58.980 --> 07:03.100
Schichten für die Detektion von komplexeren Zusammenhängen verwendet

07:03.100 --> 07:03.420
werden.

07:04.320 --> 07:07.360
Auch hier folgt erneut eine Pulling-Schicht.

07:08.320 --> 07:12.280
Nun wollen wir auch beim Sendend auf die Sendklassen im Cypher-Send

07:12.280 --> 07:13.780
-Datensatz schließen können.

07:14.480 --> 07:18.920
Um das zu erreichen, fügen wir zunächst einen Flattenlayer hinzu, der

07:18.920 --> 07:23.180
den dreidimensionalen Ausgang des zweiten Pullinglayers in eine

07:23.180 --> 07:25.060
eindimensionale Matrix überführt.

07:25.060 --> 07:29.200
Das erlaubt es uns, Denslayer zu verbinden.

07:29.840 --> 07:32.140
Wir entscheiden uns für zwei Denslayer.

07:33.120 --> 07:39.280
Der erste, ähnlich wie das MLP, soll dabei 256 Neuronen besitzen.

07:39.780 --> 07:43.340
Der letzte Denslayer soll unsere Ausgangsschicht werden.

07:44.340 --> 07:49.300
Folglich muss er auch 10 Neuronen besitzen, also eines pro Klasse.

07:50.200 --> 07:54.760
Hier ist es zudem wichtig, dass wir die Softmax-Aktivierungsfunktion

07:54.760 --> 07:59.040
verwenden, um im Ausgang des Sendends einen Wahrscheinlichkeitsvektor

07:59.040 --> 07:59.740
zu erhalten.

08:00.660 --> 08:04.400
Damit haben wir nun auch unser Sendend-Modell aufgebaut.

08:05.300 --> 08:08.320
Bevor wir nun mit dem Training beginnen, sollen wir unsere

08:08.320 --> 08:13.280
Eingangsdaten noch normalisieren, sodass die Werte der Farbe Rot, Grün

08:13.280 --> 08:16.800
und Blau jedes Pixels zwischen 0 und 1 liegen.

08:16.800 --> 08:21.500
Dadurch können die neuronalen Netze besser mit den Bildern umgehen.

08:22.540 --> 08:26.820
Das erreichen wir, indem wir unsere Trainings- und Testdaten durch den

08:26.820 --> 08:30.380
maximalen Wert, also 255, teilen.

08:31.720 --> 08:35.360
Da dieser Datensatz bereits in einen Trainings- und einen

08:35.360 --> 08:39.260
Testdatensatz unterteilt ist, kann dieser Schritt bei der

08:39.260 --> 08:40.860
Datenvorverarbeitung entfallen.

08:42.100 --> 08:46.380
Schauen wir uns nun an, wie gut die Modelle im Training performen.

08:47.220 --> 08:50.760
Dazu haben wir beide Modelle bereits mit der Cross-Entropy

08:50.760 --> 08:56.680
-Verlustfunktion und dem Adam-Optimizer kompiliert und anschließend

08:56.680 --> 08:59.980
mit den Trainingsdaten des Cypher-10-Datensatzes trainiert.

09:01.380 --> 09:06.140
Dabei wurde Early-Stopping aktiviert, um automatisch die Epoche mit

09:06.140 --> 09:09.260
dem geringsten Validierungsverlust auszuwählen.

09:09.260 --> 09:12.300
Das entspricht dem besten Netzwerk.

09:13.720 --> 09:17.480
Mit diesen Einstellungen ergibt sich für das MLP-Modell eine

09:17.480 --> 09:23.980
Trainingsgenauigkeit von 54% und für das CNN eine Genauigkeit von 80%.

09:23.980 --> 09:28.520
Betrachten wir die Vorhersagen mit dem für das Netz unbekannten

09:28.520 --> 09:33.020
Testdatensatz, ergeben sich in beiden Fällen etwas geringere

09:33.020 --> 09:34.980
Genauigkeiten wie erwartet.

09:34.980 --> 09:41.700
Im Falle des MLPs liegt dann die Genauigkeit bei 50%, während sie beim

09:41.700 --> 09:44.000
CNN bei 70% liegt.

09:45.520 --> 09:49.000
Schauen wir uns die Cross-Entropy an, können wir ein ähnliches

09:49.000 --> 09:50.200
Ergebnis feststellen.

09:50.860 --> 09:55.700
Das CNN-Modell weist hier lediglich einen Testverlust von 0,9 auf,

09:56.120 --> 09:59.800
während der Verlust beim MLP bei 1,4 liegt.

10:00.720 --> 10:05.360
Das CNN liefert also unter diesen Trainingseinstellungen deutlich

10:05.360 --> 10:07.820
bessere Ergebnisse als das MLP-Modell.

10:08.840 --> 10:12.980
In der Praxis verwendet man für die Klassifikation von Bildern in der

10:12.980 --> 10:18.520
Regel CNNs, da sie die einfach aufgebauten MLPs meistens in ihrer

10:18.520 --> 10:20.920
Performance bei Weitem übertreffen.

10:22.480 --> 10:27.280
Mit einer Genauigkeit von 70% funktioniert unser CNN-Modell zwar schon

10:27.280 --> 10:32.080
richtig gut, aber wir können das Ergebnis noch weiter verbessern.

10:33.520 --> 10:38.000
Hierfür sehen wir uns im Folgenden die sogenannte Theta Augmentation

10:38.000 --> 10:38.300
an.

10:39.520 --> 10:44.340
Bei diesem Verfahren wird künstlich die Größe des Datensatzes erhöht,

10:44.760 --> 10:48.880
indem leicht abgewandelte Versionen von bereits vorhandenen Daten

10:48.880 --> 10:50.100
hinzugefügt werden.

10:50.920 --> 10:54.880
Im Falle von Bilddatensätzen kann das z.B.

10:55.120 --> 11:00.620
durch Drehen, Spiegeln, Beschneiden oder auch durch Farbveränderungen

11:00.620 --> 11:02.360
der Bilder erreicht werden.

11:03.900 --> 11:08.380
Auf diese Weise lernt das Modell besser zu generalisieren und kann

11:08.380 --> 11:12.900
somit auch besser mit neuen, zuvor noch nicht gesehenen Daten umgehen.

11:14.140 --> 11:17.720
Gleichzeitig sinkt dadurch die Gefahr des Overfittings.

11:18.920 --> 11:23.820
Um herauszufinden, welchen Einfluss Theta Augmentation auf dem

11:23.820 --> 11:28.640
Training hat, haben wir das CNN erneut mit einem Trainingsdatensatz

11:28.640 --> 11:33.280
trainiert, der neben den zuvor verwendeten originalen Cypher-CNN

11:33.280 --> 11:36.980
-Bildern auch leicht abgewandelte Kopien enthielt.

11:38.820 --> 11:43.380
Dabei haben wir pro Originalbild jeweils vier Theta Augmentation

11:43.380 --> 11:49.140
Bilder hinzugefügt, sodass der neue Trainingsdatensatz aus 250.000

11:49.140 --> 11:53.120
anstatt den ursprünglichen 50.000 Bildern bestand.

11:54.420 --> 11:59.620
Mit diesen zusätzlichen Bildern stieg die Testgenauigkeit um 2%.

11:59.620 --> 12:05.860
Auch der Testverlust sank von ursprünglich 0,9 auf 0,84.

12:07.060 --> 12:12.020
Die Anwendung von Theta Augmentation konnte also die Performance

12:12.020 --> 12:14.680
unserer CNNs ein Stück weit verbessern.

12:15.460 --> 12:19.360
Sie haben in diesem Video anhand eines Beispiels gesehen, wie Sie ein

12:19.360 --> 12:23.140
Multilayer Perceptron und ein Convolutional Neural Network aufbauen

12:23.140 --> 12:23.520
können.

12:24.680 --> 12:30.180
Beide Netzwerke sind in der Lage, Bilder von Katzen, Autos, Flugzeuge

12:30.180 --> 12:31.980
und weitere sieben Klassen zu erkennen.

12:33.100 --> 12:37.160
Normalerweise liefern aber CNNs bei der Verarbeitung von Bildern

12:37.160 --> 12:38.400
genauere Ergebnisse.

12:39.300 --> 12:43.600
Vor allem nach der Theta Augmentation, denn so lernt das Modell besser

12:43.600 --> 12:48.340
zu generalisieren und kann neue zuvor noch nicht gesehene Daten auch

12:48.340 --> 12:49.280
besser erkennen.

12:50.700 --> 12:55.460
Deswegen empfehlen wir immer, wenn Sie einen Bildermangel haben, dann

12:55.460 --> 12:57.360
beginnen Sie sofort zu augmentieren.

