Poprawiono literówki, zamieniono encoder na enkoder

This commit is contained in:
Cezary Pukownik 2020-06-17 17:41:30 +02:00
parent fbaa07380e
commit 42080cbb09
7 changed files with 111 additions and 109 deletions

View File

@ -44,9 +44,9 @@
\@writefile{lof}{\contentsline {figure}{\numberline {1.6}{\ignorespaces Przyk\IeC {\l }ad modelu wielowarstwowej sieci neuronowej\relax }}{21}\protected@file@percent }
\newlabel{fig:neural_net_1}{{1.6}{21}}
\newlabel{section:backpropagation}{{1.5.1}{21}}
\@writefile{toc}{\contentsline {subsection}{\numberline {1.5.2\relax .\leavevmode@ifvmode \kern .5em }Autoencoder}{21}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {1.5.2\relax .\leavevmode@ifvmode \kern .5em }Autoenkoder}{21}\protected@file@percent }
\newlabel{section:autoencoder}{{1.5.2}{21}}
\@writefile{lof}{\contentsline {figure}{\numberline {1.7}{\ignorespaces Przyk\IeC {\l }ad modelu autoencodera\relax }}{22}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {1.7}{\ignorespaces Przyk\IeC {\l }ad modelu autoenkodera\relax }}{22}\protected@file@percent }
\newlabel{fig:autoencoder}{{1.7}{22}}
\@writefile{toc}{\contentsline {subsection}{\numberline {1.5.3\relax .\leavevmode@ifvmode \kern .5em }Rekurencyjne sieci neuronowe}{22}\protected@file@percent }
\newlabel{section:rnn}{{1.5.3}{22}}
@ -108,7 +108,7 @@
\@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 }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.4\relax .\leavevmode@ifvmode \kern .5em }Zakodowanie sekwencji}{50}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.4\relax .\leavevmode@ifvmode \kern .5em }Kodowanie sekwencji}{50}\protected@file@percent }
\@writefile{toc}{\contentsline {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}{52}\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 }
@ -118,7 +118,7 @@
\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}{58}}
\newlabel{fig:score10}{{3.5}{57}}
\newlabel{fig:score25}{{3.6}{58}}
\newlabel{fig:score50}{{3.7}{59}}
\newlabel{fig:score75}{{3.8}{59}}
@ -128,15 +128,15 @@
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\bibcite{survay}{1}
\bibcite{onehot}{2}
\bibcite{handson}{3}
\bibcite{deep_learning}{4}
\bibcite{seq2seq}{5}
\bibcite{analiza_mat}{6}
\bibcite{statystyka}{7}
\bibcite{tempos}{8}
\bibcite{deep_learning_2}{9}
\bibcite{seq2seq-keras}{10}
\bibcite{seq2seq-keras}{2}
\bibcite{onehot}{3}
\bibcite{handson}{4}
\bibcite{deep_learning}{5}
\bibcite{seq2seq}{6}
\bibcite{analiza_mat}{7}
\bibcite{statystyka}{8}
\bibcite{tempos}{9}
\bibcite{deep_learning_2}{10}
\@writefile{toc}{\contentsline {chapter}{Bibliografia}{63}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}

View File

@ -1,10 +1,10 @@
# Fdb version 3
["makeindex document.idx"] 1592398843 "document.idx" "document.ind" "document" 1592406827
"document.idx" 1592406795 0 d41d8cd98f00b204e9800998ecf8427e ""
["makeindex document.idx"] 1592398843 "document.idx" "document.ind" "document" 1592408443
"document.idx" 1592408434 0 d41d8cd98f00b204e9800998ecf8427e ""
(generated)
"document.ilg"
"document.ind"
["pdflatex"] 1592406794 "j:/_MAGISTERKA/praca-magisterska/docs/document.tex" "j:/_MAGISTERKA/praca-magisterska/docs/document.pdf" "document" 1592406827
["pdflatex"] 1592408437 "j:/_MAGISTERKA/praca-magisterska/docs/document.tex" "j:/_MAGISTERKA/praca-magisterska/docs/document.pdf" "document" 1592408443
"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 ""
@ -196,10 +196,10 @@
"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" 1592406799 12335 b6d638ea8c5e6b15d1a45e7f744026a3 ""
"document.aux" 1592408442 12333 d4eb3c9c8f4e0cdcae21f0327f146984 ""
"document.ind" 1592398843 0 d41d8cd98f00b204e9800998ecf8427e "makeindex document.idx"
"document.tex" 1592406826 94803 6727986e6e907d21f8189861063f2efb ""
"document.toc" 1592406799 5379 65d70d6a3f93873b4bbd09ce27d5b016 ""
"document.tex" 1592408431 94834 4ed947d88f630dfe6232db29d455af86 ""
"document.toc" 1592408442 5377 2fb0ecc4457bfa12bfcd8a2246d2a677 ""
"images/autoencoder.png" 1590441548 23857 e7e97c4ad164834bf8d9e2a1bef11905 ""
"images/gradient_descent_1_long.png" 1590441549 10075 3f2887989844779ae2c10639cdfbca6e ""
"images/gradient_descent_2_long.png" 1590441549 8705 4b42e8becdda3fb5896ce89581451166 ""
@ -228,14 +228,14 @@
"images/training_losses.png" 1592382149 57293 6eb12c89458f62456bc8b0860f6df331 ""
"images/wartosc_nut.jpg" 1590441554 48213 d311c2cedb2ed53dcf5eff20f70eda80 ""
"images/waveform_axis.png" 1592213328 15586 415de2db6755bd1d0d64273aaa86d16d ""
"j:/_MAGISTERKA/praca-magisterska/docs/document.aux" 1592406799 12335 b6d638ea8c5e6b15d1a45e7f744026a3 ""
"j:/_MAGISTERKA/praca-magisterska/docs/document.tex" 1592406826 94803 6727986e6e907d21f8189861063f2efb ""
"j:/_MAGISTERKA/praca-magisterska/docs/document.aux" 1592408442 12333 d4eb3c9c8f4e0cdcae21f0327f146984 ""
"j:/_MAGISTERKA/praca-magisterska/docs/document.tex" 1592408431 94834 4ed947d88f630dfe6232db29d455af86 ""
"pythonhighlight.sty" 1590660734 4822 44a39a68d852c9742af161f7166b2a03 ""
(generated)
"document.aux"
"document.log"
"document.pdf"
"document.idx"
"j:/_MAGISTERKA/praca-magisterska/docs/document.log"
"j:/_MAGISTERKA/praca-magisterska/docs/document.pdf"
"document.toc"
"document.idx"

