even more corrections

This commit is contained in:
Clemens Dautermann 2020-02-10 21:46:45 +01:00
parent 344616294b
commit 498511867a
7 changed files with 64 additions and 64 deletions

View file

@ -97,16 +97,16 @@
\newlabel{Filter_Example_raw}{{21}{21}{Das Beispielbild aus dem Mnist Datensatz\relax }{figure.caption.19}{}}
\@writefile{lof}{\defcounter {refsection}{0}\relax }\@writefile{lof}{\contentsline {figure}{\numberline {22}{\ignorespaces Die jeweils oben stehenden Filter wurden auf das Beispielbild angewandt.\relax }}{21}{figure.caption.20}\protected@file@percent }
\newlabel{Filter_output dargestellt}{{22}{21}{Die jeweils oben stehenden Filter wurden auf das Beispielbild angewandt.\relax }{figure.caption.20}{}}
\@writefile{lof}{\defcounter {refsection}{0}\relax }\@writefile{lof}{\contentsline {figure}{\numberline {23}{\ignorespaces Beispiele f\IeC {\"u}r low- mid- und high-level Features in Convolutional Neural Nets\newline Quelle: https://tvirdi.github.io/2017-10-29/cnn/}}{22}{figure.caption.21}\protected@file@percent }
\newlabel{HL_features_conv}{{23}{22}{Beispiele für low- mid- und high-level Features in Convolutional Neural Nets\newline Quelle: https://tvirdi.github.io/2017-10-29/cnn/}{figure.caption.21}{}}
\@writefile{lof}{\defcounter {refsection}{0}\relax }\@writefile{lof}{\contentsline {figure}{\numberline {23}{\ignorespaces Beispiele f\IeC {\"u}r low-, mid- und high-level Features in Convolutional Neural Nets\newline Quelle: https://tvirdi.github.io/2017-10-29/cnn/}}{22}{figure.caption.21}\protected@file@percent }
\newlabel{HL_features_conv}{{23}{22}{Beispiele für low-, mid- und high-level Features in Convolutional Neural Nets\newline Quelle: https://tvirdi.github.io/2017-10-29/cnn/}{figure.caption.21}{}}
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.2}Pooling Layers}{22}{subsubsection.3.7.2}\protected@file@percent }
\@writefile{lof}{\defcounter {refsection}{0}\relax }\@writefile{lof}{\contentsline {figure}{\numberline {24}{\ignorespaces Max Pooling mit $2\times 2$ gro\IeC {\ss }en Submatritzen\newline Quelle: https://computersciencewiki.org/index.php/Max-pooling\_/\_Pooling CC BY NC SA Lizenz}}{23}{figure.caption.22}\protected@file@percent }
\newlabel{Maxpool}{{24}{23}{Max Pooling mit $2\times 2$ großen Submatritzen\newline Quelle: https://computersciencewiki.org/index.php/Max-pooling\_/\_Pooling\\ CC BY NC SA Lizenz}{figure.caption.22}{}}
\@writefile{lof}{\defcounter {refsection}{0}\relax }\@writefile{lof}{\contentsline {figure}{\numberline {25}{\ignorespaces Average Pooling mit $2\times 2$ gro\IeC {\ss }en Submatritzen\newline Aus: Dominguez-Morales, Juan Pedro. (2018). Neuromorphic audio processing through real-time embedded spiking neural networks. Abbildung 33}}{23}{figure.caption.23}\protected@file@percent }
\newlabel{AvgPool}{{25}{23}{Average Pooling mit $2\times 2$ großen Submatritzen\newline Aus: Dominguez-Morales, Juan Pedro. (2018). Neuromorphic audio processing through real-time embedded spiking neural networks. Abbildung 33}{figure.caption.23}{}}
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {section}{\numberline {4}PyTorch}{23}{section.4}\protected@file@percent }
\@writefile{lof}{\defcounter {refsection}{0}\relax }\@writefile{lof}{\contentsline {figure}{\numberline {26}{\ignorespaces Gegen\IeC {\"u}berstellung von Max und Average Pooling\relax }}{24}{figure.caption.24}\protected@file@percent }
\newlabel{Pooling_Mnist}{{26}{24}{Gegenüberstellung von Max und Average Pooling\relax }{figure.caption.24}{}}
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {section}{\numberline {4}PyTorch}{24}{section.4}\protected@file@percent }
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Datenvorbereitung}{24}{subsection.4.1}\protected@file@percent }
\@writefile{lof}{\defcounter {refsection}{0}\relax }\@writefile{lof}{\contentsline {figure}{\numberline {27}{\ignorespaces Der Code zum Laden des MNIST Datensatzes\relax }}{25}{figure.caption.25}\protected@file@percent }
\newlabel{MNIST_Dataloader_Code}{{27}{25}{Der Code zum Laden des MNIST Datensatzes\relax }{figure.caption.25}{}}

View file

@ -45,7 +45,7 @@
\defcounter {refsection}{0}\relax
\contentsline {figure}{\numberline {22}{\ignorespaces Die jeweils oben stehenden Filter wurden auf das Beispielbild angewandt.\relax }}{21}{figure.caption.20}%
\defcounter {refsection}{0}\relax
\contentsline {figure}{\numberline {23}{\ignorespaces Beispiele f\IeC {\"u}r low- mid- und high-level Features in Convolutional Neural Nets\newline Quelle: https://tvirdi.github.io/2017-10-29/cnn/}}{22}{figure.caption.21}%
\contentsline {figure}{\numberline {23}{\ignorespaces Beispiele f\IeC {\"u}r low-, mid- und high-level Features in Convolutional Neural Nets\newline Quelle: https://tvirdi.github.io/2017-10-29/cnn/}}{22}{figure.caption.21}%
\defcounter {refsection}{0}\relax
\contentsline {figure}{\numberline {24}{\ignorespaces Max Pooling mit $2\times 2$ gro\IeC {\ss }en Submatritzen\newline Quelle: https://computersciencewiki.org/index.php/Max-pooling\_/\_Pooling CC BY NC SA Lizenz}}{23}{figure.caption.22}%
\defcounter {refsection}{0}\relax

View file

@ -1,4 +1,4 @@
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2020.1.22) 10 FEB 2020 11:18
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2020.1.22) 10 FEB 2020 21:26
entering extended mode
\write18 enabled.
%&-line parsing enabled.
@ -1723,10 +1723,10 @@ Package pdftex.def Info: ../graphics/mnist_5/conv_only/mnist_5_right_edges.png
<../graphics/features.png, id=360, 833.1125pt x 388.45125pt>
File: ../graphics/features.png Graphic file (type png)
<use ../graphics/features.png>
Package pdftex.def Info: ../graphics/features.png used on input line 438.
Package pdftex.def Info: ../graphics/features.png used on input line 439.
(pdftex.def) Requested size: 360.0pt x 167.85466pt.
Underfull \hbox (badness 10000) in paragraph at lines 349--445
Underfull \hbox (badness 10000) in paragraph at lines 349--446
[]
@ -1741,7 +1741,7 @@ LaTeX Warning: `h' float specifier changed to `ht'.
LaTeX Warning: `h' float specifier changed to `ht'.
Overfull \hbox (1.54195pt too wide) in paragraph at lines 446--448
Overfull \hbox (1.54195pt too wide) in paragraph at lines 447--449
\T1/LinuxBiolinumT-TLF/m/n/10.95 Pooling Layers wer-den eben-falls haupt-säch-l
ich in Con-vo-lu-tio-nal Neural Net-works
[]
@ -1753,38 +1753,38 @@ ly/mnist_5_right_edges.png>]
<../graphics/MaxpoolSample2.png, id=382, 164.25pt x 68.547pt>
File: ../graphics/MaxpoolSample2.png Graphic file (type png)
<use ../graphics/MaxpoolSample2.png>
Package pdftex.def Info: ../graphics/MaxpoolSample2.png used on input line 456
Package pdftex.def Info: ../graphics/MaxpoolSample2.png used on input line 457
.
(pdftex.def) Requested size: 251.9989pt x 105.17671pt.
<../graphics/Average-Pooling-Example.png, id=383, 746.79pt x 337.26pt>
File: ../graphics/Average-Pooling-Example.png Graphic file (type png)
<use ../graphics/Average-Pooling-Example.png>
Package pdftex.def Info: ../graphics/Average-Pooling-Example.png used on input
line 464.
line 465.
(pdftex.def) Requested size: 251.9989pt x 113.80232pt.
File: ../graphics/mnist_5/conv_only/mnist_5_upper_edges.png Graphic file (type
png)
<use ../graphics/mnist_5/conv_only/mnist_5_upper_edges.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_only/mnist_5_upper_edges.png
used on input line 474.
used on input line 475.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
File: ../graphics/mnist_5/conv_only/mnist_5_left_edges.png Graphic file (type p
ng)
<use ../graphics/mnist_5/conv_only/mnist_5_left_edges.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_only/mnist_5_left_edges.png
used on input line 479.
used on input line 480.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
File: ../graphics/mnist_5/conv_only/mnist_5_lower_edges.png Graphic file (type
png)
<use ../graphics/mnist_5/conv_only/mnist_5_lower_edges.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_only/mnist_5_lower_edges.png
used on input line 484.
used on input line 485.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
File: ../graphics/mnist_5/conv_only/mnist_5_right_edges.png Graphic file (type
png)
<use ../graphics/mnist_5/conv_only/mnist_5_right_edges.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_only/mnist_5_right_edges.png
used on input line 489.
used on input line 490.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
<../graphics/mnist_5/conv_pool/upper_horiz_pooled.png, id=385, 462.528pt x 346.
896pt>
@ -1792,7 +1792,7 @@ File: ../graphics/mnist_5/conv_pool/upper_horiz_pooled.png Graphic file (type p
ng)
<use ../graphics/mnist_5/conv_pool/upper_horiz_pooled.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_pool/upper_horiz_pooled.png
used on input line 494.
used on input line 495.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
<../graphics/mnist_5/conv_pool/left_vert_pooled.png, id=386, 462.528pt x 346.89
6pt>
@ -1800,7 +1800,7 @@ File: ../graphics/mnist_5/conv_pool/left_vert_pooled.png Graphic file (type png
)
<use ../graphics/mnist_5/conv_pool/left_vert_pooled.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_pool/left_vert_pooled.png us
ed on input line 499.
ed on input line 500.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
<../graphics/mnist_5/conv_pool/lower_horiz_pooled.png, id=387, 462.528pt x 346.
896pt>
@ -1808,7 +1808,7 @@ File: ../graphics/mnist_5/conv_pool/lower_horiz_pooled.png Graphic file (type p
ng)
<use ../graphics/mnist_5/conv_pool/lower_horiz_pooled.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_pool/lower_horiz_pooled.png
used on input line 504.
used on input line 505.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
<../graphics/mnist_5/conv_pool/right_vert_pooled.png, id=388, 462.528pt x 346.8
96pt>
@ -1816,7 +1816,7 @@ File: ../graphics/mnist_5/conv_pool/right_vert_pooled.png Graphic file (type pn
g)
<use ../graphics/mnist_5/conv_pool/right_vert_pooled.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_pool/right_vert_pooled.png u
sed on input line 509.
sed on input line 510.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
<../graphics/mnist_5/conv_pool/upper_horiz_avgpooled.png, id=389, 462.528pt x 3
46.896pt>
@ -1824,7 +1824,7 @@ File: ../graphics/mnist_5/conv_pool/upper_horiz_avgpooled.png Graphic file (typ
e png)
<use ../graphics/mnist_5/conv_pool/upper_horiz_avgpooled.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_pool/upper_horiz_avgpooled.pn
g used on input line 514.
g used on input line 515.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
<../graphics/mnist_5/conv_pool/left_vert_avgpooled.png, id=390, 462.528pt x 346
.896pt>
@ -1832,7 +1832,7 @@ File: ../graphics/mnist_5/conv_pool/left_vert_avgpooled.png Graphic file (type
png)
<use ../graphics/mnist_5/conv_pool/left_vert_avgpooled.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_pool/left_vert_avgpooled.png
used on input line 519.
used on input line 520.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
<../graphics/mnist_5/conv_pool/lower_horiz_avgpooled.png, id=391, 462.528pt x 3
46.896pt>
@ -1840,7 +1840,7 @@ File: ../graphics/mnist_5/conv_pool/lower_horiz_avgpooled.png Graphic file (typ
e png)
<use ../graphics/mnist_5/conv_pool/lower_horiz_avgpooled.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_pool/lower_horiz_avgpooled.pn
g used on input line 524.
g used on input line 525.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
<../graphics/mnist_5/conv_pool/right_vert_avgpooled.png, id=392, 462.528pt x 34
6.896pt>
@ -1848,10 +1848,10 @@ File: ../graphics/mnist_5/conv_pool/right_vert_avgpooled.png Graphic file (type
png)
<use ../graphics/mnist_5/conv_pool/right_vert_avgpooled.png>
Package pdftex.def Info: ../graphics/mnist_5/conv_pool/right_vert_avgpooled.png
used on input line 529.
used on input line 530.
(pdftex.def) Requested size: 71.9989pt x 53.99593pt.
Underfull \hbox (badness 10000) in paragraph at lines 452--535
Underfull \hbox (badness 10000) in paragraph at lines 453--536
[]
@ -1886,12 +1886,12 @@ raphics/mnist_5/conv_pool/lower_horiz_pooled.png> <../graphics/mnist_5/conv_poo
l/right_vert_pooled.png> <../graphics/mnist_5/conv_pool/upper_horiz_avgpooled.p
ng> <../graphics/mnist_5/conv_pool/left_vert_avgpooled.png> <../graphics/mnist_
5/conv_pool/lower_horiz_avgpooled.png> <../graphics/mnist_5/conv_pool/right_ver
t_avgpooled.png>] [25]
t_avgpooled.png>]
\openout6 = `Grundlagen_des_maschinellen_lernens.pyg'.
(./_minted-Grundlagen_des_maschinellen_lernens/0CC230EAEF969F875162D94A43EECC44
F6C426F58C5CCC27D3C7BD698FEC22DB.pygtex)
F6C426F58C5CCC27D3C7BD698FEC22DB.pygtex) [25]
\openout6 = `Grundlagen_des_maschinellen_lernens.pyg'.
@ -2003,7 +2003,7 @@ F6C426F58C5CCC27D3C7BD698FEC22DB.pygtex)
(./_minted-Grundlagen_des_maschinellen_lernens/6361598B18370336863B24D1B6FAE96E
F6C426F58C5CCC27D3C7BD698FEC22DB.pygtex)
LaTeX Warning: Citation '6' on page 27 undefined on input line 615.
LaTeX Warning: Citation '6' on page 27 undefined on input line 616.
\openout6 = `Grundlagen_des_maschinellen_lernens.pyg'.
@ -2021,7 +2021,7 @@ F6C426F58C5CCC27D3C7BD698FEC22DB.pygtex) [27]
(./_minted-Grundlagen_des_maschinellen_lernens/B39808E7C45EEBD5237FE1E82D273879
53A0C9FE66949F8EC4BED65B31F6975B.pygtex)
LaTeX Warning: Citation '7' on page 28 undefined on input line 657.
LaTeX Warning: Citation '7' on page 28 undefined on input line 658.
\openout6 = `Grundlagen_des_maschinellen_lernens.pyg'.
@ -2062,7 +2062,7 @@ F6C426F58C5CCC27D3C7BD698FEC22DB.pygtex)
(./_minted-Grundlagen_des_maschinellen_lernens/B51E2DE1996D35173C012720F7A4FDA4
F6C426F58C5CCC27D3C7BD698FEC22DB.pygtex)
Overfull \hbox (1.3531pt too wide) in paragraph at lines 662--662
Overfull \hbox (1.3531pt too wide) in paragraph at lines 663--663
[]\T1/txr/bx/n/14.4 Ein Klas-si-fi-zie-rungs-netz-werk für hand-ge-schrie-be-ne
Zif-
[]
@ -2094,13 +2094,13 @@ LaTeX Warning: `h' float specifier changed to `ht'.
<../graphics/Wandb_accuracy.png, id=477, 1758.57pt x 867.24pt>
File: ../graphics/Wandb_accuracy.png Graphic file (type png)
<use ../graphics/Wandb_accuracy.png>
Package pdftex.def Info: ../graphics/Wandb_accuracy.png used on input line 722
Package pdftex.def Info: ../graphics/Wandb_accuracy.png used on input line 723
.
(pdftex.def) Requested size: 360.0pt x 177.53392pt.
<../graphics/Wandb_loss.png, id=479, 1758.57pt x 867.24pt>
File: ../graphics/Wandb_loss.png Graphic file (type png)
<use ../graphics/Wandb_loss.png>
Package pdftex.def Info: ../graphics/Wandb_loss.png used on input line 729.
Package pdftex.def Info: ../graphics/Wandb_loss.png used on input line 730.
(pdftex.def) Requested size: 360.0pt x 177.53392pt.
LaTeX Warning: `h' float specifier changed to `ht'.
@ -2110,19 +2110,19 @@ LaTeX Warning: `h' float specifier changed to `ht'.
LaTeX Warning: `h' float specifier changed to `ht'.
[33] [34 <../graphics/Wandb_accuracy.png>]
Underfull \hbox (badness 10000) in paragraph at lines 748--752
Underfull \hbox (badness 10000) in paragraph at lines 749--753
\T1/LinuxBiolinumT-TLF/m/n/10.95 Quelle: https://towardsdatascience.com/common-
loss-functions-in-
[]
Underfull \hbox (badness 10000) in paragraph at lines 753--757
Underfull \hbox (badness 10000) in paragraph at lines 754--758
\T1/LinuxBiolinumT-TLF/m/n/10.95 https://www.bloomberg.com/news/articles/2019-1
2-11/face-recognition-
[]
Underfull \hbox (badness 10000) in paragraph at lines 758--762
Underfull \hbox (badness 10000) in paragraph at lines 759--763
\T1/LinuxBiolinumT-TLF/m/n/10.95 https://www.technologyreview.com/f/614986/ai-f
ace-recognition-racist-us-
[]
@ -2150,11 +2150,11 @@ rs auf-ge-tra-gen ge-gen die Trai-nings-
\openout9 = `Grundlagen_des_maschinellen_lernens.lof'.
[37]
Package atveryend Info: Empty hook `BeforeClearDocument' on input line 773.
Package atveryend Info: Empty hook `AfterLastShipout' on input line 773.
Package atveryend Info: Empty hook `BeforeClearDocument' on input line 774.
Package atveryend Info: Empty hook `AfterLastShipout' on input line 774.
(./Grundlagen_des_maschinellen_lernens.aux)
Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 773.
Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 773.
Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 774.
Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 774.
Package rerunfilecheck Info: File `Grundlagen_des_maschinellen_lernens.out' has
not changed.
(rerunfilecheck) Checksum: 491CE07912FA2AF4E8ED72CFA9408B7C;2541.
@ -2177,7 +2177,7 @@ un.xml'.
Here is how much of TeX's memory you used:
41666 strings out of 492609
935642 string characters out of 6131462
1496048 words of memory out of 5000000
1496049 words of memory out of 5000000
44636 multiletter control sequences out of 15000+600000
97218 words of font info for 129 fonts, out of 8000000 for 9000
1143 hyphenation exceptions out of 8191
@ -2195,7 +2195,7 @@ live/texmf-dist/fonts/type1/public/txfonts/txsy.pfb></usr/share/texlive/texmf-d
ist/fonts/type1/urw/times/utmb8a.pfb></usr/share/texlive/texmf-dist/fonts/type1
/urw/times/utmr8a.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/times/utmr
8a.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/times/utmri8a.pfb>
Output written on Grundlagen_des_maschinellen_lernens.pdf (39 pages, 1550895 by
Output written on Grundlagen_des_maschinellen_lernens.pdf (39 pages, 1550851 by
tes).
PDF statistics:
649 PDF objects out of 1000 (max. 8388607)

View file

@ -434,24 +434,24 @@ Der jeweils dunkel dargestellte Bereich kann als das identifiziert werden, was v
Die Kernels werden natürlich nicht per Hand initialisiert und angepasst, sondern setzen sich aus Parametern zusammen, die im Laufe des Lernprozesses durch das Netz anpassbar sind. Das Netz kann also die Filtermatrix selber verändern. Die Filter werden meist mit Zufallswerten initialisiert und dann während des Lernens angepasst. Ferner muss ein Kernel auch nicht immer drei Einheiten breit sein, sondern kann jede Größe $\ge2$ annehmen. Je nachdem, wie sich der Kernel über die Eingabematrix bewegt, ist außerdem ein sogenanntes \glqq Padding'' nötig, da gegebenenfalls Werte betrachtet werden müssten, die nicht in der Eingabematrix liegen. In der Regel werden daher alle Werte, die nicht in der Eingabematrix vorhanden sind, durch 0 ersetzt. Das Padding ist in Abbildung \ref{Convolution_illustration} in der Eingabematrix weiß dargestellt. Es ist eine Art \glqq Rand aus Nullen'', der um das Bild gelegt wird.
\\
\\
Hintereinander können convolutional Layers auch ganze Elemente eines Bildes erkennen. Erkennt das erste Layer wie oben gezeigt beispielsweise Kanten, so kann das Layer darauf Kombinationen aus diesen, wie beispielsweise Ecken oder Winkel, erkennen. Wie gefilterte Bilder für sogenannte \glqq High-Level-Features'' aussehen können ist in Abbilldung \ref{HL_features_conv} dargestellt. Die Ausgabebilder von Convolutional Layers werden als \glqq Feature map'' bezeichnet.
Hintereinander können convolutional Layers auch ganze Elemente eines Bildes erkennen. Erkennt das erste Layer wie oben gezeigt beispielsweise Kanten, so kann das Layer darauf Kombinationen aus diesen, wie beispielsweise Ecken oder Winkel, erkennen. Wie gefilterte Bilder für sogenannte \glqq High-Level-Features'' aussehen können, ist in Abbildung \ref{HL_features_conv} dargestellt. Die Ausgabebilder von Convolutional Layers werden als \glqq Feature map'' bezeichnet.
\begin{figure}[h]
\includegraphics[width=\linewidth]{../graphics/features.png}
\caption[Beispiele für low- mid- und high-level Features in Convolutional Neural Nets\newline
\caption[Beispiele für low-, mid- und high-level Features in Convolutional Neural Nets\newline
Quelle: https://tvirdi.github.io/2017-10-29/cnn/]{Beispiele für low- mid- und high-level Features in Convolutional Neural Nets}
\label{HL_features_conv}
\end{figure}
\\
Das bemerkenswerte an Convolutional Layers ist vor allem, dass duch ähnliche Optimierungsalgorithmen auch hier maschinelles lernen möglich ist, dass sich ein neuronales Netz diese Filter also selbstständig beibringen kann.
Das bemerkenswerte an Convolutional Layers ist vor allem, dass durch ähnliche Optimierungsalgorithmen auch hier maschinelles Lernen möglich ist, sich ein neuronales Netz diese Filter also selbstständig beibringen kann.
\subsubsection{Pooling Layers}
Pooling Layers werden ebenfalls hauptsächlich in Convolutional Neural Networks verwendet. Sie werden nach Convolutional Layers genutzt um das Ausgabebild herunterzutakten, also verlustbehaftet zu Komprimieren. Dabei wird die Feature Map im wesentlichen zusammengefasst um die Datenmenge, die das Folgende Convolutional Layer erhält zu reduzieren und sie Verschiebungen im Originalbild gegenüber immuner zu machen. Das ist deshalb notwendig, da die Convolutional Layers die Features lokal sehr begrenzt erkennen und daher eine kleine Verschiebung des Originalbildes zur Folge haben kann, dass im Folgenden Convolutional Layer die Kombination der Features gegebenenfalls nicht richtig erkannt wird. Das Pooling Layer kann diesem Effekt entgegenwirken, indem es die Features zusammenfasst. So kann aus einer ganzen Kante beispielsweise ein einziger Pixel werden.\\
Pooling Layers werden ebenfalls hauptsächlich in Convolutional Neural Networks verwendet. Sie werden nach Convolutional Layers genutzt, um das Ausgabebild herunterzutakten, also verlustbehaftet zu komprimieren. Dabei wird die Feature Map im wesentlichen zusammengefasst, um die Datenmenge, die das folgende Convolutional Layer erhält, zu reduzieren und sie Verschiebungen im Originalbild gegenüber immuner zu machen. Das ist notwendig, weil die Convolutional Layers die Features lokal sehr begrenzt erkennen und daher eine kleine Verschiebung des Originalbildes zur Folge haben kann, dass im folgenden Convolutional Layer die Kombination der Features gegebenenfalls nicht richtig erkannt wird. Das Pooling Layer kann diesem Effekt entgegenwirken, indem es die Features zusammenfasst. So kann aus einer ganzen Kante beispielsweise ein einziger Pixel werden.\\
Es werden im Wesentlichen zwei Techniken zum Pooling eingesetzt.
\begin{enumerate}
\item Max Pooling (Abbildung \ref{Maxpool})
\item Average Pooling (Abbildung \ref{AvgPool})
\end{enumerate}
Sie unterscheiden sich darin, wie die zu komprimierenden Werte mit einander verrechnet werden, sind ansonsten jedoch identisch.\\
Beim Pooling wird die Eingabematrix in Submatritzen partitioniert\footnote{Hier ist die Mengenteorethische Partitionierung gemeint. Eine Menge wird in nicht leere Teilmengen unterteilt, sodass jedes Element der Ausgangsmenge in genau einer der Teilmengen enthalten ist.}. Jede Submatrix stellt später einen Pixel in der Ausgabematrix dar. Hier unterscheiden sich jetzt Max- und Avarage- Pooling. Beim Max Pooling ist der neue Wert der höhste Wert aus dieser Submatrix, beim Avarage Pooling wird der Durchschnitt aller Werte Der Submatrix gebildet und als Neuer Wert verwendet.
Sie unterscheiden sich darin, wie die zu komprimierenden Werte miteinander verrechnet werden, sind ansonsten jedoch identisch.\\
Beim Pooling wird die Eingabematrix in Submatritzen partitioniert\footnote{Hier ist die mengenteoretische Partitionierung gemeint. Eine Menge wird in nicht leere Teilmengen unterteilt, sodass jedes Element der Ausgangsmenge in genau einer der Teilmengen enthalten ist.}. Jede Submatrix stellt später einen Pixel in der Ausgabematrix dar. Hier unterscheiden sich jetzt Max- und Avarage- Pooling. Beim Max Pooling ist der neue Wert der höchste Wert aus dieser Submatrix, beim Avarage Pooling wird der Durchschnitt aller Werte der Submatrix gebildet und als neuer Wert verwendet.
\begin{figure}[h]
\centering
\includegraphics[width=0.7\linewidth]{../graphics/MaxpoolSample2.png}
@ -468,7 +468,7 @@ Beim Pooling wird die Eingabematrix in Submatritzen partitioniert\footnote{Hier
\label{AvgPool}
\end{figure}
\\
Die Dimension der Submatritzen beträgt meißt $2\times2$. In Abbildung \ref{Pooling_Mnist} ist dargestellt, wie Pooling konkret auf das im letzten Abschnitt beschriebene Bild abgewandt aussieht. Dafür sind in der ersten Zeile die $28\times28$ Pixel großen Bilder dargestellt, die das Convolutional Layer mit Hilfe der Kantenerkennungsfilter berechnet hat. In Zeile zwei wurde auf die jeweils darüber stehenden Bilder Max Pooling angewandt, in Zeile drei auf die selben Bilder Average Pooling. Die Bilder sind nach dem Pooling $14\times14$ Pixel groß.
Die Dimension der Submatritzen beträgt meist $2\times2$. In Abbildung \ref{Pooling_Mnist} ist dargestellt, wie Pooling konkret auf das im letzten Abschnitt beschriebene Bild angewandt aussieht. Dafür sind in der ersten Zeile die $28\times28$ Pixel großen Bilder dargestellt, die das Convolutional Layer mit Hilfe der Kantenerkennungsfilter berechnet hat. In Zeile zwei wurde auf die jeweils darüber stehenden Bilder Max Pooling angewandt, in Zeile drei auf dieselben Bilder Average Pooling. Die Bilder sind nach dem Pooling $14\times14$ Pixel groß.
\begin{figure}[h]
\begin{minipage}{0.2\linewidth}
\centering
@ -534,11 +534,11 @@ Die Dimension der Submatritzen beträgt meißt $2\times2$. In Abbildung \ref{Poo
\end{figure}
\\
\section{PyTorch}
Pytorch ist ein von der Facebook Research Group entwickeltes Framework für machinelles Lernen in Python. Es ermöglicht Programmierern, maschinelles Lernen einfach und hochoptimiret umzusetzen. Dafür stellt es unter anderem eine Schnittstelle für Grafikkarten bereit und lieferet viele Funktionen, die oft benötigt werden. So muss beispielsweise die Gradientenberechnung oder die Berechnung der Fehlerfunktion nicht in jedem Projekt erneut implementiert werden. Die Grundlage der Pytorch Library ist der Datentyp \glqq Tensor''. Dabei handelt es sich im wesentlichen um eine Matrix, die optimierte Funktionen für maschinelles Lernen aufweist und auf Grafikkarten transferiert werden kann. Alle Daten werden in Form dieser Tensoren gespeichert und verarbeitet. Sollen also Bilder erkannt werden, müssen diese erst zu Tensoren konvertiert werden. Neben den Fehlerfunktionen und der Gradientenberechnung ist besonders die Einfachheit mit der ein Netz in Pytorch definiert werden kann bezeichnend. Pytorch ermöglicht es also, dass die Entwicklung auf die Logik selber fokusiert sein kann und trotzdem komplexe mathematische Funktionen verwendet werden können. Häufig genannte Alternativen zu Pytorch sind die Frameworks \glqq Tensorflow'' oder \glqq Keras''. Tensorflow wird von Google entwickelt und ist auch für andere Sprachen als Python verfügbar.
Pytorch ist ein von der Facebook Research Group entwickeltes Framework für machinelles Lernen in Python. Es ermöglicht Programmierern, maschinelles Lernen einfach und hochoptimiert umzusetzen. Dafür stellt es unter anderem eine Schnittstelle für Grafikkarten bereit und liefert viele Funktionen, die oft benötigt werden. So muss beispielsweise die Gradientenberechnung oder die Berechnung der Fehlerfunktion nicht in jedem Projekt erneut implementiert werden. Die Grundlage der Pytorch Library ist der Datentyp \glqq Tensor''. Dabei handelt es sich im wesentlichen um eine Matrix, die optimierte Funktionen für maschinelles Lernen aufweist und auf Grafikkarten transferiert werden kann. Alle Daten werden in Form dieser Tensoren gespeichert und verarbeitet. Sollen also Bilder erkannt werden, müssen diese erst zu Tensoren konvertiert werden. Neben den Fehlerfunktionen und der Gradientenberechnung ist besonders die Einfachheit, mit der ein Netz in Pytorch definiert werden kann, bezeichnend. Pytorch ermöglicht es also, dass die Entwicklung auf die Logik selber fokussiert sein kann und trotzdem komplexe mathematische Funktionen verwendet werden können. Häufig genannte Alternativen zu Pytorch sind die Frameworks \glqq Tensorflow'' oder \glqq Keras''. Tensorflow wird von Google entwickelt und ist auch für andere Sprachen als Python verfügbar.
\subsection{Datenvorbereitung}
Wie bereits erwähnt, müssen die Daten erst vorbereitet werden. Dies kann unter Umständen das größte Problem bei einem Projekt, das maschinelles Lernen involviert, darstellen, da die Datenvorbereitung sehr komplex werden kann. In einem einfachen Fall liegt der Datensatz bereits in Pytorchs interner Datenlibrary \glqq Torchvision'' vor und muss nur noch geladen werden. Im komplexesten Fall, kann es allerdings notwendig werden, mehrere sogenannte \glqq Transforms'' auf die Daten anzuwenden. Das sind kleine Funktionen, die die Daten verändern. Sie schneiden beispielsweise das Eingabebild zu, normalisieren es oder wenden eine vollständig selbst definierte Funktion darauf an.\\
In ein neuronales Netz können immer nur Bilder der gleichen Größe gegeben werden, da die Größe der Eingabetensoren konstant ist und die Form des Eingabelayers definiert. Ist also ein Datensatz gegeben, in dem zum Beispiel einige Bilder im hoch und einige im Querformat vorliegen, müssen diese erst durch geschicktes Zuschneiden und verschieben auf eine Größe gebracht werden. Auch dafür lassen sich Transforms verwenden. Liegen die Daten allerdings nicht als Bilder vor, müssen gegebenenfalls angepasste Algorithmen angewandt werden um diese Daten zu Tensoren zu konvertieren.\\
Aufgrund der Vielseitigkeit von PyTorch ist es ebenfalls möglich andere Librarys einzubinden um vor der Konvertierung der Bilder zu einem Tensor zum Beispiel einen Kantenerkennungsalgorithmus darauf anzuwenden. Im einfachsten Fall stellt sich das Laden der Daten wie in Abbildung \ref{MNIST_Dataloader_Code} dar.
Wie bereits erwähnt, müssen die Daten erst vorbereitet werden. Dies kann unter Umständen das größte Problem bei einem Projekt, das maschinelles Lernen involviert, darstellen, da die Datenvorbereitung sehr komplex werden kann. In einem einfachen Fall liegt der Datensatz bereits in Pytorchs interner Datenlibrary \glqq Torchvision'' vor und muss nur noch geladen werden. Im komplexesten Fall kann es allerdings notwendig werden, mehrere sogenannte \glqq Transforms'' auf die Daten anzuwenden. Das sind Funktionen, die die Daten verändern. Sie schneiden beispielsweise das Eingabebild zu, normalisieren es oder wenden eine vollständig selbst definierte Funktion darauf an.\\
In ein neuronales Netz können immer nur Bilder der gleichen Größe gegeben werden, da die Größe der Eingabetensoren konstant ist und die Form des Eingabelayers definiert. Ist also ein Datensatz gegeben, in dem zum Beispiel einige Bilder im Hoch- und einige im Querformat vorliegen, müssen diese erst durch geschicktes Zuschneiden und Verschieben auf eine Größe gebracht werden. Auch dafür lassen sich Transforms verwenden. Liegen die Daten allerdings nicht als Bilder vor, müssen gegebenenfalls angepasste Algorithmen angewandt werden, um diese Daten zu Tensoren zu konvertieren.\\
Aufgrund der Vielseitigkeit von PyTorch ist es ebenfalls möglich, andere Librarys einzubinden, um vor der Konvertierung der Bilder zu einem Tensor zum Beispiel einen Kantenerkennungsalgorithmus darauf anzuwenden. Im einfachsten Fall stellt sich das Laden der Daten wie in Abbildung \ref{MNIST_Dataloader_Code} dar.
\begin{figure}[h]
\begin{minted}[
frame=lines,
@ -567,25 +567,25 @@ Aufgrund der Vielseitigkeit von PyTorch ist es ebenfalls möglich andere Library
\label{MNIST_Dataloader_Code}
\end{figure}
\\
Der Code lädt zwei Datensätze. Einen zum testen und einen zum trainieren. Anschließend wird aus diesen je ein DataLoader erstellt, um über die Daten iterieren zu können. In Zeile 1 werden dafür zunächst alle nötigen Funktionen importiert. Die Zeilen 3 bis 6 sind für das eigentliche Laden der Daten zuständig. \\
Der Code lädt zwei Datensätze. Einen zum Testen und einen zum Trainieren. Anschließend wird aus diesen je ein DataLoader erstellt, um über die Daten iterieren zu können. In Zeile 1 werden dafür zunächst alle nötigen Funktionen importiert. Die Zeilen 3 bis 6 sind für das eigentliche Laden der Daten zuständig. \\
Die Funktion \mintinline{python}{datasets.MNIST()} nimmt dabei vier Parameter an:
\begin{enumerate}
\item \mintinline{python}{'./datasets'} Dieser Parameter gibt den Speicherort für den heruntergeladenen Datensatz an
\item \mintinline{python}{train} Dieser Booleanparameter gibt an, ob es sich bei diesem Datensatz um den Trainingsdatensatz oder um den Testdatensatz handeln soll.
\item \mintinline{python}{download} Mit diesem Parameter wird festgelegt ob der Datensatz heruntergeladen werden soll, oder jedes mal erneut aus dem Internet abgerufen werden soll.
\item \mintinline{python}{transform} Hier werden die Transforms angegeben, die auf die geladenen Daten angewandt werden sollen. In diesem Fall wurde der Ansatz\\ \mintinline{python}{transforms.Compose([transforms.ToTensor()])} gewählt.\\ \mintinline{python}{transforms.Compose()} ist dabei dafür verantwortlich die Transforms im Array zu kaskadieren, also nach einander auf die Eingabedaten anzuwenden. \\
\mintinline{python}{transforms.ToTensor()} ist der häufigste Transform. Er wird eingesetzt um Bilddaten in einen Tensor umzuwandeln.
\item \mintinline{python}{download} Mit diesem Parameter wird festgelegt, ob der Datensatz heruntergeladen werden, oder jedesmal erneut aus dem Internet abgerufen werden soll.
\item \mintinline{python}{transform} Hier werden die Transforms angegeben, die auf die geladenen Daten angewandt werden sollen. In diesem Fall wurde der Ansatz\\ \mintinline{python}{transforms.Compose([transforms.ToTensor()])} gewählt.\\ \mintinline{python}{transforms.Compose()} ist dabei dafür verantwortlich, die Transforms im Array zu kaskadieren, also nacheinander auf die Eingabedaten anzuwenden. \\
\mintinline{python}{transforms.ToTensor()} ist der häufigste Transform. Er wird eingesetzt, um Bilddaten in einen Tensor umzuwandeln.
\end{enumerate}
In Zeile 13 wird dann der DataLoader erstellt. Er nimmt folgende Parameter an:
\begin{enumerate}
\item Der erste Parameter ist der Datensatz aus dem der DataLoader erstellt werden soll
\item Der erste Parameter ist der Datensatz, aus dem der DataLoader erstellt werden soll
\item \mintinline{python}{batch_size} Ist ein Parameter, der eine ganz fundamentale Variable beim maschinellen Lernen durch neuronale Netze festlegt: die Batch size.\\
Die Tensoren werden nämlich nicht einzeln, sondern in sogenannten minibatches in das Netz gegeben. Es wird mit Durchschnittswerten über diese Tensoren in einer Minibatch gerechnet. Dies dient der Reduktion der Rechenzeit. Batching kann veranschaulicht werden, indem man sich vorstellt, dass die \glqq Eingabebilder'' hinter einander geklebt und alle gleichzeitzig betrachtet werden. Die Batch size gibt dann analog an, wie viele Bilder hinter einander geklebt werden. Je höher die Batch size, desto höher ist die Speicherauslastung auf der Grafikkarte und desto ungenauer ist das Ergebnis, da über mehr Werte der Durchschnitt gerechnet wird. Mit höherer Batch size sinkt allerdings auch die Rechenzeit massiv.
\item \mintinline{python}{shuffle} gibt lediglich an, ob die Reihenfolge der Daten randomisiert werden soll. Dies ist wie am Anfang bereits erwähnt ein sehr nützlicher Parameter um overfitting vorzubeugen.
Die Tensoren werden nämlich nicht einzeln, sondern in sogenannten minibatches in das Netz gegeben. Es wird mit Durchschnittswerten über diese Tensoren in einer Minibatch gerechnet. Dies dient der Reduktion der Rechenzeit. Batching kann veranschaulicht werden, indem man sich vorstellt, dass die \glqq Eingabebilder'' hintereinander geklebt und alle gleichzeitzig betrachtet werden. Die Batch size gibt dann analog an, wie viele Bilder hintereinander geklebt werden. Je höher die Batch size, desto höher ist die Speicherauslastung auf der Grafikkarte und desto ungenauer ist das Ergebnis, da über mehr Werte der Durchschnitt gerechnet wird. Mit höherer Batch size sinkt allerdings auch die Rechenzeit massiv.
\item \mintinline{python}{shuffle} gibt lediglich an, ob die Reihenfolge der Daten randomisiert werden soll. Dies ist, wie am Anfang bereits erwähnt, ein sehr nützlicher Parameter, um overfitting vorzubeugen.
\end{enumerate}
Über den entstandenen DataLoader kann jetzt in einer konventionellen Schleife iteriert werden, da die Klasse DataLoader die MagicMethod \mintinline{python}{__iter__} implementiert. Der DataLoader gibt dabei Tupel der Form (Batch von Bildern als Tensoren, Batch von Labels als Klassenindices) zurück.
\subsection{Definieren des Netzes}
Das Definieren des Netzes ist in Pytorch bereits sehr einfach möglich, bietet jedoch dennoch extreme individuelle Anpassungsmöglichkeiten. Um ein Netz zu definieren muss zunächst eine neue Klasse erstellt werden, die Subklkasse von \mintinline{python}{nn.Module} ist. Im Konstruktor wird dann angegeben, welche Layers das Netz haben soll. Es muss außerdem die Methode \mintinline{python}{forward(self, x)} implementiert werden. Diese spezifiziert, wie mit den Daten innerhalbn des Netzes verfahren wird. Eine möglichst einfache Definition eines Netzes ist in Abbildung \ref{Net_simple_definition} gegeben.
Das Definieren des Netzes ist in Pytorch bereits sehr einfach möglich, bietet dennoch extreme individuelle Anpassungsmöglichkeiten. Um ein Netz zu definieren, muss zunächst eine neue Klasse erstellt werden, die Subklasse von \mintinline{python}{nn.Module} ist. Im Konstruktor wird dann angegeben, welche Layers das Netz haben soll. Es muss außerdem die Methode \mintinline{python}{forward(self, x)} implementiert werden. Diese spezifiziert, wie mit den Daten innerhalb des Netzes verfahren wird. Eine möglichst einfache Definition eines Netzes ist in Abbildung \ref{Net_simple_definition} gegeben.
\begin{figure}[h]
\begin{minted}[
frame=lines,
@ -609,14 +609,14 @@ Das Definieren des Netzes ist in Pytorch bereits sehr einfach möglich, bietet j
return F.log_softmax(x)
\end{minted}
\caption{Code um ein einfaches Netz in Pytorch zu definieren}
\caption{Code, um ein einfaches Netz in Pytorch zu definieren}
\label{Net_simple_definition}
\end{figure}\\
Dieses Netz hat nur drei Layers: Ein Eingabelayer (\mintinline{python}{fc0}), das genau die Größe der Eingabedaten ($28\times28$) aufweist, ein hidden Layer (\mintinline{python}{fc1}), das 64 Skalere annimmt und 120 Skalare ausgibt und ein Ausgabelayer (\mintinline{python}{fc2}), das 120 Skalare annimmt und 10 ausgibt. Dass \mintinline{python}{fc2} 10 Ausgabeneuronen besitzt ist kein Zufall, sondern liegt darin begründet, dass dieses Klassifizierungsnetz genau 10 Klassen unterscheiden soll. Die Größe von \mintinline{python}{fc1} ist jedoch völlig frei gewählt. Es ist allerdings wichtig Acht zu geben, dass die Layers die Daten auch an einander weitergeben können. Ein Layer muss also stets so viele Ausgaben aufweisen, wie das Layer, an das die Daten weitergegeben werden sollen, Eingaben besitzt.\\
Die \mintinline{python}{forward(self, x)} Funktion definiert, wie die Daten innerhalb des Netzes weitergegeben werden sollen. Hier werden sie erst in \mintinline{python}{fc0} gegeben, dann wird auf die Ausgabe aus \mintinline{python}{fc0} die Aktivierungsfunktion \glqq ReLu'' (REctified Linear Unit) angewandt. Die Ausgabe daraus wird dann in das hidden Layer \mintinline{python}{fc1} gegebnen und die Aktivierungsfunktion wird erneut angewandt. Im Output Layer geschieht dies nicht. Abschließend wird die Ausgabe von \mintinline{python}{F.log_softmax} zurück gegeben. Dies wendet erst einen SoftMax und dann einen Logarithmus auf die Daten an \cite{6} um diese zu normalisieren und ist in Klassifizierungsnetzwerken oft nötig um sogenannte \glqq One hot Vectors'' zu erstellen. Herkömmliche Ausgabevektoren haben einen Wert für jede Klasse und geben an wie wahrscheinlich das Netz die Eingabedaten dieser Klasse zuordnet. In One hot Vektoren ist immer der höhste Wert 1 und alle anderen Werte sind 0.\\
Da die Netze als Klassen definiert werden und der Interne Datenverkehr in der\\ \mintinline{python}{forward(self, x)} Funktion abläuft, sind neuronale Netze in Pytorch also sehr anpassbar. So wäre es beispielsweise kein Problem zwischen Input und hidden Layer die Daten mit 2 zu multiplizieren (dafür würde man zwischen Zeile 9 und 10 den Code \glqq\mintinline{python}{x = x * 2}'' einfügen), auch wenn dies in den meisten Anwendungsbereichen keinen Sinn hätte. Pytorch kombiniert mit dieser Art Netze zu definieren also eine umfangreiche Flexibilität mit einfacher Bedienbartkeit.
Dieses Netz hat nur drei Layers: Ein Eingabelayer (\mintinline{python}{fc0}), das genau die Größe der Eingabedaten ($28\times28$) aufweist, ein hidden Layer (\mintinline{python}{fc1}), das 64 Skalere annimmt und 120 Skalare ausgibt und ein Ausgabelayer (\mintinline{python}{fc2}), das 120 Skalare annimmt und 10 ausgibt. Dass \mintinline{python}{fc2} 10 Ausgabeneuronen besitzt, ist kein Zufall, sondern liegt darin begründet, dass dieses Klassifizierungsnetz genau 10 Klassen unterscheiden soll. Die Größe von \mintinline{python}{fc1} ist jedoch völlig frei gewählt. Es ist allerdings wichtig, zu beachten, dass die Layers die Daten auch aneinander weitergeben können. Ein Layer muss also stets so viele Ausgaben aufweisen, wie das Layer, an das die Daten weitergegeben werden sollen, Eingaben besitzt.\\
Die \mintinline{python}{forward(self, x)} Funktion definiert, wie die Daten innerhalb des Netzes weitergegeben werden sollen. Hier werden sie erst in \mintinline{python}{fc0} gegeben, dann wird auf die Ausgabe aus \mintinline{python}{fc0} die Aktivierungsfunktion \glqq ReLu'' (REctified Linear Unit) angewandt. Die Ausgabe daraus wird dann in das hidden Layer \mintinline{python}{fc1} gegeben, und die Aktivierungsfunktion wird erneut angewandt. Im Output Layer geschieht dies nicht. Abschließend wird die Ausgabe von \mintinline{python}{F.log_softmax} zurück gegeben. Dies wendet erst einen SoftMax und dann einen Logarithmus auf die Daten an, \cite{6} um diese zu normalisieren und ist in Klassifizierungsnetzwerken oft nötig, um sogenannte \glqq One hot Vectors'' zu erstellen. Herkömmliche Ausgabevektoren haben einen Wert für jede Klasse und geben an, wie wahrscheinlich das Netz die Eingabedaten dieser Klasse zuordnet. In One hot Vektoren ist immer der höchste Wert 1 und alle anderen Werte sind 0.\\
Da die Netze als Klassen definiert werden und der Interne Datenverkehr in der\\ \mintinline{python}{forward(self, x)} Funktion abläuft, sind neuronale Netze in Pytorch also sehr anpassbar. So wäre es beispielsweise kein Problem, zwischen Input und hidden Layer die Daten mit 2 zu multiplizieren (dafür würde man zwischen Zeile 9 und 10 den Code \glqq\mintinline{python}{x = x * 2}'' einfügen), auch wenn dies in den meisten Anwendungsbereichen keinen Sinn ergäbe. Pytorch kombiniert mit dieser Art, Netze zu definieren, also eine umfangreiche Flexibilität mit einfacher Bedienbarkeit.
\subsection{Trainieren des Netzes}
Das Trainieren des Netzes erfolgt in der sogenannten \glqq Training Loop''. Also in einer Schleife, die über den Datensatz iteriert. Zumeißt steht diese noch in einer Schleife, die über die Epochenzahl iteriert. In der Training loop wird ein Element des Datensatzes gelesen, in das Netz gegeben, die Ausgabe wird mit dem Label verglichen und schließlich werden die Parameter des Netzes Angepasst. Der Code dafür ist in Abbildung \ref{Code_train_loop} dargestellt.
Das Trainieren des Netzes erfolgt in der sogenannten \glqq Training Loop'', also in einer Schleife, die über den Datensatz iteriert. Zumeist steht diese noch in einer Schleife, die über die Epochenzahl iteriert. In der Training loop wird ein Element des Datensatzes gelesen, in das Netz gegeben, die Ausgabe wird mit dem Label verglichen und schließlich werden die Parameter des Netzes Angepasst. Der Code dafür ist in Abbildung \ref{Code_train_loop} dargestellt.
\begin{figure}[h]
\begin{minted}[
frame=lines,

View file

@ -49,7 +49,7 @@
\defcounter {refsection}{0}\relax
\contentsline {subsubsection}{\numberline {3.7.2}Pooling Layers}{22}{subsubsection.3.7.2}%
\defcounter {refsection}{0}\relax
\contentsline {section}{\numberline {4}PyTorch}{24}{section.4}%
\contentsline {section}{\numberline {4}PyTorch}{23}{section.4}%
\defcounter {refsection}{0}\relax
\contentsline {subsection}{\numberline {4.1}Datenvorbereitung}{24}{subsection.4.1}%
\defcounter {refsection}{0}\relax