Všechen SQL kód potřebný ke vytvoření databáze je v adresáři sql/ v těchto souborech:
JR - Procedury a funkce pro DP.sql
JR - Tabulky s importovanými daty pro DP.sql
JR - Tabulky s převedenými daty pro DP.sql
NN - Procedury a funkce pro DP.sql
NN - Tabulky s daty.sql
Soubory s předponou NN
obsahují SQL pro rekonstrukci
implementace neuronových sítí. Soubory s předponou JR
obsahují SQL pro vytvoření databáze jízdních řádů a příslušných
uložených procedur.
Další dva soubory obsahují ukázkové naučené neuronové sítě:
JR NN - Naučená síť pro zastávku 5.sql
NN - Naučená síť XOR.sql
Nejprve je třeba nainstalovat standardní distribuci MySQL 5.0 nebo vyšší (stahujte zde).
Poté je třeba vytvořit dvě databáze a nastavit uživatelská práva pro
uživatele, který je bude používat. Následující kód vytvoří databáze
neural_network
a jizdnirady_cb
a nastaví veškerá
práva k nim uživateli OndrejZizka
, který se může připojit
odkudkoliv (‚%‘):
CREATE DATABASE neural_network; CREATE DATABASE jizdnirady_cb; GRANT ALL ON neural_network.* TO OndrejZizka@'%' IDENTIFIED BY 'BezpecneHeslo'; GRANT ALL ON jizdnirady_cb.* TO OndrejZizka@'%' IDENTIFIED BY 'BezpecneHeslo';
Tyto úkony lze pohodlně provést v GUI nástroji MySQL Administrator, případně vykonat SQL příkazy v nástroji MySQL Query Browser, viz níže.
SQL skripty jsou vytvořené nástrojem MySQL Administator, oficiálním nástrojem pro administraci databázového systému MySQL (stahujte zde).
Nejsnazší cesta, jak z nich vytvořit svoji kopii databáze, je použít právě tento nástroj. Nezkoušejte načíst procedury v nástroji phpMyAdmin – ten je plný chyb a nezvládne skripty správně přeparsovat.
Pozor! Pokud se vaše databáze pro neuronové sítě
nejmenuje neural_network
, je nutné ručně upravit SQL
skript ukládaných procedur pro databázi jízdní řády! Toto se
bohužel nedá v současné verzi MySQL nijak obejít.
Úpravu proveďte takto:
JR - Procedury a funkce pro DP.sql
v editoru,
který zvládá kódování UTF-8 bez signatury (pro Windows např. Visual
Studio nebo PSpad).neural_network.
názvem
vaší databáze a tečkou.Poté upravenou verzi skriptu načtěte do MySQL místo původní verze.
Výše jmenovaný balík GUI nástrojů zahrnuje také MySQL Query Browser, šikovný nástroj pro práci s databázovým systémem MySQL.
Výčet jeho vlastností a dovedností je dlouhý. My se pro účely demonstrace kódu této diplomové práce omezíme na podstatné.
Po spuštění stiskněte F11
– to zvětší konzoli pro SQL
příkazy.
Nejprve předznamenejme, že MySQL používá koncept „aktuálně vybrané databáze“. Pokud voláte nějakou proceduru nebo pracujete s tabulkou, ujistěte se, že buď používáte plně kvalifikované jméno, nebo se daný objekt nachází ve vybrané databázi.
SQL příkazy vykonáváte tak, že na něj najedete kurzorem (nikoliv ukazatelem myši) a stisknete Ctrl + Enter. Výsledek (resultset) se zobrazí v dolní části
Můžete prozkoumat obsah tabulek jízdních řádů těmito SQL příkazy:
SELECT * FROM mhd_jizdy LIMIT 100; SELECT * FROM mhd_jizdy_stani LIMIT 100; SELECT * FROM mhd_linky; SELECT * FROM mhd_kody; SELECT * FROM mhd_trasy LIMIT 100; SELECT * FROM mhd_trasy_uzly LIMIT 100; SELECT * FROM mhd_zast LIMIT 100;
Zde je například výpis zastávek a jejich geografických pozic:
Po importu dat z výše uvedených souborů obsahují tabulky všechna data jízdních řádů, na kterých jsme kód testovali.
Z tabulek je možné vhodnými SELECTy získat jakékoliv informace, které chceme znát – například:
Zde je ukázka výpisu všech linek projíždějících zastávkou Žižkova:
Tabulky neuronových sítí prozkoumáte takto:
SELECT * FROM neural_network.nn_networks; SELECT * FROM neural_network.nn_net_neurons; SELECT * FROM neural_network.nn_net_synapses;
Po importu obsahují tabulky několik testovacích neuronových sítí.
Ladící zprávy pro algoritmy jízdních řádů, resp. neuronových sítí,
najdete v tabulkách neural_network.lib_logg
, resp.
jizdnirady_cb.lib_logg
:
SELECT * FROM neural_network.lib_logg; SELECT * FROM jizdnirady_cb.lib_logg;
Jak se konkrétní procedury používají je popsáno jednak v technické zprávě diplomové práce, jednak v komentářích v kódu jednotlivých procedur, a také na webu autora – jízdní řády, neuronové sítě.
Proto zde jen několik příkladů, jak SQL příkazy používat.
Standardně Query Browser po každém dotazu uzavře spojení s DB. Proto
nejprve spusťte transakci – dočasné tabulky tak zůstanou k dispozici po
volání procedury. Transakci spustíte buď příkazem
START TRANSACTION;
(a stisknutím Ctrl+Enter
) nebo
tlačítkem Transaction v horním pruhu programu. Vedle něj se po
spustění transakce objeví tlačítka pro potvrzení nebo zrušení transakce.
Stejného efektu lze docílit provedením příkazů COMMIT;
nebo
ROLLBACK;
.
-- Vyhledání spoje ze zastávky 115 do zastávky 465, maximálně 2 přestupy. CALL mhd_VyhledejSpoje(115, 465, NOW(), 3); SELECT * FROM mhd_VyhledejSpoje ORDER BY pos;
Zde je ukázka vyhledání spojů mezi zastávkami Žižkova – Budvar – U pily – Nemocnice – U chromých:
Se sítěmi lze provádět v podstatě tři operace: Vytvářet je, provést jejich výpočet, a učit je.
Na následujícím obrázku jsou zachycené první dva kroky.
Nejprve vytváříme neuronovou síť s architekturou 2,2,1
(vhodná pro řešení XOR):
-- Vytvoření neuronové sítě CALL nn_CreatePerceptron('2,2,1','XOR', 0.10, 0.5, @out_NetID);
Pro vzniklou síť provádíme její výpočet a uchováváme hodnoty vnitřních neuronů:
-- Výpočet neuronové sítě CALL nn_ComputeNet(1, '-1, 1', TRUE); -- Zjistění výsledků výpočtu SELECT * FROM nn_ComputeNet; -- Výstupní hodnoty všech neuronů SELECT * FROM nn_ComputeNet_InternalValues;
Výsledkem jsou tyto struktury:
id_neuron | val |
---|---|
5 | 0.984122623404696 |
id_neuron | val |
---|---|
1 | –1 |
2 | 1 |
3 | 0.0166427942550775 |
4 | 0.972952595778587 |
5 | 0.984122623404696 |
Na základě vzniklých hodnot můžeme provést jeden krok učení:
-- Učení neuronové sítě ALTER TABLE nn_ComputeNet RENAME TO nn_CorrectWeights; ALTER TABLE nn_ComputeNet_InternalValues RENAME TO nn_CorrectWeights_InternalValues; CALL nn_CorrectWeights(iNetID, '1', @dLearn, @out_dErrorSum);
Po provedení procedury (a případně potvrzení transakce) jsou váhy sítě upravené algoritmem backpropagation podle předchozího stavu sítě, dočasně uložených výstupních hodnot všech neuronů sítě a požadovaných hodnot výstupní vrstvy.
Pro pohodlné vyzkoušení učení neuronové sítě je k dispozici procedra
nn_TeachXOR_Dynamic( //ID//, //cílová úroveň chyby//, //maximum kroků//)
.
Kód v následující ukázce učí síť vytvořenou výše uvedeným postupem
na cílovou úroveň chyby 0,0001 v maximálním počtu 10 000 kroků:
-- Učení neuronové sítě pro XOR CALL nn_TeachXOR_Dynamic(3, 0.0001, 10000);
V diplomové práci používáme neuronové sítě k určení vhodné trasy
pro dosažení cílové zastávky v nejlepším čase.
Zde je kód pro vytvoření a učení neuronové sítě pro zastávku 5:
-- Vytvoření sítě pro zastávku 5 se třiceti neurony v jedné skryté vrstvě: CALL mhd_nn_CreateNetForStation(5, '30'); -- Učení právě vzniklé sítě pro zastávku 5 do cílové -- úrovně chyby 0.0001, maximálně po 40 000 kol učení: CALL mhd_nn_TeachStationNet(5, LAST_INSERT_ID(), 0.0001, 40000);
Všechny procesy se v naší implementaci zaznamenávají do logu. To je
užitečné zejména pokud něco nepracuje podle očekávání. Většinou je
chyba na straně uživatele a v logu je zapsán její příčina (ve sloupci
level
je hodnota error
nebo warning
).
Zde je ukázka záznamů z učení neuronové sítě zastávky s ID 530:
Další vysvětlení najdete ve výše jmenovaných zdrojích – v diplomové prácí, ve zdrojových kódech jednotlivých procedur a na webu autora.
Případné dotazy směřujte na mail ondra@dynawest.cz nebo
JabberID ondra.zizka@jabber.cz
.