2018-07-31

Ondřej Žižka – Diplomová práce – Návod na zprovoznění

SQL skripty

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

Instalace MySQL, vytvoření databází a nastavení práv

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.

Rekonstrukce databáze z SQL souborů

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:

  1. Otevřete soubor 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).
  2. Nahraďte veškeré výskyty řetězce neural_network. názvem vaší databáze a tečkou.
  3. Uložte soubor v kódování UTF-8 bez signatury (na obrázku je ukázka uložení ve Visual Studiu).

Poté upravenou verzi skriptu načtěte do MySQL místo původní verze.

Prohlížení dat

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 po­zic:

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:

  • trasy projíždějící danou zastávkou a počet zastávek do konce příslušné trasy
  • zastávky dané trasy
  • zastávky a časy stání dané jíždy
  • odjezdy spojů dané linky z dané zastávky
  • první následující jízda přijízdějící do dané zastávky od daného okamžiku

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;

Volání API

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;.

Kód pro vyhledávání v jízdních řádech

-- 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:

Kód pro neuronové sítě

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);

Kód učení neuronových sítí pro heuristiku vyhledávání spojů

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.


0