Semestrální práce KIV/PC



Podobné dokumenty
Matematika v programovacích

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování

IB111 Programování a algoritmizace. Programovací jazyky

11. Přehled prog. jazyků

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování Předmět: Programování

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Překladač a jeho struktura

Algoritmizace- úvod. Ing. Tomáš Otáhal

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

IB111 Úvod do programování skrze Python Přednáška 13

1 Úvod 1.1 Vlastnosti programového vybavení (SW)

Úvod Seznámení s předmětem Co je.net Vlastnosti.NET Konec. Programování v C# Úvodní slovo 1 / 25

Architektura rodiny operačních systémů Windows NT Mgr. Josef Horálek

Hospodářská informatika

Funkcionální programování. Kristýna Kaslová

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Typy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu

Proces vývoje HRIS Vema (Human Resources Information System) Jaroslav Šmarda

Obsah. Zpracoval:

5.15 INFORMATIKA A VÝPOČETNÍ TECHNIKA

C2115 Praktický úvod do superpočítání

10 Balíčky, grafické znázornění tříd, základy zapozdření

Profilová část maturitní zkoušky 2013/2014

KRY. Projekt č. 2. Kamil Dudka xdudka00

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Program a životní cyklus programu

Vyřešené teoretické otázky do OOP ( )

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

TÉMATICKÝ OKRUH Softwarové inženýrství

Profilová část maturitní zkoušky 2017/2018

2 Postup při programování, úvod do programovacího jazyka Java

Specifikace projektu Ocerus

Paralelní výpočty ve finančnictví

Semestální práce z předmětu PC

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

FORTANNS. 22. února 2010

Současný svět Projekt č. CZ.2.17/3.1.00/32038, podpořený Evropským sociálním fondem v rámci Operačního programu Praha adaptabilita

Objektově orientovaný přístup

Vývoj programů. ÚVOD DO OPERAČNÍCH SYSTÉMŮ

Geometrické algoritmy pro počítačovou grafiku

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

TEORIE ZPRACOVÁNÍ DAT

Semestrální úloha 1 z předmětu Programovací jazyk C. Textový merge. Student:

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: AVTK. Úvod. strana 1

Procesy a vlákna (Processes and Threads)

Objektově orientované technologie Diagram komponent Implementační náhled (Diagram rozmístění) Pavel Děrgel, Daniela Szturcová

Programování II. Modularita 2017/18

ČESKÉ VYSOKÉ UČENÍ TECHNIKÉ Fakulta elektrotechnická. Microsoft Sharepoint 2007 Workflows Průmyslové informační systémy

Vlákno (anglicky: thread) v informatice označuje vlákno výpočtu neboli samostatný výpočetní tok, tedy posloupnost po sobě jdoucích operací.

12. Globální metody MI-PAA

Nové jazykové brány do Caché. Daniel Kutáč

Java/QE Akademie - Osnova

Principy OOP při tvorbě aplikací v JEE. Michal Čejchan

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Neuropočítače. podnět. vnímání (senzory)

Aplikace. vliv na to, jakou mají strukturu i na to, jak pracné je je vyvinout. Bylo vypozorováno, že aplikace je možné rozdělit do skupin

Diplomová práce Prostředí pro programování pohybu manipulátorů

Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

1 Strukturované programování

Dílčí projekt: Systém projektování textilních struktur 1.etapa: tvorba systému projektování vlákno - příze - tkanina

Obsah. 1) Rozšířené zadání 2) Teorie zásuvných modulů a) Druhy aplikací používajících zásuvné moduly b) Knihovny c) Architektura aplikace d) Výhody

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Programování a algoritmizace: úvod

Úvod. Programovací paradigmata

Zobrazte si svazy a uspořádané množiny! Jan Outrata

xrays optimalizační nástroj

Příprava dat v softwaru Statistica

Rozklad na prvočinitele. 3. prosince 2010

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Datová věda (Data Science) akademický navazující magisterský program

Uklízení odpadků a analýza úniku

Základní informace. Operační systém (OS)

Programové vybavení počítačů operační systémy

Vývoj informačních systémů. Přehled témat a úkolů

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost

Kontingenční tabulky v MS Excel 2010

Datové struktury 2: Rozptylovací tabulky

Zkušenosti nejen z provozu Portálu občana. Jan Vlasák NAKIT Miroslav Vacula Jihomoravský kraj Václav Koudele - Microsoft

S ICT ve výuce to umíme_dodávka dodatečného software

