Poprawiono przecinki, literówki, błędy językowe i niezrozumiałe fragmentu, ta wersja pracy została wysłana do Promotora

This commit is contained in:
Cezary Pukownik 2020-06-19 12:46:47 +02:00
parent d10654d115
commit 9bdbd12c7e
10 changed files with 310 additions and 285 deletions

View File

@ -82,49 +82,51 @@
\@writefile{toc}{\contentsline {section}{\numberline {2.2\relax .\leavevmode@ifvmode \kern .5em }Cyfrowa reprezentacja muzyki symbolicznej}{31}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {2.2\relax .\leavevmode@ifvmode \kern .5em }Cyfrowa reprezentacja muzyki symbolicznej}{31}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1\relax .\leavevmode@ifvmode \kern .5em }Standard MIDI}{31}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {2.2.1\relax .\leavevmode@ifvmode \kern .5em }Standard MIDI}{31}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Fragment protoko\IeC {\l }u MIDI\relax }}{31}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {2.4}{\ignorespaces Fragment protoko\IeC {\l }u MIDI\relax }}{31}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 3\relax .\leavevmode@ifvmode \kern .5em Projekt}{33}\protected@file@percent } \newlabel{fig:generalmidi}{{2.5}{33}}
\@writefile{toc}{\contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 3\relax .\leavevmode@ifvmode \kern .5em Projekt}{35}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}
\newlabel{section:project}{{3}{33}} \newlabel{section:project}{{3}{35}}
\@writefile{toc}{\contentsline {section}{\numberline {3.1\relax .\leavevmode@ifvmode \kern .5em }Koncepcja}{33}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3.1\relax .\leavevmode@ifvmode \kern .5em }Koncepcja}{35}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3.2\relax .\leavevmode@ifvmode \kern .5em }Wst\IeC {\k e}pne przygotowanie danych do treningu}{34}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3.2\relax .\leavevmode@ifvmode \kern .5em }Wst\IeC {\k e}pne przygotowanie danych do treningu}{36}\protected@file@percent }
\newlabel{section:midi}{{3.2}{34}} \newlabel{section:midi}{{3.2}{36}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1\relax .\leavevmode@ifvmode \kern .5em }Muzyczne ,,s\IeC {\l }owo''}{34}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1\relax .\leavevmode@ifvmode \kern .5em }Muzyczne s\IeC {\l }owo}{36}\protected@file@percent }
\newlabel{section:midi_words}{{3.2.1}{34}} \newlabel{section:midi_words}{{3.2.1}{36}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2\relax .\leavevmode@ifvmode \kern .5em }Konwersja MIDI na sekwencje s\IeC {\l }\IeC {\'o}w muzycznych}{34}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2\relax .\leavevmode@ifvmode \kern .5em }Konwersja MIDI na sekwencje s\IeC {\l }\IeC {\'o}w muzycznych}{36}\protected@file@percent }
\citation{survay} \citation{survay}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania danych}{37}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania danych}{39}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.4\relax .\leavevmode@ifvmode \kern .5em }Podzia\IeC {\l } danych na dane wej\IeC {\'s}ciowe i wyj\IeC {\'s}ciowe}{38}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.4\relax .\leavevmode@ifvmode \kern .5em }Podzia\IeC {\l } danych na dane wej\IeC {\'s}ciowe i wyj\IeC {\'s}ciowe}{40}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.5\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania zbioru ucz\IeC {\k a}cego}{40}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.5\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania zbioru ucz\IeC {\k a}cego}{42}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{42}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{44}\protected@file@percent }
\newlabel{section:model}{{3.3}{42}} \newlabel{section:model}{{3.3}{44}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1\relax .\leavevmode@ifvmode \kern .5em }Model w trybie uczenia}{42}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1\relax .\leavevmode@ifvmode \kern .5em }Model w trybie uczenia}{44}\protected@file@percent }
\newlabel{fig:training-model}{{3.1}{44}} \newlabel{fig:training-model}{{3.1}{45}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2\relax .\leavevmode@ifvmode \kern .5em }Model w trybie wnioskowania}{44}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2\relax .\leavevmode@ifvmode \kern .5em }Model w trybie wnioskowania}{46}\protected@file@percent }
\newlabel{section:inference-model}{{3.3.2}{44}} \newlabel{section:inference-model}{{3.3.2}{46}}
\newlabel{fig:inference-decoder}{{3.2}{45}} \newlabel{fig:inference-decoder}{{3.2}{47}}
\citation{onehot} \citation{onehot}
\@writefile{toc}{\contentsline {section}{\numberline {3.4\relax .\leavevmode@ifvmode \kern .5em }Transformacja danych dla modelu}{47}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3.4\relax .\leavevmode@ifvmode \kern .5em }Transformacja danych dla modelu}{48}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.1\relax .\leavevmode@ifvmode \kern .5em }Enkodowanie one-hot}{47}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.4.1\relax .\leavevmode@ifvmode \kern .5em }Enkodowanie one-hot}{49}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.2\relax .\leavevmode@ifvmode \kern .5em }S\IeC {\l }ownik}{47}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.4.2\relax .\leavevmode@ifvmode \kern .5em }S\IeC {\l }ownik}{49}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.3\relax .\leavevmode@ifvmode \kern .5em }Elementy specjalne}{48}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.4.3\relax .\leavevmode@ifvmode \kern .5em }Elementy specjalne}{50}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.4\relax .\leavevmode@ifvmode \kern .5em }Kodowanie sekwencji}{48}\protected@file@percent } \newlabel{section:specialtoken}{{3.4.3}{50}}
\@writefile{toc}{\contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Ekperyment}{49}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.4.4\relax .\leavevmode@ifvmode \kern .5em }Kodowanie sekwencji}{50}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.1\relax .\leavevmode@ifvmode \kern .5em }Oprogramowanie}{50}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Ekperyment}{51}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.2\relax .\leavevmode@ifvmode \kern .5em }Zbi\IeC {\'o}r danych}{50}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.5.1\relax .\leavevmode@ifvmode \kern .5em }Oprogramowanie}{51}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.3\relax .\leavevmode@ifvmode \kern .5em }Wydobycie danych}{50}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.5.2\relax .\leavevmode@ifvmode \kern .5em }Zbi\IeC {\'o}r danych}{52}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.4\relax .\leavevmode@ifvmode \kern .5em }Trenowanie modelu}{51}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.5.3\relax .\leavevmode@ifvmode \kern .5em }Wydobycie danych}{52}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.5\relax .\leavevmode@ifvmode \kern .5em }Generowanie muzyki przy pomocy wytrenowanych modeli}{52}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.5.4\relax .\leavevmode@ifvmode \kern .5em }Trenowanie modelu}{53}\protected@file@percent }
\newlabel{fig:losses}{{3.3}{53}} \@writefile{toc}{\contentsline {subsection}{\numberline {3.5.5\relax .\leavevmode@ifvmode \kern .5em }Generowanie muzyki przy pomocy wytrenowanych modeli}{54}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.6\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{54}\protected@file@percent } \newlabel{fig:losses}{{3.3}{55}}
\newlabel{fig:score1}{{3.4}{55}} \@writefile{toc}{\contentsline {subsection}{\numberline {3.5.6\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{56}\protected@file@percent }
\newlabel{fig:score10}{{3.5}{55}} \newlabel{fig:score1}{{3.4}{57}}
\newlabel{fig:score25}{{3.6}{56}} \newlabel{fig:score10}{{3.5}{57}}
\newlabel{fig:score50}{{3.7}{57}} \newlabel{fig:score25}{{3.6}{58}}
\newlabel{fig:score75}{{3.8}{57}} \newlabel{fig:score50}{{3.7}{59}}
\newlabel{fig:score100}{{3.9}{58}} \newlabel{fig:score75}{{3.8}{59}}
\newlabel{fig:score150}{{3.10}{58}} \newlabel{fig:score100}{{3.9}{60}}
\@writefile{toc}{\contentsline {chapter}{Podsumowanie}{59}\protected@file@percent } \newlabel{fig:score150}{{3.10}{60}}
\@writefile{toc}{\contentsline {chapter}{Podsumowanie}{61}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}
\bibcite{survay}{1} \bibcite{survay}{1}
@ -137,6 +139,6 @@
\bibcite{statystyka}{8} \bibcite{statystyka}{8}
\bibcite{tempos}{9} \bibcite{tempos}{9}
\bibcite{deep_learning_2}{10} \bibcite{deep_learning_2}{10}
\@writefile{toc}{\contentsline {chapter}{Bibliografia}{61}\protected@file@percent } \@writefile{toc}{\contentsline {chapter}{Bibliografia}{63}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }} \@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }}

View File

@ -1,10 +1,10 @@
# Fdb version 3 # Fdb version 3
["makeindex document.idx"] 1592412677 "document.idx" "document.ind" "document" 1592416971 ["makeindex document.idx"] 1592557594 "document.idx" "document.ind" "document" 1592561820
"document.idx" 1592414607 0 d41d8cd98f00b204e9800998ecf8427e "" "document.idx" 1592561782 0 d41d8cd98f00b204e9800998ecf8427e ""
(generated) (generated)
"document.ind"
"document.ilg" "document.ilg"
["pdflatex"] 1592416964 "j:/_MAGISTERKA/praca-magisterska/docs/document.tex" "j:/_MAGISTERKA/praca-magisterska/docs/document.pdf" "document" 1592416971 "document.ind"
["pdflatex"] 1592561777 "j:/_MAGISTERKA/praca-magisterska/docs/document.tex" "j:/_MAGISTERKA/praca-magisterska/docs/document.pdf" "document" 1592561820
"c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plit.enc" 1550343089 1946 62ba825cda1ff16dbaa60d53ac60525a "" "c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plit.enc" 1550343089 1946 62ba825cda1ff16dbaa60d53ac60525a ""
"c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plme.enc" 1550343089 3126 59f33ff3e396436ebc36f4e7b444d5c4 "" "c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plme.enc" 1550343089 3126 59f33ff3e396436ebc36f4e7b444d5c4 ""
"c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plmi.enc" 1550343089 2005 f094775651a1386335c158fb632529f1 "" "c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plmi.enc" 1550343089 2005 f094775651a1386335c158fb632529f1 ""
@ -193,11 +193,12 @@
"c:/software/latex/texmf-var/web2c/pdftex/pdflatex.fmt" 1550344823 4224189 05b80a2fc98956d1ad757099b6714631 "" "c:/software/latex/texmf-var/web2c/pdftex/pdflatex.fmt" 1550344823 4224189 05b80a2fc98956d1ad757099b6714631 ""
"c:/software/latex/texmf.cnf" 1550344763 715 839ef4b14d931ce86420174d3a223d3e "" "c:/software/latex/texmf.cnf" 1550344763 715 839ef4b14d931ce86420174d3a223d3e ""
"chapter-style.sty" 1560952449 376 87871882de090607c810d89fd5ae18d9 "" "chapter-style.sty" 1560952449 376 87871882de090607c810d89fd5ae18d9 ""
"document.aux" 1592416970 12333 f03945da9a0198c6832f0bcc70eb3e8d "" "document.aux" 1592561809 12412 2aecdd25dcfa881b68f535c7ca66dccc ""
"document.ind" 1592412677 0 d41d8cd98f00b204e9800998ecf8427e "makeindex document.idx" "document.ind" 1592557594 0 d41d8cd98f00b204e9800998ecf8427e "makeindex document.idx"
"document.tex" 1592416963 94831 8c0abbc37a3a2437ec9937baed3ecc00 "" "document.tex" 1592561789 95683 f15942adacd7abef6ca2184e9ab754c1 ""
"document.toc" 1592416971 5377 99f1fbfeeed311c15641911019d5b141 "" "document.toc" 1592561809 5373 969bd356360a2f54401e2ea06cf75c01 ""
"images/autoencoder.png" 1592409298 45138 b1cb8e1c5a4277b2e72bf3e77e86d26c "" "images/autoencoder.png" 1592409298 45138 b1cb8e1c5a4277b2e72bf3e77e86d26c ""
"images/general-midi.png" 1592557163 39913 399e67d3d3358eb9656bc3aa91411565 ""
"images/gradient_descent_1_long.png" 1592412262 47914 5c985451026c8d5e28901587bf5ee835 "" "images/gradient_descent_1_long.png" 1592412262 47914 5c985451026c8d5e28901587bf5ee835 ""
"images/gradient_descent_2_long.png" 1592412282 43574 6b02401960a159a520593d4ccef24fff "" "images/gradient_descent_2_long.png" 1592412282 43574 6b02401960a159a520593d4ccef24fff ""
"images/inference-decoder-graph.png" 1592382139 39617 5ccfdc4fde77e18a8689e1af6b852a5e "" "images/inference-decoder-graph.png" 1592382139 39617 5ccfdc4fde77e18a8689e1af6b852a5e ""
@ -225,14 +226,14 @@
"images/training_losses.png" 1592382149 57293 6eb12c89458f62456bc8b0860f6df331 "" "images/training_losses.png" 1592382149 57293 6eb12c89458f62456bc8b0860f6df331 ""
"images/wartosc_nut.jpg" 1590441554 48213 d311c2cedb2ed53dcf5eff20f70eda80 "" "images/wartosc_nut.jpg" 1590441554 48213 d311c2cedb2ed53dcf5eff20f70eda80 ""
"images/waveform_axis.png" 1592410460 56303 20c29ea310c3d0f7bef501c488c7de5a "" "images/waveform_axis.png" 1592410460 56303 20c29ea310c3d0f7bef501c488c7de5a ""
"j:/_MAGISTERKA/praca-magisterska/docs/document.aux" 1592416970 12333 f03945da9a0198c6832f0bcc70eb3e8d "" "j:/_MAGISTERKA/praca-magisterska/docs/document.aux" 1592561809 12412 2aecdd25dcfa881b68f535c7ca66dccc ""
"j:/_MAGISTERKA/praca-magisterska/docs/document.tex" 1592416963 94831 8c0abbc37a3a2437ec9937baed3ecc00 "" "j:/_MAGISTERKA/praca-magisterska/docs/document.tex" 1592561789 95683 f15942adacd7abef6ca2184e9ab754c1 ""
"pythonhighlight.sty" 1590660734 4822 44a39a68d852c9742af161f7166b2a03 "" "pythonhighlight.sty" 1590660734 4822 44a39a68d852c9742af161f7166b2a03 ""
(generated) (generated)
"document.toc" "document.log"
"document.aux"
"document.pdf"
"j:/_MAGISTERKA/praca-magisterska/docs/document.pdf" "j:/_MAGISTERKA/praca-magisterska/docs/document.pdf"
"j:/_MAGISTERKA/praca-magisterska/docs/document.log" "j:/_MAGISTERKA/praca-magisterska/docs/document.log"
"document.aux"
"document.log"
"document.idx" "document.idx"
"document.pdf" "document.toc"

View File

@ -311,6 +311,9 @@ INPUT c:/software/latex/texmf-dist/tex/latex/polski/ot4cmtt.fd
INPUT c:/software/latex/texmf-dist/tex/latex/polski/ot4cmtt.fd INPUT c:/software/latex/texmf-dist/tex/latex/polski/ot4cmtt.fd
INPUT c:/software/latex/texmf-dist/fonts/tfm/public/pl/pltt12.tfm INPUT c:/software/latex/texmf-dist/fonts/tfm/public/pl/pltt12.tfm
INPUT c:/software/latex/texmf-dist/fonts/tfm/public/pl/pltt10.tfm INPUT c:/software/latex/texmf-dist/fonts/tfm/public/pl/pltt10.tfm
INPUT j:/_MAGISTERKA/praca-magisterska/docs/images/general-midi.png
INPUT j:/_MAGISTERKA/praca-magisterska/docs/images/general-midi.png
INPUT j:/_MAGISTERKA/praca-magisterska/docs/images/general-midi.png
INPUT c:/software/latex/texmf-dist/fonts/tfm/public/pl/plsltt10.tfm INPUT c:/software/latex/texmf-dist/fonts/tfm/public/pl/plsltt10.tfm
INPUT j:/_MAGISTERKA/praca-magisterska/docs/images/training-model-graph.png INPUT j:/_MAGISTERKA/praca-magisterska/docs/images/training-model-graph.png
INPUT j:/_MAGISTERKA/praca-magisterska/docs/images/training-model-graph.png INPUT j:/_MAGISTERKA/praca-magisterska/docs/images/training-model-graph.png

View File

