CNNs hinzugefügt.
@ -18,38 +18,39 @@
|
||||
\def \DATE{\today}
|
||||
|
||||
\includeonly{
|
||||
%Einleitung
|
||||
chapters/Einleitung,
|
||||
%Classical_Supervised_Learning
|
||||
chapters/Classical_Supervised_Learning/Linear_Regression,
|
||||
chapters/Classical_Supervised_Learning/Linear_Classification,
|
||||
chapters/Classical_Supervised_Learning/Model_Selection,
|
||||
chapters/Classical_Supervised_Learning/k-Nearest_Neighbors,
|
||||
chapters/Classical_Supervised_Learning/Trees_and_Forests,
|
||||
%Kernel_Methods
|
||||
chapters/Kernel_Methods/Kernel-Regression,
|
||||
chapters/Kernel_Methods/Support_Vector_Machines,
|
||||
chapters/Bayesian_Learning/Bayesian_Learning,
|
||||
chapters/Bayesian_Learning/Bayesian_Regression_Algorithms,
|
||||
%Einleitu%ng
|
||||
%chapters/Einleitung,
|
||||
%%Classical_Supervised_Learning
|
||||
%chapters/Classical_Supervised_Learning/Linear_Regression,
|
||||
%chapters/Classical_Supervised_Learning/Linear_Classification,
|
||||
%chapters/Classical_Supervised_Learning/Model_Selection,
|
||||
%chapters/Classical_Supervised_Learning/k-Nearest_Neighbors,
|
||||
%chapters/Classical_Supervised_Learning/Trees_and_Forests,
|
||||
%%Kernel_Methods
|
||||
%chapters/Kernel_Methods/Kernel-Regression,
|
||||
%chapters/Kernel_Methods/Support_Vector_Machines,
|
||||
%chapters/Bayesian_Learning/Bayesian_Learning,
|
||||
%chapters/Bayesian_Learning/Bayesian_Regression_Algorithms,
|
||||
%Neural_Networks
|
||||
chapters/Neural_Networks/Basics,
|
||||
chapters/Neural_Networks/Gradient_Descent,
|
||||
chapters/Neural_Networks/Regularization,
|
||||
chapters/Neural_Networks/Practical_Considerations,
|
||||
chapters/Neural_Networks/CNNs_and_RNNs,
|
||||
%Classical_Unsupervised_Learning
|
||||
chapters/Classical_Unsupervised_Learning/Dimensionality_Reduction_and_Clustering,
|
||||
chapters/Classical_Unsupervised_Learning/Density_Estimation_and_Mixture_Models,
|
||||
chapters/Classical_Unsupervised_Learning/Variational_Auto-Encoders,
|
||||
%Mathematische_Grundlagen
|
||||
chapters/Mathematische_Grundlagen/Lineare_Algebra,
|
||||
chapters/Mathematische_Grundlagen/Probability_Theory,
|
||||
chapters/Mathematische_Grundlagen/Kernel_Basics,
|
||||
chapters/Mathematische_Grundlagen/Sub-Gradients,
|
||||
chapters/Mathematische_Grundlagen/Constraint_Optimization,
|
||||
chapters/Mathematische_Grundlagen/Gaussian_Identities,
|
||||
%Anhang
|
||||
Appendix
|
||||
chapters/Neural_Networks/CNN,
|
||||
chapters/Neural_Networks/RNN,
|
||||
%Classical%_Unsupervised_Learning
|
||||
%chapters/Classical_Unsupervised_Learning/Dimensionality_Reduction_and_Clustering,
|
||||
%chapters/Classical_Unsupervised_Learning/Density_Estimation_and_Mixture_Models,
|
||||
%chapters/Classical_Unsupervised_Learning/Variational_Auto-Encoders,
|
||||
%%Mathematische_Grundlagen
|
||||
%chapters/Mathematische_Grundlagen/Lineare_Algebra,
|
||||
%chapters/Mathematische_Grundlagen/Probability_Theory,
|
||||
%chapters/Mathematische_Grundlagen/Kernel_Basics,
|
||||
%chapters/Mathematische_Grundlagen/Sub-Gradients,
|
||||
%chapters/Mathematische_Grundlagen/Constraint_Optimization,
|
||||
%chapters/Mathematische_Grundlagen/Gaussian_Identities,
|
||||
%%Anhang
|
||||
%Appendix
|
||||
}
|
||||
|
||||
\input{Glossary.tex}
|
||||
@ -90,7 +91,8 @@
|
||||
\include{chapters/Neural_Networks/Gradient_Descent.tex}
|
||||
\include{chapters/Neural_Networks/Regularization.tex}
|
||||
\include{chapters/Neural_Networks/Practical_Considerations.tex}
|
||||
\include{chapters/Neural_Networks/CNNs_and_RNNs.tex}
|
||||
\include{chapters/Neural_Networks/CNN.tex}
|
||||
\include{chapters/Neural_Networks/RNN.tex}
|
||||
|
||||
\part{Classical Unsupervised Learning}
|
||||
\label{part:Classical Unsupervised Learning}
|
||||
|
168
chapters/Neural_Networks/CNN.tex
Normal file
@ -0,0 +1,168 @@
|
||||
\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}
|
@ -1,2 +1,127 @@
|
||||
\chapter{\texorpdfstring{\glsxtrshortpl{CNN} and \glsxtrshortpl{RNN}}{\glsfmtshortpl{CNN} and \glsfmtshortpl{RNN}}}%
|
||||
\label{cha:CNNs and RNNs}
|
||||
\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.
|
||||
|
||||
|
||||
|
3
chapters/Neural_Networks/RNN.tex
Normal file
@ -0,0 +1,3 @@
|
||||
\chapter{\texorpdfstring{\glsxtrlongpl{RNN}}{\glsfmtlongpl{CNN}}}%
|
||||
\label{cha:RNNs}
|
||||
|
BIN
images/1-channel_convolution_example.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
images/CNN.png
Normal file
After Width: | Height: | Size: 59 KiB |
BIN
images/convolutional_layer.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
images/convolutional_layer_stack_filter.png
Normal file
After Width: | Height: | Size: 154 KiB |
BIN
images/image-based_inputs.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
images/max-pooling.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
images/padding_and_stride.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
images/pooling_layer.png
Normal file
After Width: | Height: | Size: 216 KiB |
BIN
images/transfer_learning.png
Normal file
After Width: | Height: | Size: 174 KiB |