5. Umělé neuronové sítě. Neuronové sítě

Aplikace je program určený pro uživatele. Aplikaci je možné rozdělit na části:

PV021 Vícevrstvá neuronová síť pro rozeznávání mikroteček. Matúš Goljer, Maroš Kucbel, Michal Novotný, Karel Štěpka 2011

Maturitní témata Školní rok: 2015/2016

Práce v textovém editoru

28.z-8.pc ZS 2015/2016

ZÁPOČTOVÁ PRÁCE z UIR

PŘÍLOHA C Požadavky na Dokumentaci

POČÍTAČE A PROGRAMOVÁNÍ

VY_32_INOVACE_INF.19. Inkscape, GIMP, Blender

8 Třídy, objekty, metody, předávání argumentů metod

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Simluátor Trilobota. (projekt do předmětu ROB)

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ /14

Transkript:

Semestrální práce KIV/PC Václav Löffelmann 2014-12-31

1 Zadání Naprogramujte v ANSI C přenositelnou konzolovou aplikaci, která jako vstup obdrží soubor obsahující obrázek ručně psané číslice a soubor s váhami a topologií již natrénované dopředné neuronové sítě, na jejich základě vytvoří odpovídající neuronovou sít a následně provede klasifikaci obsahu zadaného obrázku. Výstupem aplikace je třída obrázku po klasifikaci. Plné znění zadání je k dispozici zde[1]. Analýza úlohy Naším úkolem je vytvořit program, který bude simulovat vzruchy umělé neuronové sítě. Množina vstupních dat je již vytvořená a síť je naučená. Nebudeme tedy vytvářet tu nejzajímavější část - učení. Pokud bychom se dostali k takovému problému v praxi, určitě by prvním krokem mělo být prozkoumání možností současného softwaru. Aneb jak jedno staré pořekadlo praví Poslední věc, co by programátor měl dělat je programování., měli bychom se nejdříve kouknout po hotových řešeních. Po krátkém hledání zjistíme, že v oblasti umělých neuronových sítí již existuje mnoho projektů. Bez problémů lze najít nespočet knihoven, v libovolných jazycích [2, 3, 4, 5, 6, 7, 8,?]. Většina z nich má svobodnou licenci a lze je tedy bezplatně využít. Jelikož se ale nenacházíme v praxi, ale ve škole, kde děláme cvičné příklady, musíme se uchýlit k vlastní implementaci. Před začátkem prací na implementaci je nanejvýš vhodné zvážit nástroje, které v projektu použijeme. Důležité je zejména vybrat vhodný programovací jazyk. Zvolit knihovny, jež nám ušetří práci. Dále pak, jestli-že se jedná o týmovou práci, vybrat nástroje pro synchronizaci a verzování zdrojových kódů, metodiku vývoje, software pro kolaboraci, databázi (nebo formu) pro ukládání znalostí. Nástroj pro verzování zdrojových kódů se hodí i při práci v jednom člověku. Zde máme na výběr z několika známých a ověřených projektů. Jako prvním bych uvedl Git[9]. Git je pokročilý verzovací systém s podporou všech funkcí, které jsou pro vývoj potřeba. Jedná se o distribuovaný systém, který používají i ty největší projekty na světě. Příkladem budiž Linuxové jádro[10]. Dalšími zástupci softwaru pro verzování jsou Mercurial[11] a SVN[12]. Jelikož s Gitem mám největší zkušenosti, rozhodl jsem se pro svojí práci použít právě Git. Vzhledem k tomu, že je vhodné mít gitový repozitář někde hostovaný - hodí se zejména pro zálohy a kolaboraci. Rozhodl jsem se využít služeb od poskytovatele GitHub Inc[13]. Tato renomovaná společnost nabízí hostování veřejně přístupných repozitářů zadarmo. Pro studenty nabízí hostování až 5 privátních repozitářů také zadarmo. Za tuto starost o studenty bych této společnosti rád poděkoval přidáním odkazu na jejich vzdělávací projekt[14].

