Sieci Neuronowe

Prowadzący: [Krzysztof Zając

Uwaga: ponieważ Martyna w ostatniej chwili zrezygnowała, program może się zmienić.

O czym będą warsztaty

Istnieją problemy, których nie potrafimy jeszcze rozwiązać żadnym znanym algorytmem. Na warsztatach zajmiemy się takimi właśnie problemami − stworzymy pamięć skojarzeniową, a potem będziemy próbować rozpoznawać za pomocą programu wykresy funkcji, znaki, a może i leżące na stole karty do seta. Jeśli zostanie trochę czasu (albo zadecydują o tym uczestnicy) spróbujemy zająć się siecią neuronową uczoną na podstawie bieżących efektów podejmowanych działań (np. sterującą wirtualnym samolotem i unikającą zderzeń lub poruszającą kończynami wirtualnego człowieka tak, aby pokonał pewien dystans i nie upadł).

Program zajęć

− wprowadzenie i teoria (co to jest neuron, czym jest sieć neuronowa, typowe topologie sieci i strategie uczenia)
− jak zaprogramować sieci − jeśli lenistwo weźmie górę, skorzystamy z gotowego frameworku
− nauczymy sieć znajdować maksimum z trzech liczb, potem rozpoznawać, czy wejście przypomina bardziej sinusoidę, kosinusoidę, czy też tangensoidę
− stworzymy prostą pamięć skojarzeniową, dopasowującą jeden ciąg liczb do drugiego
− spróbujemy rozpoznawać obrazek przedstawiający jakiś znak
− zajmiemy się rozpoznawaniem kart do seta lub sterowaniem czymś związanym z wirtualną fizyką − zobaczymy, może uda się zrobić obie rzeczy

Wymagania

Aby zapisać się na nasze warsztaty nie trzeba mieć pojęcia o sieciach neuronowych. Wystarczy umiejętność programowania w C/C++ (ewentualnie Java/Pascal). Można, chociaż nie jest to wymagane, zapoznać się z podstawami rachunku różniczkowego.

Zadania kwalifikacyjne

Zadania proszę przesyłać na adres: www6-sieci(na)0x04.net. Na wszelki wypadek lepiej podesłać kopię na adres jednego z prowadzących.

Zadanie 1:

Mamy dane 4 funkcje: f(x) = tanh(x), F(x) = arctg(x), g(x) = x, G(x) = 1/(1+e^(-x))

Napisz program, który wczytuje punkt y (zapisany w postaci pewnej liczby rzeczywistej) i oblicza pochodną w punkcie y napisu w rodzaju:
f(G(g(F(g(f(x)))))).

Wejście:
w pierwszej linii wejścia znajduje się y, zapisany w postaci jednej liczby zmiennoprzecinkowej. Następnie znajduje się n (1<=n<=1000), oznaczające liczbę funkcji w napisie.
Następnie znajduje się n znaków oddzielonych spacjami, oznaczających funkcje.

Wyjście:
wartość pochodnej z dokładnością do 3-go miejsca po przecinku.

Przykład:
0.00000
2
f F

Przykładowe wejście oznacza pochodną w zerze f(F(x))=tanh(arctg(x)), równą 1

Program powinien zwrócić:
1.000

Uwaga: Zadanie to nie wymaga znajomości rachunku różniczkowego. Prawdopodobnie wystarcza mieć dostęp do wikipedii i/lub Wolframa.

Zadanie 2

Napisz funkcję, która zwraca miejsce zerowe zadanej funkcji $f$ na przedziale $(u,v)$ z dokładnością do 6 miejsc po przecinku. Załóż, że $f$ jest ciągła oraz $f(u)*f(v)<0$.

W C/C++, skorzystaj ze wskaźników do funkcji, aby móc podawać $f$ jako parametr. Możesz także (w C++ i Javie) wykorzystać do tego celu obiektowość.

O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License