diff --git a/docs/Pukownik C. - Generowanie muzyki przy pomocy gÅ‚Ä™bokiego uczenia.pdf b/docs/Pukownik C. - Generowanie muzyki przy pomocy gÅ‚Ä™bokiego uczenia.pdf new file mode 100644 index 0000000..a62fdc0 Binary files /dev/null and b/docs/Pukownik C. - Generowanie muzyki przy pomocy gÅ‚Ä™bokiego uczenia.pdf differ diff --git a/docs/document.aux b/docs/document.aux index 773fd42..5bc54aa 100644 --- a/docs/document.aux +++ b/docs/document.aux @@ -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 {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{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{lot}{\addvspace {10\p@ }} -\newlabel{section:project}{{3}{33}} -\@writefile{toc}{\contentsline {section}{\numberline {3.1\relax .\leavevmode@ifvmode \kern .5em }Koncepcja}{33}\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 } -\newlabel{section:midi}{{3.2}{34}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1\relax .\leavevmode@ifvmode \kern .5em }Muzyczne ,,s\IeC {\l }owo''}{34}\protected@file@percent } -\newlabel{section:midi_words}{{3.2.1}{34}} -\@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 } +\newlabel{section:project}{{3}{35}} +\@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}{36}\protected@file@percent } +\newlabel{section:midi}{{3.2}{36}} +\@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}{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}{36}\protected@file@percent } \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.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.5\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania zbioru ucz\IeC {\k a}cego}{40}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{42}\protected@file@percent } -\newlabel{section:model}{{3.3}{42}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1\relax .\leavevmode@ifvmode \kern .5em }Model w trybie uczenia}{42}\protected@file@percent } -\newlabel{fig:training-model}{{3.1}{44}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2\relax .\leavevmode@ifvmode \kern .5em }Model w trybie wnioskowania}{44}\protected@file@percent } -\newlabel{section:inference-model}{{3.3.2}{44}} -\newlabel{fig:inference-decoder}{{3.2}{45}} +\@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}{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}{44}\protected@file@percent } +\newlabel{section:model}{{3.3}{44}} +\@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}{45}} +\@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}{46}} +\newlabel{fig:inference-decoder}{{3.2}{47}} \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 {subsection}{\numberline {3.4.1\relax .\leavevmode@ifvmode \kern .5em }Enkodowanie one-hot}{47}\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.3\relax .\leavevmode@ifvmode \kern .5em }Elementy specjalne}{48}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.4\relax .\leavevmode@ifvmode \kern .5em }Kodowanie sekwencji}{48}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Ekperyment}{49}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.1\relax .\leavevmode@ifvmode \kern .5em }Oprogramowanie}{50}\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.3\relax .\leavevmode@ifvmode \kern .5em }Wydobycie danych}{50}\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.5\relax .\leavevmode@ifvmode \kern .5em }Generowanie muzyki przy pomocy wytrenowanych modeli}{52}\protected@file@percent } -\newlabel{fig:losses}{{3.3}{53}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.6\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{54}\protected@file@percent } -\newlabel{fig:score1}{{3.4}{55}} -\newlabel{fig:score10}{{3.5}{55}} -\newlabel{fig:score25}{{3.6}{56}} -\newlabel{fig:score50}{{3.7}{57}} -\newlabel{fig:score75}{{3.8}{57}} -\newlabel{fig:score100}{{3.9}{58}} -\newlabel{fig:score150}{{3.10}{58}} -\@writefile{toc}{\contentsline {chapter}{Podsumowanie}{59}\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}{49}\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}{50}\protected@file@percent } +\newlabel{section:specialtoken}{{3.4.3}{50}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.4\relax .\leavevmode@ifvmode \kern .5em }Kodowanie sekwencji}{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.1\relax .\leavevmode@ifvmode \kern .5em }Oprogramowanie}{51}\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.3\relax .\leavevmode@ifvmode \kern .5em }Wydobycie danych}{52}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.4\relax .\leavevmode@ifvmode \kern .5em }Trenowanie modelu}{53}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.5\relax .\leavevmode@ifvmode \kern .5em }Generowanie muzyki przy pomocy wytrenowanych modeli}{54}\protected@file@percent } +\newlabel{fig:losses}{{3.3}{55}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.6\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{56}\protected@file@percent } +\newlabel{fig:score1}{{3.4}{57}} +\newlabel{fig:score10}{{3.5}{57}} +\newlabel{fig:score25}{{3.6}{58}} +\newlabel{fig:score50}{{3.7}{59}} +\newlabel{fig:score75}{{3.8}{59}} +\newlabel{fig:score100}{{3.9}{60}} +\newlabel{fig:score150}{{3.10}{60}} +\@writefile{toc}{\contentsline {chapter}{Podsumowanie}{61}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} \bibcite{survay}{1} @@ -137,6 +139,6 @@ \bibcite{statystyka}{8} \bibcite{tempos}{9} \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{lot}{\addvspace {10\p@ }} diff --git a/docs/document.fdb_latexmk b/docs/document.fdb_latexmk index 24506ad..96fe471 100644 --- a/docs/document.fdb_latexmk +++ b/docs/document.fdb_latexmk @@ -1,10 +1,10 @@ # Fdb version 3 -["makeindex document.idx"] 1592412677 "document.idx" "document.ind" "document" 1592416971 - "document.idx" 1592414607 0 d41d8cd98f00b204e9800998ecf8427e "" +["makeindex document.idx"] 1592557594 "document.idx" "document.ind" "document" 1592561820 + "document.idx" 1592561782 0 d41d8cd98f00b204e9800998ecf8427e "" (generated) - "document.ind" "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/plme.enc" 1550343089 3126 59f33ff3e396436ebc36f4e7b444d5c4 "" "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.cnf" 1550344763 715 839ef4b14d931ce86420174d3a223d3e "" "chapter-style.sty" 1560952449 376 87871882de090607c810d89fd5ae18d9 "" - "document.aux" 1592416970 12333 f03945da9a0198c6832f0bcc70eb3e8d "" - "document.ind" 1592412677 0 d41d8cd98f00b204e9800998ecf8427e "makeindex document.idx" - "document.tex" 1592416963 94831 8c0abbc37a3a2437ec9937baed3ecc00 "" - "document.toc" 1592416971 5377 99f1fbfeeed311c15641911019d5b141 "" + "document.aux" 1592561809 12412 2aecdd25dcfa881b68f535c7ca66dccc "" + "document.ind" 1592557594 0 d41d8cd98f00b204e9800998ecf8427e "makeindex document.idx" + "document.tex" 1592561789 95683 f15942adacd7abef6ca2184e9ab754c1 "" + "document.toc" 1592561809 5373 969bd356360a2f54401e2ea06cf75c01 "" "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_2_long.png" 1592412282 43574 6b02401960a159a520593d4ccef24fff "" "images/inference-decoder-graph.png" 1592382139 39617 5ccfdc4fde77e18a8689e1af6b852a5e "" @@ -225,14 +226,14 @@ "images/training_losses.png" 1592382149 57293 6eb12c89458f62456bc8b0860f6df331 "" "images/wartosc_nut.jpg" 1590441554 48213 d311c2cedb2ed53dcf5eff20f70eda80 "" "images/waveform_axis.png" 1592410460 56303 20c29ea310c3d0f7bef501c488c7de5a "" - "j:/_MAGISTERKA/praca-magisterska/docs/document.aux" 1592416970 12333 f03945da9a0198c6832f0bcc70eb3e8d "" - "j:/_MAGISTERKA/praca-magisterska/docs/document.tex" 1592416963 94831 8c0abbc37a3a2437ec9937baed3ecc00 "" + "j:/_MAGISTERKA/praca-magisterska/docs/document.aux" 1592561809 12412 2aecdd25dcfa881b68f535c7ca66dccc "" + "j:/_MAGISTERKA/praca-magisterska/docs/document.tex" 1592561789 95683 f15942adacd7abef6ca2184e9ab754c1 "" "pythonhighlight.sty" 1590660734 4822 44a39a68d852c9742af161f7166b2a03 "" (generated) - "document.toc" + "document.log" + "document.aux" + "document.pdf" "j:/_MAGISTERKA/praca-magisterska/docs/document.pdf" "j:/_MAGISTERKA/praca-magisterska/docs/document.log" - "document.aux" - "document.log" "document.idx" - "document.pdf" + "document.toc" diff --git a/docs/document.fls b/docs/document.fls index 7add9e8..23a56d1 100644 --- a/docs/document.fls +++ b/docs/document.fls @@ -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/fonts/tfm/public/pl/pltt12.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 j:/_MAGISTERKA/praca-magisterska/docs/images/training-model-graph.png INPUT j:/_MAGISTERKA/praca-magisterska/docs/images/training-model-graph.png diff --git a/docs/document.log b/docs/document.log index cec7113..40cad6d 100644 --- a/docs/document.log +++ b/docs/document.log @@ -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 restricted \write18 enabled. file:line:error style messages enabled. @@ -429,20 +429,20 @@ Writing index file document.idx (j:/_MAGISTERKA/praca-magisterska/docs/document.aux) \openout1 = `document.aux'. -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 58. -LaTeX Font Info: ... okay on input line 58. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 58. -LaTeX Font Info: ... okay on input line 58. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 58. -LaTeX Font Info: ... okay on input line 58. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 58. -LaTeX Font Info: ... okay on input line 58. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 58. -LaTeX Font Info: ... okay on input line 58. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 58. -LaTeX Font Info: ... okay on input line 58. -LaTeX Font Info: Checking defaults for OT4/cmr/m/n on input line 58. -LaTeX Font Info: ... okay 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 59. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 59. +LaTeX Font Info: ... okay on input line 59. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 59. +LaTeX Font Info: ... okay on input line 59. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 59. +LaTeX Font Info: ... okay on input line 59. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 59. +LaTeX Font Info: ... okay on input line 59. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 59. +LaTeX Font Info: ... okay on input line 59. +LaTeX Font Info: Checking defaults for OT4/cmr/m/n on input line 59. +LaTeX Font Info: ... okay on input line 59. (c:/software/latex/texmf-dist/tex/context/base/mkii/supp-pdf.mkii [Loading MPS to PDF converter (version 2006.09.02).] \scratchcounter=\count140 @@ -503,12 +503,12 @@ Package caption Info: Begin \AtBeginDocument code. Package caption Info: subfig package v1.3 is loaded. 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 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 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 File: omxplex.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW) ) 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 -(Font) <8> on input line 137. +(Font) <8> on input line 138. LaTeX Font Info: External font `plex10' loaded for size -(Font) <6> on input line 137. -LaTeX Font Info: Try loading font information for U+msa on input line 137. +(Font) <6> on input line 138. +LaTeX Font Info: Try loading font information for U+msa on input line 138. (c:/software/latex/texmf-dist/tex/latex/amsfonts/umsa.fd 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 File: umsb.fd 2013/01/14 v3.01 AMS symbols B ) 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 @@ -564,60 +564,60 @@ LaTeX Font Info: External font `plex10' loaded for size ] [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. File: images/linear_reg.png Graphic file (type 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. [13] [14 ] [15] File: images/gradient_descent_1_long.png Graphic file (type 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. File: images/gradient_descent_2_long.png Graphic file (type 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. File: images/naural_model_one_ver2.png Graphic file (type 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. [16 ] File: images/naural_model_multi_ver2.png Graphic file (type 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. [17 ] [18 ] File: images/sigmoid.png Graphic file (type 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. [19 ] File: images/neural_net_1_ver2.png Graphic file (type 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. [20 ] File: images/autoencoder.png Graphic file (type 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. [21] File: images/rnn.png Graphic file (type 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. Underfull \vbox (badness 3557) has occurred while \output is active [] @@ -626,29 +626,29 @@ Underfull \vbox (badness 3557) has occurred while \output is active [] File: images/lstm_cell2.png Graphic file (type 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. [23 ] [24 ] File: images/tanh.png Graphic file (type 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. [25 ] File: images/seq2seq2.png Graphic file (type 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. [26 ] -Overfull \vbox (16.08192pt too high) detected at line 551 +Overfull \vbox (16.08192pt too high) detected at line 552 [] Rozdzia\PlPrIeC {\l } 2. File: images/waveform_axis.png Graphic file (type 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. [27 @@ -656,157 +656,156 @@ Package pdftex.def Info: images/waveform_axis.png used on input line 583. File: images/wartosc_nut.jpg Graphic file (type 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. Underfull \vbox (badness 1527) has occurred while \output is active [] [28 ] 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 -(Font) <7> on input line 609. +(Font) <7> on input line 610. LaTeX Font Info: External font `plex10' loaded for size -(Font) <5> on input line 609. +(Font) <5> on input line 610. File: images/nuty_linia.png Graphic file (type 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. + +Underfull \vbox (badness 1142) has occurred while \output is active [] + [29 ] [30 ] (c:/software/latex/texmf-dist/tex/latex/listings/lstlang1.sty 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 File: ot4cmtt.fd 2008/02/24 v1.2.1 Font defs for fonts PL (MW) -) [31] [32] -Overfull \vbox (16.08192pt too high) detected at line 738 +) [31] + +File: images/general-midi.png Graphic file (type 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 ] [34 + +] +Overfull \vbox (16.08192pt too high) detected at line 758 [] Rozdzia\PlPrIeC {\l } 3. -[33 - -] [34] +[35] [36] 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] -Underfull \vbox (badness 7081) has occurred while \output is active [] +[37] [38] +Underfull \vbox (badness 5022) has occurred while \output is active [] - [36] [37] [38] [39] -Underfull \vbox (badness 2080) has occurred while \output is active [] + [39] [40] [41] [42] [43] +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] + File: images/training-model-graph.png Graphic file (type 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. - [43] -Overfull \hbox (2.09326pt too wide) in paragraph at lines 1136--1137 + [45 ] +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ó- [] -[44 ] - +[46] + File: images/inference-decoder-graph.png Graphic file (type 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. - [45 ] -Underfull \vbox (badness 10000) has occurred while \output is active [] - - [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] - + [47 ] [48] [49] [50] [51] [52] [53] + File: images/training_losses.png Graphic file (type 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. -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 [] -[52] -Overfull \hbox (4.86064pt too wide) in paragraph at lines 1499--1500 +[54] +Overfull \hbox (4.86064pt too wide) in paragraph at lines 1519--1520 [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] -[53 ] -Overfull \hbox (1.56473pt too wide) in paragraph at lines 1513--1515 +[55 ] +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ó- [] -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- [] - + File: images/score_1.png Graphic file (type 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. -[54] - +[56] + File: images/score_10.png Graphic file (type 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. - [55 ] - + File: images/score_25.png Graphic file (type 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. - + [57 ] + File: images/score_50.png Graphic file (type 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. - + File: images/score_75.png Graphic file (type 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. - + File: images/score_100.png Graphic file (type 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. - [56 ] - + File: images/score_150.png Graphic file (type 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. - [57 ] [58 ] [59 + [58 ] [59 ] [60 ] [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: - 16788 strings out of 492616 - 311428 string characters out of 6131816 - 660527 words of memory out of 5000000 - 20341 multiletter control sequences out of 15000+600000 + 16798 strings out of 492616 + 311656 string characters out of 6131816 + 660983 words of memory out of 5000000 + 20350 multiletter control sequences out of 15000+600000 26080 words of font info for 78 fonts, out of 8000000 for 9000 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} -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: - 343 PDF objects out of 1000 (max. 8388607) - 214 compressed objects within 3 object streams + 351 PDF objects out of 1000 (max. 8388607) + 218 compressed objects within 3 object streams 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) diff --git a/docs/document.pdf b/docs/document.pdf index 4dad089..a62fdc0 100644 Binary files a/docs/document.pdf and b/docs/document.pdf differ diff --git a/docs/document.synctex.gz b/docs/document.synctex.gz index a0450d2..7ba6210 100644 Binary files a/docs/document.synctex.gz and b/docs/document.synctex.gz differ diff --git a/docs/document.tex b/docs/document.tex index 88fda01..61f3b76 100644 --- a/docs/document.tex +++ b/docs/document.tex @@ -36,6 +36,7 @@ \newtheorem{tw}{Twierdzenie} \captionsetup[figure]{labelfont={bf}, name={Rysunek}, labelsep=period} +\captionsetup[table]{labelfont={bf}, name={Tabela}, labelsep=period} \pagestyle{fancy} \renewcommand{\chaptermark}[1]{\markboth{#1}{}} @@ -162,13 +163,13 @@ JednoczeÅ›nie przyjmujÄ™ do wiadomoÅ›ci, że przypisanie sobie, w pracy dyplomow \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} - 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. - 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 @@ -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.\] - 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} @@ -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}). - 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.\] 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} - 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), \] 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. @@ -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 \[ - \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), @@ -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. 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} \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} \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: \[ @@ -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 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Ä™. \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} - 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] \centering @@ -587,7 +588,7 @@ The rest of this chapter discusses an example of using the proposed model to gen \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} 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 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} \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} \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. \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. \begin{center} - $A_5$ = 2 * 440Hz = 880Hz \\ - $A_3$ = 1/2 * 440Hz = 220Hz + $A_5$ = 2 * 440Hz = 880Hz, \\ + $A_3$ = 1/2 * 440Hz = 220Hz. \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. \subsubsection{Akord} @@ -669,7 +670,14 @@ The rest of this chapter discusses an example of using the proposed model to gen \subsubsection{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} @@ -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 \\ \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} 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} 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ść} 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} - 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} Åš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} \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} - 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} \label{section:midi} - - \subsection{Muzyczne ,,sÅ‚owo''} + \subsection{Muzyczne sÅ‚owo} \label{section:midi_words} 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. - 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} - ((60, 64, 67), 0.5) + ((60, 64, 67), 0.5). \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. @@ -855,7 +874,7 @@ def parse_pretty_midi_instrument(instrument, resolution, \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} >>> resolution = midi.resolution @@ -883,13 +902,13 @@ resolution, time_to_tick, key_offset=0) \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} 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} - 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} @@ -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 \[ \begin{array}{c} - x_t = g_t \\ + x_t = g_t, \\ y_t = g_{t+1}, \end{array} \] 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: \begin{python} @@ -949,7 +968,7 @@ def get_data_seq2seq_melody(self, instrument_class, \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 \[ \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. \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} - 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Ä™: \begin{python} @@ -1050,20 +1069,20 @@ else: return False \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} \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. -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} \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} 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] \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}. \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} 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} -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] \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. \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} \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} @@ -1175,7 +1194,7 @@ self.decoder_model = Model( \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} 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. -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} @@ -1236,7 +1255,7 @@ Na podstawie definicji modelu wiemy, że należy przygotować trzy zestawy danyc \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} @@ -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 & 0 & 1 & 0 \\ \end{bmatrix} -\] +.\] \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]) \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} self.x_vocab = sorted(list(x_vocab)) @@ -1281,7 +1300,7 @@ self.y_vocab = ['',''] self.y_vocab.extend(sorted(list(y_vocab))) \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} self.x_transform_dict = dict( @@ -1295,8 +1314,9 @@ self.y_reverse_dict = dict( \end{python} \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{} (\textit{ang. start of sequence}). Można spotkać również inne oznaczenia,np. \pyth{} lub \pyth{}. Ten element ma na celu wypeÅ‚nienie przestrzeni pierwszego pustego miejsca w danych wejÅ›ciowych dla dekodera. Token koÅ„ca sekwencji oznaczany jako \pyth{} (\textit{ang. start of sequence}) lub \pyth{}. 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{} (\textit{ang. start of sequence}). Można spotkać również inne oznaczenia, np. \pyth{} lub \pyth{}. Ten element ma na celu wypeÅ‚nienie przestrzeni pierwszego pustego miejsca w danych wejÅ›ciowych dla dekodera. Token koÅ„ca sekwencji oznaczany jako \pyth{} (\textit{ang. start of sequence}) lub \pyth{}. Ten element jest wykorzystywany, aby wywoÅ‚ać warunek stopu w procesie predykcji opisanym w rozdziale~\ref{section:inference-model}. \begin{python} _y_train = [] @@ -1330,57 +1350,57 @@ decoder_input_data = np.zeros( self.y_vocab_size), dtype='float32') -decoder_target_data = np.zeros( +decoder_target = np.zeros( (len(x_train), self.y_max_seq_length, self.y_vocab_size), dtype='float32') for i, (x_train, y_train) in enumerate(zip(x_train, y_train)): - for t, char in enumerate(x_train): - encoder_input_data[i, t, self.x_transform_dict[char]] = 1. - for t, char in enumerate(y_train): - decoder_input_data[i, t, self.y_transform_dict[char]] = 1. + for t, c in enumerate(x_train): + encoder_input_data[i, t, self.x_transform_dict[c]] = 1. + for t, c in enumerate(y_train): + decoder_input_data[i, t, self.y_transform_dict[c]] = 1. 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} 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{}. +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{}. \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} -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} - \item \pyth{midi_procesing.py} - zawiera funkcjÄ™ potrzebne do pracy w plikami midi. - \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{train.py} - wykonujÄ…c ten skrypt wykorzystujemy wygenerowane dane, aby wytrenować zestaw sieci neuronowych. + \item \pyth{midi_procesing.py} - zawiera funkcjÄ™ potrzebne do pracy w plikami midi, + \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{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. \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} -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} - \item The Offspring - All I Want.mid - \item The Offspring - Change the World.mid - \item The Offspring - Nitro.mid - \item The Offspring - Original Prankster.mid - \item The Offspring - Self Esteem.mid - \item The Offspring - The Kids Arent Alright.mid - \item The Offspring - Why Dont You Get a Job.mid + \item The Offspring - All I Want.mid, + \item The Offspring - Change the World.mid, + \item The Offspring - Nitro.mid, + \item The Offspring - Original Prankster.mid, + \item The Offspring - Self Esteem.mid, + \item The Offspring - The Kids Arent Alright.mid, + \item The Offspring - Why Dont You Get a Job.mid. \end{itemize} \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] \begin{python} @@ -1392,11 +1412,11 @@ Aby wydobyć dane z plików midi wykorzystamy skypt \pyth{extract.py}. Można u 1 of Organ \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. - 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. @@ -1425,7 +1445,7 @@ Done. %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] -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} \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. \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} @@ -1467,7 +1487,7 @@ Epoch 1/1 - 4s 12ms/step - loss: 2.2721 - val_loss: 1.7813 \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] \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} -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} >>> python generate.py offspring --i 10 --m from_state @@ -1489,7 +1509,7 @@ Generating music... Done. \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. @@ -1546,7 +1566,7 @@ Utwór przedstawiony na rysunku~\ref{fig:score1} zostaÅ‚ wygenerowany po pierwsz \label{fig:score1} \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] \centering @@ -1564,7 +1584,7 @@ PiÄ™tnaÅ›cie epok później, na rysunku~\ref{fig:score25} model generujÄ…cy gita \label{fig:score25} \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] \centering @@ -1573,7 +1593,7 @@ Na rysunku~\ref{fig:score50} przedstawiono utwór po pięćdziesiÄ™ciu epokach. \label{fig:score50} \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] \centering @@ -1600,11 +1620,11 @@ Na rysunku~\ref{fig:score100} i rysunku~\ref{fig:score150} przedstawiono odpowie \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. - 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} diff --git a/docs/document.toc b/docs/document.toc index 8579afb..8d20ecb 100644 --- a/docs/document.toc +++ b/docs/document.toc @@ -22,28 +22,28 @@ \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 {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 {section}{\numberline {3.1\relax .\leavevmode@ifvmode \kern .5em }Koncepcja}{33}% -\contentsline {section}{\numberline {3.2\relax .\leavevmode@ifvmode \kern .5em }Wst\IeC {\k e}pne przygotowanie danych do treningu}{34}% -\contentsline {subsection}{\numberline {3.2.1\relax .\leavevmode@ifvmode \kern .5em }Muzyczne ,,s\IeC {\l }owo''}{34}% -\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.3\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania danych}{37}% -\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.5\relax .\leavevmode@ifvmode \kern .5em }Inne aspekty przygotowania zbioru ucz\IeC {\k a}cego}{40}% -\contentsline {section}{\numberline {3.3\relax .\leavevmode@ifvmode \kern .5em }Definicja modelu}{42}% -\contentsline {subsection}{\numberline {3.3.1\relax .\leavevmode@ifvmode \kern .5em }Model w trybie uczenia}{42}% -\contentsline {subsection}{\numberline {3.3.2\relax .\leavevmode@ifvmode \kern .5em }Model w trybie wnioskowania}{44}% -\contentsline {section}{\numberline {3.4\relax .\leavevmode@ifvmode \kern .5em }Transformacja danych dla modelu}{47}% -\contentsline {subsection}{\numberline {3.4.1\relax .\leavevmode@ifvmode \kern .5em }Enkodowanie one-hot}{47}% -\contentsline {subsection}{\numberline {3.4.2\relax .\leavevmode@ifvmode \kern .5em }S\IeC {\l }ownik}{47}% -\contentsline {subsection}{\numberline {3.4.3\relax .\leavevmode@ifvmode \kern .5em }Elementy specjalne}{48}% -\contentsline {subsection}{\numberline {3.4.4\relax .\leavevmode@ifvmode \kern .5em }Kodowanie sekwencji}{48}% -\contentsline {section}{\numberline {3.5\relax .\leavevmode@ifvmode \kern .5em }Ekperyment}{49}% -\contentsline {subsection}{\numberline {3.5.1\relax .\leavevmode@ifvmode \kern .5em }Oprogramowanie}{50}% -\contentsline {subsection}{\numberline {3.5.2\relax .\leavevmode@ifvmode \kern .5em }Zbi\IeC {\'o}r danych}{50}% -\contentsline {subsection}{\numberline {3.5.3\relax .\leavevmode@ifvmode \kern .5em }Wydobycie danych}{50}% -\contentsline {subsection}{\numberline {3.5.4\relax .\leavevmode@ifvmode \kern .5em }Trenowanie modelu}{51}% -\contentsline {subsection}{\numberline {3.5.5\relax .\leavevmode@ifvmode \kern .5em }Generowanie muzyki przy pomocy wytrenowanych modeli}{52}% -\contentsline {subsection}{\numberline {3.5.6\relax .\leavevmode@ifvmode \kern .5em }Wyniki}{54}% -\contentsline {chapter}{Podsumowanie}{59}% -\contentsline {chapter}{Bibliografia}{61}% +\contentsline {chapter}{Rozdzia\PlPrIeC {\l }\ 3\relax .\leavevmode@ifvmode \kern .5em Projekt}{35}% +\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}{36}% +\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}{36}% +\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}{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}{44}% +\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}{46}% +\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}{49}% +\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}{50}% +\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}{51}% +\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}{52}% +\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}{53}% +\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}{56}% +\contentsline {chapter}{Podsumowanie}{61}% +\contentsline {chapter}{Bibliografia}{63}% diff --git a/docs/images/general-midi.png b/docs/images/general-midi.png new file mode 100644 index 0000000..3dd5537 Binary files /dev/null and b/docs/images/general-midi.png differ