2 Obrázek 0.0.1: Biologický neuron. Zdroj[18] Výběr jazyka I přes to, že byl jazyk implementace zadaný, pojďme si situaci trochu zanalyzovat. V zadání máme jasně řečeno, že máme vytvořit jednoduchou aplikaci, která bude fungovat sama o sobě. Nejedná se tedy o žádnou knihovnu, driver ani framework. Tato podmínka sama o sobě nepřináší žádné omezení. Pojďme tedy prozkoumat další aspekt, tedy doménu problému. Tato doména se vyznačuje náročností zejména na matematické výpočty, jelikož simulujeme určité množství neuronů, resp. jejich excitací, které reprezentujeme hyperbolickým tangensem součinů všech vstupů a jejich vah. Shrnuli jsme tedy, že budeme potřebovat výkonnou aplikaci, jelikož zadání hovoří o obecném fungování řešení, tedy libovolnou velikostí sítě. Odtud můžeme předpokládat, že některé použití mají rozsáhlé sítě a velké množství neuronů. Pokud budeme uvažovat malou síť na vstupu, zajisté oceníme i ekvivalentní paměťové nároky, odpovídající malému množství vstupních dat. V předchozích odstavcích jsme z výběru diskvalifikovali jazyky s tristním výkonem, nicméně pojďme se podívat na vyšší vyspělé programovací jazyky. Reprezentanty této skupiny mohou být třeba Java, Python, Node.js. Minimálně první dva zmíněné mají velice dobrou podporu napříč operačními systémy a přenositelnost, což byl také jeden z aspektů zadání. Node.js jako poměrně nová technologie má podporu u běžných operačních systémů, jež byly v zadání vyjmenované. Co se výkonu, který pro naši úlohu požadujeme, těchto programovacích jazyků týká, dá se říci, že uspokojují naše potřeby. Java se svou HotSpot[15] optimalizací, která kompiluje kód do nativního kódu platformy má velice dobré výsledky. U Node.js máme v zásadě dvě možnosti. Buď použijeme kompilátor a interpret V8[16], který Google vyladil pro vysoký výkon, a nebo použijeme novinku z Javy verze 8 a budeme ho spouštět nad JVM a jsme na tom stejně

3 jako v případě Javy. V případě Pythonu máme také možnosti kompilace do C kódu, takže o samotný výkon máme postaráno. Vzhledem k výše uvedenému je jasné, že při výběru jazyka nemůžeme jednoduše opomenout vyšší programovací jazyky. Já osobně bych se klonil k použití vyššího programovacího jazyka, jelikož nám přináší přenositelnost nativně a další výhody, jako jsou například automatický garbage collector, vyšší úroveň abstrakce a nebo netypovost. Upřímně se domnívám, že vývoj ve vyšším programovacím jazyku, nebo dokonce ještě vyšším transkompileru, uvažujme třeba CoffeeScript[17], by byl o poznání rychlejší. Dalším zajímavým pohledem by mohl být pohled řešení úlohy ve funkcionálním programovacím jazyku. Uveďme zde čistý funkcionální jazyk, implementující lambda kalkulus - Haskell. Konkrétně tento jazyk má veliké možnosti a splnění takovéto úlohy by nebyl problém. Pokud se podíváme na řešení, která se vyskytují při řešení problematiky neuronových sítí, narazíme nutně na zpracování na grafických kartách. Výpočet na grafických kartách je vhodný zejména díky paralelnímu zpracování. Excitace jednotlivých neuronů v rámci jedné vrstvy lze totiž vypočítat současně. Jestliže zajdeme v problematice neuronových sítí ještě dál, zjistíme, že pro tuto doménu úloh se vytváří i specializovaná hardwarová řešení. Jejich použití je tedy nasnadě. Jazyk je, nicméně, daný a proto práce bude implementována v C kvůli edukačním účelům. Avšak v reálném světě by tento jazyk pravděpodobně nevyhrál. Dekompozice problému Problém není nikterak složitý a proto můžeme při analýze problém rozebrat tak, jak půjde běh programu. Vstupem jsou dva soubory, jeden s neuronovou sítí a druhý se vstupem do této sítě. Rozeberme tedy zpracování souboru s naučenou neuronovou sítí. Soubor je potřeba naparsovat a následně reprezentovat pomocí vhodné datové struktury. Parsování je v celku jasné, jelikož se jedná o textový soubor, kde jsou jednotlivé sekce uvedeny speciálním řádkem. O trochu složitější jsou datové struktury, jenž mají vzniknout. Nechť budeme uvažovat neuronovou síť jako množinu neuronů, jakožto samostatných entit sdruženým po vrstvách. Jelikož je při výpočtu excitace neuronu z vyšší vrstvy potřeba zjistit excitace propojených neuronů z předchozí vrstvy, máme zde vcelku jasný požadavek na rychlý náhodný přístup k neuronům z určité vrstvy. Tento požadavek uspokojuje pole, hash nebo při velkých objemech dat strom. Abstrakce neuronu by měla obsahovat propojení a jejich váhy s ostatními neurony, dále pak bias a výslednou hodnotu excitace při průchodu vzruchu. Propojení neuronu se budou vždy procházet sekvenčně a vzhledem k dynamickému množství propojení se zde nabízí k použití spojový seznam. Datový typ této entity by tedy měl zapouzdřovat všechny výše zmíněné vlastnosti. Co se týká druhého souboru, tedy vstupu pro neuronovou síť, máme pro tato data stejné nároky jako na kteroukoliv jinou vrstvu - určitě budeme potřebovat

