\chapter{\texorpdfstring{\glsxtrlongpl{CNN}}{\glsfmtlongpl{CNN}}}%
\label{cha:CNNs}
\glspl{CNN} kommen in einer Vielzahl verschiedener Anwendungsbereiche zum Einsatz.
Vor allem im Bereich der Bildverarbeitung sind diese besonders nützlich (Beispiele: {\color{red} Vorlesung 09 Folien 3 und 4}).
\glspl{CNN} bestehen aus einer Verkettung verschiedenartiger Schichten.
\begin{figure}[H]
    \centering
    \includegraphics[width=0.6\textwidth]{CNN.png}
    \caption{Beispiel eines \texorpdfstring{\glsxtrshort{CNN}}{\glsfmtshort{CNN}}}
    \label{fig:cnn}
\end{figure}

\section{Image-based Inputs}%
\label{sec:Image-based Inputs}
Der Nachteil von Bilddateien ist,
dass diese sehr viele Daten enthalten.
Schon ein 32x32 Pixel großes Bild mit 3 Farben (RGB) hat $32\cdot32\cdot3=3072$ Datenpunkte.
Würde man diese Daten ein einen Vektor verpacken
und anschließend mit einem neuronalen Netzwerk mit (nur) 10 Neuronen verarbeiten,
führt dies bereits zu einer Anzahl von $10^3072$ Gewichten,
welche trainiert werden müssen.
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\textwidth]{image-based_inputs.png}
    \caption{Beispiel für die Anzahl der nötigen Gewichte eines 32x32 Bildes}
    \label{fig:image-based_inputs}
\end{figure}

\section{Convolutional Layers}%
\label{sec:Convolutional Layers}
Das Convolutional Layer akzeptiert Eingabedaten mit dem Volumen $W_1\times H_1\times D_1$ und erzeugt daraus Daten mit dem Volumen $W_2\times H_2\times D_2$.
\begin{itemize}
    \item Es gibt 4 Hyper-Parameter:
        \begin{itemize}
            \item Filteranzahl \tabto{7cm}$K$
            \item Filtergröße (spacial extend\slash\,kernel size) \tabto{7cm}$F$
            \item Schrittweite (Stride)\tabto{7cm}$S$
            \item Padding \tabto{7cm}$P$
        \end{itemize}
    \item die Dimension der Ausgabe errechnet sich aus der Eingabe und den Hyper-Parametern
        \begin{itemize}
            \item $W_2 = \frac{(W_1 - F + 2P)}{S} + 1$
            \item $H_2 = \frac{H_1 - F + 2P}{S} + 1$
            \item $D_2 = K$
        \end{itemize}
    \item Die Anzahl der zu trainierenden Gewichte ist $F\cdot F\cdot D_1\cdot K$
\end{itemize}
Mithilfe eines Convolutional Layers werden Filter auf gegebene Daten angewant.
\begin{figure}[H]
    \centering
    \includegraphics[width=0.6\textwidth]{convolutional_layer.png}
    \caption{Convolutional Layer}
    \label{fig:convolutional_layer}
\end{figure}
Jeder Filter errechnet mithilfe einer Filtermatrix ein Produkt aus einer Teilmenge der Eingangsdaten.
Jedes dieser Produkte ergibt einen einzelnen Datenpunkt auf der \say{activation map}.
\begin{figure}[H]
    \centering
    \includegraphics[width=0.6\textwidth]{1-channel_convolution_example.png}
    \caption{Beispiel einer 1-Kanal Convolutional}
    \label{fig:1-channel_convolution_example}
\end{figure}
Meist werden in einem Convolutional Layer mehrere Filter verwendet,
was zu mehreren Activation Maps führt.
\begin{figure}[H]
    \centering
    \includegraphics[width=0.6\textwidth]{convolutional_layer_stack_filter.png}
    \caption{Convolutional Layer mit mehreren gestapelten (stacked) Filtern}
    \label{fig:convolutional_layer_stack_filter}
\end{figure}

\subsection{Stride and Padding}%
\label{sub:Stride and Padding}
\begin{wrapfigure}{r}{.5\textwidth}
    \centering
    \includegraphics[width=\linewidth]{padding_and_stride.png}
    \caption{Beispiel für Padding und Stride}
    \label{fig:padding_and_stride}