@ -1,4 +1,4 @@
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX) (preloaded format=pdflatex 2019.2.16) 17 JUN 2020 20:02 This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX) (preloaded format=pdflatex 2019.2.16) 19 JUN 2020 12:16
entering extended mode entering extended mode
restricted \write18 enabled. restricted \write18 enabled.
file:line:error style messages enabled. file:line:error style messages enabled.
@ -429,20 +429,20 @@ Writing index file document.idx
(j:/_MAGISTERKA/praca-magisterska/docs/document.aux) (j:/_MAGISTERKA/praca-magisterska/docs/document.aux)
\openout1 = `document.aux'. \openout1 = `document.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 58. LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 59.
LaTeX Font Info: ... okay on input line 58. LaTeX Font Info: ... okay on input line 59.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 58. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 59.
LaTeX Font Info: ... okay on input line 58. LaTeX Font Info: ... okay on input line 59.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 58. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 59.
LaTeX Font Info: ... okay on input line 58. LaTeX Font Info: ... okay on input line 59.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 58. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 59.
LaTeX Font Info: ... okay on input line 58. LaTeX Font Info: ... okay on input line 59.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 58. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 59.
LaTeX Font Info: ... okay on input line 58. LaTeX Font Info: ... okay on input line 59.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 58. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 59.
LaTeX Font Info: ... okay on input line 58. LaTeX Font Info: ... okay on input line 59.
LaTeX Font Info: Checking defaults for OT4/cmr/m/n on input line 58. LaTeX Font Info: Checking defaults for OT4/cmr/m/n on input line 59.
LaTeX Font Info: ... okay on input line 58. LaTeX Font Info: ... okay on input line 59.
(c:/software/latex/texmf-dist/tex/context/base/mkii/supp-pdf.mkii (c:/software/latex/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).] [Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count140 \scratchcounter=\count140
@ -503,12 +503,12 @@ Package caption Info: Begin \AtBeginDocument code.
Package caption Info: subfig package v1.3 is loaded. Package caption Info: subfig package v1.3 is loaded.
Package caption Info: End \AtBeginDocument code. Package caption Info: End \AtBeginDocument code.
Underfull \hbox (badness 10000) in paragraph at lines 99--100 Underfull \hbox (badness 10000) in paragraph at lines 100--101
[] []
Underfull \hbox (badness 10000) in paragraph at lines 101--102 Underfull \hbox (badness 10000) in paragraph at lines 102--103
[] []
@ -518,34 +518,34 @@ Underfull \hbox (badness 10000) in paragraph at lines 101--102
] ]
LaTeX Font Info: Try loading font information for OML+plm on input line 137. LaTeX Font Info: Try loading font information for OML+plm on input line 138.
(c:/software/latex/texmf-dist/tex/latex/polski/omlplm.fd (c:/software/latex/texmf-dist/tex/latex/polski/omlplm.fd
File: omlplm.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW) File: omlplm.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW)
) )
LaTeX Font Info: Try loading font information for OMS+plsy on input line 137. LaTeX Font Info: Try loading font information for OMS+plsy on input line 138.
(c:/software/latex/texmf-dist/tex/latex/polski/omsplsy.fd (c:/software/latex/texmf-dist/tex/latex/polski/omsplsy.fd
File: omsplsy.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW) File: omsplsy.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW)
) )
LaTeX Font Info: Try loading font information for OMX+plex on input line 137. LaTeX Font Info: Try loading font information for OMX+plex on input line 138.
(c:/software/latex/texmf-dist/tex/latex/polski/omxplex.fd (c:/software/latex/texmf-dist/tex/latex/polski/omxplex.fd
File: omxplex.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW) File: omxplex.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW)
) )
LaTeX Font Info: External font `plex10' loaded for size LaTeX Font Info: External font `plex10' loaded for size
(Font) <12> on input line 137. (Font) <12> on input line 138.
LaTeX Font Info: External font `plex10' loaded for size LaTeX Font Info: External font `plex10' loaded for size
(Font) <8> on input line 137. (Font) <8> on input line 138.
LaTeX Font Info: External font `plex10' loaded for size LaTeX Font Info: External font `plex10' loaded for size
(Font) <6> on input line 137. (Font) <6> on input line 138.
LaTeX Font Info: Try loading font information for U+msa on input line 137. LaTeX Font Info: Try loading font information for U+msa on input line 138.
(c:/software/latex/texmf-dist/tex/latex/amsfonts/umsa.fd (c:/software/latex/texmf-dist/tex/latex/amsfonts/umsa.fd
File: umsa.fd 2013/01/14 v3.01 AMS symbols A File: umsa.fd 2013/01/14 v3.01 AMS symbols A
) )
LaTeX Font Info: Try loading font information for U+msb on input line 137. LaTeX Font Info: Try loading font information for U+msb on input line 138.
(c:/software/latex/texmf-dist/tex/latex/amsfonts/umsb.fd (c:/software/latex/texmf-dist/tex/latex/amsfonts/umsb.fd
File: umsb.fd 2013/01/14 v3.01 AMS symbols B File: umsb.fd 2013/01/14 v3.01 AMS symbols B
) )
LaTeX Font Info: External font `plex10' loaded for size LaTeX Font Info: External font `plex10' loaded for size
(Font) <10.95> on input line 145. (Font) <10.95> on input line 146.
[3] [4 [3] [4
@ -564,60 +564,60 @@ LaTeX Font Info: External font `plex10' loaded for size
] [11] [12 ] [11] [12
] ]
Overfull \vbox (16.08192pt too high) detected at line 198 Overfull \vbox (16.08192pt too high) detected at line 199
[] []
Rozdzia\PlPrIeC {\l } 1. Rozdzia\PlPrIeC {\l } 1.
<images/linear_reg.png, id=50, 540.8205pt x 369.17924pt> <images/linear_reg.png, id=50, 540.8205pt x 369.17924pt>
File: images/linear_reg.png Graphic file (type png) File: images/linear_reg.png Graphic file (type png)
<use images/linear_reg.png> <use images/linear_reg.png>
Package pdftex.def Info: images/linear_reg.png used on input line 228. Package pdftex.def Info: images/linear_reg.png used on input line 229.
(pdftex.def) Requested size: 398.33858pt x 271.91525pt. (pdftex.def) Requested size: 398.33858pt x 271.91525pt.
[13] [14 <j:/_MAGISTERKA/praca-magisterska/docs/images/linear_reg.png>] [15] [13] [14 <j:/_MAGISTERKA/praca-magisterska/docs/images/linear_reg.png>] [15]
<images/gradient_descent_1_long.png, id=69, 216.81pt x 216.81pt> <images/gradient_descent_1_long.png, id=69, 216.81pt x 216.81pt>
File: images/gradient_descent_1_long.png Graphic file (type png) File: images/gradient_descent_1_long.png Graphic file (type png)
<use images/gradient_descent_1_long.png> <use images/gradient_descent_1_long.png>
Package pdftex.def Info: images/gradient_descent_1_long.png used on input line 281. Package pdftex.def Info: images/gradient_descent_1_long.png used on input line 282.
(pdftex.def) Requested size: 142.26378pt x 142.27127pt. (pdftex.def) Requested size: 142.26378pt x 142.27127pt.
<images/gradient_descent_2_long.png, id=70, 216.81pt x 216.81pt> <images/gradient_descent_2_long.png, id=70, 216.81pt x 216.81pt>
File: images/gradient_descent_2_long.png Graphic file (type png) File: images/gradient_descent_2_long.png Graphic file (type png)
<use images/gradient_descent_2_long.png> <use images/gradient_descent_2_long.png>
Package pdftex.def Info: images/gradient_descent_2_long.png used on input line 283. Package pdftex.def Info: images/gradient_descent_2_long.png used on input line 284.
(pdftex.def) Requested size: 142.26378pt x 142.27127pt. (pdftex.def) Requested size: 142.26378pt x 142.27127pt.
<images/naural_model_one_ver2.png, id=71, 437.83575pt x 451.08525pt> <images/naural_model_one_ver2.png, id=71, 437.83575pt x 451.08525pt>
File: images/naural_model_one_ver2.png Graphic file (type png) File: images/naural_model_one_ver2.png Graphic file (type png)
<use images/naural_model_one_ver2.png> <use images/naural_model_one_ver2.png>
Package pdftex.def Info: images/naural_model_one_ver2.png used on input line 315. Package pdftex.def Info: images/naural_model_one_ver2.png used on input line 316.
(pdftex.def) Requested size: 227.62204pt x 234.51062pt. (pdftex.def) Requested size: 227.62204pt x 234.51062pt.
[16 <j:/_MAGISTERKA/praca-magisterska/docs/images/gradient_descent_1_long.png> <j:/_MAGISTERKA/praca-magisterska/docs/images/gradient_descent_2_long.png>] [16 <j:/_MAGISTERKA/praca-magisterska/docs/images/gradient_descent_1_long.png> <j:/_MAGISTERKA/praca-magisterska/docs/images/gradient_descent_2_long.png>]
<images/naural_model_multi_ver2.png, id=78, 417.35925pt x 448.67625pt> <images/naural_model_multi_ver2.png, id=78, 417.35925pt x 448.67625pt>
File: images/naural_model_multi_ver2.png Graphic file (type png) File: images/naural_model_multi_ver2.png Graphic file (type png)
<use images/naural_model_multi_ver2.png> <use images/naural_model_multi_ver2.png>
Package pdftex.def Info: images/naural_model_multi_ver2.png used on input line 341. Package pdftex.def Info: images/naural_model_multi_ver2.png used on input line 342.
(pdftex.def) Requested size: 227.62204pt x 244.70514pt. (pdftex.def) Requested size: 227.62204pt x 244.70514pt.
[17 <j:/_MAGISTERKA/praca-magisterska/docs/images/naural_model_one_ver2.png>] [18 <j:/_MAGISTERKA/praca-magisterska/docs/images/naural_model_multi_ver2.png>] [17 <j:/_MAGISTERKA/praca-magisterska/docs/images/naural_model_one_ver2.png>] [18 <j:/_MAGISTERKA/praca-magisterska/docs/images/naural_model_multi_ver2.png>]
<images/sigmoid.png, id=88, 564.9105pt x 374.5995pt> <images/sigmoid.png, id=88, 564.9105pt x 374.5995pt>
File: images/sigmoid.png Graphic file (type png) File: images/sigmoid.png Graphic file (type png)
<use images/sigmoid.png> <use images/sigmoid.png>
Package pdftex.def Info: images/sigmoid.png used on input line 388. Package pdftex.def Info: images/sigmoid.png used on input line 389.
(pdftex.def) Requested size: 398.33858pt x 264.14412pt. (pdftex.def) Requested size: 398.33858pt x 264.14412pt.
[19 <j:/_MAGISTERKA/praca-magisterska/docs/images/sigmoid.png>] [19 <j:/_MAGISTERKA/praca-magisterska/docs/images/sigmoid.png>]
<images/neural_net_1_ver2.png, id=94, 678.1335pt x 444.4605pt> <images/neural_net_1_ver2.png, id=94, 678.1335pt x 444.4605pt>
File: images/neural_net_1_ver2.png Graphic file (type png) File: images/neural_net_1_ver2.png Graphic file (type png)
<use images/neural_net_1_ver2.png> <use images/neural_net_1_ver2.png>
Package pdftex.def Info: images/neural_net_1_ver2.png used on input line 420. Package pdftex.def Info: images/neural_net_1_ver2.png used on input line 421.
(pdftex.def) Requested size: 227.62204pt x 149.1885pt. (pdftex.def) Requested size: 227.62204pt x 149.1885pt.
[20 <j:/_MAGISTERKA/praca-magisterska/docs/images/neural_net_1_ver2.png>] [20 <j:/_MAGISTERKA/praca-magisterska/docs/images/neural_net_1_ver2.png>]
<images/autoencoder.png, id=99, 419.76825pt x 397.485pt> <images/autoencoder.png, id=99, 419.76825pt x 397.485pt>
File: images/autoencoder.png Graphic file (type png) File: images/autoencoder.png Graphic file (type png)
<use images/autoencoder.png> <use images/autoencoder.png>
Package pdftex.def Info: images/autoencoder.png used on input line 448. Package pdftex.def Info: images/autoencoder.png used on input line 449.
(pdftex.def) Requested size: 227.62204pt x 215.53633pt. (pdftex.def) Requested size: 227.62204pt x 215.53633pt.
[21] [21]
<images/rnn.png, id=105, 680.5425pt x 257.16075pt> <images/rnn.png, id=105, 680.5425pt x 257.16075pt>
File: images/rnn.png Graphic file (type png) File: images/rnn.png Graphic file (type png)
<use images/rnn.png> <use images/rnn.png>
Package pdftex.def Info: images/rnn.png used on input line 467. Package pdftex.def Info: images/rnn.png used on input line 468.
(pdftex.def) Requested size: 398.33858pt x 150.52278pt. (pdftex.def) Requested size: 398.33858pt x 150.52278pt.
Underfull \vbox (badness 3557) has occurred while \output is active [] Underfull \vbox (badness 3557) has occurred while \output is active []
@ -626,29 +626,29 @@ Underfull \vbox (badness 3557) has occurred while \output is active []
<images/lstm_cell2.png, id=110, 419.76825pt x 295.1025pt> <images/lstm_cell2.png, id=110, 419.76825pt x 295.1025pt>
File: images/lstm_cell2.png Graphic file (type png) File: images/lstm_cell2.png Graphic file (type png)
<use images/lstm_cell2.png> <use images/lstm_cell2.png>
Package pdftex.def Info: images/lstm_cell2.png used on input line 488. Package pdftex.def Info: images/lstm_cell2.png used on input line 489.
(pdftex.def) Requested size: 398.33858pt x 280.04857pt. (pdftex.def) Requested size: 398.33858pt x 280.04857pt.
[23 <j:/_MAGISTERKA/praca-magisterska/docs/images/rnn.PNG>] [24 <j:/_MAGISTERKA/praca-magisterska/docs/images/lstm_cell2.PNG>] [23 <j:/_MAGISTERKA/praca-magisterska/docs/images/rnn.PNG>] [24 <j:/_MAGISTERKA/praca-magisterska/docs/images/lstm_cell2.PNG>]
<images/tanh.png, id=119, 578.16pt x 367.97475pt> <images/tanh.png, id=119, 578.16pt x 367.97475pt>
File: images/tanh.png Graphic file (type png) File: images/tanh.png Graphic file (type png)
<use images/tanh.png> <use images/tanh.png>
Package pdftex.def Info: images/tanh.png used on input line 526. Package pdftex.def Info: images/tanh.png used on input line 527.
(pdftex.def) Requested size: 398.33858pt x 253.52666pt. (pdftex.def) Requested size: 398.33858pt x 253.52666pt.
[25 <j:/_MAGISTERKA/praca-magisterska/docs/images/tanh.png>] [25 <j:/_MAGISTERKA/praca-magisterska/docs/images/tanh.png>]
<images/seq2seq2.png, id=125, 596.2275pt x 196.3335pt> <images/seq2seq2.png, id=125, 596.2275pt x 196.3335pt>
File: images/seq2seq2.png Graphic file (type png) File: images/seq2seq2.png Graphic file (type png)
<use images/seq2seq2.png> <use images/seq2seq2.png>
Package pdftex.def Info: images/seq2seq2.png used on input line 543. Package pdftex.def Info: images/seq2seq2.png used on input line 544.
(pdftex.def) Requested size: 398.33858pt x 131.17126pt. (pdftex.def) Requested size: 398.33858pt x 131.17126pt.
[26 <j:/_MAGISTERKA/praca-magisterska/docs/images/seq2seq2.PNG>] [26 <j:/_MAGISTERKA/praca-magisterska/docs/images/seq2seq2.PNG>]
Overfull \vbox (16.08192pt too high) detected at line 551 Overfull \vbox (16.08192pt too high) detected at line 552
[] []
Rozdzia\PlPrIeC {\l } 2. Rozdzia\PlPrIeC {\l } 2.
<images/waveform_axis.png, id=130, 707.64375pt x 436.029pt> <images/waveform_axis.png, id=130, 707.64375pt x 436.029pt>
File: images/waveform_axis.png Graphic file (type png) File: images/waveform_axis.png Graphic file (type png)
<use images/waveform_axis.png> <use images/waveform_axis.png>
Package pdftex.def Info: images/waveform_axis.png used on input line 583. Package pdftex.def Info: images/waveform_axis.png used on input line 584.
(pdftex.def) Requested size: 398.33858pt x 245.44534pt. (pdftex.def) Requested size: 398.33858pt x 245.44534pt.
[27 [27
@ -656,157 +656,156 @@ Package pdftex.def Info: images/waveform_axis.png used on input line 583.
<images/wartosc_nut.jpg, id=134, 903.375pt x 470.75874pt> <images/wartosc_nut.jpg, id=134, 903.375pt x 470.75874pt>
File: images/wartosc_nut.jpg Graphic file (type jpg) File: images/wartosc_nut.jpg Graphic file (type jpg)
<use images/wartosc_nut.jpg> <use images/wartosc_nut.jpg>
Package pdftex.def Info: images/wartosc_nut.jpg used on input line 602. Package pdftex.def Info: images/wartosc_nut.jpg used on input line 603.
(pdftex.def) Requested size: 398.33858pt x 207.57985pt. (pdftex.def) Requested size: 398.33858pt x 207.57985pt.
Underfull \vbox (badness 1527) has occurred while \output is active [] Underfull \vbox (badness 1527) has occurred while \output is active []
[28 <j:/_MAGISTERKA/praca-magisterska/docs/images/waveform_axis.png>] [28 <j:/_MAGISTERKA/praca-magisterska/docs/images/waveform_axis.png>]
LaTeX Font Info: External font `plex10' loaded for size LaTeX Font Info: External font `plex10' loaded for size
(Font) <10> on input line 609. (Font) <10> on input line 610.
LaTeX Font Info: External font `plex10' loaded for size LaTeX Font Info: External font `plex10' loaded for size
(Font) <7> on input line 609. (Font) <7> on input line 610.
LaTeX Font Info: External font `plex10' loaded for size LaTeX Font Info: External font `plex10' loaded for size
(Font) <5> on input line 609. (Font) <5> on input line 610.
<images/nuty_linia.png, id=139, 683.55376pt x 127.22531pt> <images/nuty_linia.png, id=139, 683.55376pt x 127.22531pt>
File: images/nuty_linia.png Graphic file (type png) File: images/nuty_linia.png Graphic file (type png)
<use images/nuty_linia.png> <use images/nuty_linia.png>
Package pdftex.def Info: images/nuty_linia.png used on input line 644. Package pdftex.def Info: images/nuty_linia.png used on input line 646.
(pdftex.def) Requested size: 398.33858pt x 74.14209pt. (pdftex.def) Requested size: 398.33858pt x 74.14209pt.
Underfull \vbox (badness 1142) has occurred while \output is active []
[29 <j:/_MAGISTERKA/praca-magisterska/docs/images/wartosc_nut.jpg>] [30 <j:/_MAGISTERKA/praca-magisterska/docs/images/nuty_linia.png (PNG copy)>] (c:/software/latex/texmf-dist/tex/latex/listings/lstlang1.sty [29 <j:/_MAGISTERKA/praca-magisterska/docs/images/wartosc_nut.jpg>] [30 <j:/_MAGISTERKA/praca-magisterska/docs/images/nuty_linia.png (PNG copy)>] (c:/software/latex/texmf-dist/tex/latex/listings/lstlang1.sty
File: lstlang1.sty 2018/09/02 1.7 listings language file File: lstlang1.sty 2018/09/02 1.7 listings language file
) )
LaTeX Font Info: Try loading font information for OT4+cmtt on input line 682. LaTeX Font Info: Try loading font information for OT4+cmtt on input line 690.
(c:/software/latex/texmf-dist/tex/latex/polski/ot4cmtt.fd (c:/software/latex/texmf-dist/tex/latex/polski/ot4cmtt.fd
File: ot4cmtt.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW) File: ot4cmtt.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW)
) [31] [32] ) [31]
Overfull \vbox (16.08192pt too high) detected at line 738 <images/general-midi.png, id=152, 529.98pt x 397.485pt>
File: images/general-midi.png Graphic file (type png)
<use images/general-midi.png>
Package pdftex.def Info: images/general-midi.png used on input line 745.
(pdftex.def) Requested size: 398.33858pt x 298.75592pt.
[32] [33 <j:/_MAGISTERKA/praca-magisterska/docs/images/general-midi.png>] [34
]
Overfull \vbox (16.08192pt too high) detected at line 758
[] []
Rozdzia\PlPrIeC {\l } 3. Rozdzia\PlPrIeC {\l } 3.
[33 [35] [36]
] [34]
LaTeX Font Warning: Font shape `OT4/cmtt/bx/n' in size <10> not available LaTeX Font Warning: Font shape `OT4/cmtt/bx/n' in size <10> not available
(Font) Font shape `OT4/cmtt/m/n' tried instead on input line 780. (Font) Font shape `OT4/cmtt/m/n' tried instead on input line 799.
[35] [37] [38]
Underfull \vbox (badness 7081) has occurred while \output is active [] Underfull \vbox (badness 5022) has occurred while \output is active []
[36] [37] [38] [39] [39] [40] [41] [42] [43]
Underfull \vbox (badness 2080) has occurred while \output is active [] Overfull \hbox (1.58351pt too wide) in paragraph at lines 1100--1101
\OT4/cmr/m/n/12 dat-ko-wo u»y-wa-j¡c pa-ra-me-tru [][][][][][][][][][] war-stwa LSTM zwra-ca wek-
[]
[40] [41] [42] [44]
<images/training-model-graph.png, id=188, 968.61874pt x 406.51875pt> <images/training-model-graph.png, id=197, 968.61874pt x 406.51875pt>
File: images/training-model-graph.png Graphic file (type png) File: images/training-model-graph.png Graphic file (type png)
<use images/training-model-graph.png> <use images/training-model-graph.png>
Package pdftex.def Info: images/training-model-graph.png used on input line 1117. Package pdftex.def Info: images/training-model-graph.png used on input line 1136.
(pdftex.def) Requested size: 398.33858pt x 167.1762pt. (pdftex.def) Requested size: 398.33858pt x 167.1762pt.
[43] [45 <j:/_MAGISTERKA/praca-magisterska/docs/images/training-model-graph.png>]
Overfull \hbox (2.09326pt too wide) in paragraph at lines 1136--1137 Overfull \hbox (2.09326pt too wide) in paragraph at lines 1155--1156
[][][][][]\OT4/cmr/m/n/12 , za-wie-ra-j¡-ce se-kwen-cje ele-men-tów wyj-±cio-wych, któ- [][][][][]\OT4/cmr/m/n/12 , za-wie-ra-j¡-ce se-kwen-cje ele-men-tów wyj-±cio-wych, któ-
[] []
[44 <j:/_MAGISTERKA/praca-magisterska/docs/images/training-model-graph.png>] [46]
<images/inference-decoder-graph.png, id=197, 1179.40625pt x 296.10625pt> <images/inference-decoder-graph.png, id=205, 1179.40625pt x 296.10625pt>
File: images/inference-decoder-graph.png Graphic file (type png) File: images/inference-decoder-graph.png Graphic file (type png)
<use images/inference-decoder-graph.png> <use images/inference-decoder-graph.png>
Package pdftex.def Info: images/inference-decoder-graph.png used on input line 1171. Package pdftex.def Info: images/inference-decoder-graph.png used on input line 1190.
(pdftex.def) Requested size: 398.33858pt x 100.0106pt. (pdftex.def) Requested size: 398.33858pt x 100.0106pt.
[45 <j:/_MAGISTERKA/praca-magisterska/docs/images/inference-decoder-graph.png>] [47 <j:/_MAGISTERKA/praca-magisterska/docs/images/inference-decoder-graph.png>] [48] [49] [50] [51] [52] [53]
Underfull \vbox (badness 10000) has occurred while \output is active [] <images/training_losses.png, id=230, 722.7pt x 722.7pt>
[46] [47] [48]
Overfull \hbox (42.66057pt too wide) in paragraph at lines 1345--1346
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[]
Underfull \vbox (badness 4713) has occurred while \output is active []
[49] [50] [51]
<images/training_losses.png, id=222, 722.7pt x 722.7pt>
File: images/training_losses.png Graphic file (type png) File: images/training_losses.png Graphic file (type png)
<use images/training_losses.png> <use images/training_losses.png>
Package pdftex.def Info: images/training_losses.png used on input line 1474. Package pdftex.def Info: images/training_losses.png used on input line 1494.
(pdftex.def) Requested size: 398.33858pt x 398.33534pt. (pdftex.def) Requested size: 398.33858pt x 398.33534pt.
Overfull \hbox (3.0656pt too wide) in paragraph at lines 1481--1482 Overfull \hbox (3.0656pt too wide) in paragraph at lines 1501--1502
[]\OT4/cmr/m/n/12 Gdy zde-fi-nio-wa-ne mo-de-le zo-sta-n¡ wy-tre-no-wa-ne mo-»e-my wy-ko-rzy-sta¢ skrypt []\OT4/cmr/m/n/12 Gdy zde-fi-nio-wa-ne mo-de-le zo-sta-n¡ wy-tre-no-wa-ne mo-»e-my wy-ko-rzy-sta¢ skrypt
[] []
[52] [54]
Overfull \hbox (4.86064pt too wide) in paragraph at lines 1499--1500 Overfull \hbox (4.86064pt too wide) in paragraph at lines 1519--1520
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[] []
[53 <j:/_MAGISTERKA/praca-magisterska/docs/images/training_losses.png>] [55 <j:/_MAGISTERKA/praca-magisterska/docs/images/training_losses.png>]
Overfull \hbox (1.56473pt too wide) in paragraph at lines 1513--1515 Overfull \hbox (1.56473pt too wide) in paragraph at lines 1533--1535
[][][][][][][][]\OT4/cmr/m/n/12 , któ-re wspie-ra-j¡ for-mat se-kwen-cji sªów mu-zycz-nych omó- [][][][][][][][]\OT4/cmr/m/n/12 , któ-re wspie-ra-j¡ for-mat se-kwen-cji sªów mu-zycz-nych omó-
[] []
Overfull \hbox (0.20659pt too wide) in paragraph at lines 1538--1539 Overfull \hbox (0.20659pt too wide) in paragraph at lines 1558--1559
\OT4/cmr/m/n/12 oraz opo-wiem ja-kie ulep-sze-nia po-ja-wia-ªy si¦ wraz z po-st¦-pem tre-nin-gu. Wszyst- \OT4/cmr/m/n/12 oraz opo-wiem ja-kie ulep-sze-nia po-ja-wia-ªy si¦ wraz z po-st¦-pem tre-nin-gu. Wszyst-
[] []
<images/score_1.png, id=230, 585.68813pt x 241.65282pt> <images/score_1.png, id=239, 585.68813pt x 241.65282pt>
File: images/score_1.png Graphic file (type png) File: images/score_1.png Graphic file (type png)
<use images/score_1.png> <use images/score_1.png>
Package pdftex.def Info: images/score_1.png used on input line 1544. Package pdftex.def Info: images/score_1.png used on input line 1564.
(pdftex.def) Requested size: 398.33858pt x 164.35861pt. (pdftex.def) Requested size: 398.33858pt x 164.35861pt.
[54] [56]
<images/score_10.png, id=234, 575.90157pt x 290.58563pt> <images/score_10.png, id=243, 575.90157pt x 290.58563pt>
File: images/score_10.png Graphic file (type png) File: images/score_10.png Graphic file (type png)
<use images/score_10.png> <use images/score_10.png>
Package pdftex.def Info: images/score_10.png used on input line 1553. Package pdftex.def Info: images/score_10.png used on input line 1573.
(pdftex.def) Requested size: 398.33858pt x 200.99646pt. (pdftex.def) Requested size: 398.33858pt x 200.99646pt.
[55 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_1.png (PNG copy)> <j:/_MAGISTERKA/praca-magisterska/docs/images/score_10.png (PNG copy)>] <images/score_25.png, id=244, 578.91281pt x 307.1475pt>
<images/score_25.png, id=239, 578.91281pt x 307.1475pt>
File: images/score_25.png Graphic file (type png) File: images/score_25.png Graphic file (type png)
<use images/score_25.png> <use images/score_25.png>
Package pdftex.def Info: images/score_25.png used on input line 1562. Package pdftex.def Info: images/score_25.png used on input line 1582.
(pdftex.def) Requested size: 398.33858pt x 211.34148pt. (pdftex.def) Requested size: 398.33858pt x 211.34148pt.
<images/score_50.png, id=240, 578.16pt x 307.90031pt> [57 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_1.png (PNG copy)> <j:/_MAGISTERKA/praca-magisterska/docs/images/score_10.png (PNG copy)>]
<images/score_50.png, id=248, 578.16pt x 307.90031pt>
File: images/score_50.png Graphic file (type png) File: images/score_50.png Graphic file (type png)
<use images/score_50.png> <use images/score_50.png>
Package pdftex.def Info: images/score_50.png used on input line 1571. Package pdftex.def Info: images/score_50.png used on input line 1591.
(pdftex.def) Requested size: 398.33858pt x 212.13666pt. (pdftex.def) Requested size: 398.33858pt x 212.13666pt.
<images/score_75.png, id=241, 588.69937pt x 310.15875pt> <images/score_75.png, id=249, 588.69937pt x 310.15875pt>
File: images/score_75.png Graphic file (type png) File: images/score_75.png Graphic file (type png)
<use images/score_75.png> <use images/score_75.png>
Package pdftex.def Info: images/score_75.png used on input line 1580. Package pdftex.def Info: images/score_75.png used on input line 1600.
(pdftex.def) Requested size: 398.33858pt x 209.86871pt. (pdftex.def) Requested size: 398.33858pt x 209.86871pt.
<images/score_100.png, id=242, 574.39594pt x 314.67563pt> <images/score_100.png, id=250, 574.39594pt x 314.67563pt>
File: images/score_100.png Graphic file (type png) File: images/score_100.png Graphic file (type png)
<use images/score_100.png> <use images/score_100.png>
Package pdftex.def Info: images/score_100.png used on input line 1589. Package pdftex.def Info: images/score_100.png used on input line 1609.
(pdftex.def) Requested size: 398.33858pt x 218.23076pt. (pdftex.def) Requested size: 398.33858pt x 218.23076pt.
[56 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_25.png (PNG copy)>] <images/score_150.png, id=251, 580.41844pt x 300.3722pt>
<images/score_150.png, id=246, 580.41844pt x 300.3722pt>
File: images/score_150.png Graphic file (type png) File: images/score_150.png Graphic file (type png)
<use images/score_150.png> <use images/score_150.png>
Package pdftex.def Info: images/score_150.png used on input line 1596. Package pdftex.def Info: images/score_150.png used on input line 1616.
(pdftex.def) Requested size: 398.33858pt x 206.14786pt. (pdftex.def) Requested size: 398.33858pt x 206.14786pt.
[57 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_50.png (PNG copy)> <j:/_MAGISTERKA/praca-magisterska/docs/images/score_75.png (PNG copy)>] [58 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_100.png (PNG copy)> <j:/_MAGISTERKA/praca-magisterska/docs/images/score_150.png (PNG copy)>] [59 [58 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_25.png (PNG copy)>] [59 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_50.png (PNG copy)> <j:/_MAGISTERKA/praca-magisterska/docs/images/score_75.png (PNG copy)>] [60 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_100.png (PNG copy)> <j:/_MAGISTERKA/praca-magisterska/docs/images/score_150.png (PNG copy)>] [61
] [60 ] [62
] (j:/_MAGISTERKA/praca-magisterska/docs/document.ind) [61] (j:/_MAGISTERKA/praca-magisterska/docs/document.aux) ) ] (j:/_MAGISTERKA/praca-magisterska/docs/document.ind) [63] (j:/_MAGISTERKA/praca-magisterska/docs/document.aux) )
Here is how much of TeX's memory you used: Here is how much of TeX's memory you used:
16788 strings out of 492616 16798 strings out of 492616
311428 string characters out of 6131816 311656 string characters out of 6131816
660527 words of memory out of 5000000 660983 words of memory out of 5000000
20341 multiletter control sequences out of 15000+600000 20350 multiletter control sequences out of 15000+600000
26080 words of font info for 78 fonts, out of 8000000 for 9000 26080 words of font info for 78 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191 1141 hyphenation exceptions out of 8191
55i,12n,50p,1575b,1971s stack positions out of 5000i,500n,10000p,200000b,80000s 55i,12n,50p,1574b,1971s stack positions out of 5000i,500n,10000p,200000b,80000s
{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plit.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/pltt.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plrm.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plms.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plmi.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plme.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plsc.enc}<c:/software/latex/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbsy10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plcsc10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plex10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi6.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmib10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr7.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsltt10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsy10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsy8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plti10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plti12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/pltt10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/pltt12.pfb> {c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plit.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/pltt.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plrm.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plms.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plmi.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plme.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plsc.enc}<c:/software/latex/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbsy10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plcsc10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plex10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi6.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmib10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr7.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsltt10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsy10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsy8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plti10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plti12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/pltt10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/pltt12.pfb>
Output written on j:/_MAGISTERKA/praca-magisterska/docs/document.pdf (61 pages, 1199932 bytes). Output written on j:/_MAGISTERKA/praca-magisterska/docs/document.pdf (63 pages, 1241654 bytes).
PDF statistics: PDF statistics:
343 PDF objects out of 1000 (max. 8388607) 351 PDF objects out of 1000 (max. 8388607)
214 compressed objects within 3 object streams 218 compressed objects within 3 object streams
0 named destinations out of 1000 (max. 500000) 0 named destinations out of 1000 (max. 500000)
138 words of extra memory for PDF output out of 10000 (max. 10000000) 143 words of extra memory for PDF output out of 10000 (max. 10000000)

