Jako vim co to je nasobeni matic. Vim co to je vektor. Ale nepochopil sem to. Rad bych to pochopil, ale nejde to. Rozumim kazdemu slovu az do "tři 2D pole (matice) typu double: weights1, weights2, weights3", tam sem se ztratil. Chtelo by to pro blby jako sem ja vysvetlit trochu lip, jako na co sou ty weighty, proc jsou deklarovany nejaky x-rozmerny dalsi matice, proc ma co kolik radku a sloupcu, a tak...
On neimplementuje neuron jako class, ze by si napriklad jednotlive
objekty tridy neuron posilaly svoje vstupy/vystupy.
Misto toho ma matice ukazujici jak vystup i-teho neuronu v nizsi vrstve
ovlivnuje vstup j-teho neuronu ve vyssi vrstve.
Podle toho kolik ma vrstev tolik ma matic, a kazda matice je velka podle toho
kolik neuronu je ve vrstvach ktere matice spojuje.
Dovolim si zopakovat vase myslenkove pochody jen abych si overil ze rozumim. Nekdo napsal clanek a pro nej ukazkovy kod - rozhodl se pro javu - tento zdrojak neulozil do gitu - cely repozitar neumistil na web na github. Dle vas je v miste nektere pomlcky chyba. Muzete upresnit kde a proc a jak to souvisi s javou jako takovou? Opravdu jsem zvedav...
Zdravim, je sice pekne, ze autor popise, ze ma 3 2D pole, pak 3 2D pole s vahami, ale postradam treba vysvetleni proc je delka pole o 1 delsi nez 256. V obrazku u klasifikace je sice pekne schema, ale ocenil bych vysvetleni jak velka ta pole jsou a proc. Obecne bych ocenil co a proc se kde dela, proc se nastavuje nejaka velikost apod. V jave nedelam, takze precteni zdrojaku mi nic moc nerekne. Bylo by asi zajimave nejak vizualizovat vypocet, ovsem chapu, ze by to bylo neumerne narocne napsat. Bylo by mozne treba clanek rozsirit o tyto informace ? Byl bych neskonale nadsen :-) (Plus pripadne jsem ochoten poslat autorovi nejakou korunu.)
Kazdoapdne dekuji za serial, nebot je velmi zajimavy a velmi brzy budu v situaci, kdy budu tyto informace hodne potrebovat pri jedne uloze.
Zdravím, každé 2D pole reprezentuje každou vrstvu. Vrstva se skládá z N neuronů a každý neuron má M vstupů - odtud matice MxN. Každý prvek matice je m-tá váha n-tého neuronu. Neurony mají ale o 1 vstup více než je dimenze vstupujicího vektoru - viz článek "Biologické algoritmy (4) - Neuronové sítě" obrázek pod nadpisem Umělý neuron. Tato jednička v podstatě způsobuje posunutí rozdělující roviny a zbylé váhy pronasobené se vstupy způsobují orientaci (směr) této roviny, ktera rozděluje prostor na dva podprostory - viz v tom samém článku příklad s muži a ženami.
Velikost matic je tedy dána zvoleným počtem neuronů v jednotlivých vrstvách. Málo neuronů ve skrytých vrstvách může vést k méně přesné klasifikaci (prostě není dostatek zdrojů k zmapování celého prostoru). Hodně neuronů naopak může způsobit přeučení (zbytečně velké zaměření na detaily v trénovacích datech), což způsobí lepší výsledky v trenovacích datech, ale reálně v testovacích horší a učení trvá déle. Záleží na konkrétním problému jaké počty zvolíme.
U první vrstvy je 256, protože jsem zvolil zrovna tuto metodu výpočtu příznaku obrázku, který má 256 hodnot. Kdybychom příznaky nepočítali jako histogramy barev, ale zvolili nějaký jiný přístup, těchto hodnot by mohl být jiný počet. Výstupní vrstva má 4 neurony protože rozlišujeme právě 4 typy scén.
Počty neuronů ve skrytých vrstvách 75 a 15 by šlo zvolit i jiné. Jen by jich nemělo být příliš málo ani příliš mnoho. Záleží na konkrétním problémů. Jestliže je prostor řešení jako z příkladu mužů a žen v článku 4 takto jednoduchý, tak stačí málo neuronů, jestliže ale bude komplikovaný jako např. tady http://www.ire.pw.edu.pl/~rsulej/NetMaker/index.php?pg=e03 je potřeba neuronů více. Existují odhady pro neuronovou síť se dvěma skrytými vrstvami: N1 = out*(out/in)^(2/3) a N2 = out*(out/in)^(1/3), kde v tomto případě je out=256 a in=4. Nejlepší by bylo otestovat pro různé počty neuronů, kdy síť na testovacích datech klasifikuje nejlépe.
Jinak jsou tam 2 skryté vrstvy a jedna výstupní. Někdy se volí pouze jedna skrytá vrstva - aspoň jedna je potřeba, protože pro některé problémy (např. XOR) by jen výstupní vrstva nestačila.
Pokud by byla jen jedna skrytá vrstva tak situace je následující. Ta jedna vrstva rozseká prostor na různé dvojice podprostorů - viz článek 5. Tím v prostoru vzniknou různé polygonální oblasti. A poslední výstupní vrstva se pak naučí, že když je bod uvnitř té které oblasti, tak jak se má klasifikovat.
V případě, že máme dvě skryté vrstvy může se ještě zpřesnit klasifikace bodů na rozhraní mezi dvěma oblastmi.
Komentovaný kód můžete zaslat na e-mail, děkuji.
Připomělo mi to jeden článek, který jsem četl odhaduju tak před patnácti, dvaceti lety.
V něm se psalo, jak americká armáda začala dělat pokusy s neuronovou sítí, kterou chtěli používat na vyhodnocování nějakých fotografií. Konkrétně pro rozlišení, zda na fotografii je nebo není tank. Vzali sérii fotografií na které neuronovu síť učili. Když se zdálo, že je naučená a vše funguje, dali jí jinou sadu fotografií. Výsledky byly najednou katastrofální.
Dodatečně přišli na to, že v původní sérii se snímky s tankem a bez liší svým jasem (tuším, že všechny fotky s tankem byly tmavší) a neuronová síť se naučila to rozpoznávat podle něj. :-)
Článek je fajn, ale tohle fakt ne:
"úspěšnost na těchto trénovacích obrázcích měla být okolo 97,5 %."
úspěšnost klasifikace nikdy nesmíte testovat na trénovacích datech. Na testování je nutné použít data testovací. Jinak výsledek naprosto o ničem nevypovídá. (je triviální udělat algoritmus, který bude mít 100% úspěšnost na trénovacích datech)
+1. Já jsem takhle napsal algoritmus na obchodování na forexu, naučil jsem ho na prvních 7 měsících letošního roku a světe div se, v tom samém období dokázal na testovacím účtu počáteční vklad zdvacetinásobit :-)
Kolega mi kladl na srdce, že je třeba hned 3 různé množiny dat: 1. na učení strategií, 2 na výběr nejlepších strategií a 3. na ověření, že ty nejlepši fungují.
Ja myslim ze u burzy je metodicka chyba v tom, ze neni mozne aby vsichni meli zisky, protoze penize se proste presouvaji od jednoho k druhemu, jeden musi mit zisk druhy ztratu.
Jenze vsichni chteji zisky mit (muj predpoklad - pokud se tam nachazi nejaky masochista ktery jde na burzu s cilem tam prodelat tak se omlouvam)
Takze to jako celek podle me nemuze fungovat.
Navrhuju se na burzu vykaslat a zabyvat se misto toho aktivitami typu win-win.
Ty se vezmou treba z toho, ze ta firma ma uspesne vyrobky a ze to lidi kupuji. U tech tezko rict, ze tim prodelavaji - pro ne to treba ma tu cenu a je to ok. Dal se to muze projevit tak, ze lidi ty prachy neutratili u konkurencni firmy a ta uz tim muze tratit, ale to se projevi treba na jine burze nebo taky na zadne. A pokud na te burze je dodavatel obou tech firem, tak tam uz je to uplne jasny.
Je to tedy samozrejme slozitejsi (a ja nejsem ekonom :-) ), ale chtel jsem tim rict, ze urcite lze mit burzu kde jsou vsichni v zisku proste proto, ze je to otevreny system.
Souhlasím, samozřejmě na jiných obrázcích než naučených klasifikace bude horší. Správně by se mělo testovat na jiných (testovacích) datech a učení provádět do okamžiku než se síť začně přeučovat (příliš zaměřovat na detaily), tedy do okamžiku než úspěšnost klasifikace začne na testovacích datech klesat. Ale pro zjednodušení se v příkladu testuje na těch samých obrázcích a pak je v zipu několik obrázků, na kterých učení neprobíhalo a lze pro ně ověřit, že se klasifikují dobře.
Ono je to trosku jinak.
Klasifikace by se mela testovat samozrejme na testovacich datech, nikoliv trenovacich, ale pro uplnost se obvykle udava i presnost klasifikace na trenovaci mnozine - pro pripad, ze by nebyla 100%. Ono zrovna prave u neuronovych siti se clovek muze zamyslet nad tim, jestli nahodou neni sit s 100% presnosti na trenovacich datech preucena.
když tak omluvte hloupou otázku. moc o neuronových sítích nevím, ale jak se dá ta síť "přeučit"? já myslel, že množstvím získaných dat se výsledek neustále zpřesňuje. teoreticky pokud by tedy hodnotila testovací obrázky a já ji vždy řekl, kde udělala chybu - zpřesňuje se ne? a od určité doby už by prakticky neměla potřebovat můj zásah.
A. Představte si obrovskou neuronovou síť. Nastavení vah na jednotlivých synapsích je víceméně "paměť". A když je ta síť hodně velká a proběhne strašně moc iterací, tak si neuronová síť výsledky z trénovací množiny prostě "zapamatuje". No jo, jenže pak přijde nový vstup (z testovací množiny) a ty miliony drobných pravidel na něj nezafungují, protože je o trochu jiný.
B. Oproti tomu jiná, menší a míň trénovaná neuronová síť se naučí jen pár pravidel (takové, které fungovaly na velké množství vstupů z trénovací množiny). Když se pak potká s novým vstupem, tak je daleko větší pravděpodobnost, že tyhlety obecnější pravidla zafungují.
Ještě formulováno jinak:
A. si "našprtá" všechna data, ale u nového vstupu je bezradný, protože neví, která jsou důležitá.
B. si odvodí jen pár obecnějších zásad a ty pak aplikuje i u nového vstupu.
(PS: U testovacích obrázků síti už nic neříkáte, tedy se ani nic nezpřesňuje.)