\end{wrapfigure}
Neben der Filtergröße sind die zwei wichtigsten Parameter eines Convolution Layers die Schrittweite (Stride)
und die Wahl des Paddings.
Die Schrittweite gibt an,
wie weit sich dein Filter zwischen jeder Berechnung verschiebt.
Eine größere Schrittweite führt dazu,
dass die Dimension der Daten stärker reduziert wird.
Beim Padding werden zusätzliche Daten (meist nur Nullen) um die Eingabedaten des Convolution Layers herum erzeugt.  
Ein Beispiel hier für ist in {\color{red} Vorlesung 09 Folie 14 und 15} zu sehen.

\section{Pooling Layers}%
\label{sec:Pooling Layers}
\begin{wrapfigure}{r}{.4\textwidth}
    \vspace*{-10mm}
    \centering
    \includegraphics[width=.8\linewidth]{pooling_layer.png}
    \caption{Pooling Layer}
    \label{fig:pooling_layer}
\end{wrapfigure}
Pooling Layer werden dazu verwendet die Dimensionalität der Daten zu reduzieren.
Die Dimension der Eingabedaten wird von $W_1\times H_1\times D_1$ zu $W_2\times H_2\times D_2$ reduziert.
\begin{itemize}
    \item 2 Hyper-Parameter
        \begin{itemize}
            \item Filtergröße (spacial extend\slash\,kernel size) \tabto{7cm}$F$
            \item Schrittweite (Stride)\tabto{7cm}$S$
        \end{itemize}
    \item die Dimension der Ausgabe errechnet sich aus der Eingabe und den Hyper-Parametern
        \begin{itemize}
            \item $W_2 = \frac{(W_1 - F)}{S} + 1$
            \item $H_2 = \frac{H_1 - F}{S} + 1$
            \item $D_2 = D_1$
        \end{itemize}
\end{itemize}
\subsection{Max-Pooling}%
\label{sub:Max-Pooling}
\begin{wrapfigure}{r}{.5\textwidth}
    \vspace*{-10mm}
    \centering
    \includegraphics[width=\linewidth]{max-pooling.png}
    \caption{Max-Pooling}
    \label{fig:max-pooling}
\end{wrapfigure}
Die am häufigsten verwendete Variante eines Pooling Layers verwendet das Max-Pooling verfahren.
Hierbei wird die Dimensionalität einfach reduziert,
indem der mehrere Datenpunkte zu einem Datenpunkt zusammengefasst werden,
wobei der Wert des neuen Datenpunktes gleich dem höchsten Wert der zusammengefassten Datenpunkte entspricht.

\section{\texorpdfstring{\glsxtrshort{CNN}}{\glsfmtshort{CNN}} Architectures}%
\label{sec:CNN_architectures}
Da \glspl{CNN} schon seit vielen Jahren bekannt sind,
gab es in ihrer Architektur viele Entwicklungsschritte

\paragraph{LeNet}%
\label{par:LeNet}

{\color{red} Vorlesung 09 Folie 24}

\paragraph{ImageNet}%
\label{par:ImageNet}
{\color{red} Vorlesung 09 Folie 25}

\subparagraph{AlexNet}%
\label{subp:AlexNet}
{\color{red} Vorlesung 09 Folie 26-30}

\subparagraph{VGG Net}%
\label{subp:VGG Net}
{\color{red} Vorlesung 09 Folie 33-34}

\subparagraph{ResNet}%
\label{subp:ResNet}
{\color{red} Vorlesung 09 Folie 36-45}

\subsection{Transfer Learning}%
\label{sub:Transfer Learning}
Da nicht für jede Anwendung Millionen von Trainingsdaten zur Verfügung stehen muss ein alternativer Weg gefunden werden,
\glspl{CNN} auch für diese Anwendungsgebiete zu trainieren.
Ein moderner Trick ist das \say{Transfer Learning}.
Hierbei wird das \gls{CNN} auf einem verwandten Problem trainiert 
und anschließend mithilfe von den vorhandenen Datenpunkten spezialisiert.
Hierfür werden ein Teil der Schichten \say{eingefroren} und nur die letzten Schichten trainiert.
Abhängig davon,
wie viele Trainingsdaten für das jeweilige Problem vorhanden sind werden mehr oder weniger Schichten eingefroren.
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\textwidth]{transfer_learning.png}
    \caption{Beispiel für Transfer Learning}
    \label{fig:transfer_learning}
\end{figure}