Binary file not shown.

Binary file not shown.

View File

@ -36,6 +36,7 @@
\newtheorem{tw}{Twierdzenie} \newtheorem{tw}{Twierdzenie}
\captionsetup[figure]{labelfont={bf}, name={Rysunek}, labelsep=period} \captionsetup[figure]{labelfont={bf}, name={Rysunek}, labelsep=period}
\captionsetup[table]{labelfont={bf}, name={Tabela}, labelsep=period}
\pagestyle{fancy} \pagestyle{fancy}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}} \renewcommand{\chaptermark}[1]{\markboth{#1}{}}
@ -162,13 +163,13 @@ Jednocześnie przyjmuję do wiadomości, że przypisanie sobie, w pracy dyplomow
\chapter*{Streszczenie} \chapter*{Streszczenie}
W pracy magisterskiej pod tytułem ,,Generowanie muzyki przy pomocy głębokiego uczenia'' został zaproponowany przykład sieci neuronowej, którego celem jest generowanie krótkich multi instrumentalnych klipów muzycznych. W pracy magisterskiej pod tytułem ,,Generowanie muzyki przy pomocy głębokiego uczenia'' został zaproponowany przykład sieci neuronowej, którego celem jest generowanie krótkich multiinstrumentalnych klipów muzycznych.
Główna część pracy została poprzedzona wprowadzeniem do tematu sieci neuronowych oraz teorii muzyki, w celu lepszego zrozumienia omawianego tematu. W rozdziale~\ref{section:nets} przeznaczonym teorii sieci neuronowych autor przedstawia w jaki sposób rozbudować regresję liniową, aby otrzymać model sieci neuronowej oraz przedstawia rekurencyjne sieci neuronowe, komórki LSTM oraz model sequence-to-sequence. W rozdziale~\ref{section:music} poświęconym teorii muzyki autor odróżnia dwa pojęcia, muzykę w rozumieniu fizycznego zjawiska oraz muzykę symboliczną jaką obiekt abstrakcyjny. Następnie zostały opisane podstawowe obiekty muzyczne oraz przedstawiony protokół MIDI. Protokół MIDI jest międzynarodowym standardem komunikacji instrumentów muzycznych a w formie plików przechowuje informacje o muzyce w formie podobnej do zapisu nutowego. Pliki midi zostały wykorzystane jako źródło informacji dla sieci neuronowej. Główna część pracy została poprzedzona wprowadzeniem do tematu sieci neuronowych oraz teorii muzyki, w celu lepszego zrozumienia omawianego tematu. W rozdziale~\ref{section:nets} przeznaczonym teorii sieci neuronowych autor przedstawia w jaki sposób rozbudować regresję liniową, aby otrzymać model sieci neuronowej. Omawia rekurencyjne sieci neuronowe, komórki LSTM oraz model sequence-to-sequence. W rozdziale~\ref{section:music} poświęconym teorii muzyki autor odróżnia dwa pojęcia: muzykę w rozumieniu fizycznego zjawiska oraz muzykę symboliczną jaką obiekt abstrakcyjny. Następnie zostały opisane podstawowe obiekty muzyczne oraz przedstawiony protokół MIDI. Protokół MIDI jest międzynarodowym standardem komunikacji instrumentów muzycznych, a w formie plików przechowuje informacje o muzyce w formie podobnej do zapisu nutowego. Pliki midi zostały wykorzystane jako źródło informacji dla sieci neuronowej.
W rozdziale~\ref{section:project} została przedstawiona część główna pracy. Autor przyrównuje partie muzyczne do języka mówionego a różne instrumenty do różnych języków świata. Dlatego do generowania muzyki została wykorzystana architektura służąca do tłumaczenia maszynowego języków sequence-to-sequence. W pracy zostanie zaproponowane kodowanie muzyki jako sekwencje zdarzeń, nazywanych w pracy ,,muzycznymi słowami'', gdzie każde słowo posiada informacje o wysokości i długości trwania dźwięku, akordu lub pauzy. Następnie zostanie zademonstrowana architektura modelu wraz z jej implementacją w języku Python z wykorzystaniem biblioteki Keras oraz szczegóły opis procesu przygotowania danych dla modelu. Rozdział~\ref{section:project} zawiera główną część pracy. Autor przyrównuje partie muzyczne do języka mówionego, a różne instrumenty do różnych języków świata. Dlatego do generowania muzyki została wykorzystana architektura służąca do tłumaczenia maszynowego języków sequence-to-sequence. W pracy zostanie zaproponowane kodowanie muzyki jako sekwencje zdarzeń, nazywanych w pracy ,,muzycznymi słowami'', gdzie każde słowo posiada informacje o wysokości i długości trwania dźwięku, czy akordu albo pauzy. Następnie zostanie zademonstrowana architektura modelu wraz z jej implementacją w języku Python z wykorzystaniem biblioteki Keras oraz szczegółowy opis procesu przygotowania danych dla modelu.
W dalszej części tego samego rozdziału zostaje omówiony przykład wykorzystania zaproponowanego modelu do generowania muzyki. Jako dane źródłowe dla modelu zostało przygotowanych siedem utworów zespołu The Offspring. Autor przeprowadza przez omówiony wcześniej proces wydobycia danych z plików MIDI, uczenia oraz generowania utworów muzycznych. Na zakończenie pracy zostały pokazane przykładany wygenerowanych utworów. W dalszej części tego samego rozdziału zostaje omówiony przykład wykorzystania zaproponowanego modelu do generowania muzyki. Jako dane źródłowe dla modelu zostało użytych siedem utworów zespołu The Offspring. Autor przeprowadza przez cały proces od wydobycia danych z plików MIDI przez uczenie do generowania utworów muzycznych. Na zakończenie pracy zostały pokazane przykładany wygenerowanych utworów.
@ -184,13 +185,13 @@ The rest of this chapter discusses an example of using the proposed model to gen
\chapter*{Wstęp} \chapter*{Wstęp}
Uczenie maszynowe w ostatnich latach mocno zyskało na popularności. Zastosowania i możliwości różnych algorytmów uczenia maszynowego czasami przekraczają nasze wyobrażenie o tym co komputer może zrobić. Wśród aplikacji opartych na sztucznej inteligencji znajdują się takie, które potrafią przewidywać następne wartości akcji giełdowych, rozpoznawać na filmie obiekty w czasie rzeczywistym, czy nawet prowadzić samochód. Algorytmy wyuczone prezentują nam spersonalizowane reklamy produktów na podstawie naszych upodobań. Najczęstsze zastosowania dotyczą przetwarzania obrazów lub tekstu, natomiast zastosowania w przetwarzaniu muzyki są niszowe i rzadziej spotykane. Uczenie maszynowe w ostatnich latach mocno zyskało na popularności. Zastosowania i możliwości różnych algorytmów uczenia maszynowego czasami przekraczają nasze wyobrażenie, o tym co komputer może zrobić. Wśród aplikacji opartych na sztucznej inteligencji znajdują się takie, które potrafią przewidywać następne wartości akcji giełdowych, rozpoznawać na filmie obiekty w czasie rzeczywistym, czy nawet prowadzić samochód. Algorytmy wyuczone prezentują nam spersonalizowane reklamy produktów na podstawie naszych upodobań. Najczęstsze zastosowania dotyczą przetwarzania obrazów lub tekstu, natomiast zastosowania w przetwarzaniu muzyki są niszowe i rzadziej spotykane.
Celem tej pracy jest stworzenie modelu sieci neuronowej, którego zadaniem będzie generowanie krótkich multi instrumentalnych klipów muzycznych. Celem tej pracy jest stworzenie modelu sieci neuronowej, którego zadaniem będzie generowanie krótkich multi instrumentalnych klipów muzycznych.
W pierwszej części swojej pracy W pierwszej części pracy opiszę w jaki sposób działają sieci neuronowe, jak się uczą oraz podstawowe architektury sieci, które pomogą zrozumieć model który wykorzystałem. Następnie krótko przedstawię podstawowe koncepcje związane z muzyką oraz sposobami jej reprezentacji. W pierwszej części swojej pracy W pierwszej części pracy opiszę w jaki sposób działają sieci neuronowe, jak się uczą oraz podstawowe architektury sieci, które pomogą zrozumieć model, który wykorzystałem. Następnie krótko przedstawię podstawowe koncepcje związane z muzyką oraz sposobami jej reprezentacji.
Następnie przedstawię swój projekt modelu. Omówię jakie idee stały za wyborami, które podjąłem w projektowaniu sieci. Szczegółowo opiszę sposób ekstrakcji danych tak, aby mogły być one wykorzystane przez model. Opiszę architekturę którą wybrałem oraz przedstawię i opiszę fragmenty kodu w języku Python. W tym samym rozdziale zademonstruję na przykładowym zbiorze danych proces ich przetworzenia, uczenia modelu oraz generowania muzyki. Na końcu pokażę i omówię wyniki. Następnie przedstawię swój projekt modelu. Omówię jakie idee stały za wyborami, które podjąłem w projektowaniu sieci. Szczegółowo opiszę sposób ekstrakcji danych tak, aby mogły być one wykorzystane przez model. Opiszę architekturę, którą wybrałem oraz przedstawię i opiszę fragmenty kodu w języku Python. W tym samym rozdziale zademonstruję na przykładowym zbiorze danych proces ich przetworzenia, uczenia modelu oraz generowania muzyki. Na końcu pokażę i omówię wyniki.
\newpage \newpage
@ -234,7 +235,7 @@ The rest of this chapter discusses an example of using the proposed model to gen
\[h(x) = b + \theta_1x_2 + \theta_2x_2 + ... + \theta_px_p + \epsilon = b + \sum_{i=1}^{p} \theta_ix_i + \epsilon.\] \[h(x) = b + \theta_1x_2 + \theta_2x_2 + ... + \theta_px_p + \epsilon = b + \sum_{i=1}^{p} \theta_ix_i + \epsilon.\]
Rysunek~\ref{fig:linreg} przedstawia przykładowy model regresji liniowej jednej zmiennej, dopasowany do zbioru. Rysunek~\ref{fig:linreg} przedstawia przykładowy dopasowany model regresji liniowej jednej zmiennej.
\section{Uczenie modelu} \section{Uczenie modelu}
@ -249,14 +250,14 @@ The rest of this chapter discusses an example of using the proposed model to gen
W tym celu używa się funkcji $J_\theta(h)$, która zwraca wartość błędu między wartościami $h(x)$ oraz $y$ dla wszystkich obserwacji. Taka funkcja nazywana jest funkcją kosztu (\textit{ang. cost function}). W tym celu używa się funkcji $J_\theta(h)$, która zwraca wartość błędu między wartościami $h(x)$ oraz $y$ dla wszystkich obserwacji. Taka funkcja nazywana jest funkcją kosztu (\textit{ang. cost function}).
Dla przykładu regresji liniowej funkcją kosztu może być błąd średniokwadratowy (\textit{ang. mean squared error}). Wtedy funkcja kosztu przyjmuje postać: Dla przykładu regresji liniowej funkcją kosztu może być błąd średniokwadratowy (\textit{ang. mean squared error}). Wtedy funkcja kosztu przyjmuje postać
\[ J_\theta(h) = \frac{1}{n}\sum_{i=1}^{n}(y_i-h(x_i))^2.\] \[ J_\theta(h) = \frac{1}{n}\sum_{i=1}^{n}(y_i-h(x_i))^2.\]
Przy zdefiniowanej funkcji kosztu proces uczenia sprowadza się do znalezienia takich parametrów funkcji $h(x)$, aby funkcja kosztu była najmniejsza. Jest to problem optymalizacyjny sprowadzający się do znalezienia globalnego minimum funkcji. Przy zdefiniowanej funkcji kosztu proces uczenia sprowadza się do znalezienia takich parametrów funkcji $h(x)$, aby funkcja kosztu była najmniejsza. Jest to problem optymalizacyjny sprowadzający się do znalezienia globalnego minimum funkcji.
\subsection{Znajdowanie minimum funkcji} \subsection{Znajdowanie minimum funkcji}
Aby znaleźć minimum funkcji $f$ możemy skorzystać z analizy matematycznej. Wiemy, że jeśli funkcja $f$ jest różniczkowalna, to funkcja może przyjmować minimum lokalne, gdy $f'(x_0) = 0$ dla pewnego $x_0$ z dziedziny funkcji $f$. Dodatkowo jeśli istnieje otoczenie punktu $x_0$, że dla wszystkich punktów z tego otoczenia spełniona jest nierówność: Aby znaleźć minimum funkcji $f$ możemy skorzystać z analizy matematycznej. Wiemy, że jeśli funkcja $f$ jest różniczkowalna to funkcja może przyjmować minimum lokalne, gdy $f'(x_0) = 0$ dla pewnego $x_0$ z dziedziny funkcji $f$. Dodatkowo jeśli istnieje otoczenie punktu $x_0$, że dla wszystkich punktów z tego otoczenia spełniona jest nierówność:
\[ f(x)>f(x_0), \] \[ f(x)>f(x_0), \]
to znaleziony punkt $x_0$ jest minimum lokalnym. to znaleziony punkt $x_0$ jest minimum lokalnym.
W teorii należałoby zatem wybrać taką funkcję kosztu, aby była różniczkowalna. Rozwiązać równanie $J_\theta'(h)=0$, następnie dla otrzymanych wyników sprawdzić powyższą nierówność oraz wybrać najmniejszy wynik ze wszystkich \cite{analiza_mat}. W praktyce rozwiązanie takiego równania ze względu na jego złożoność może się okazać niewykonalne. Aby rozwiązać ten problem powstały inne metody, które pozwalają szukać ekstremów funkcji, jednak nigdy nie będziemy mieli pewności, że otrzymany wynik jest minimum globalnym funkcji kosztu. W teorii należałoby zatem wybrać taką funkcję kosztu, aby była różniczkowalna. Rozwiązać równanie $J_\theta'(h)=0$, następnie dla otrzymanych wyników sprawdzić powyższą nierówność oraz wybrać najmniejszy wynik ze wszystkich \cite{analiza_mat}. W praktyce rozwiązanie takiego równania ze względu na jego złożoność może się okazać niewykonalne. Aby rozwiązać ten problem powstały inne metody, które pozwalają szukać ekstremów funkcji, jednak nigdy nie będziemy mieli pewności, że otrzymany wynik jest minimum globalnym funkcji kosztu.
@ -292,10 +293,10 @@ The rest of this chapter discusses an example of using the proposed model to gen
Następnie policzyć wszystkie pochodne częściowe $\frac{\partial J_\theta(h)}{\partial \theta_i}$. Otrzymamy w ten sposób gradient $\nabla J_\theta(h)$, gdzie Następnie policzyć wszystkie pochodne częściowe $\frac{\partial J_\theta(h)}{\partial \theta_i}$. Otrzymamy w ten sposób gradient $\nabla J_\theta(h)$, gdzie
\[ \[
\nabla J_\theta(h) = \left[ \frac{\partial J_\theta(h)}{\partial \theta_1}, \frac{\partial J_\theta(h)}{\partial \theta_2}, ... , \frac{\partial J_\theta(h)}{\partial \theta_p} \right]. \nabla J_\theta(h) = \left[ \frac{\partial J_\theta(h)}{\partial \theta_1}, \frac{\partial J_\theta(h)}{\partial \theta_2}, ... , \frac{\partial J_\theta(h)}{\partial \theta_p} \right],
\] \]
Następnie obliczyć element $\Theta_{k+1}$ ze wzoru wtedy można obliczyć element $\Theta_{k+1}$ ze wzoru
\[ \[
\Theta_{k+1} = \Theta_{k} - \alpha\nabla J_\theta(h), \Theta_{k+1} = \Theta_{k} - \alpha\nabla J_\theta(h),
@ -453,7 +454,7 @@ The rest of this chapter discusses an example of using the proposed model to gen
Podczas uczenia autoenkodera przedstawia się dane wejściowe jako cel. W ten sposób ta architektura stara się odtworzyć funkcje identycznościowe. Zadanie nie jest trywialne jak mogłoby się zdawać, ponieważ zazwyczaj ukryta warstwa jest mniejszego rozmiaru niż dane wejściowe. Z tego względu autoenkoder jest zmuszony do wydobycia istotnych cech danych wejściowych, skompresowania, a następnie jak najwierniejszego ich odtworzenia. Część kompresująca dane nazywana jest enkoderem, natomiast część dekompresująca dekoderem. Podczas uczenia autoenkodera przedstawia się dane wejściowe jako cel. W ten sposób ta architektura stara się odtworzyć funkcje identycznościowe. Zadanie nie jest trywialne jak mogłoby się zdawać, ponieważ zazwyczaj ukryta warstwa jest mniejszego rozmiaru niż dane wejściowe. Z tego względu autoenkoder jest zmuszony do wydobycia istotnych cech danych wejściowych, skompresowania, a następnie jak najwierniejszego ich odtworzenia. Część kompresująca dane nazywana jest enkoderem, natomiast część dekompresująca dekoderem.
Cechy, które zostały odkryte przez autoenkoder nazywane są zmiennymi utajnionymi (\textit{ang. latent variables}). Zarówno encoder jak i dekoder można wyodrębnić z autoenkodera i wykorzystywać go jako osobną sieć neuronową. Cechy, które zostały odkryte przez autoenkoder nazywane są zmiennymi utajnionymi (\textit{ang. latent variables}). Zarówno encoder jak i dekoder można wyodrębnić z autoenkodera i wykorzystywać go jako osobną sieć neuronową.
Ciekawą cechą dekodera jest jego generatywny charakter, ponieważ dostarczając zupełnie nowe informacje jako zmienne wejściowe, dekoder otworzy je na podobieństwo danych, na których został nauczony. Ciekawą cechą dekodera jest jego generatywny charakter, ponieważ dostarczając zupełnie nowe informacje jako zmienne wejściowe, dekoder otworzy je na podobieństwo danych na, których został nauczony.
\subsection{Rekurencyjne sieci neuronowe} \subsection{Rekurencyjne sieci neuronowe}
\label{section:rnn} \label{section:rnn}
@ -490,7 +491,7 @@ The rest of this chapter discusses an example of using the proposed model to gen
\label{fig:lstm} \label{fig:lstm}
\end{figure} \end{figure}
Główny pomysł na funkcjonowanie komórek LSTM był taki, aby sieć sama mogła się nauczyć jakie informacje są istotne i je przechować, a które informacje można pominąć, zapomnieć. Schemat komórki LSTM przedstawiono na rysunku~\ref{fig:lstm}. Aby to osiągnąć powstała idea bramek (\textit{ang. gates}) oraz kontrolerów bramek (\textit{ang. gate controllers}). W komórce LSTM wyróżniamy trzy bramki. Bramkę zapomnienia (\textit{ang. forget gate}) sterowaną przez $f_{(t)}$, bramkę wejściową(\textit{ang. input gate}) sterowaną przez $i_{(t)}$ oraz bramkę wyjściową (\textit{ang. output gate}), sterowaną przez $o_{(t)}$. Przepływ danych w komórce LSTM zaczyna w miejscu, gdzie wektor wejściowy $x_{(t)}$ i poprzedni krótkoterminowy stan $h_{(t-1)}$ trafiają do czterech warstw. Główną warstwą jest ta zwracająca $g_{(t)}$. W podstawowej komórce RNN jest tylko ta warstwa. Pozostałe trzy warstwy po przejściu przez funkcje logistyczne trafiają do bramek. Bramka zapomnienia kontroluje, które informacje z długookresowego stanu $c_{(t-1)}$ powinny zostać wykasowane. Bramka wejściowa kontroluje jakie informacje z $g_{(t)}$ powinny zostać przekazane dalej i dodane do następnego stanu długookresowego $c_{(t)}$. Bramka wyjściowa odpowiada za wybranie odpowiednich elementów z stanu długookresowego i przekazanie ich następnych kroku. Wynik komórki zostaje przekazany do wyjścia komórki $y_{(t)}$ oraz jako następny stan krótkoterminowy $h_{(t)}$. Główny pomysł na funkcjonowanie komórek LSTM był taki, aby sieć sama mogła się nauczyć jakie informacje są istotne i je przechować, a które informacje można pominąć, zapomnieć. Schemat komórki LSTM przedstawiono na rysunku~\ref{fig:lstm}. Aby to osiągnąć powstała idea bramek (\textit{ang. gates}) oraz kontrolerów bramek (\textit{ang. gate controllers}). W komórce LSTM wyróżniamy trzy bramki. Bramkę zapomnienia (\textit{ang. forget gate}) sterowaną przez $f_{(t)}$, bramkę wejściową (\textit{ang. input gate}) sterowaną przez $i_{(t)}$ oraz bramkę wyjściową (\textit{ang. output gate}) sterowaną przez $o_{(t)}$. Przepływ danych w komórce LSTM zaczyna w miejscu, gdzie wektor wejściowy $x_{(t)}$ i poprzedni krótkoterminowy stan $h_{(t-1)}$ trafiają do czterech warstw. Główną warstwą jest ta zwracająca $g_{(t)}$. W podstawowej komórce RNN jest tylko ta warstwa. Pozostałe trzy warstwy po przejściu przez funkcje logistyczne trafiają do bramek. Bramka zapomnienia kontroluje, które informacje z długookresowego stanu $c_{(t-1)}$ powinny zostać wykasowane. Bramka wejściowa kontroluje jakie informacje z $g_{(t)}$ powinny zostać przekazane dalej i dodane do następnego stanu długookresowego $c_{(t)}$. Bramka wyjściowa odpowiada za wybranie odpowiednich elementów z stanu długookresowego i przekazanie ich następnych kroku. Wynik komórki zostaje przekazany do wyjścia komórki $y_{(t)}$ oraz jako następny stan krótkoterminowy $h_{(t)}$.
Kolejne etapy komórki LSTM obliczane są zgodnie z poniższymi wzorami: Kolejne etapy komórki LSTM obliczane są zgodnie z poniższymi wzorami:
\[ \[
@ -535,7 +536,7 @@ The rest of this chapter discusses an example of using the proposed model to gen
%-model-679e04af4346 26.05.2020 14:58} %-model-679e04af4346 26.05.2020 14:58}
Model sequence-to-sequence ma dwie części, enkoder i dekoder. Obie części są w zasadzie dwiema zupełnie osobnymi modelami, połączonymi ze sobą w jedną sieć. Schemat modelu sequence-to-sequence przedstawiono na rysunku~\ref{fig:seq2seq}. Model sequence-to-sequence ma dwie części, enkoder i dekoder. Obie części są w zasadzie dwiema zupełnie osobnymi modelami, połączonymi ze sobą w jedną sieć. Schemat modelu sequence-to-sequence przedstawiono na rysunku~\ref{fig:seq2seq}.
Zadaniem enkodera, podobnie jak zostało to opisane w rozdziale~\ref{section:autoencoder} o autoenkoderze, jest wydobycie z wektora wejściowego najistotniejszych informacji i skompresowanie ich. Następnie wektor stanu enkodera jest przekazywany do dekodera, który Zadaniem enkodera jest wydobycie z wektora wejściowego najistotniejszych informacji i skompresowanie ich tak jak zostało to opisane w rozdziale~\ref{section:autoencoder}. Następnie wektor stanu enkodera jest przekazywany do dekodera, który
na jego podstawie rekonstruuje sekwencję. na jego podstawie rekonstruuje sekwencję.
\begin{figure}[!htb] \begin{figure}[!htb]
@ -576,7 +577,7 @@ The rest of this chapter discusses an example of using the proposed model to gen
\subsection{Sygnał dźwiękowy} \subsection{Sygnał dźwiękowy}
W rzeczywistości utwór muzyczny jest zazwyczaj kombinacją wielu fal dźwiękowych, o różnych charakterystykach i nazywany jest sygnałem dźwiękowym. Wizualizację sygnału dźwiękowego przedstawiono na Rysunku~\ref{fig:waveform} W rzeczywistości utwór muzyczny jest zazwyczaj kombinacją wielu fal dźwiękowych o różnych charakterystykach i nazywany jest sygnałem dźwiękowym. Wizualizację sygnału dźwiękowego przedstawiono na Rysunku~\ref{fig:waveform}
\begin{figure}[!htb] \begin{figure}[!htb]
\centering \centering
@ -587,7 +588,7 @@ The rest of this chapter discusses an example of using the proposed model to gen
\subsection{Zapis nutowy} \subsection{Zapis nutowy}
Reprezentacja muzyki jako sygnału dźwiękowego przechowuje informacje o dokładnym brzmieniu danego utworu tzn. jakie drgania należy wytworzyć, aby móc odtworzyć muzykę. Taki zapis nie informuje nas bezpośrednio jakie instrumenty zostały użyte, jakie wysokości i długości dźwięków zostały wykorzystane. Dlatego ludzkość na przestrzeni wieków opracowała abstrakcyjne obiekty, które reprezentują utwór w czytelny dla człowieka sposób. Reprezentacja muzyki jako sygnału dźwiękowego przechowuje informacje o dokładnym brzmieniu danego utworu tzn. jakie drgania należy wytworzyć, aby móc odtworzyć muzykę. Taki zapis nie informuje nas o instrumentach, które zostały użyte ani jakie wysokości i długości dźwięków zostały zagrane. Dlatego ludzkość na przestrzeni wieków opracowała abstrakcyjne obiekty, które reprezentują utwór w czytelny dla człowieka sposób.
\subsubsection{Tempo} \subsubsection{Tempo}
W muzyce symbolicznej tempo informuje nas o prędkości utworu. W muzyce klasycznej stosowało się opisowy sposób dostosowywania tempa np. Allegro - Szybko lub Adagio - wolno. Jak można szybko stwierdzić są to zwroty subiektywne i nie wyznaczają tempa jednoznacznie. Obecnie wyraża się tempo w liczbie uderzeń na minutę (\textit{ang. beats per minute; BPM}). I tak Allegro jest to od 120 do 168 BPM a Adagio od 66 do 76 BPM \cite{tempos}. % \footnote{źródlo: http://www.classicalmusiccity.com/search/article.php?vars=446/ W muzyce symbolicznej tempo informuje nas o prędkości utworu. W muzyce klasycznej stosowało się opisowy sposób dostosowywania tempa np. Allegro - Szybko lub Adagio - wolno. Jak można szybko stwierdzić są to zwroty subiektywne i nie wyznaczają tempa jednoznacznie. Obecnie wyraża się tempo w liczbie uderzeń na minutę (\textit{ang. beats per minute; BPM}). I tak Allegro jest to od 120 do 168 BPM a Adagio od 66 do 76 BPM \cite{tempos}. % \footnote{źródlo: http://www.classicalmusiccity.com/search/article.php?vars=446/
@ -608,7 +609,8 @@ The rest of this chapter discusses an example of using the proposed model to gen
\newline \newline
5 kwietnia 2020 12:46} 5 kwietnia 2020 12:46}
Tak jak pisałem wcześniej, wysokość dźwięku jest to częstotliwość drgań fali dźwiękowej wyrażona w hercach. W muzyce symbolicznej dla uproszczenia wybrane częstotliwości zostały nazwane literami alfabetu C, D, E, F, G, A, H. Tak jak pisałem wcześniej wysokość dźwięku jest to częstotliwość drgań fali dźwiękowej wyrażona w hercach. Obecnie używa się systemu równomiernie temperowanego, który wyróżnia 12 dzwięków równo od siebie oddzielonych. Są to dzwięki C, C\#/D$\flat$, D, D\#/E$\flat$, E, F, F\#/G$\flat$, G, G\#/A$\flat$, A, A\#/B oraz H.
Każdej literze przypisana jest częstotliwość zgodnie z Tabelą~\ref{table:dzwieki} Każdej literze przypisana jest częstotliwość zgodnie z Tabelą~\ref{table:dzwieki}
\begin{table}[!htb] \begin{table}[!htb]
@ -649,7 +651,7 @@ The rest of this chapter discusses an example of using the proposed model to gen
\footnotetext{https://amplitudaschool.weebly.com/lekcja-11.html 5 kwietnia 2020 13:24} \footnotetext{https://amplitudaschool.weebly.com/lekcja-11.html 5 kwietnia 2020 13:24}
\subsubsection{Interwał} \subsubsection{Interwał}
O interwałach mówimy, kiedy porównujemy ze sobą dwie nuty. Interwał jest to odległość między nutami, liczona w półnutach. Półnuta jest to najmniejsza odległość między nutami we współczesnej notacji muzycznej. Oktawa jest podzielona na 12 równych części. Pomiędzy dźwiękami C i D jest odległość O interwałach mówimy kiedy porównujemy ze sobą dwie nuty. Interwał jest to odległość między nutami liczona w półnutach. Półnuta jest to najmniejsza odległość między nutami we współczesnej notacji muzycznej. Oktawa jest podzielona na 12 równych części. Pomiędzy dźwiękami C i D jest odległość
dwóch półnut, natomiast między F oraz F\# jest odległość jednej półnuty. Dla ludzkiego ucha w celu rozpoznania melodii istotniejsze są interwały między kolejnymi nutami niż konkretna wysokość dźwięków. dwóch półnut, natomiast między F oraz F\# jest odległość jednej półnuty. Dla ludzkiego ucha w celu rozpoznania melodii istotniejsze są interwały między kolejnymi nutami niż konkretna wysokość dźwięków.
\subsubsection{Oktawa} \subsubsection{Oktawa}
@ -657,11 +659,10 @@ The rest of this chapter discusses an example of using the proposed model to gen
Oktawą nazywamy zestaw ośmiu nut od C do H. Podane w Tabeli~\ref{table:dzwieki} częstotliwości nut odpowiadają dźwiękom w oktawie czwartej. Dlatego w indeksie dolnym nuty widnieje liczba 4. Aby utworzyć dźwięk, np. $A_5$ należy pomnożyć częstotliwość dźwięku $A_4$ razy dwa natomiast, aby utworzyć dźwięk $A_3$, należy tę częstotliwość podzielić przez dwa. Oktawą nazywamy zestaw ośmiu nut od C do H. Podane w Tabeli~\ref{table:dzwieki} częstotliwości nut odpowiadają dźwiękom w oktawie czwartej. Dlatego w indeksie dolnym nuty widnieje liczba 4. Aby utworzyć dźwięk, np. $A_5$ należy pomnożyć częstotliwość dźwięku $A_4$ razy dwa natomiast, aby utworzyć dźwięk $A_3$, należy tę częstotliwość podzielić przez dwa.
\begin{center} \begin{center}
$A_5$ = 2 * 440Hz = 880Hz \\ $A_5$ = 2 * 440Hz = 880Hz, \\
$A_3$ = 1/2 * 440Hz = 220Hz $A_3$ = 1/2 * 440Hz = 220Hz.
\end{center} \end{center}
W ten sposób możemy stworzyć nieskończenie wiele oktaw, jednak w rzeczywistości używa się nut od C0 do C8. W ten sposób możemy stworzyć nieskończenie wiele oktaw, jednak w rzeczywistości używa się nut od C0 do C8.
\subsubsection{Akord} \subsubsection{Akord}
@ -669,7 +670,14 @@ The rest of this chapter discusses an example of using the proposed model to gen
\subsubsection{Skala} \subsubsection{Skala}
\label{section:skala} \label{section:skala}
Skala jest to zestaw nut, które dobrze ze sobą brzmią. Skalę opisujemy dwoma parametrami, tonacją oraz modem. Tonacja jest to pierwsza nuta dla skali. Mod natomiast jest to zestaw interwałów liczony od pierwszej nuty. np. C-Dur, gdzie C jest wartością początkową, a Dur opisuje sekwencję interwałów. Możemy utworzyć inne skale, np G-Dur, używając tych samych interwałów, ale zaczynając od innej nuty. Skala szereg dzwięków ułożonych według stałego schematu interwałów. Wspołcześnie wyróżniamy dwa rodzaje skal, durową (Dur) oraz molową (Mol). Skala durowa odbierana jest przez słuchacza jako "wesoła", a skala molowa jako "smutna". Skalę tworzy się wybierając dowolny dzwięk początkowy, który będzie pierwszym stopniem skali. Następnie dobieramy kolejne dźwięki zgodnie ze schematem skali. Skale durową tworzymy według następującego schematu
\begin{center}
2 2 1 2 2 2 1.
\end{center}
Schemat przedstawia liczbę półnut między kolejnymi dzwiękami skali. Dla przykładu skala C-Dur składa się z dzwięków C, D, E, F, G, A i H.
% http://www.kwadransdlagitary.pl/skala-durowa-teoria/
% https://pl.wikipedia.org/wiki/Skala_(muzyka)
\section{Cyfrowa reprezentacja muzyki symbolicznej} \section{Cyfrowa reprezentacja muzyki symbolicznej}
@ -706,7 +714,7 @@ note_on channel=0 note=60 velocity=0 time=0
note\textunderscore on channel 0 note 48 velocity 100 time 0 \\ note\textunderscore on channel 0 note 48 velocity 100 time 0 \\
\end{center} \end{center}
oznacza, aby na kanele 0 zagrać dźwięk nr 48 z głośnością 100 w momencie 0 utworu. Nie informuje nas on jednak o długości trwania dźwięku. Aby zakończyć dźwięk, należy wysłać wiadomość: oznacza, że na kanele 0 nalezy zagrać dźwięk nr 48 z głośnością 100 w momencie 0 utworu. Nie informuje nas on jednak o długości trwania dźwięku. Aby zakończyć dźwięk należy wysłać wiadomość:
\begin{center} \begin{center}
note\textunderscore off, channel 0, note 48, velocity 100, time 24. \\ note\textunderscore off, channel 0, note 48, velocity 100, time 24. \\
@ -724,13 +732,25 @@ note_on channel=0 note=60 velocity=0 time=0
\subsubsection{Nuty} \subsubsection{Nuty}
Nuty w formacie MIDI opisane są kolejnymi cyframi naturalnymi w przedziale od 0 do 127. Odpowiada to dźwiękom od $C_0$ do $C_8$. Dla przykładu nuta 69 odpowiada $A_4$, a nuta 47 odpowiada $B_2$. Nuty w formacie MIDI opisane są kolejnymi cyframi naturalnymi w przedziale od 0 do 127. Odpowiada to dźwiękom od $C_0$ do $C_8$. Dla przykładu nuta 69 odpowiada $A_4$, a nuta 47 odpowiada $B_2$.
Wyjątkiem są nuty z kanału dziewiątego, gdzie istnieją tylko nuty z zakresu od 35 do 81 i każda nuta odpowiada innemu elementowi perkusyjne np. 35 to stopa (\textit{ang. kick}), a 37 to werbel {\textit{ang. snare}}. Wyjątkiem są nuty z kanału dziewiątego, gdzie istnieją tylko nuty z zakresu od 35 do 81 i każda nuta odpowiada innemu elementowi perkusyjne, np. 35 to stopa (\textit{ang. kick}), a 37 to werbel {\textit{ang. snare}}.
\subsubsection{Głośność} \subsubsection{Głośność}
Za głośność dźwięku odpowiada parametr \textit{velocity}, który jest liczbą z przedziału od 0 do 127. Im większa jest wartość tym głośniej wybrzmi dźwięk. Za głośność dźwięku odpowiada parametr \textit{velocity}, który jest liczbą z przedziału od 0 do 127. Im większa jest wartość tym głośniej wybrzmi dźwięk.
\subsubsection{Program} \subsubsection{Program}
Program w kontekście standardu MIDI oznacza instrument który ma zagrać nuty. W standardzie GM (ang. General MIDI), jest 16 grup instrumentów a w każdej z nich znajduje się po 8 instrumentów. Są to pianina, chromatyczne perkusje, organy, gitary, basy, instrumenty smyczkowe, zestawy instrumentów, instrumenty dmuchane blaszane, instrumenty dmuchane drewniane, flety, syntezatory prowadzące, syntezatory uzupełniające, efekty syntetyczne, instrumenty etniczne, perkusjonalia i efekty dźwiękowe. Program w kontekście standardu MIDI oznacza instrument, który ma zagrać nuty. W standardzie GM (\textit{ang. General MIDI}) jest 16 grup instrumentów, a w każdej z nich znajduje się po 8 instrumentów. Są to pianina, chromatyczne perkusje, organy, gitary, basy, instrumenty smyczkowe, zestawy instrumentów, instrumenty dmuchane blaszane, instrumenty dmuchane drewniane, flety, syntezatory prowadzące, syntezatory uzupełniające, efekty syntetyczne, instrumenty etniczne, perkusjonalia i efekty dźwiękowe. Szczegółowa rozpiska została przedstawiona na rysunku~\ref{fig:generalmidi}
\begin{figure}[!htb]
\centering
\includegraphics[width=\linewidth]{images/general-midi.png}
\caption[]{Lista programów w standardzie General MIDI\footnotemark}
\label{fig:generalmidi}
\end{figure}
% https://www.midi.org/specifications-old/item/gm-level-1-sound-set
\footnotetext{https://alchetron.com/ 16 czerwca 2020 8:23}
% https://alchetron.com/General-MIDI#general-midi-d016a071-b750-46c2-8828-926e6d2aa12-resize-750.png
\subsubsection{Ścieżka} \subsubsection{Ścieżka}
Ścieżka (\textit{ang. track}) grupuje nuty, aby podzielić utwór muzyczny na różne instrumenty lub partie. Protokół MIDI pozwala, aby grać wiele ścieżek dźwiękowych jednocześnie. Wtedy mówimy o muzyce polifonicznej lub multiinstrumentalnej. Ścieżka (\textit{ang. track}) grupuje nuty, aby podzielić utwór muzyczny na różne instrumenty lub partie. Protokół MIDI pozwala, aby grać wiele ścieżek dźwiękowych jednocześnie. Wtedy mówimy o muzyce polifonicznej lub multiinstrumentalnej.
@ -738,20 +758,19 @@ note_on channel=0 note=60 velocity=0 time=0
\chapter{Projekt} \chapter{Projekt}
\label{section:project} \label{section:project}
W tym rozdziale opiszę szczegóły działania modelu, który przygotowałem. Najpierw przedstawię pomysł na model, opiszę szczegóły techniczne dotyczące przygotowania danych uczących dla modelu. Następnie zdefiniuj model i rozwiń opis modelu sequence-to-sequence. W tym rozdziale będę również zamieszczał fragmentu kodu napisanego w języku Python. W tym rozdziale opiszę szczegóły działania modelu, który przygotowałem. Najpierw przedstawię pomysł na model, opiszę szczegóły techniczne dotyczące przygotowania danych uczących dla modelu. Następnie zdefiniuję i opiszę architekturę sequence-to-sequence. Fragmenty kodu zamieszoczne w pracy zostały napisane w języku Python.
\section{Koncepcja} \section{Koncepcja}
Celem tej pracy, było wykonanie modelu, który przy użyciu głębokiego uczenia będzie w stanie generować krótkie klipy multiinstrumentalne. Zainspirował mnie sposób w jaki tworzy się muzykę w zespole. W przeciwieństwie do muzyki tworzonej przez jednego kompozytora, w zespole każda partia tworzona jest przez muzyka grającego na danym instrumencie. Przykładowy sposób tworzenia utworu w zespole, np. rockowym wygląda jak następuje. Jedna osoba tworzy (generuje) pierwszą partię muzyczną, np. partię na gitary. Ta partia została stworzona bez odniesienia do innych członków zespołu. Następnie taka partia zostaje przedstawiona zespołowi. Każdy z członków zespołu musi teraz stworzyć swoje partie w taki sposób, aby pasowały one muzycznie do pierwszej partii. W ten sposób powstają nam zależności między partiami, tworzącymi cały utwór. Celem tej pracy było wykonanie modelu, który przy użyciu głębokiego uczenia będzie w stanie generować krótkie klipy multiinstrumentalne. Zainspirował mnie sposób w jaki tworzy się muzykę w zespole. W przeciwieństwie do muzyki tworzonej przez jednego kompozytora, w zespole każda partia tworzona jest przez muzyka grającego na danym instrumencie. Przykładowy sposób tworzenia utworu w zespole, np. rockowym wygląda jak następuje. Jedna osoba tworzy (generuje) pierwszą partię muzyczną, np. partię na gitary. Ta partia została stworzona bez odniesienia do innych członków zespołu. Następnie taka partia zostaje przedstawiona zespołowi. Każdy z członków zespołu musi teraz stworzyć swoje partie w taki sposób, aby pasowały one muzycznie do pierwszej partii. W ten sposób powstają nam zależności między partiami tworzącymi cały utwór.
Na podstawie tej idei postanowiłem opracować model składający się z wielu sieci neuronowych, każda z nich odpowiadać będzie jednej partii w utworze, muzykowi w zespole. Jedna z tych sieci będzie generatorem. Ta sieć powinna być skonstruowana w taki sposób, aby zainicjować partię muzyczną. Pozostałe będą dopasowywać swoje partie w taki sposób, aby pasowały pod partię wygenerowaną. Te sieci nazywać będę modelami akompaniujący. Dzięki temu jesteśmy wstanie stworzyć model wielu sieci, w którym następna sieć będzie produkować swoje partie na podstawie tego, co wygenerowała poprzednia. Na podstawie tej idei postanowiłem opracować model składający się z wielu sieci neuronowych, każda z nich odpowiadać będzie jednej partii w utworze, muzykowi w zespole. Jedna z tych sieci będzie generatorem. Ta sieć powinna być skonstruowana w taki sposób, aby zainicjować partię muzyczną. Pozostałe będą dopasowywać swoje partie pod partię stworząną przez generator. Te sieci nazywać będę modelami akompaniujący. Dzięki temu jesteśmy wstanie stworzyć model wielu sieci, w którym następna sieć będzie produkować swoje partie na podstawie tego, co wygenerowała poprzednia.
Kluczowe było zauważenie podobieństwa między językiem naturalnym oraz muzyką. Zarówno zdanie jak i partia muzyczna składa się z sekwencji elementów rozmieszczonych w czasie. Elementy te są zależne od długoterminowego kontekstu oraz od tego jaki element był ustawiony wcześniej. Dla języka naturalnego są to słowa, dla muzyki są to nuty i akordy. Dodatkowo pomyślałem, że różne instrumenty można porównać do różnych języków świata. Wtedy, aby stworzyć melodię, np. basu tak, aby pasowała pod partię gitary, należy ,,przetłumaczy'' język gitary na język basu. Do tłumaczeń języka naturalnego wykorzystuje się modele sequence-to-sequence, dlatego postanowiłem w modelu generowania muzyki wykorzystać właśnie tą architekturę. Dodatkowo modele sequence-to-sequence mają tę cechę, że liczba elementów sekwencji wejściowej może być inna niż liczba elementów sekwencji wyjściowej. Idealnie sprawdzi się w przypadku muzyki, ponieważ o długości trwania ścieżki muzycznej nie świadczy liczba nut tylko suma ich wartości. Kluczowe było zauważenie podobieństwa między językiem naturalnym oraz muzyką. Zarówno zdanie jak i partia muzyczna składa się z sekwencji elementów rozmieszczonych w czasie. Elementy te są zależne od długoterminowego kontekstu oraz od tego jaki element był ustawiony wcześniej. Dla języka naturalnego są to słowa, dla muzyki są to nuty i akordy. Dodatkowo pomyślałem, że różne instrumenty można porównać do różnych języków świata. Wtedy, aby stworzyć melodię, np. basu tak, żeby pasowała pod partię gitary należy przetłumaczyć ,,język'' gitary na ,,język'' basu. Do tłumaczeń języka naturalnego wykorzystuje się modele sequence-to-sequence, dlatego postanowiłem w modelu generowania muzyki wykorzystać właśnie tą architekturę. Dodatkowo modele sequence-to-sequence mają tę cechę, że liczba elementów sekwencji wejściowej może być inna niż liczba elementów sekwencji wyjściowej. Idealnie sprawdzi się w przypadku muzyki, ponieważ o długości trwania ścieżki muzycznej nie świadczy liczba nut tylko suma ich wartości.
\section{Wstępne przygotowanie danych do treningu} \section{Wstępne przygotowanie danych do treningu}
\label{section:midi} \label{section:midi}
\subsection{Muzyczne słowo}
\subsection{Muzyczne ,,słowo''}
\label{section:midi_words} \label{section:midi_words}
Na potrzeby dostosowania danych muzycznych do koncepcji słów w zdaniu zakodowałem pojedyncze słowo muzyczne jako Na potrzeby dostosowania danych muzycznych do koncepcji słów w zdaniu zakodowałem pojedyncze słowo muzyczne jako
@ -762,10 +781,10 @@ note_on channel=0 note=60 velocity=0 time=0
W ten sposób byłem w stanie zakodować pojedyńcze nuty i akordy. W ten sposób byłem w stanie zakodować pojedyńcze nuty i akordy.
Akord C-dur składający się z dźwięków C, E i G o długości ósemki, zapisaliśmy w następujący sposób. Akord C-dur składający się z dźwięków C, E i G o długości ósemki zapisaliśmy w następujący sposób
\begin{center} \begin{center}
((60, 64, 67), 0.5) ((60, 64, 67), 0.5).
\end{center} \end{center}
W ten sposób jesteśmy w stanie kodować melodię w sekwencji słów muzycznych. Tak skonstruowane dane mają niestety swoje negatywne aspekty. Nie da się w ten sposób zapisać partii, w której zostaje grana nowa nuta, gdy poprzednia jeszcze powinna brzmieć. Nasz zapis zakłada, że melodia jest grana element po elemencie i nowy element wymusza zakończenie poprzedniego. Nie przechowujemy również informacji o dynamice melodii (głośności). Rozszerzenie tego zapisu o informacje o głośności nie jest trudne i nie będzie wymagać przebudowy modelu, natomiast wraz ze wzrostem liczby możliwych ,,słów muzycznych'' w słowniku i zwiększa złożoność obliczeniową. Zdecydowałem się na niewykorzystanie tych danych w generowaniu muzyki. W ten sposób jesteśmy w stanie kodować melodię w sekwencji słów muzycznych. Tak skonstruowane dane mają niestety swoje negatywne aspekty. Nie da się w ten sposób zapisać partii, w której zostaje grana nowa nuta, gdy poprzednia jeszcze powinna brzmieć. Nasz zapis zakłada, że melodia jest grana element po elemencie i nowy element wymusza zakończenie poprzedniego. Nie przechowujemy również informacji o dynamice melodii (głośności). Rozszerzenie tego zapisu o informacje o głośności nie jest trudne i nie będzie wymagać przebudowy modelu, natomiast wraz ze wzrostem liczby możliwych ,,słów muzycznych'' w słowniku i zwiększa złożoność obliczeniową. Zdecydowałem się na niewykorzystanie tych danych w generowaniu muzyki.
@ -855,7 +874,7 @@ def parse_pretty_midi_instrument(instrument, resolution,
\end{python} \end{python}
Powyższa funkcja w zamienia wartości absolutne czasu, na wartości względne o ustalonej rozdzielczości przez plik MIDI. Dodatkowo zmniejsza szczegółowość i zaokrągla czas zagrania nuty po szesnastki. Gdy w tym samym momencie, czyli jeśli kilka nut posiada tą samą wartość start, zostają dodane do jednego słowa muzycznego, aby utworzyć akord. Pauzy są kodowane jako $-1$. Dodatkowo jeśli pauza trwa dłużej niż takt wtedy zostaje podzielona na mniejsze części o długości \pyth{max_rest_len}. Funkcja zwraca obiekt \pyth{SingleTrack}, który jest obiektem stworzonym, aby poza nutami, przechowywać inne istotne informacje na temat ścieżki, którą będą istotne w następnych częściach przetwarzania danych. Ostatecznie sekwencje słów muzycznych przechowane są w \pyth{notes}. Powyższa funkcja zamienia wartości absolutne czasu na wartości względne o ustalonej rozdzielczości przez plik MIDI. Dodatkowo zmniejsza szczegółowość i zaokrągla czas zagrania nuty po szesnastki. Gdy w tym samym momencie, czyli jeśli kilka nut posiada tą samą wartość start, zostają dodane do jednego słowa muzycznego, aby utworzyć akord. Pauzy są kodowane jako $-1$. Dodatkowo jeśli pauza trwa dłużej niż takt wtedy zostaje podzielona na mniejsze części o długości \pyth{max_rest_len}. Funkcja zwraca obiekt \pyth{SingleTrack}, który jest obiektem stworzonym, aby poza nutami przechowywać inne istotne informacje na temat ścieżki. Będą one istotne w następnych częściach przetwarzania danych. Ostatecznie sekwencje słów muzycznych przechowane są w \pyth{notes}.
\begin{python} \begin{python}
>>> resolution = midi.resolution >>> resolution = midi.resolution
@ -883,13 +902,13 @@ resolution, time_to_tick, key_offset=0)
\subsection{Inne aspekty przygotowania danych} \subsection{Inne aspekty przygotowania danych}
Po odczytaniu danych i konwersji je do pożądanego formatu dane należy oczyścić. W mojej pracy zastosowałem kilka operacji, w celu zwiększenia muzycznego sensu danych. Po odczytaniu danych i konwersji ich do pożądanego formatu dane należy oczyścić. W mojej pracy zastosowałem kilka operacji, w celu zwiększenia muzycznego sensu danych.
\subsubsection{Unormowanie skali} \subsubsection{Unormowanie skali}
W muzyce istnieje pojęcie skali. Skala jest to zestaw nut, które dobrze ze sobą współgrają. Zostało to szerzej opisane w podrozdziale~\ref{section:skala}. W uczeniu maszynowym powoduje to realny problem, ponieważ piosenki wykorzystują różne skale i sieć neuronowa będzie preferować wybranie skali częściej używanej. Dodatkowo zmiana skali nie zmienia znacznie kontentu muzycznego utworu, tj. nawet po zmianie skali melodii człowiek dalej jest w stanie ją rozpoznać. Zmiana wysokości wszystkich nut bez zmiany ich względnych interwałów nazywana jest transpozycją. Aby rozwiązać ten problem zaleca się rozszerzenie danych do wszystkich możliwych skal. W mojej pracy wykorzystałam jednak inne rozwiązanie. Zamiast rozszerzać zbiór danych sprowadziłem wszystkie ścieżki muzyczne do jednej skali C. Dzięki temu model przyłoży większą uwagę na rozumienie wzajemnych relacji, zamiast uczyć się pojęcia tonacji skali \cite{survay}. W muzyce istnieje pojęcie skali. Skala jest to zestaw nut, które dobrze ze sobą współgrają. Zostało to szerzej opisane w podrozdziale~\ref{section:skala}. W uczeniu maszynowym powoduje to realny problem, ponieważ piosenki wykorzystują różne skale i sieć neuronowa będzie preferować wybranie skali częściej używanej. Dodatkowo zmiana skali nie zmienia znacznie kontentu muzycznego utworu, tj. nawet po zmianie skali melodii człowiek dalej jest w stanie ją rozpoznać. Zmiana wysokości wszystkich nut bez zmiany ich względnych interwałów nazywana jest transpozycją. Aby rozwiązać ten problem zaleca się rozszerzenie danych do wszystkich możliwych skal. W mojej pracy wykorzystałam jednak inne rozwiązanie. Zamiast rozszerzać zbiór danych sprowadziłem wszystkie ścieżki muzyczne do jednej skali C. Dzięki temu model przyłoży większą uwagę na rozumienie wzajemnych relacji, zamiast uczyć się pojęcia tonacji skali \cite{survay}.
\subsubsection{Podział na takty} \subsubsection{Podział na takty}
Długie listy muzycznych słów zostały podzielone na takty (\textit{ang. bars}), o odpowiedniej długości, domyślnie o długości 4, co odpowiada czterem ćwierćnutom. Dzięki temu utwór muzyczny zostanie podzielony na mniejsze sekwencje. Sekwencje te będą posiadały różną liczbę elementów, ale będą tak samo długie, w kontekście muzycznym. Głównym celem takie zabiegu, jest zapewnienie muzycznego sensu sekwenjom. Takt jest naturalnym dla muzyki podziałem dłuższego partii na mniejsze. Długie listy muzycznych słów zostały podzielone na takty (\textit{ang. bars}) o odpowiedniej długości, domyślnie o długości 4, co odpowiada czterem ćwierćnutom. Dzięki temu utwór muzyczny zostanie podzielony na mniejsze sekwencje. Sekwencje te będą posiadały różną liczbę elementów, ale będą tak samo długie w kontekście muzycznym. Głównym celem takiego zabiegu, jest zapewnienie muzycznego sensu sekwenjom. Takt jest naturalnym podziałem dłuższych partii na krótsze.
\subsection{Podział danych na dane wejściowe i wyjściowe} \subsection{Podział danych na dane wejściowe i wyjściowe}
@ -904,13 +923,13 @@ resolution, time_to_tick, key_offset=0)
gdzie $n$ jest liczbą taktów w partii muzycznej. Pary $(x_t, y_t)$ tworzymy według poniżej reguły gdzie $n$ jest liczbą taktów w partii muzycznej. Pary $(x_t, y_t)$ tworzymy według poniżej reguły
\[ \[
\begin{array}{c} \begin{array}{c}
x_t = g_t \\ x_t = g_t, \\
y_t = g_{t+1}, y_t = g_{t+1},
\end{array} \end{array}
\] \]
dla $t \in (1, n-1)$. dla $t \in (1, n-1)$.
Dzięki takiemu zdefiniowaniu danych uczących generator będzie uczył się jak powinien wyglądać następny takt, na podstawie poprzedniego. W ten sposób będziemy w stanie wykorzystać model do generowania muzyki bez danych wejściowych. Wątek zostanie rozwinięty w dalszej części pracy. Dzięki takiemu zdefiniowaniu danych uczących generator będzie uczył się jak powinien wyglądać następny takt na podstawie poprzedniego. W ten sposób będziemy w stanie wykorzystać model do generowania muzyki bez danych wejściowych. Wątek zostanie rozwinięty w dalszej części pracy.
Implementacja w Pythonie: Implementacja w Pythonie:
\begin{python} \begin{python}
@ -949,7 +968,7 @@ def get_data_seq2seq_melody(self, instrument_class,
\subsubsection{Przygotowanie danych dla akompaniamentu} \subsubsection{Przygotowanie danych dla akompaniamentu}
Model akompaniujący natomiast, będzie na podstawie partii instrumentu tworzyć partię na nowy instrument. Model akompaniujący będzie na podstawie partii instrumentu tworzyć partię na nowy instrument.
Niech $G$, $B$ będą sekcjami muzycznymi różnych instrumentów tej samej długości oraz niech Niech $G$, $B$ będą sekcjami muzycznymi różnych instrumentów tej samej długości oraz niech
\[ \[
\begin{array}{c} \begin{array}{c}
@ -1005,10 +1024,10 @@ def get_data_seq2seq_arrangment(self, x_instrument,
W przygotowaniu danych dla modelu ważne jest, aby dostarczone dane były jak najlepszej jakości. W tym celu usunąłem powtarzające się pary $(x, y)$ oraz usunąłem takty, które nie zawierały muzycznego kontentu. W przygotowaniu danych dla modelu ważne jest, aby dostarczone dane były jak najlepszej jakości. W tym celu usunąłem powtarzające się pary $(x, y)$ oraz usunąłem takty, które nie zawierały muzycznego kontentu.
\subsubsection{Wybór programu dla instrumentu} \subsubsection{Wybór programu dla instrumentu}
Podczas etapu ekstrakcji danych z plików MIDI poza informacjami o muzyce, zapamiętuję również informacje o programie partii muzycznej. Każda ścieżka MIDI przechowuje informacje o instrumencie (brzmieniu) danej partii. Istnieje 128 różnych programów, dla zmniejszenia szczególności na potrzeby modelu wyróżniam 16 instrumentów zgodnie z grupą do jakiej należą w podziale General MIDI. Dla każdej z grup, sprawdzam jaki program został najczęściej wykorzystywany i zapisuję go na przyszłość, aby móc wygenerowanej muzyce przy kompilacji do MIDI zdefiniować brzmienie instrumentu zgodnie z najczęściej wykorzystywanym w zbiorze MIDI, który został wykorzystany do stworzenia zbioru uczącego dla modelu. Podczas etapu ekstrakcji danych z plików MIDI poza informacjami o muzyce zapamiętuję również informacje o programie partii muzycznej. Każda ścieżka MIDI przechowuje informacje o instrumencie (brzmieniu) danej partii. Istnieje 128 różnych programów, dla zmniejszenia szczególności na potrzeby modelu wyróżniam 16 instrumentów zgodnie z grupą do jakiej należą w podziale General MIDI. Dla każdej z grup sprawdzam jaki program został najczęściej wykorzystywany i zapisuję go na przyszłość. Dzięki temu przy kompilacji wygenerowanej muzyki do MIDI będzie można zdefiniować brzmienie instrumentu zgodnie z najczęściej wykorzystywanym w zbiorze uczącym.
\subsubsection{Melodia} \subsubsection{Melodia}
Dodatkowym elementem procesu ekstrakcji danych jest znalezienie ścieżek melodii przewodnich w plikach MIDI. Ścieżki tego typu zamiast być oznaczone nazwą grupy instrumentów, do której należą oznaczone są nazwą \pyth{Melody}. Melodia jest kategorią ścieżek z podziału ze względu na rolę partii w utworze, zamiast na instrument. Istnieją też inne role instrumentów, jednak często rola jest w pewnym sensie definiowana przez instrument. Nie jest to zasada, bardziej prawidłowość w muzyce. Uznałem że wydobycie tej informacji na temat ścieżki nada więcej muzycznego sensu danym. Dodatkowym elementem procesu ekstrakcji danych jest znalezienie ścieżek melodii przewodnich w plikach MIDI. Ścieżki tego typu zamiast być oznaczone nazwą grupy instrumentów, do której należą oznaczone są nazwą \pyth{Melody}. Melodia jest kategorią ścieżek z podziału ze względu na rolę partii w utworze, zamiast na instrument. Istnieją też inne role instrumentów, jednak często rola jest w pewnym sensie definiowana przez instrument. Nie jest to zasada, bardziej prawidłowość w muzyce. Uznałem, że wydobycie tej informacji na temat ścieżki nada więcej muzycznego sensu danym.
Aby sprawdzić czy dana ścieżka jest melodią zastosowałem poniższą funkcję: Aby sprawdzić czy dana ścieżka jest melodią zastosowałem poniższą funkcję:
\begin{python} \begin{python}
@ -1050,20 +1069,20 @@ else:
return False return False
\end{python} \end{python}
Funkcja sprawdza liczbę pojedynczych nut i akordów w ścieżce oraz zagęszczenie nut w takcie. Jeśli jest więcej niż 90\% pojedynczych nut w ścieżce oraz jest średnio więcej nut w takcie niż dwie wtedy uznaję, że partia instrumentalna utworu jest melodią. Funkcja sprawdza liczbę pojedynczych nut i akordów w ścieżce oraz zagęszczenie nut w takcie. Jeśli jest więcej niż 90\% pojedynczych nut w ścieżce i jest średnio więcej nut w takcie niż dwie, wtedy uznaję że partia instrumentalna utworu jest melodią.
\section{Definicja modelu} \section{Definicja modelu}
\label{section:model} \label{section:model}
Wszystkie modele sieci neuronowych zastosowane w tej pracy, zostały napisane z wykorzystaniem środowiska Keras. Keras jest to środowisko wyższego poziomu, służące do tworzenia modelu głębokiego uczenia. Wszystkie modele sieci neuronowych zastosowane w tej pracy, zostały napisane z wykorzystaniem środowiska Keras. Keras jest to środowisko wyższego poziomu, służące do tworzenia modelu głębokiego uczenia.
Model sequence-to-sequence, jest to model składający się z dwóch mniejszych sieci neuronowych, enkodera i dekodera. Dodatkowo inaczej definiuje się model, aby go uczyć a inaczej, aby dokonać predykcji. Model sequence-to-sequence jest to model składający się z dwóch mniejszych sieci neuronowych, enkodera i dekodera. Dodatkowo inaczej definiuje się model aby go uczyć, a inaczej aby dokonać predykcji.
\subsection{Model w trybie uczenia} \subsection{Model w trybie uczenia}
\subsubsection{Definiowanie warstw enkodera} \subsubsection{Definiowanie warstw enkodera}
Zadaniem enkodera jest wydobycie z przetwarzanej sekwencji kontekstu, skompresowanej informacji o danych. W tym celu zastosowana została jedna warstwa wejściowa o rozmiarze słownika wejściowego oraz warstwa LSTM. Definiowane warstwy są atrybutami całej klasy modelu, dlatego w prezentowanym kodzie występuje przedrostek \pyth{self.}. Zadaniem enkodera jest wydobycie z przetwarzanej sekwencji kontekstu skompresowanej informacji o danych. W tym celu zastosowana została jedna warstwa wejściowa o rozmiarze słownika wejściowego oraz warstwa LSTM. Definiowane warstwy są atrybutami całej klasy modelu, dlatego w prezentowanym kodzie występuje przedrostek \pyth{self.}.
\begin{python} \begin{python}
self.encoder_inputs = self.encoder_inputs =
@ -1078,13 +1097,13 @@ self.encoder_outputs, self.state_h, self.state_c =
self.encoder_states = [self.state_h, self.state_c] self.encoder_states = [self.state_h, self.state_c]
\end{python} \end{python}
Ostatecznie jako dane wyjściowe otrzymujemy wektor danych ukrytych \pyth{encoder_outputs} o wymiarze równym ustalonej zmiennej \pyth{latent_dim}. Dodatkowo używając parametru \pyth{return_state=True}, warstwa LSTM zwraca wektory stanu komórek $h$ oraz $c$. Te wektory są pamięcią warstwy LSTM i posłużą jako stan wejściowy dla modelu dekodera. Ostatecznie jako dane wyjściowe otrzymujemy wektor danych ukrytych \pyth{encoder_outputs} o wymiarze równym ustalonej zmiennej \pyth{latent_dim}. Dodatkowo używając parametru \pyth{return_state=True} warstwa LSTM zwraca wektory stanu komórek $h$ oraz $c$. Te wektory są pamięcią warstwy LSTM i posłużą jako stan wejściowy dla modelu dekodera.
Oba wektory zostały zapisane do jednej zmiennej \pyth{self.encoder_states}. Oba wektory zostały zapisane do jednej zmiennej \pyth{self.encoder_states}.
\subsubsection{Definiowanie warstw dekodera} \subsubsection{Definiowanie warstw dekodera}
W części dekodera sieci sequence-to-sequence, definiujemy warstwę wejściową o rozmiarze słownika wynikowego i jedną warstwę LSTM o stanie komórek $h$ i $c$ w enkodera. Na końcu została zdefiniowana prosta warstwa typu \pyth{Dense} z funkcją aktywacji \pyth{softmax} w celu rozszerzenia wymiaru do wielkości słownika wyjściowego. W części dekodera sieci sequence-to-sequence definiujemy warstwę wejściową o rozmiarze słownika wynikowego i jedną warstwę LSTM o stanie komórek $h$ i $c$ enkodera. Na końcu została zdefiniowana prosta warstwa typu \pyth{Dense} z funkcją aktywacji \pyth{softmax}, w celu rozszerzenia wymiaru do wielkości słownika wyjściowego.
\begin{python} \begin{python}
self.decoder_inputs = self.decoder_inputs =
@ -1110,7 +1129,7 @@ Jako wynik propagacji modelu otrzymujemy wektor o rozmiarze słownika wyjściowe
\subsubsection{Definicja modelu w trybie uczenia} \subsubsection{Definicja modelu w trybie uczenia}
Ostatnim krokiem, aby otrzymać model gotowy do procesu uczenia należy połączyć ze sobą enkoder i dekoder, tworząc pełny model. Po jego skompilowaniu model można przedstawić jako graf tak jak pokazano to na rysunku~\ref{fig:training-model} Aby otrzymać model gotowy do procesu uczenia należy połączyć ze sobą enkoder i dekoder tworząc pełny model. Po jego skompilowaniu model można przedstawić jako graf tak jak pokazano to na rysunku~\ref{fig:training-model}
\begin{figure}[!htb] \begin{figure}[!htb]
\centering \centering
@ -1136,12 +1155,12 @@ Możemy zauważyć, że w procesie uczenia musimy zaprezentować modelowi dwa we
\item \pyth{decoder_target_data}, zawierające sekwencje elementów wyjściowych, które będą celem. \item \pyth{decoder_target_data}, zawierające sekwencje elementów wyjściowych, które będą celem.
\end{itemize} \end{itemize}
Jest to ciekawe, że musimy dostarczyć do modelu dane, które tak naprawdę chcemy otrzymać. Jednak te dane są przesunięte o jeden element w sekwencji do przodu i pierwszy element tej sekwencji nie zawiera treści. Dekoder uczy się jak na podstawie aktualnego stanu enkodera oraz aktualnego elementu sekwencji wyjściowej jaki powinien być następny element w sekwencji docelowej. Warto też zauważyć, że z definicji modelu nie wynika, aby model uczył się przetwarzania całych sekwencji, tylko każdego elementu sekwencji z osobna. Jest to ciekawe, że musimy dostarczyć do modelu dane, które tak naprawdę chcemy otrzymać. Jednak te dane są przesunięte o jeden element w sekwencji do przodu i pierwszy element tej sekwencji nie zawiera treści. Dekoder uczy się jak na podstawie aktualnego stanu enkodera oraz aktualnego elementu sekwencji wyjściowej przewidzieć następny element w sekwencji docelowej. Warto też zauważyć, że z definicji modelu nie wynika, aby model uczył się przetwarzania całych sekwencji tylko każdego elementu sekwencji z osobna.
\subsection{Model w trybie wnioskowania} \subsection{Model w trybie wnioskowania}
\label{section:inference-model} \label{section:inference-model}
To co czyni model seq2seq zdolnym do przetwarzania całych sekwencji jest sposób zdefiniowania metody wnioskowania (\textit{ang. inference}). Na tym etapie model w sposób rekurencyjny będzie przewidywał następny element sekwencji, na podstawie tego co przewidział wcześniej oraz aktualizowanych wektorów stanu warstwy LSTM. Musimy w tym celu zdefiniować dekoder tak, aby mógł przyjąć swoje wyjście jako nowe wejście. Dlatego definicja modelu wtedy wygląda następująco, a graf przedstawiający dekoder w trybie uczenia został przedstawiony na rysunku~\ref{fig:inference-decoder}. To co czyni model seq2seq zdolnym do przetwarzania całych sekwencji jest sposób zdefiniowania metody wnioskowania (\textit{ang. inference}). Na tym etapie model w sposób rekurencyjny będzie przewidywał następny element sekwencji, na podstawie tego co przewidział wcześniej oraz aktualizowanych wektorów stanu warstwy LSTM. Musimy w tym celu zdefiniować dekoder tak, aby mógł przyjąć swoje wyjście jako nowe wejście. Dlatego definicja modelu wygląda następująco, a graf przedstawiający dekoder w trybie uczenia został przedstawiony na rysunku~\ref{fig:inference-decoder}.
\begin{python} \begin{python}
@ -1175,7 +1194,7 @@ self.decoder_model = Model(
\footnotetext{machinelearningmastery.com 16 czerwca 2020 06:24} \footnotetext{machinelearningmastery.com 16 czerwca 2020 06:24}
Dzięki takiej definicji, jesteśmy w stanie w pętli przewidywać następne elementy do momentu osiągnięcia warunku stopu. Implementacja tego procesu wygląda tak: Dzięki takiej definicji jesteśmy w stanie w pętli przewidywać następne elementy do momentu osiągnięcia warunku stopu. Implementacja tego procesu wygląda tak:
\begin{python} \begin{python}
def predict(self, input_seq=None, mode=None): def predict(self, input_seq=None, mode=None):
@ -1228,7 +1247,7 @@ def predict(self, input_seq=None, mode=None):
Enkoder w tym trybie ma za zadanie tylko dostarczyć do dekodera wektory kontekstu dla zainicjowania procesu. Dekoder na podstawie wektorów pamięci $h$ i $c$ przewidzi pierwszy element sekwencji i tym samym zainicjuje proces wnioskowania. Enkoder w tym trybie ma za zadanie tylko dostarczyć do dekodera wektory kontekstu dla zainicjowania procesu. Dekoder na podstawie wektorów pamięci $h$ i $c$ przewidzi pierwszy element sekwencji i tym samym zainicjuje proces wnioskowania.
W tym miejscu mamy kontrolę twórczą nad dekoderem. Aby zainicjować reakcję wystarczą wektory pamięci, możemy wtedy podać je w dowolny sposób i zobaczyć co wygeneruje dekoder. W mojej pracy próbowałem dwóch sposób na zainicjowanie procesu predykcji z wektorów losowych. Pierwszy polega na wygenerowaniu losowej sekwencji dla enkodera i nazywam tę metodę \pyth{from_seq}. Druga metoda polega na bezpośrednim definiowaniu stanu $h$ i $c$ \pyth{states_value} w sposób losowy tak, aby wartości były z przedziału [-1, 1]. W tym miejscu mamy kontrolę twórczą nad dekoderem. Aby zainicjować reakcję wystarczą wektory pamięci, wtedy możemy podać dowolne wartości i zobaczyć co wygeneruje dekoder. W mojej pracy próbowałem dwóch sposób na zainicjowanie procesu predykcji z wektorów losowych. Pierwszy polega na wygenerowaniu losowej sekwencji dla enkodera i nazywam tę metodę \pyth{from_seq}. Druga metoda polega na bezpośrednim definiowaniu stanu $h$ i $c$ \pyth{states_value} w sposób losowy tak, aby wartości były z przedziału [-1, 1].
\section{Transformacja danych dla modelu} \section{Transformacja danych dla modelu}
@ -1236,7 +1255,7 @@ Na podstawie definicji modelu wiemy, że należy przygotować trzy zestawy danyc
\subsection{Enkodowanie one-hot} \subsection{Enkodowanie one-hot}
Każdy element sekwencji jest osobną kategorią, dlatego dane należy traktować tak jak dane kategoryczne. Wykorzystamy w tym celu enkodowanie one-hot (\textit{ang. one-hot encoding}) Enkodowanie One-Hot jest wykorzystywane w uczeniu maszynowym, aby nadać liczbową wartość danych kategorycznych. Polega ona stworzeniu słownika, w którym każde słowo otrzyma swój unikatowy identyfikator, następnie zostanie utworzony wektor o wymiarze słów w słowniku, gdzie na pozycji odpowiadającej indeksowi słowa będzie wartość 1 a na pozostałych będzie wartość zero \cite{onehot}. Każdy element sekwencji jest osobną kategorią, dlatego dane należy traktować tak jak dane kategoryczne. Wykorzystamy w tym celu enkodowanie one-hot (\textit{ang. one-hot encoding}). Enkodowanie one-hot jest wykorzystywane w uczeniu maszynowym, aby nadać liczbową wartość danych kategorycznych. Polega ona stworzeniu słownika, w którym każde słowo otrzyma swój unikatowy identyfikator, następnie zostanie utworzony wektor o wymiarze słów w słowniku, gdzie na pozycji odpowiadającej indeksowi słowa będzie wartość 1 a na pozostałych będzie wartość 0 \cite{onehot}.
\subsubsection{Przykład enkodowania one-hot} \subsubsection{Przykład enkodowania one-hot}
@ -1262,7 +1281,7 @@ Kodując słowo MATEMATYKA, otrzymalibyśmy macierz
0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\
\end{bmatrix} \end{bmatrix}
\] .\]
\subsection{Słownik} \subsection{Słownik}
@ -1273,7 +1292,7 @@ x_vocab = set([note for seq in x_train for note in seq])
y_vocab = set([note for seq in y_train for note in seq]) y_vocab = set([note for seq in y_train for note in seq])
\end{python} \end{python}
Do słownika dodajemy dwa dodatkowe elementy, które opiszę w następnym rozdziale. Do słownika dodajemy dwa dodatkowe elementy, które opiszę w rozdziale~\ref{section:specialtoken}.
\begin{python} \begin{python}
self.x_vocab = sorted(list(x_vocab)) self.x_vocab = sorted(list(x_vocab))
@ -1281,7 +1300,7 @@ self.y_vocab = ['<GO>','<EOS>']
self.y_vocab.extend(sorted(list(y_vocab))) self.y_vocab.extend(sorted(list(y_vocab)))
\end{python} \end{python}
Następnie tworzymy obiekty typu \pyth{dictionary}, aby zmapować elementy sekwencji na liczby. W tym momencie tworzymy również słowniki odwrotne, aby móc później otrzymane wyniki zamienić na z powrotem na muzyczne słowa. Następnie tworzymy obiekty typu \pyth{dictionary}, aby zmapować elementy sekwencji na liczby oraz słowniki odwrotne, aby móc później otrzymane wyniki zamienić z powrotem na muzyczne słowa.
\begin{python} \begin{python}
self.x_transform_dict = dict( self.x_transform_dict = dict(
@ -1295,8 +1314,9 @@ self.y_reverse_dict = dict(
\end{python} \end{python}
\subsection{Elementy specjalne} \subsection{Elementy specjalne}
\label{section:specialtoken}
Dodaje się dwóch elementów specjalnych. Te elementy mają za zadanie oznaczenie początku i końca sekwencji. Token początku sekwencji zazwyczaj oznaczany jest jako \pyth{<SOS>} (\textit{ang. start of sequence}). Można spotkać również inne oznaczenia,np. \pyth{<GO>} lub \pyth{<s>}. Ten element ma na celu wypełnienie przestrzeni pierwszego pustego miejsca w danych wejściowych dla dekodera. Token końca sekwencji oznaczany jako \pyth{<EOS>} (\textit{ang. start of sequence}) lub \pyth{</s>}. Ten element jest wykorzystywany, aby wywołać warunek stopu w procesie predykcji opisanym w rozdziale~\ref{section:inference-model}. Dodaje się dwa elementy specjalne. Te elementy mają za zadanie oznaczenie początku i końca sekwencji. Token początku sekwencji zazwyczaj oznaczany jest jako \pyth{<SOS>} (\textit{ang. start of sequence}). Można spotkać również inne oznaczenia, np. \pyth{<GO>} lub \pyth{<s>}. Ten element ma na celu wypełnienie przestrzeni pierwszego pustego miejsca w danych wejściowych dla dekodera. Token końca sekwencji oznaczany jako \pyth{<EOS>} (\textit{ang. start of sequence}) lub \pyth{</s>}. Ten element jest wykorzystywany, aby wywołać warunek stopu w procesie predykcji opisanym w rozdziale~\ref{section:inference-model}.
\begin{python} \begin{python}
_y_train = [] _y_train = []
@ -1330,57 +1350,57 @@ decoder_input_data = np.zeros(
self.y_vocab_size), self.y_vocab_size),
dtype='float32') dtype='float32')
decoder_target_data = np.zeros( decoder_target = np.zeros(
(len(x_train), (len(x_train),
self.y_max_seq_length, self.y_max_seq_length,
self.y_vocab_size), self.y_vocab_size),
dtype='float32') dtype='float32')
for i, (x_train, y_train) in enumerate(zip(x_train, y_train)): for i, (x_train, y_train) in enumerate(zip(x_train, y_train)):
for t, char in enumerate(x_train): for t, c in enumerate(x_train):
encoder_input_data[i, t, self.x_transform_dict[char]] = 1. encoder_input_data[i, t, self.x_transform_dict[c]] = 1.
for t, char in enumerate(y_train): for t, c in enumerate(y_train):
decoder_input_data[i, t, self.y_transform_dict[char]] = 1. decoder_input_data[i, t, self.y_transform_dict[c]] = 1.
if t > 0: if t > 0:
decoder_target_data[i, t - 1, self.y_transform_dict[char]] = 1. decoder_target[i, t-1, self.y_transform_dict[c]] = 1.
\end{python} \end{python}
W ten sposób otrzymujemy trzy zestawy danych potrzebne do przeprowadzenia procesu uczenia modelu. W ten sposób otrzymujemy trzy zestawy danych potrzebne do przeprowadzenia procesu uczenia modelu.
Warto zwrócić uwagę, że przed opisaną transformacją sekwencje były różnej długości a po niej, rozmiar sekwencji został rozszerzony do rozmiaru sekwencji posiadającej najwięcej elementów. Taki zabieg był niezbędny, ponieważ rozmiar sieci neuronowej jest stały dla wszystkich prób ze zbioru uczącego. Nie wpływa to jednak na same sekwencję, ponieważ podczas predykcję kończymy w momencie wygenerowania tokenu \pyth{<EOS>}. Warto zwrócić uwagę, że przed opisaną transformacją sekwencje były różnej długości, a po niej rozmiar sekwencji został rozszerzony do rozmiaru najdłuższej sekwencji. Taki zabieg był niezbędny, ponieważ rozmiar sieci neuronowej jest stały dla wszystkich prób ze zbioru uczącego. Nie wpływa to jednak na same sekwencję, ponieważ podczas predykcję kończymy w momencie wygenerowania tokenu \pyth{<EOS>}.
\section{Ekperyment} \section{Ekperyment}
W tej części pokażę jak wykorzystać oprogramowanie, które stworzyłem, aby wygenerować muzykę na przykładzie. Omówię cały proces, następnie zademonstruję wyniki. W tej części pokażę jak wykorzystać oprogramowanie, które stworzyłem, aby wygenerować muzykę na konkretnym przykładzie. Omówię cały proces oraz przedstawię wyniki pracy.
\subsection{Oprogramowanie} \subsection{Oprogramowanie}
Stworzone przeze mnie oprogramowanie, napisane w języku Python, składa się z 2 bibliotek oraz 3 skryptów. Stworzone przeze mnie oprogramowanie składa się z 2 bibliotek oraz 3 skryptów:
\begin{itemize} \begin{itemize}
\item \pyth{midi_procesing.py} - zawiera funkcję potrzebne do pracy w plikami midi. \item \pyth{midi_procesing.py} - zawiera funkcję potrzebne do pracy w plikami midi,
\item \pyth{model.py} - zawiera definicję modelu sieci neuronowej \item \pyth{model.py} - zawiera definicję modelu sieci neuronowej,
\item \pyth{extract.py} - służy do wydobycia w plików midi zbioru danych w postaci sekwencji. \item \pyth{extract.py} - służy do wydobycia w plików midi zbioru danych w postaci sekwencji,
\item \pyth{train.py} - wykonując ten skrypt wykorzystujemy wygenerowane dane, aby wytrenować zestaw sieci neuronowych. \item \pyth{train.py} - wykonując ten skrypt wykorzystujemy wygenerowane dane, aby wytrenować zestaw sieci neuronowych,
\item \pyth{generate.py} - wykorzystuje wytrenowane modele, aby wygenerować ostatecznie plik midi. \item \pyth{generate.py} - wykorzystuje wytrenowane modele, aby wygenerować ostatecznie plik midi.
\end{itemize} \end{itemize}
Fragmenty bilbiotek \pyth{midi_procesing.py} i \pyth{model.py} zostały szczegółowo omówione w rozdziałach ~\ref{section:midi} i ~\ref{section:model}. Natomiast skrypty \pyth{extract.py}, \pyth{train.py} i \pyth{generate.py} zostały napisane, aby ułatwić proces generowania oraz zapewniają powtarzalność i skalowalność prowadzonych eksperymentów. Fragmenty bilbiotek \pyth{midi_procesing.py} i \pyth{model.py} zostały szczegółowo omówione w rozdziałach ~\ref{section:midi} i ~\ref{section:model}. Natomiast skrypty \pyth{extract.py}, \pyth{train.py} i \pyth{generate.py} zostały napisane, aby ułatwić proces generowania. Dodatkowo zapewniają powtarzalność i skalowalność prowadzonych eksperymentów.
\subsection{Zbiór danych} \subsection{Zbiór danych}
W omawianym przykładzie wykorzystałem zbiór wybranych utworów midi zespołu The Offspring. Został on skompletowany ze źródeł dostępnych na stronie internetowej https://www.midiworld.com/. Składa się z 7 utworów. W omawianym przykładzie wykorzystałem zbiór wybranych utworów midi zespołu The Offspring. Został on skompletowany ze źródeł dostępnych na stronie internetowej https://www.midiworld.com/. Składa się z 7 utworów:
\begin{itemize} \begin{itemize}
\item The Offspring - All I Want.mid \item The Offspring - All I Want.mid,
\item The Offspring - Change the World.mid \item The Offspring - Change the World.mid,
\item The Offspring - Nitro.mid \item The Offspring - Nitro.mid,
\item The Offspring - Original Prankster.mid \item The Offspring - Original Prankster.mid,
\item The Offspring - Self Esteem.mid \item The Offspring - Self Esteem.mid,
\item The Offspring - The Kids Arent Alright.mid \item The Offspring - The Kids Arent Alright.mid,
\item The Offspring - Why Dont You Get a Job.mid \item The Offspring - Why Dont You Get a Job.mid.
\end{itemize} \end{itemize}
\subsection{Wydobycie danych} \subsection{Wydobycie danych}
Aby wydobyć dane z plików midi wykorzystamy skypt \pyth{extract.py}. Można użyć flagi \pyth{-a}, aby najpierw zapoznać się z zawartością muzyczną zbioru plików midi. Aby wydobyć dane z plików MIDI wykorzystamy skypt \pyth{extract.py}. Można użyć flagi \pyth{-a}, aby najpierw zapoznać się z zawartością muzyczną zbioru danych.
% 100\%|███████████████████████████████████| 7/7 [00:01<00:00, 3.67it/s] % 100\%|███████████████████████████████████| 7/7 [00:01<00:00, 3.67it/s]
\begin{python} \begin{python}
@ -1392,11 +1412,11 @@ Aby wydobyć dane z plików midi wykorzystamy skypt \pyth{extract.py}. Można u
1 of Organ 1 of Organ
\end{python} \end{python}
Dzięki temu możemy zaobserwować że w zbiorze danych jest 1098 taktów perkusji, 1037 taktów gitar, 704 melodii, 528 basu oraz 1 takt organ. Dzięki temu możemy zaobserwować, że w zbiorze danych jest 1098 taktów perkusji, 1037 taktów gitar, 704 melodii, 528 basu oraz 1 takt organ.
Na tym etapie musimy zdecydować, który instrument będzie generatorem oraz jakie będą zależności między partiami w zespole sieci neuronowych. Na tym etapie musimy zdecydować, który instrument będzie generatorem oraz jakie będą zależności między partiami w zespole sieci neuronowych.
W tym przykładzie, zdecydowałem że gitara będzie generowana na podstawie losowego wektora, a melodia, bas oraz perkusja będę tworzone na podstawie gitary. W tym przykładzie zdecydowałem, że gitara będzie generowana na podstawie losowego wektora, a melodia, bas oraz perkusja będą tworzone na podstawie partii gitary.
Uruchamiajać skrypt \pyth{extract.py} bez flagi \pyth{-a} zdefiniujemy omawiany przepływ za pomocą prostego konfiguratora. Uruchamiajać skrypt \pyth{extract.py} bez flagi \pyth{-a} zdefiniujemy omawiany przepływ za pomocą prostego konfiguratora.
@ -1425,7 +1445,7 @@ Done.
%Exporting: ('Guitar', 'Drums'): 100\%||███████████████████████████████████| 7/7 [00:01<00:00, 3.79it/s] %Exporting: ('Guitar', 'Drums'): 100\%||███████████████████████████████████| 7/7 [00:01<00:00, 3.79it/s]
%Exporting: ('Guitar', 'Bass'): 100\%||███████████████████████████████████| 7/7 [00:01<00:00, 3.81it/s] %Exporting: ('Guitar', 'Bass'): 100\%||███████████████████████████████████| 7/7 [00:01<00:00, 3.81it/s]
Po tym etapie zostały utworzony pliki zawierające oczyszczone pary sekwencji dla każdej sieci neuronowej. Zostało wygenerowanych Po tym etapie zostaną utworzone pliki zawierające oczyszczone pary sekwencji dla każdej sieci neuronowej. Zostały wygenerowane:
\begin{itemize} \begin{itemize}
\item 263 próby dla modelu gitary, \item 263 próby dla modelu gitary,
@ -1434,7 +1454,7 @@ Po tym etapie zostały utworzony pliki zawierające oczyszczone pary sekwencji d
\item 385 prób par basu i gitary. \item 385 prób par basu i gitary.
\end{itemize} \end{itemize}
Na podstawie takiego zbioru danych, w następnym kroku zostaną wytrenowane cztery sieci neuronowe, po jednej dla każdego instrumentu. Na podstawie takiego zbioru danych w następnym kroku zostaną wytrenowane cztery sieci neuronowe, po jednej dla każdego instrumentu.
\subsection{Trenowanie modelu} \subsection{Trenowanie modelu}
@ -1467,7 +1487,7 @@ Epoch 1/1
- 4s 12ms/step - loss: 2.2721 - val_loss: 1.7813 - 4s 12ms/step - loss: 2.2721 - val_loss: 1.7813
\end{python} \end{python}
Na potrzeby badań trenowałem i generowałem klipy muzyczne dla epok 1, 10, 25, 50, 75, 100, 150. Dzięki temu mogę porównać ze sobą poszczególne etapy treningu sieci neuronowych. Wykresy funkcji kosztów dla zbioru uczącego i testowego zaprezentowane zostały na rysunku~\ref{fig:losses}. Sieci neuronowe zostały trenowane przez 150 epok. Na potrzeby badań generowałem klipy muzyczne dla epok 1, 10, 25, 50, 75, 100, 150. Dzięki temu mogłem porównać ze sobą poszczególne etapy treningu sieci neuronowych. Wykresy funkcji kosztów dla zbioru uczącego i testowego zaprezentowane zostały na rysunku~\ref{fig:losses}.
\begin{figure}[!htb] \begin{figure}[!htb]
\centering \centering
@ -1478,7 +1498,7 @@ Na potrzeby badań trenowałem i generowałem klipy muzyczne dla epok 1, 10, 25,
\subsection{Generowanie muzyki przy pomocy wytrenowanych modeli} \subsection{Generowanie muzyki przy pomocy wytrenowanych modeli}
Gdy zdefiniowane modele zostaną wytrenowane możemy wykorzystać skrypt \pyth{generate.py}, wtedy generująca sieć neuonowa zostanie zasilona losowym wektorem, aby wygenerować partię. W tym przykładzie gitary a wygenerowana partia posłuży jako dane wejściowe na pozostałych modeli. Ostatecznie otrzymane sekwencje zostaną skompilowane do pliku MIDI. W tym momencie zostają wykorzystane informacje o programach dla każdego z instrumentów, a tempo utworu domyślnie ustawione jest na 120 BPM. Możemy również zdecydować, czy zasilanie dekodera modelu generującego odbędzie się za pomocą losowej sekwencji elementów ze słownika (\textit{from\textunderscore seq}), czy losowy wektor zasili bezpośrednio stany wewnętrzne dekodera $h$ i $c$ (\textit{from\textunderscore state}). Gdy zdefiniowane modele zostaną wytrenowane możemy wykorzystać skrypt \pyth{generate.py}, wtedy generująca sieć neuonowa zostanie zasilona losowym wektorem, aby wygenerować partię muzyczną. W omawianym przykładzie będzie to partia gitary. Następnie ta partia posłuży jako dane wejściowe dla pozostałych modeli. Ostatecznie otrzymane sekwencje zostaną skompilowane do pliku MIDI. W tym momencie zostają wykorzystane informacje o programach dla każdego z instrumentów, a tempo utworu domyślnie ustawione jest na 120 BPM. Możemy również zdecydować, czy zasilanie dekodera modelu generującego odbędzie się za pomocą losowej sekwencji elementów ze słownika (\textit{from\textunderscore seq}), czy losowy wektor zasili bezpośrednio stany wewnętrzne dekodera $h$ i $c$ (\textit{from\textunderscore state}).
\begin{python} \begin{python}
>>> python generate.py offspring --i 10 --m from_state >>> python generate.py offspring --i 10 --m from_state
@ -1489,7 +1509,7 @@ Generating music...
Done. Done.
\end{python} \end{python}
Parametr \pyth{--i} służy do określenia liczby wygenerowanych utworów a parametr \pyth{--m} pozwala zdefiniować metodę generowania, omówioną wyżej. Parametr \pyth{--i} służy do określenia liczby wygenerowanych utworów, a parametr \pyth{--m} pozwala zdefiniować metodę generowania omówioną wyżej.
Przekazywanie wygenerowanych partii to odpowiednich modeli wykonywane jest przy pomocy poniższego fragmentu kodu. Przekazywanie wygenerowanych partii to odpowiednich modeli wykonywane jest przy pomocy poniższego fragmentu kodu.
@ -1546,7 +1566,7 @@ Utwór przedstawiony na rysunku~\ref{fig:score1} został wygenerowany po pierwsz
\label{fig:score1} \label{fig:score1}
\end{figure} \end{figure}
Po dziesięciu epokach treningu melodia dalej wygląda na bardzo powtarzalną, jednak teraz jest bardziej spójna. Na przedstawionej na rysunku~\ref{fig:score10} partyturze widać, że model wygenerował partię gitary. Jednostajnie, co ćwierćnutę gra akord C-G-C (tzw. Power Chord) popularnie stosowany w muzyce rockowej. Perkusja wybija tylko jedną perkusjonalię, hi-hat. Melodia gra dźwięk C, ale oktawę wyżej niż poprzednio, podobnie jak bas, tylko bas gra oktawę niżej niż poprzednio. Cały utwór oparty jest na dźwięku C, co pomimo monotonnej i mało ciekawej aranżacji jest muzycznie poprawnie i nie powoduje fałszu ani dysonansu w odbiorze. Po dziesięciu epokach treningu melodia dalej wygląda na bardzo powtarzalną, jednak teraz jest bardziej spójna. Na przedstawionej na rysunku~\ref{fig:score10} partyturze widać, że model wygenerował partię gitary. Jednostajnie co ćwierćnutę gra akord C-G-C (tzw. Power Chord) popularnie stosowany w muzyce rockowej. Perkusja wybija tylko hi-hat. Melodia gra dźwięk C, ale oktawę wyżej niż poprzednio, podobnie jak bas, tylko bas gra oktawę niżej. Cały utwór oparty jest na dźwięku C, co pomimo monotonnej i mało ciekawej aranżacji jest muzycznie poprawne i nie powoduje fałszu ani dysonansu w odbiorze.
\begin{figure}[!htb] \begin{figure}[!htb]
\centering \centering
@ -1564,7 +1584,7 @@ Piętnaście epok później, na rysunku~\ref{fig:score25} model generujący gita
\label{fig:score25} \label{fig:score25}
\end{figure} \end{figure}
Na rysunku~\ref{fig:score50} przedstawiono utwór po pięćdziesięciu epokach. W tym momencie partia gitary zaczyna wykorzystywać dwa akordy. Daje to prostą progresję akordów a to mocno urozmaica utwór. Perkusja stała się bardziej jednolita a melodia ciekawsza. Bas w dalszym ciągu monotonnie wygrywa dźwięk C nawet w momentach, gdzie gitara gra akord B$\flat$. Lepsze w tej sytuacji było by zagranie B$\flat$ również na basie. Na rysunku~\ref{fig:score50} przedstawiono utwór po pięćdziesięciu epokach. W tym momencie partia gitary zaczyna wykorzystywać dwa akordy. Daje to prostą progresję akordów co mocno urozmaica utwór. Perkusja stała się bardziej jednolita a melodia ciekawsza. Bas w dalszym ciągu monotonnie wygrywa dźwięk C nawet w momentach, gdzie gitara gra akord B$\flat$. Lepsze w tej sytuacji byłoby zagranie B$\flat$ również na basie.
\begin{figure}[!htb] \begin{figure}[!htb]
\centering \centering
@ -1573,7 +1593,7 @@ Na rysunku~\ref{fig:score50} przedstawiono utwór po pięćdziesięciu epokach.
\label{fig:score50} \label{fig:score50}
\end{figure} \end{figure}
Po siedemdziesięciu pięciu epokach uczenia, generowany utwory zaczęły być o wiele ciekawsze, ale też bardziej chaotyczne. Partia gitary stała się melodyczna. W partii perkusji widzimy talerze a bas zaczął podążać za gitarą. Pokazano opisaną sytuację na rysunku~\ref{fig:score75}. Po siedemdziesięciu pięciu epokach uczenia, generowane utwory zaczęły być o wiele ciekawsze, ale też bardziej chaotyczne. Partia gitary stała się melodyczna. W partii perkusji widzimy talerze a bas zaczął podążać za gitarą. Pokazano opisaną sytuację na rysunku~\ref{fig:score75}.
\begin{figure}[!htb] \begin{figure}[!htb]
\centering \centering
@ -1600,11 +1620,11 @@ Na rysunku~\ref{fig:score100} i rysunku~\ref{fig:score150} przedstawiono odpowie
\chapter*{Podsumowanie} \chapter*{Podsumowanie}
Celem pracy było zaprezentowanie modelu, który byłby w stanie generować krótkie multiinstrumentalne utwory muzyczne. Sądzę że cel pracy został osiągnięty. Model potrafi uczyć się z plików MIDI oraz reprodukować muzykę podobną do tej, z której się uczył. Ocenienie jakości generowanej muzyki jest trudne i subiektywne, ale sądzę że przy odpowiednio dobranym zbiorze uczącym i konfiguracji można wygenerować ciekawe rezultaty. Celem pracy było zaprezentowanie modelu, który byłby w stanie generować krótkie multiinstrumentalne utwory muzyczne. Sądzę, że cel pracy został osiągnięty. Model potrafi uczyć się z plików MIDI oraz reprodukować muzykę podobną do tej, z której się uczył. Ocena jakości generowanej muzyki jest trudna i subiektywna. Uważam jednak, że przy odpowiednio dobranym zbiorze uczącym i dostosowanej konfiguracji można wygenerować ciekawe rezultaty.
Pomimo, że zaprezentowany przeze mnie model posiada potencjał nie sądzę, aby mógł on zastąpić ludzi w produkcji muzyki. Natomiast uważam, że mógłby zainspirować muzyków krótkim utworem, który następnie mógłby zostać rozbudowany przez nich do pełnego utworu. Pomimo, że zaprezentowany przeze mnie model posiada potencjał nie sądzę, aby mógł on zastąpić ludzi w produkcji muzyki. Natomiast uważam, że mógłby zainspirować muzyków krótkim utworem, który następnie mógłby zostać rozbudowany przez nich do pełnego utworu.
Temat produkcji muzyki przez sztuczną inteligencję jest temat ciekawym jak również mocno złożonym i skomplikowanym. Istnieje wiele kwestii, które nie zostały poruszone w pracy jak generowanie tekstu piosenki, dobranie brzmienia instrumentów czy struktury utworu a z którymi muzycy potrafią sobie świetnie dać radę. Dlatego jest jeszcze miejsce na rozwój tej dziedziny sztucznej inteligencji w przyszłości. Temat produkcji muzyki przez sztuczną inteligencję jest tematem ciekawym, jak również mocno złożonym i skomplikowanym. Istnieje wiele kwestii, które nie zostały poruszone w pracy, np. generowanie tekstu piosenki, dobranie brzmienia instrumentów czy struktury utworu, a z którymi muzycy potrafią sobie świetnie radzić. Dlatego jest jeszcze miejsce na rozwój tej dziedziny sztucznej inteligencji w przyszłości.
\begin{thebibliography}{99} \begin{thebibliography}{99}

View File

@ -22,28 +22,28 @@
\contentsline {subsection}{\numberline {2.1.3\relax .\leavevmode@ifvmode \kern .5em }Zapis nutowy}{27}% \contentsline {subsection}{\numberline {2.1.3\relax .\leavevmode@ifvmode \kern .5em }Zapis nutowy}{27}%
\contentsline {section}{\numberline {2.2\relax .\leavevmode@ifvmode \kern .5em }Cyfrowa reprezentacja muzyki symbolicznej}{31}% \contentsline {section}{\numberline {2.2\relax .\leavevmode@ifvmode \kern .5em }Cyfrowa reprezentacja muzyki symbolicznej}{31}%
\contentsline {subsection}{\numberline {2.2.1\relax .\leavevmode@ifvmode \kern .5em }Standard MIDI}{31}% \contentsline {subsection}{\numberline {2.2.1\relax .\leavevmode@ifvmode \kern .5em }Standard MIDI}{31}%
\contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 3\relax .\leavevmode@ifvmode \kern .5em Projekt}{33}% \contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 3\relax .\leavevmode@ifvmode \kern .5em Projekt}{35}%
\contentsline {section}{\numberline {3.1\relax .\leavevmode@ifvmode \kern .5em }Koncepcja}{33}% \contentsline {section}{\numberline {3.1\relax .\leavevmode@ifvmode \kern .5em }Koncepcja}{35}%
\contentsline {section}{\numberline {3.2\relax .\leavevmode@ifvmode \kern .5em }Wst\IeC {\k e}pne przygotowanie danych do treningu}{34}% \contentsline {section}{\numberline {3.2\relax .\leavevmode@ifvmode \kern .5em }Wst\IeC {\k e}pne przygotowanie danych do treningu}{36}%
\contentsline {subsection}{\numberline {3.2.1\relax .\leavevmode@ifvmode \kern .5em }Muzyczne ,,s\IeC {\l }owo''}{34}% \contentsline {subsection}{\numberline {3.2.1\relax .\leavevmode@ifvmode \kern .5em }Muzyczne s\IeC {\l }owo}{36}%
\contentsline {subsection}{\numberline {3.2.2\relax .\leavevmode@ifvmode \kern .5em }Konwersja MIDI na sekwencje s\IeC {\l }\IeC {\'o}w muzycznych}{34}% \contentsline {subsection}{\numberline {3.2.2\relax .\leavevmode@ifvmode \kern .5em }Konwersja MIDI na sekwencje s\IeC {\l }\IeC {\'o}w muzycznych}{36}%
\contentsline {subsection}{\numberline {3.2.3\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania danych}{37}% \contentsline {subsection}{\numberline {3.2.3\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania danych}{39}%
\contentsline {subsection}{\numberline {3.2.4\relax .\leavevmode@ifvmode \kern .5em }Podzia\IeC {\l } danych na dane wej\IeC {\'s}ciowe i wyj\IeC {\'s}ciowe}{38}% \contentsline {subsection}{\numberline {3.2.4\relax .\leavevmode@ifvmode \kern .5em }Podzia\IeC {\l } danych na dane wej\IeC {\'s}ciowe i wyj\IeC {\'s}ciowe}{40}%
\contentsline {subsection}{\numberline {3.2.5\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania zbioru ucz\IeC {\k a}cego}{40}% \contentsline {subsection}{\numberline {3.2.5\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania zbioru ucz\IeC {\k a}cego}{42}%
\contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{42}% \contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{44}%
\contentsline {subsection}{\numberline {3.3.1\relax .\leavevmode@ifvmode \kern .5em }Model w trybie uczenia}{42}% \contentsline {subsection}{\numberline {3.3.1\relax .\leavevmode@ifvmode \kern .5em }Model w trybie uczenia}{44}%
\contentsline {subsection}{\numberline {3.3.2\relax .\leavevmode@ifvmode \kern .5em }Model w trybie wnioskowania}{44}% \contentsline {subsection}{\numberline {3.3.2\relax .\leavevmode@ifvmode \kern .5em }Model w trybie wnioskowania}{46}%
\contentsline {section}{\numberline {3.4\relax .\leavevmode@ifvmode \kern .5em }Transformacja danych dla modelu}{47}% \contentsline {section}{\numberline {3.4\relax .\leavevmode@ifvmode \kern .5em }Transformacja danych dla modelu}{48}%
\contentsline {subsection}{\numberline {3.4.1\relax .\leavevmode@ifvmode \kern .5em }Enkodowanie one-hot}{47}% \contentsline {subsection}{\numberline {3.4.1\relax .\leavevmode@ifvmode \kern .5em }Enkodowanie one-hot}{49}%
\contentsline {subsection}{\numberline {3.4.2\relax .\leavevmode@ifvmode \kern .5em }S\IeC {\l }ownik}{47}% \contentsline {subsection}{\numberline {3.4.2\relax .\leavevmode@ifvmode \kern .5em }S\IeC {\l }ownik}{49}%
\contentsline {subsection}{\numberline {3.4.3\relax .\leavevmode@ifvmode \kern .5em }Elementy specjalne}{48}% \contentsline {subsection}{\numberline {3.4.3\relax .\leavevmode@ifvmode \kern .5em }Elementy specjalne}{50}%
\contentsline {subsection}{\numberline {3.4.4\relax .\leavevmode@ifvmode \kern .5em }Kodowanie sekwencji}{48}% \contentsline {subsection}{\numberline {3.4.4\relax .\leavevmode@ifvmode \kern .5em }Kodowanie sekwencji}{50}%
\contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Ekperyment}{49}% \contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Ekperyment}{51}%
\contentsline {subsection}{\numberline {3.5.1\relax .\leavevmode@ifvmode \kern .5em }Oprogramowanie}{50}% \contentsline {subsection}{\numberline {3.5.1\relax .\leavevmode@ifvmode \kern .5em }Oprogramowanie}{51}%
\contentsline {subsection}{\numberline {3.5.2\relax .\leavevmode@ifvmode \kern .5em }Zbi\IeC {\'o}r danych}{50}% \contentsline {subsection}{\numberline {3.5.2\relax .\leavevmode@ifvmode \kern .5em }Zbi\IeC {\'o}r danych}{52}%
\contentsline {subsection}{\numberline {3.5.3\relax .\leavevmode@ifvmode \kern .5em }Wydobycie danych}{50}% \contentsline {subsection}{\numberline {3.5.3\relax .\leavevmode@ifvmode \kern .5em }Wydobycie danych}{52}%
\contentsline {subsection}{\numberline {3.5.4\relax .\leavevmode@ifvmode \kern .5em }Trenowanie modelu}{51}% \contentsline {subsection}{\numberline {3.5.4\relax .\leavevmode@ifvmode \kern .5em }Trenowanie modelu}{53}%
\contentsline {subsection}{\numberline {3.5.5\relax .\leavevmode@ifvmode \kern .5em }Generowanie muzyki przy pomocy wytrenowanych modeli}{52}% \contentsline {subsection}{\numberline {3.5.5\relax .\leavevmode@ifvmode \kern .5em }Generowanie muzyki przy pomocy wytrenowanych modeli}{54}%
\contentsline {subsection}{\numberline {3.5.6\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{54}% \contentsline {subsection}{\numberline {3.5.6\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{56}%
\contentsline {chapter}{Podsumowanie}{59}% \contentsline {chapter}{Podsumowanie}{61}%
\contentsline {chapter}{Bibliografia}{61}% \contentsline {chapter}{Bibliografia}{63}%

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB