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.
Preco nemam rad Javu? Pretoze javisti. Nie, oni sa stale spravaju akoby zili v ulite a ani za toho boha nedaju zdrojaky na Github. Sry za trolling, musel som.
Inak pekny clanok, vdaka.
A proč dávat na github jeden 300 řádkový zdroják, který se už nikdy v budoucnu měnit nebude a bez vysvětlujícího článku nemá smysl? A co budou dělat lidi až z githubu ten projekt zmizí a oni si najdou článek s neexistujícím odkazem?
Pretoze zdrojaky v .zip su podobna blbost ako menu restauracie v PDF. Ked cestujem MHD a kcem rychlo prescannovat obsah, tato forma odkazu mi to neumoznuje.
Nikdy nebude menit... vy byste jednoho pobavil. Stejne tak neni zadna zaruka, ze nezmizi ten zip. Jak to sem da autor je jeho vec, ale jsou vhodnejsi a min vhodne zpusoby zverejnovani kodu.
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...
To je jednoduché, C++ fašismus, mindráky... s Javou prostě na root.cz neuspějete.
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.
Zacal jsem trochu komentovat kod, tak pokud bude mit autor, zajem, rad jej predam k doplneni a dokomentovani :-)
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.
Dekuji za vysvetleni. A odkud tedy pocty 75 a 15 u prostrednich vazeb mezi vrstvami ?
Mimochodem, mate zajem o muj okomentovany kod, tak jak jsem ho pochopil a doplneni, pripadne novy doplnujici clanek ?
Protoze je dokazano, ze MLP (multi-layer perceptron) o 3 vrsvach a dostatecnem mnozstvi neuronu je schopen libovolne presne aproximovat libovolnou funkci.
Tedy vic vrstev neni potreba.
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.
Diky moc za vysvetleni. Doplnim komentare v kodu o nove poznatky od Vas a poslu vam ho meilem.
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. :-)
mohli zvolit špatný způsob výpočtu vektoru popisujicího obrázek anebo učili síť na špatných datech.. ale od té doby se mnoho věcí posunulo dál :)
Neuronova sit se naucila rozpoznavat trenovaci fotky u kterych po ni americka armada chtela aby je klasifikovala jako tank od trenovacich fotek u kterych po ni chtela aby je klasifikovala jako bez tanku :)
Přidávám se k pochvalám za přínosný článek i seriál a zároveň k posteskům, že si autor zrovna vybral zrovna Javu, na kterou jsem značně alergickej ;-)
Ses na javu alergickej? Treba bude pristi clanek o biologickych komputacnich procesech v imunitnim systemu...
Č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í.
Jj, přesně tak. Pravidelně tak jednou ročně potkám startup, který se chlubí, jak krásně dokáže přes strojové učení predikovat nějakou burzu. Bohužel jim tam ve většině případů najdu do půl hodiny nějakou takovouhle metodickou chybu :( - udělat to správně totiž není jen tak.
Pro to obchodování na burze nepomůže ani testování na těch nejoptimálnějších datech. Jeden "drobný" faktor, a to mj. i zásah do entropie při reálném obchodování, tohle všechno zbourá jak domeček z karet.
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.
Burza je otevreny system, uspesne firme bude rust cena akcii, takze se ji muze vyplatit je po case odkoupit zpet a vsichni kdo ty akcie meli mezi tim jsou v zisku taky. Cili je mozne aby vsichni na takove burze byli v plusu.
No ale ty "vydělané" peníze se ale musí odněkud vzít, takže vždy někdo prodělá, akorát se neví kdo, nebo ne?
1. Růst hodnoty akcií je dán primárně tím, že se té firmě daří - má zisk a buď ho vyplatí nebo se o něj zvýší valuace firmy.
2. Plus sekundární výkyvy dělají spekulace - o nich platí, co píšete: jeden vydělá, druhý prodělá. To ale neznamená, že neplatí bod 1.
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.
To nejak nechapu proc by firma na zacatku emitovala akcie a az naroste jejich cena tak je koupila zpet? Tim preci trati ne?
Treba by ta firma rozjela neco vynosnyho, akorat na to nema prachy. Vyda akcie, a penize zhodnoti natolik, ze se ji casem vyplati odkoupit ty akcie zpatky drazsi a porad je v plusu.
To se dělá v případech kdy má firma volnou hotovost a nemá pro ni uplatnění. Buď ji může vyplatit jako dividendu, ale v některých případech je daňově výhodnější nakupovat za ni vlastní akcie, což má prakticky stejný efekt.
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.
Proc by clovek nemohl testovat uspesnost klasifikace na trenovacich datech? Tento clanek je zarnym prikladem toho ze clovek muze.
Jen se pak nesmite divit, ze se v diskusi pod clankem budou objevovat nesouhlasne ci kriticke komentare, jako je ten Michala Illiche :)
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.)
Proč taková agresivita? Si tady člověk udělá srandu a deset dalších z toho má infarkt.