View File

@ -1,4 +1,4 @@
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX) (preloaded format=pdflatex 2019.2.16) 17 JUN 2020 17:13
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX) (preloaded format=pdflatex 2019.2.16) 17 JUN 2020 17:40
entering extended mode
restricted \write18 enabled.
file:line:error style messages enabled.
@ -723,7 +723,12 @@ Overfull \hbox (4.86064pt too wide) in paragraph at lines 1215--1216
Underfull \vbox (badness 10000) has occurred while \output is active []
[48] [49] [50]
[48]
Overfull \hbox (1.23253pt too wide) in paragraph at lines 1234--1235
\OT4/cmr/m/n/12 one-hot (\OT4/cmr/m/it/12 one-hot en-co-ding\OT4/cmr/m/n/12 ) En-ko-do-wa-nie One-Hot jest wy-ko-rzy-sty-wa-ne w ucze-
[]
[49] [50]
Overfull \hbox (42.66057pt too wide) in paragraph at lines 1341--1342
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[]
@ -768,33 +773,28 @@ File: images/score_10.png Graphic file (type png)
<use images/score_10.png>
Package pdftex.def Info: images/score_10.png used on input line 1549.
(pdftex.def) Requested size: 398.33858pt x 200.99646pt.
<images/score_25.png, id=242, 578.91281pt x 307.1475pt>
[57 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_1.png (PNG copy)> <j:/_MAGISTERKA/praca-magisterska/docs/images/score_10.png (PNG copy)>]
<images/score_25.png, id=245, 578.91281pt x 307.1475pt>
File: images/score_25.png Graphic file (type png)
<use images/score_25.png>
Package pdftex.def Info: images/score_25.png used on input line 1558.
(pdftex.def) Requested size: 398.33858pt x 211.34148pt.
<images/score_50.png, id=243, 578.16pt x 307.90031pt>
<images/score_50.png, id=246, 578.16pt x 307.90031pt>
File: images/score_50.png Graphic file (type png)
<use images/score_50.png>
Package pdftex.def Info: images/score_50.png used on input line 1567.
(pdftex.def) Requested size: 398.33858pt x 212.13666pt.
<images/score_75.png, id=244, 588.69937pt x 310.15875pt>
<images/score_75.png, id=247, 588.69937pt x 310.15875pt>
File: images/score_75.png Graphic file (type png)
<use images/score_75.png>
Package pdftex.def Info: images/score_75.png used on input line 1576.
(pdftex.def) Requested size: 398.33858pt x 209.86871pt.
Underfull \vbox (badness 1337) has occurred while \output is active []
[57 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_1.png (PNG copy)>]
Underfull \vbox (badness 3849) has occurred while \output is active []
[58 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_10.png (PNG copy)> <j:/_MAGISTERKA/praca-magisterska/docs/images/score_25.png (PNG copy)>]
<images/score_100.png, id=251, 574.39594pt x 314.67563pt>
<images/score_100.png, id=248, 574.39594pt x 314.67563pt>
File: images/score_100.png Graphic file (type png)
<use images/score_100.png>
Package pdftex.def Info: images/score_100.png used on input line 1585.
(pdftex.def) Requested size: 398.33858pt x 218.23076pt.
[58 <j:/_MAGISTERKA/praca-magisterska/docs/images/score_25.png (PNG copy)>]
<images/score_150.png, id=252, 580.41844pt x 300.3722pt>
File: images/score_150.png Graphic file (type png)
<use images/score_150.png>
@ -806,15 +806,15 @@ Package pdftex.def Info: images/score_150.png used on input line 1592.
] (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:
16794 strings out of 492616
311504 string characters out of 6131816
16792 strings out of 492616
311476 string characters out of 6131816
660831 words of memory out of 5000000
20345 multiletter control sequences out of 15000+600000
20343 multiletter control sequences out of 15000+600000
27095 words of font info for 80 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
55i,12n,50p,1576b,1971s stack positions out of 5000i,500n,10000p,200000b,80000s
{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plit.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/pltt.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plrm.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plms.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plmi.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plme.enc}{c:/software/latex/texmf-dist/fonts/enc/dvips/pl/plsc.enc}<c:/software/latex/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbsy10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plbx8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plcsc10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plex10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi6.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmi8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plmib10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr7.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plr8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsltt10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsy10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plsy8.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plti10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/plti12.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/pltt10.pfb><c:/software/latex/texmf-dist/fonts/type1/public/pl/pltt12.pfb>
Output written on j:/_MAGISTERKA/praca-magisterska/docs/document.pdf (63 pages, 1024286 bytes).
Output written on j:/_MAGISTERKA/praca-magisterska/docs/document.pdf (63 pages, 1024299 bytes).
PDF statistics:
352 PDF objects out of 1000 (max. 8388607)
221 compressed objects within 3 object streams

Binary file not shown.

Binary file not shown.

View File

@ -162,11 +162,11 @@ 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 multiintrumentalnych 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 multi instrumentalnych klipów muzycznych.
Główna częśc pracy została poprzedzona wprowadzeniem do tematu sieci neuronowych oraz teorii muzyki, w celu lepszego zrozumienia omawianego tematu. W rozdziale~\ref{section:nets} przeznaczonym teori 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 sequance-to-sequance. W rozdziale~\ref{section:music} poświęcionym teorii muzyki autor odróżnia dwa pojęcia, muzykę w rozumieniu fizycznego zjawiska, oraz muzykę symboliczną jaką obiekt abstraktycjny. Następnie zostały opisane podstawowe obiekty muzyczne oraz przedstawiony protokół MIDI. Protokół MIDI jest międzynarodowym standardem komunikacji intrumentów muzycznych a w formie plików przechowuje informacje o muzyce w formie podobnej do zapisu nutowego. Pliki midi zostały wykorzysane jako źródło informacji dla sieci nauronowej.
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.
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 intrumenty 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 zostaje zaproponowane kodowanie muzyki jako sekwencje zdarzeń, nazwywanych w pracy ,,muzycznymi słowami'', gdzie każde słowo posiada informacje o wysokości i długości trwania dzwięku, akordu lub pauzy. Następnie zostaje zademontrowana architektura modelu wraz z jej implementacją w języku Python z wykorzystaniem biblioteki Keras oraz szczegóły opis procesu przygotowania danych dla modelu.
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.
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.
@ -176,7 +176,7 @@ W dalszej części tego samego rozdziału zostaje omówiony przykład wykorzysta
In the master's thesis titled "Music generation with deep learning`", an example of a neural network was proposed whose purpose is to generate short multi-instrumental music clips.
The main part of the work was preceded by an introduction to the topic of neural networks and music theory in order to better understand the subject. In the~\ref{section:nets} chapter dedicated to the theory of neural networks, the author presents how to expand linear regression to obtain a neural network model, and presents recursive neural networks, LSTM cells and the sequance-to-sequance model. In the chapter~\ref{section:music} devoted to the theory of music, the author distinguishes two concepts, music in the understanding of a physical phenomenon, and symbolic music as an abstract object. Then the main music concepts were described and the MIDI protocol was presented. The MIDI protocol is an international standard for communication of musical instruments and in the form of files stores information about music in a form similar to sheet music. MIDI files have been used as a source of information for the neural network.
The main part of the work was preceded by an introduction to the topic of neural networks and music theory in order to better understand the subject. In the~\ref{section:nets} chapter dedicated to the theory of neural networks, the author presents how to expand linear regression to obtain a neural network model, and presents recursive neural networks, LSTM cells and the sequence-to-sequence model. In the chapter~\ref{section:music} devoted to the theory of music, the author distinguishes two concepts, music in the understanding of a physical phenomenon, and symbolic music as an abstract object. Then the main music concepts were described and the MIDI protocol was presented. The MIDI protocol is an international standard for communication of musical instruments and in the form of files stores information about music in a form similar to sheet music. MIDI files have been used as a source of information for the neural network.
The main part of the work is presented in chapter~\ref{section:project}. The author compares music to the spoken language and various instruments to different languages of the world. Therefore, the architecture used for machine translation of languages was used to generate music. The work proposes encoding music as a sequence of events, called in the work "musical words", where each word has information about the pitch and length of the sound, chord or pause. Then the model architecture is demonstrated with its implementation in Python using the Keras library and a detailed description of the data preparation process for the model.
@ -190,7 +190,7 @@ The rest of this chapter discusses an example of using the proposed model to gen
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 zademontruję na przykładowym zbiorze danych zademontruję proces ich przetworzenia, uczenia modelu oraz generowania muzyki. Na końcu zademontruję 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
@ -438,22 +438,22 @@ The rest of this chapter discusses an example of using the proposed model to gen
Kiedy używamy jednokierunkowych sieci neuronowych, zasilamy je danymi wejściowymi $x$ ostatecznie otrzymując predykcję $\hat{y}$. Taki sposób działania nazywa się propagacją wprzód (\textit{ang. forward propagation}). Podczas uczenia sieci kontynuuje się ten proces obliczając koszt $J(h)$. Propagacja wsteczna (\textit{ang. back-propagation}) pozwala na przepływ informacji od funkcji kosztu wstecz sieci neuronowej, aby ostatecznie obliczyć gradient. Zasada działania algorytmu propagacji wstecznej błędu polega na sukcesywnym aktualizowaniu wag i biasów oraz przesyłaniu wstecz po warstwach sieci. Dzięki temu jesteśmy w stanie wyuczyć sieć oraz obliczyć optymalne wagi i biasy dla całej sieci neuronowej.
\subsection{Autoencoder}
\subsection{Autoenkoder}
\label{section:autoencoder}
Autoencoder jest szczególnym przypadkiem sieci neuronowej. Posiada jedną warstwę ukrytą, a rozmiar warstwy wejściowej musi być równy rozmiarowi warstwy wyjściowej, tworząc w ten sposób symetryczną sieć, której kształt przypomina klepsydrę. Przykład autoencodera przedstawiono na rysunku~\ref{fig:autoencoder}.
Autoenkoder jest szczególnym przypadkiem sieci neuronowej. Posiada jedną warstwę ukrytą, a rozmiar warstwy wejściowej musi być równy rozmiarowi warstwy wyjściowej, tworząc w ten sposób symetryczną sieć, której kształt przypomina klepsydrę. Przykład autoenkodera przedstawiono na rysunku~\ref{fig:autoencoder}.
\begin{figure}[!htb]
\centering
\includegraphics[width=8cm]{images/autoencoder.png}
\caption{Przykład modelu autoencodera}
\caption{Przykład modelu autoenkodera}
\label{fig:autoencoder}
\end{figure}
Podczas uczenia autoencodera 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 autoencoder jest zmuszony do wydobycia istotnych cech danych wejściowych, skompresowania, a następnie jak najwierniejszego ich odtworzenia. Część kompresująca dane nazywana jest encoderem, natomiast część dekompresująca decoderem.
Cechy, które zostały odkryte przez autoencoder nazywane są zmiennymi utajnionymi (\textit{ang. latent variables}). Zarówno encoder jak i dekoder można wyodrębnić z autoencodera i wykorzystywać go jako osobną sieć neuronową.
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ą decodera jest jego generatywny charakter, ponieważ dostarczając zupełnie nowe informacje jako zmienne wejściowe, decoder odtworzy 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, decoder otworzy je na podobieństwo danych, na których został nauczony.
\subsection{Rekurencyjne sieci neuronowe}
\label{section:rnn}
@ -535,7 +535,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, encoder i decoder. 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 encodera, podobnie jak zostało to opisane w rozdziale~\ref{section:autoencoder} o autoencoderze, jest wydobycie z wektora wejściowego najistotniejszych informacji i skompresowanie ich. Następnie wektor stanu encodera jest przekazywany do decodera, który
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
na jego podstawie rekonstruuje sekwencję.
\begin{figure}[!htb]
@ -649,8 +649,8 @@ 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ły}
O interwałach mówimy, kiedy porównoujemy ze sobą dwie nuty. Interwał jest to odległość między nutami, liczona w półnutach. Półnuta jest to najmniejsza odległość miedzy 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 miedzy 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.
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{Oktawy}
@ -735,13 +735,13 @@ 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 technicze dotyczące przygotowania danych uczących dla modelu. Natępnie zdefiniuję model i rozwinę 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 model i rozwiń opis modelu sequence-to-sequence. W tym rozdziale będę również zamieszczał fragmentu kodu napisanego 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.
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ącymi. 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 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.
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.
@ -765,7 +765,7 @@ note_on channel=0 note=60 velocity=0 time=0
((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 zwiększy liczbę możliwych ,,słów muzycznych'' w słowniku i zwiększy złożoność obliczeniową. Zdecydowałem się na niewykorzystanie tych danych w generowaniu muzyki.
W ten sposób jesteśmy w stanie kodować melodię w sekwencji słów muzycznych. Tak skonstruowane dane mają niestety swoje negatywne aspekty. Nie da się w ten sposób zapisać partii, w której zostaje grana nowa nuta gdy poprzednia jeszcze powinna brzmieć. Nasz zapis zakłada, że melodia jest grana element po elemencie i nowy element wymusza zakończenie poprzedniego. Nie przechowujemy również informacji o dynamice melodii (głośności). Rozszerzenie tego zapisu o informacje o głośności nie jest trudne i nie będzie wymagać przebudowy modelu, natomiast wraz ze wzrostem liczby możliwych ,,słów muzycznych'' w słowniku i zwiększa złożoność obliczeniową. Zdecydowałem się na niewykorzystanie tych danych w generowaniu muzyki.
\subsection{Konwersja MIDI na sekwencje słów muzycznych}
@ -1052,15 +1052,15 @@ Funkcja sprawdza liczbę pojedynczych nut i akordów w ścieżce oraz zagęszcze
\section{Definicja modelu}
\label{section:model}
Wszystkie modele sieci neuonowych zastosowane w tej pracy, zostały napisane z wykorzystaniem środowiska Keras. Keras jest to środowisko wyższego poziomu, służące do tworzenia modelu głębokiego uczenia.
Wszystkie modele sieci neuronowych zastosowane w tej pracy, zostały napisane z wykorzystaniem środowiska Keras. Keras jest to środowisko wyższego poziomu, służące do tworzenia modelu głębokiego uczenia.
Model sequence-to-sequence, jest to model składający się z dwóch mniejszych sieci neuronowych, enkodera i dekodera. Dodatkowo inaczej definiuje się model aby go uczyć, a inaczej aby dokowyać predycji.
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{Zdefiniowanie warstw enkodera}
\subsubsection{Definiowanie warstw enkodera}
Zadaniem enkodera jest wydobycie z przetwarzanej sekwekcji 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 =
@ -1075,13 +1075,13 @@ self.encoder_outputs, self.state_h, self.state_c =
self.encoder_states = [self.state_h, self.state_c]
\end{python}
Ostatecznie jako dane wyjsciowe otrzymujemy wektor danych ukrytych \pyth{encoder_outputs} o wymiarze równym ustalonej zmiennej \pyth{latent_dim}. Dodatkowo uzywając parametru \pyth{return_state=True}, warstwa LSTM zwraca wektory stanu komórek $h$ oraz $c$. Te wektory są pamięcią wartswy 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 wekory zostały zapisane do jednej zmiennej \pyth{self.encoder_states}.
Oba wektory zostały zapisane do jednej zmiennej \pyth{self.encoder_states}.
\subsubsection{Zdefiniowanie warstw dekodera}
\subsubsection{Definiowanie warstw dekodera}
W części dekodera sieci sequance-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$ 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.
\begin{python}
self.decoder_inputs =
@ -1107,7 +1107,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 mozna przedstawić jako graf tak jak pokazano to na rysunku~\ref{fig:training-model}
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}
\begin{figure}[!htb]
\centering
@ -1126,19 +1126,19 @@ self.train_model.compile(optimizer='rmsprop',
loss='categorical_crossentropy')
\end{python}
Możemy zauważyć, że w procesie uczenia musimy zaprezentować modelowi dwa wektory danych wejsciowych oraz jednego wektora danych wyjściowych. W pracy zostały one opisane jako:
Możemy zauważyć, że w procesie uczenia musimy zaprezentować modelowi dwa wektory danych wejściowych oraz jednego wektora danych wyjściowych. W pracy zostały one opisane jako:
\begin{itemize}
\item \pyth{encoder_input_data}, zawierające sekwencję elementów wejściowych. Te dane będą zasilać encoder aby na ich podstawie został wygenerowany kontekst.
\item \pyth{decoder_input_data}, zawierające sekwencje elementów wyjściowych opóźnione o jeden element w czasie. Te dane będą zasilały dekoder.
\item \pyth{decoder_target_data}, zawierające sekwencje elementów wyjściowych, które bedą celem.
\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 sekwecji 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 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.
\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 nastepująco, a graf przedstawiający dekoder w trybie uczenia zostal 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 wtedy wygląda następująco, a graf przedstawiający dekoder w trybie uczenia został przedstawiony na rysunku~\ref{fig:inference-decoder}.
\begin{python}
@ -1223,15 +1223,15 @@ def predict(self, input_seq=None, mode=None):
Encoder 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 encodera 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, 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].
\section{Transformacja danych dla modelu}
Na podstawie definicji modelu wiemy, że należy przygotować trzy zestawy danych aby móc wytrenowac model. Dwa zestawy danych wejściowych i jeden zestaw danych wyjściowych. Musimy również zakodować sekwencje elementów w taki sposób aby można było wykonywac na nich obliczenia.
Na podstawie definicji modelu wiemy, że należy przygotować trzy zestawy danych aby móc wytrenować model. Dwa zestawy danych wejściowych i jeden zestaw danych wyjściowych. Musimy również zakodować sekwencje elementów w taki sposób aby można było wykonywać na nich obliczenia.
\subsection{Enkodowanie one-hot}
Kazdy element sekwencji jest osobną kategorią, dlatego dane należy potraktować tak jak dane kategorycznym. Wykorzystamy w tym celu enkodowanie one-hot (\textit{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{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}.
\subsubsection{Przykład działania One-Hot Encoding}
@ -1262,7 +1262,7 @@ Kodując słowo MATEMATYKA, otrzymalibyśmy macierz
\subsection{Słownik}
Aby zakodować sekwencje musimy utowrzyć słownik, w którym każdy element będzie posiadał unikatowy indeks.
Aby zakodować sekwencje musimy stworzyć słownik, w którym każdy element będzie posiadał unikatowy indeks.
\begin{python}
x_vocab = set([note for seq in x_train for note in seq])
@ -1277,7 +1277,7 @@ self.y_vocab = ['<GO>','<EOS>']
self.y_vocab.extend(sorted(list(y_vocab)))
\end{python}
Następnie tworzymy obiekty typu \pyth{dictionary}, aby zmapować elementy sekwncji 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. W tym momencie tworzymy również słowniki odwrotne, aby móc później otrzymane wyniki zamienić na z powrotem na muzyczne słowa.
\begin{python}
self.x_transform_dict = dict(
@ -1292,7 +1292,7 @@ self.y_reverse_dict = dict(
\subsection{Elementy specjalne}
Dodaje się dwóch elementów specjalnych. Te elementy mają za zadanie oznaczenie początku i końca sekwencji. Token początku senwekcji zazwyczaj oznaczany jest jako \pyth{<SOS>} (\textit{ang. start of sequance}). Można spotkać również inne oznaczenia,np. \pyth{<GO>} lub \pyth{<s>}. Ten element ma na celu wypełnienie przestrzenie pierwszego pustego miejsca w danych wejściowych dla dekodera. Token końca sekwecji oznaczany jako \pyth{<EOS>} (\textit{ang. start of sequance}) lub \pyth{</s>}. Ten element jest wykorzystywany aby wywołać warunek stopu w procesie predykcji opisanym w rozdziale~\ref{section:inference-model}.
Dodaje się dwóch elementów specjalnych. Te elementy mają za zadanie oznaczenie początku i końca sekwencji. Token początku sekwencji zazwyczaj oznaczany jest jako \pyth{<SOS>} (\textit{ang. start of sequence}). Można spotkać również inne oznaczenia,np. \pyth{<GO>} lub \pyth{<s>}. Ten element ma na celu wypełnienie przestrzeni pierwszego pustego miejsca w danych wejściowych dla dekodera. Token końca sekwencji oznaczany jako \pyth{<EOS>} (\textit{ang. start of sequence}) lub \pyth{</s>}. Ten element jest wykorzystywany aby wywołać warunek stopu w procesie predykcji opisanym w rozdziale~\ref{section:inference-model}.
\begin{python}
_y_train = []
@ -1304,7 +1304,7 @@ for i, seq in enumerate(y_train):
_y_train[i].append('<EOS>')
\end{python}
\subsection{Zakodowanie sekwencji}
\subsection{Kodowanie sekwencji}
Ostatecznie tworzymy tensory o rozmiarach $n$ x $s$ x $p$, gdzie $n$ jest liczbą obserwacji \pyth{len(x_train)}, $s$ jest maksymalną liczbą elementów w sekwencji \pyth{self.x_max_seq_length} a $p$ jest rozmiarem słownika, czyli liczbą cech \pyth{self.x_vocab_size}.
@ -1343,27 +1343,27 @@ for i, (x_train, y_train) in enumerate(zip(x_train, y_train)):
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 uczacego. Nie wpływa to jednak na same sekwencję ponieważ podczas predykcję kończymy w momencie wygenerowania tokenu \pyth{<EOS>}.
Warto zwrócić uwagę, że przed opisaną transformacją sekwencje były różnej długości a po niej, rozmiar sekwencji został rozszerzony do rozmiaru sekwencji posiadającej najwięcej elementów. Taki zabieg był niezbędny ponieważ rozmiar sieci neuronowej jest stały dla wszystkich prób ze zbioru uczącego. Nie wpływa to jednak na same sekwencję ponieważ podczas predykcję kończymy w momencie wygenerowania tokenu \pyth{<EOS>}.
\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.
\subsection{Oprogramowanie}
Stworzone przeze mnie oprogramowanie, napisane w języku Python, składa się z 2 bibiotek oraz 3 skryptów.
Stworzone przeze mnie oprogramowanie, napisane w języku Python, 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 postacji sekwencji.
\item \pyth{train.py} - wykonując ten skrypt wykorzystujemy wygenerowane dane, aby wytrenować zestaw sieci neuronych.
\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 ekperymentó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 oraz 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 Offstring. 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
@ -1376,7 +1376,7 @@ W omawianym przykładzie wykorzystałem zbiór wybranych utworów midi zespołu
\end{itemize}
\subsection{Wydobycie danych}
Aby wydobyć dane z plików midi wykorzystamy skypt \pyth{extract.py}. Można uzyć 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 plików midi.
% 100\%|███████████████████████████████████| 7/7 [00:01<00:00, 3.67it/s]
\begin{python}
@ -1388,11 +1388,11 @@ Aby wydobyć dane z plików midi wykorzystamy skypt \pyth{extract.py}. Można uz
1 of Organ
\end{python}
Dzięki temu możemy zaobserować że w procesowanym 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 instrment będzie generatorem oraz jakie będą zalezności między partiami w zespole sieci neuronowych.
Na tym etapie musimy zdecydować, który instrument będzie generatorem oraz jakie będą zależności między partiami w zespole sieci neuronowych.
W tym przykładzie, zdecydowałem że gitara będzie generowana na podstawie losowego wektora, a melodia, bass oraz perkusja będe 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 gitary.
Uruchamiajać skrypt \pyth{extract.py} bez flagi \pyth{-a} zdefiniujemy omawiany przepływ za pomocą prostego konfiguratora.
@ -1430,7 +1430,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 nastepnym kroku zostaną wytrenowane czrety sieci neuronowe, po jednej dla każdego intrumentu.
Na podstawie takiego zbioru danych, w następnym kroku zostaną wytrenowane cztery sieci neuronowe, po jednej dla każdego instrumentu.
\subsection{Trenowanie modelu}
@ -1463,7 +1463,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 oraz testowego zaprezentowane zostały na rysunku~\ref{fig:losses}.
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}.
\begin{figure}[!htb]
\centering
@ -1474,7 +1474,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 wekorem 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 intrmentów, a tempo utworu domyślnie ustawione jest na 120 BPM. Możemy również zdecydować, czy zasilenie 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ę. 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}).
\begin{python}
>>> python generate.py offspring --i 10 --m from_state
@ -1485,9 +1485,9 @@ Generating music...
Done.
\end{python}
Parametr \pyth{--i} służy do okreslenia 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 patrii to odpowiednich modeli wykonywane jest przy pomocy poniższego fragmenu kodu.
Przekazywanie wygenerowanych partii to odpowiednich modeli wykonywane jest przy pomocy poniższego fragmentu kodu.
\begin{python}
notes = dict()
@ -1503,8 +1503,8 @@ Przekazywanie wygenerowanych patrii to odpowiednich modeli wykonywane jest przy
notes[instrument] = model.predict(input_data)[:-1]
\end{python}
Słownik \pyth{band} przechowuje dane dotyczące całego zespołu modeli. Zmienna \pyth{intrument} jest nazwą intrumentu, \pyth{model} przechowuje obiekt modelu \\
sequance-to-sequance, \pyth{program} jest liczbą naturalną odpowiającą programowi MIDI z kolekcji GM a \pyth{generator} to nazwa intrumentu na podstawie którego powinna zostać wygenerowana kolejna partia intrumentalna.
Słownik \pyth{band} przechowuje dane dotyczące całego zespołu modeli. Zmienna \pyth{instrument} jest nazwą instrumentu, \pyth{model} przechowuje obiekt modelu \\
sequence-to-sequence, \pyth{program} jest liczbą naturalną odpowiadającą programowi MIDI z kolekcji GM a \pyth{generator} to nazwa instrumentu na podstawie którego powinna zostać wygenerowana kolejna partia instrumentalna.
Kompilacja do MIDI zachodzi z wykorzystaniem klas biblioteki \\
\pyth{midi_processing.py}, które wspierają format sekwencji słów muzycznych omówionych w rozdziale ~\ref{section:midi_words}.
@ -1533,7 +1533,7 @@ W ten sposób pomyślnie zostały wygenerowane fragmenty muzyczne przy pomocy g
Przedstawię wybrane fragmenty wygenerowanych utworów w zapisie nutowym dla kolejnych etapów uczenia. Krótko scharakteryzuję każdy fragment oraz opowiem jakie ulepszenia pojawiały się wraz z postępem treningu. Wszystkie przedstawione poniżej utwory zostały wygenerowane przy pomocy metody \pyth{from_seq}.
Utwór przedstawiony na rysunku~\ref{fig:score1} został wygenerowany po pierwszej epoce. Model wygenerował tylko pauzy dla ścieżki gitary, dlatego nie został on umieszony na rysunku. Wszystkie partie są bardzo powtarzalne za wyjątkiem kilku wariacji, jakby w losowych miejsach. Melodia zaczęła od dzwięku C a w trzecim takcie przeszła na dzwięk D. Linia basu jednostajnie gra dzwięk C.
Utwór przedstawiony na rysunku~\ref{fig:score1} został wygenerowany po pierwszej epoce. Model wygenerował tylko pauzy dla ścieżki gitary, dlatego nie został on umieszczony na rysunku. Wszystkie partie są bardzo powtarzalne za wyjątkiem kilku wariacji, jakby w losowych miejsach. Melodia zaczęła od dźwięku C a w trzecim takcie przeszła na dźwięk D. Linia basu jednostajnie gra dźwięk C.
\begin{figure}[!htb]
\centering
@ -1542,7 +1542,7 @@ Utwór przedstawiony na rysunku~\ref{fig:score1} został wygenerowany po pierwsz
\label{fig:score1}
\end{figure}
Po dziesięciu epokach treningu melodia dalaj 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 dziwię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 dzwięku C, co pomimo ponnotonnej 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 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.
\begin{figure}[!htb]
\centering
@ -1551,7 +1551,7 @@ Po dziesięciu epokach treningu melodia dalaj wygląda na bardzo powtarzalną, j
\label{fig:score10}
\end{figure}
Piętnaście epok później, na rysunku~\ref{fig:score25} model generujący gitarę nie nauczył się niczego więcej. Perkusja zaczęła generować partię przypominającą prawdziwą perkusję składająca sie z wygrywanych naprzemiennie stopy i werbla. Melodia zaczęła tworzyć ciekawsze partie, wykorzystując nuty różnej długości i wysokości. Bas, który podąża za gitarą również spełnia swoją muzyczną funkcję. Cały utwór jest muzycznie poprawny.
Piętnaście epok później, na rysunku~\ref{fig:score25} model generujący gitarę nie nauczył się niczego więcej. Perkusja zaczęła generować partię przypominającą prawdziwą perkusję składająca się z wygrywanych naprzemiennie stopy i werbla. Melodia zaczęła tworzyć ciekawsze partie, wykorzystując nuty różnej długości i wysokości. Bas, który podąża za gitarą również spełnia swoją muzyczną funkcję. Cały utwór jest muzycznie poprawny.
\begin{figure}[!htb]
\centering
@ -1560,7 +1560,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 dzwię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 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.
\begin{figure}[!htb]
\centering
@ -1569,7 +1569,7 @@ Na rysunku~\ref{fig:score50} przedstawiono utwór po pięćdziesięciu epokach.
\label{fig:score50}
\end{figure}
Po siedemdziesięciu pięciu epokoach 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ążac za gitarą. Pokazano opisaną sytuację na rysunku~\ref{fig:score75}.
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}.
\begin{figure}[!htb]
\centering
@ -1578,7 +1578,7 @@ Po siedemdziesięciu pięciu epokoach uczenia, generowany utwory zaczęły być
\label{fig:score75}
\end{figure}
Na rysunku~\ref{fig:score100} i rysunku~\ref{fig:score150} przedstawiono odpowiednio wygenerowane utwory po stu i stu pięćdziesięciu epokach uczenia. Po setnej epoce możemy zobaczyć że po drugim takcie nastąpiła zmiana, gitara przeszła z melodii na akordy, natomiast najciekawsza rzecz wydarzyła się po epoce sto pięćdziesiątej. Gitara po drugim takcie zmianiła melodię na akordy i sworzyła ich progresję. Model perkucji wychwycił tą zmianę i takcie drugim zmienił sposób grania tak, aby zaakcentować przejście na akordy w trzecim takcie. Melodia po przejćiu zamilkła, a bas podąża dzwiękami za melodią.
Na rysunku~\ref{fig:score100} i rysunku~\ref{fig:score150} przedstawiono odpowiednio wygenerowane utwory po stu i stu pięćdziesięciu epokach uczenia. Po setnej epoce możemy zobaczyć że po drugim takcie nastąpiła zmiana, gitara przeszła z melodii na akordy, natomiast najciekawsza rzecz wydarzyła się po epoce sto pięćdziesiątej. Gitara po drugim takcie zmieniła melodię na akordy i stworzyła ich progresję. Model perkusji wychwycił tą zmianę i takcie drugim zmienił sposób grania tak, aby zaakcentować przejście na akordy w trzecim takcie. Melodia po przejściu zamilkła, a bas podąża dźwiękami za melodią.
\begin{figure}[!htb]
\centering
@ -1596,16 +1596,18 @@ Na rysunku~\ref{fig:score100} i rysunku~\ref{fig:score150} przedstawiono odpowie
\chapter*{Podsumowanie}
Celem pracy było zaprezentowanie modelu, który byłby wstanie generować krkie multiinstrumentalne utwory muzyczne. Sądzę że cel pracy został osiegnięty. Model potrafi uczyć sie 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ł. 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.
Pomimo, że zaprezentowany prze zemnie model posiada potencjał nie sądzę aby mogł on zastąpić ludzi w produkcji muzyki. Natomiast uważam, że mógłby zainspirować muzyków krótkim utworem, który następnie mogłby zostać rozbudowany przez nich do pełnego utworu.
Pomimo, że zaprezentowany przeze mnie model posiada potencjał nie sądzę aby mógł on zastąpić ludzi w produkcji muzyki. Natomiast uważam, że mógłby zainspirować muzyków krótkim utworem, który następnie mógłby zostać rozbudowany przez nich do pełnego utworu.
Temat produkcji muzyki przez sztuczną inteligencję jest temat ciekawym jak również mocno złożonym i skomplikowanym. Istenieje wiele kwesji, które nie zostały poruszone w pracy jak generowanie tekstu piosenki, dobranie brzmienia intrumentów czy struktury utworu a z którymi muzycy potrafią sobie świetnie dać radę. Dlatego jest jeszcze miesce na rozwój tej dziedziny sztucznej inteligencji w przyszłości.
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.
\begin{thebibliography}{99}
\begin{thebibliography}{99}
\bibitem{survay} Briot, J.P., Hadjeres, G., Pachet, F.D. (2019): {\em Deep Learning Techniques for Music Generation - A Survey. arXiv:1709.01620v3}
\bibitem{seq2seq-keras} Brownlee, J. (2017): {\em How to Develop a Seq2Seq Model for Neural Machine Translation in Keras, machinelearningmastery.com}
\bibitem{onehot} DeepAI (2019): {\em One Hot Encoding}
\bibitem{handson} Géron, A. (2019): {\em Hands-on machine learning with scikit-learn, keras and TensorFlow. O'Reilly.}
@ -1622,12 +1624,11 @@ Na rysunku~\ref{fig:score100} i rysunku~\ref{fig:score150} przedstawiono odpowie
\bibitem{deep_learning_2} Zocca, V., Spacagna, G., Slater, D., Roelants, P. (2018): {\em Deep Learning. Uczenie głębokie z językiem Python. Helion.}
\bibitem{seq2seq-keras} Brownlee, J. (2017): {\em How to Develop a Seq2Seq Model for Neural Machine Translation in Keras, machinelearningmastery.com}
% https://machinelearningmastery.com/define-encoder-decoder-sequence-sequence-model-neural-machine-translation-keras/
% \footnote{Statystyka, Mieczysław Sobczyk s.179}
% \footnote{źródlo: Analiza matematyczna, Krysicki Włodarski, s.187 }
% \footnote{źródło: Analiza matematyczna, Krysicki Włodarski, s.187 }
% \footnote{Deep Learning techniques for music geneation - A survay s.44}
% \footnote{Deep Learning Book, s.66}
% \footnote{Deep Learning techniques for music geneation - A survay s.63}
@ -1647,3 +1648,4 @@ Na rysunku~\ref{fig:score100} i rysunku~\ref{fig:score150} przedstawiono odpowie
\end{document}

View File

@ -11,7 +11,7 @@
\contentsline {section}{\numberline {1.4\relax .\leavevmode@ifvmode \kern .5em }Funkcje aktywacji}{19}%
\contentsline {section}{\numberline {1.5\relax .\leavevmode@ifvmode \kern .5em }Wielowarstwowe sieci neuronowe}{19}%
\contentsline {subsection}{\numberline {1.5.1\relax .\leavevmode@ifvmode \kern .5em }Jednokierunkowe sieci neuronowe}{20}%
\contentsline {subsection}{\numberline {1.5.2\relax .\leavevmode@ifvmode \kern .5em }Autoencoder}{21}%
\contentsline {subsection}{\numberline {1.5.2\relax .\leavevmode@ifvmode \kern .5em }Autoenkoder}{21}%
\contentsline {subsection}{\numberline {1.5.3\relax .\leavevmode@ifvmode \kern .5em }Rekurencyjne sieci neuronowe}{22}%
\contentsline {subsection}{\numberline {1.5.4\relax .\leavevmode@ifvmode \kern .5em }LSTM}{23}%
\contentsline {subsection}{\numberline {1.5.5\relax .\leavevmode@ifvmode \kern .5em }Sequence-to-sequence}{26}%
@ -37,7 +37,7 @@
\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 }Zakodowanie sekwencji}{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}{52}%
\contentsline {subsection}{\numberline {3.5.2\relax .\leavevmode@ifvmode \kern .5em }Zbi\IeC {\'o}r danych}{52}%