Neuronal Netze benötigen oft eine große Menge an Trainingsdaten, damit es nicht zu overfitting kommt. Transfer learning erlaubt es, mit relativ geringen Datenmenge dennoch erfolgreiche große Netze zu trainieren. Dabei verwendet man ein bereits auf einen anderen Datensatz (z.b. ImageNet) vortrainiertes Netzwerk, und ersetzt nur das letzte Layer durch ein neues. In dieser Übung geht es darum, ein Netzwerk für die Erkennung von Geparden und Leoparden in der freien Wildbahn zu trainineren.
%% Cell type:markdown id: tags:
## Daten laden
Lade die Daten hier herunter: http://tonic.imp.fu-berlin.de/cv_data/data.tar.gz
(die Daten liegen auch entpackt hier: http://tonic.imp.fu-berlin.de/cv_data/data/)
Die Daten wurde bereits in ein Trainings- und Validierungsset geteilt. Die Ordnerstruktur ist wie bei vielen Bildklassifierungsdatensetzen so aufgebaut. Es gibt zwei Unterordner für die Trainings- und Validierunsdaten. In diesen Ordnern liegen dann jeweils alle Bilder von einer Klasse in einem Unterordner mit dem Namen der Klasse.
Ein Beispiel: Die Trainingsbilder für die Klasse "cheetah" liegen in dem Unterordner train/cheetah
Diese Orderstruktur wird auch von dem in keras enhaltenen ImageDataGenerator unterstützt.
C:\Anaconda3\envs\tensorflow\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
Trainiere zuerst ein kleines Classifer-Netzwerk ohne transfer learning. Falls du keine Grafikkarte hast, solltest du nicht die volle Auflösung (siehe Variable image_input_size) verwenden, da das Training sonst zu lange dauert. Eine Bildgröße von 32x32 Pixeln wäre zum Beispiel möglich.
Erstelle eine Confusion matrix basierend auf den Ausgaben des Netzes für die Validierungsdaten und berechne den ROC AUC für die Klasse cheetah. Du kannst hierfür optional die scikit-learn Bibliothek verwenden.
Lade nun ein auf Imagenet vortrainiertes Netzwerk und klassifiziere damit die Validierungsdaten. Eine Anleitung für keras findest du hier: https://keras.io/applications
Du kannst selber entscheiden, welche Netzwerkarchitektur du verwendest.
Da der ImageNet-Datensatz auch die Klassen cheetah und leopard enthält, können wir sogar ohne transfer learning das vortrainierte Netzwerk evaluieren. Interpretiere alle Klassen außer cheetah und leopard als unknown und berechne wie im vorherigen Schritt die Confusion matrix und den ROC AUC score für die Klasse cheetah.
Das vortrainierte Netzwerk kann nun mit unseren Daten weitertrainiert werden. Ersetze dafür das letzte Layer in dem Netzwerk mit einem Dense Layer mit 3 Ausgaben für unsere Klassen cheetah, leopard und unknown. Du kannst selbst entscheiden, ob du nun das komplette Netzwerk mit trainierst oder nur das neu eingefügte, letzte Layer.
Auch hierfür kannst du dich wieder an der keras Anleitung orientieren: https://keras.io/applications
Evaluiere das so trainierte Netzwerk wie in den letzten beiden Aufgaben.
%% Cell type:code id: tags:
``` python
predict=model.predict_generator(val_gen)
```
%% Cell type:code id: tags:
``` python
predict_labels=np.argmax(predict,axis=1)
evaluate(predict,predict_labels)
```
%% Output
Konfusionsmatrix
('unknown', 'cheetah', 'leopard')
[[ 3 361 0]
[ 3 1437 0]
[ 0 111 0]]
Accuracy: 0.7519582245430809
ROC AUC 0.49802302631578954
%% Cell type:markdown id: tags:
## Auswertung
Beschreibe kurz qualitativ die Resultate. Wie unterscheiden sich die trainierten Netzwerke, zum Beispiel im Bezug auf die Genauigkeit oder die Laufzeit? Welche Entscheidungen musstest du bei der Erfüllung der Aufgaben treffen und warum hast du dich für den von dir gewählten Weg entschieden?
%% Cell type:markdown id: tags:
**Eignes Netzwerk**
Da der Unterschied im Fellmuster sehr eindeutig zu sehen ist, haben wir uns entschieden mehrere Conv-Layer hintereinander zu nutzen, damit der Algorithmus diese gut erkennen kann.
Dies schien im Trainig auch gut zu funktionieren, da wir schnell eine gute Genauigkeit bekommen haben.
Leider kam es dabei zu einem starken overfitting, wir hatten im Training 95%, beim Validieren aber nur knapp über 50.
Oder es kam nur zu einer Genauigkeit von 64%. Dann hat er einfach immer "Cheetah" ausgegeben.
**Vortrainiertes Netzwerk**
Das Vortrainierte Netzwerk hat den Vorteil das man nicht selber trainieren muss, ist aber vorhersagen nicht viel besser, da es auf sehr viele Klassen trainiert wurde, die uns hier nicht interessieren.
Es war unbekannt welche Klasse welche ausgabe ist, hier mussten wir statistisch die klassen nehmen die am besten passten.
**Transfer Learning**
Das Netz sah beim Training noch gut aus, hat beim Validieren dann einfach nur "Cheetah" ausgegeben.