4 rychlý přístup k náhodnému vstupu. Parsování bude velice přímé, jelikož soubor obsahuje pouze užitečná binární data. Následně můžeme analyzovat vlastní algoritmus. Běh by se dal rozdělit do tří hlavních částí. První část naplní první vrstvu vstupy ze vstupní vrstvy a vypočte excitace neuronů v první vrstvě. Druhá část vezme všechny následující vrstvy (pokud nějaké jsou) a postupně, po vrstvách, vypočítává jednotlivé excitace. Poslední částí je výpočet maxima z excitací neuronů z výstupní vrstvy. Popis implementace Implementace se skládá z parsování vstupních souboru a následné vytváření vhodných datových struktur. Jako datovou strukturu pro reprezentaci neuronů v rámci jedné vrstvy jsem použil pole, jelikož se jednoduše implementuje a poskytuje rychlý náhodný přístup. Abstrakce nad vrstvou, struktura layer, je pouze obalem nad tímto polem neuronů, což jsou samy o sobě také struktury, které mají vlastnosti vyjmenované výše v analýze. Pro snadný přístup k vrstvám jsem použil reprezentaci jako pole vrstev. Další struktura, kterou jsem vytvořil je zapouzdření pro neuronové spojení. Toto spojení obsahuje informaci o tom, s kterým neuronem z předchozí vrstvy je vytvořené, dále pak váhu tohoto spojení a následně i odkaz na další spojení. Jedná se tedy o zřetězený seznam. Každý neuron si uchovává odkaz na začátek toho seznamu. Struktura programu je dekomponována logicky po funkcích. Program samozřejmě validuje všechny vstupy a dělá správu paměti. Uživatelská příručka Program má ovládání pomocí parametrů z příkazové řádky. Po spuštění již neobsahuje žádné uživatelské rozhraní. Překlad programu je zajištěn utilitou make. Program se spouští binárním souborem neural_net.exe. Tento příkaz očekává dva argumenty. Prvním je soubor s definicí neuronové sítě a druhý je cesta k souboru se vstupem sítě. Očekávaný formát těchto souborů je definovaný v zadání.

5 Závěr Závěrem bych chtěl předně poděkovat jednak za možnost výběru zadání a jednak za zajímavé téma. Problematika neuronových sítí je dle mého názoru velice zajímavá, škoda jen, že byla vynechána nejzajímavější část a to učení. Nicméně to je pochopitelné, vzhledem k tomu, že se jedná pouze o semestrální práci. S výsledným programem jsem spokojen. Doba běhu a paměťové nároky odpovídají nezbytně nutným výpočtům. Při implementaci jsem se snažil vyvarovat zbytečným iteracím nebo používáním neefektivních datových struktur. Jako možnost dalšího rozšiřování bych viděl jednoznačně v implementaci některého učícího algoritmu, jelikož klasifikace je v tomto případě pouze špička ledovce.

Literatura [1] http://www.kiv.zcu.cz/studies/predmety/pc/doc/work/sw2014-02.pdf [2] http://leenissen.dk/fann/wp/ [3] http://pybrain.org/ [4] http://opennn.cimne.com/ [5] http://neuroph.sourceforge.net/ [6] https://github.com/hannes-brt/hebel [7] http://caffe.berkeleyvision.org/ [8] http://www.intelnics.com/opennn [9] http://git-scm.com/ [10] https://git.kernel.org/cgit/ [11] http://mercurial.selenic.com/ [12] https://subversion.apache.org/ [13] https://github.com/ [14] https://education.github.com/ [15] http://www.oracle.com/technetwork/java/whitepaper-135217.html [16] https://code.google.com/p/v8/ [17] http://coffeescript.org/ [18] http://home.agh.edu.pl/~vlsi/ai/intro/ 6