Vaša konzolová aplikácia napísaná v jazyku C bude fungovať v týchto krokoch:
0
z funkcie main
).
Strojové učenie (z angl. machine learning) je oblasťou umelej inteligencie, ktorá sa zaoberá vývojom algoritmov, ktoré sú schopné sa sami učiť z dát a na základe získaných poznatkov sú schopné robiť rozhodnutia bez zásahu človeka. Najvýznamnejším príkladom sú neurónové siete, ktoré stoja v pozadí súčasnej revolúcie v strojovom učení. Neurónové siete sú inšpirované biologickým nervovým systémom. Neurónová sieť je sada matematických algoritmov, ktoré vykonávajú operácie so vstupnými dátami. Zjednodušene si ich vieme predstaviť ako mriežku výpočtových jednotiek, tzv. neurónov, ktoré sú medzi sebou prepojené a posielajú si medzi sebou signály. Signál sa bežne šíri zo vstupu na výstup cez jednotlivé neuróny.
Pomocou neurónových sietí vieme riešiť rôzne zložité problémy:
Ako príklad si môžeme zobrať jednoduchú neurónovú sieť, ktorej úlohou je klasifikovať vstupný obrázok, na ktorom sa nachádza rukou písaná číslica (viď Obrázok 3). Jednotlvé pixely obrazu predstavujú vstupné signály siete. Tieto signály sú zaslané do neurónov, ktoré ich spracujú a na výstupe získame informáciu o tom, aká číslica je prítomná na obraze. Každý neurón spracuje vstupný signál pomocou svojej aktivačnej funkcie. Aktivačným funkciám sa venujeme v časti Aktivačné funkcie.
Neurónové siete sú zložené z vrstiev neurónov, ktoré sú vzájomne prepojené. Informácie sa sieťou šíria zo vstupnej vrstvy smerom k výstupnej (pozn. pri trénovaní sa informácia šíri opačným smerom). Každá vrstva siete obsahuje neuróny. Neurón je základnou stavebnou jednotkou neurónovej siete. Každý neurón má svoju aktivačnú funkciu, ktorá predstavuje matematickú operáciu na prevod vstupného signálu na výstupný. Na obrázku 4 vidíme znázornenie biologického (hore) a umelého (dole) neurónu.
Do neurónu môže vstupovať viacero signálov. Každý z nich má svoju váhu (z angl. weight), t.j. číslo, ktorým sa signál vynásobí. Vedomosti siete sú obsiahnuté práve v týchto váhach. Počas trénovania siete sa hodnoty váh neustále adaptujú tak, aby sieť spôsobovala, čo najmenšiu chybu pri svojich rozhodnutiach. Po vynásobení signálov váhami sa všetky vstupné hodnoty sčítajú a privedú sa na vstup aktivačnej funkcie. Aktivačná funkcia prevádza vstupné signály na nové hodnoty, ktoré sú väčšinou obmedzené v stanovenom intervale.
Aktivačná funkcia pridáva do výstupu nelinearitu a vďaka tomu vedia neurónové siete riešiť komplikované nelineárne problémy (napr. rozpoznávanie tváre v rôznom osvetlení, vzdialenosti, pod rôznym uhlom). Je množstvo druhov aktivačných funkcií. My sa budeme v tomto zadaní zaoberať nasledovnými aktivačnými funkciami:
Táto funkcia je zapísaná vzťahom $ f_{1}(x) = \begin{cases} 0 & \text{if }x < 0 \\ 1 & \text{if }x \geq 0 \end{cases}\ $
Táto funkcia je zapísaná vzťahom $ f_{2}(x) = \dfrac{1}{1+e^{-x}}$
Táto funkcia je zapísaná vzťahom $ f_{3}(x) = \dfrac{e^x - e^{-x}}{e^x + e^{-x}}$
Táto funkcia je zapísaná vzťahom $ f_{4}(x) = e^{-x^{2}}$
Táto funkcia je zapísaná vzťahom $ f_{5}(x) = \begin{cases} 0 & \text{if }x \leq 0 \\ x & \text{if }x > 0 \end{cases}\ $
Táto funkcia je zapísaná vzťahom $ f_{6}(x,b) = \dfrac{1}{2}\left(x+\sqrt{x^2 + b}\right)$. V tomto zadaní bude platiť $b=4$.
Rozlišujeme dva režimy činnosti programu: automatický a manuálny. Po spustení programu používateľ vstupom z klávesnice určí, ktorý režim sa aktivuje.
Ak používateľ zadá z klávesnice ako prvú hodnotu číslo 0
.
Následne používateľ zadá z klávesnice 3 parametre (čísla oddelené bielymi znakmi):
Tieto parametre definujú interval $\langle x_{start},x_{stop} \rangle$, z ktorého sa s krokom $step$ automaticky vygenerujú vstupné hodnoty pre aktivačné funkcie.
Ak používateľ zadá z klávesnice ako prvú hodnotu číslo 1
.
Následne používateľ zadáva z klávesnice čísla, až pokiaľ nebude načítaný nenumerický vstup (túto situáciu je ľahké odhaliť správnym použitím funkcie scanf). Tieto čísla predstavujú vstupné hodnoty pre aktivačné funkcie.
Všetky číselné hodnoty v automatickom aj manuálnom režime treba načítať ako double
čísla.
V programe môžu za behu nastať tieto chybové situácie, ktoré je potrebné vyšetrovať v nasledujúcom poradí:
Používateľ zadá neplatnú hodnotu pri určovaní režimu fungovania aplikácie. Platné hodnoty sú len 0 a 1.
Všetky ostatné čísla a nenumerické vstupy sú považované za neplatné hodnoty. Ak sa odhalí táto situácia,
program vypíše na štandardný výstup text E1
a okamžite ukončí svoju činnosť
(funkcia main
vráti 0). Žiadne iné výpisy nenastanú.
./z1
5
./z1
g
g
(akceptujú sa len hodnoty
0 alebo 1).
Používateľ zadá v automatickom režime nenumerickú hodnotu pri načítavaní parametrov $x_{start}$, $x_{stop}$ a
$step$. Platné hodnoty sú len číselné hodnoty.
Ak sa odhalí táto situácia, program vypíše na štandardný výstup text E2
a
okamžite ukončí svoju činnosť
(funkcia main
vráti 0). Žiadne iné výpisy nenastanú.
./z1
0 W 1 0.5
W
../z1
0 -1 1 +
+
. Používateľ zadá v automatickom režime také hodnoty $x_{start}$ a $x_{stop}$, pre ktoré platí $x_{start} \geq
x_{stop}$.
Ak sa odhalí táto situácia, program vypíše na štandardný výstup text E3
a
okamžite ukončí svoju činnosť
(funkcia main
vráti 0). Žiadne iné výpisy nenastanú.
./z1
0 2 2 0.3
./z1
0 -2 -4 1
Aplikácia má za úlohu formátovane vypísať tabuľku s hodnotami aktivačných funkcií $f_{1} ... f_{6}$, ktoré boli
uvedené v časti
Neuróny a aktivačné funkcie. Výpis musí smerovať na štandardný výstup (t.j. stdout
).
Vstupy pre aktivačné funkcie sa získajú v závislosti od zvoleného režimu.
Ak bol zvolený automatický režim, vstupy sa vygenerujú zo zadaného intervalu.
V prípade manuálneho režimu, vstupy zadá používateľ.
Každý riadok tabuľky má 7 stĺpcov a bude predstavovať hodnoty všetkých aktivačných funkcií pre jednu vstupnú hodnotu. Štruktúra riadku je nasledovná:
x f1 f2 f3 f4 f5 f6
kde:
x
je hodnota vstupu zobrazená v stĺpci so šírkou 10 znakov, s presnosťou 2 desatinných miest a zarovnaná dopravaf1 f2 f3 f4 f5 f6
sú hodnoty aktivačných funkcií, pričom každá hodnota je zobrazená
v stĺpci so šírkou 10 znakov, s presnosťou 2 desatinných miest a zarovnaná dopravaDôležitá poznámka: na výpis a zobrazovanie stanoveného počtu desatinných miest používajte funkciu printf. Vypočítané číselné hodnoty žiadno neupravujte ani nezaokrúhľujte.
Spustenie programu:
./z1
1 -3 0.5 -0.41 2 5 0 k
Výstup programu (biele znaky sú zámerne ukázané):
-3.00 0.00 0.05 -1.00 0.00 0.00 0.30
0.50 1.00 0.62 0.46 0.78 0.50 1.28
-0.41 0.00 0.40 -0.39 0.85 0.00 0.82
2.00 1.00 0.88 0.96 0.02 2.00 2.41
5.00 1.00 0.99 1.00 0.00 5.00 5.19
0.00 1.00 0.50 0.00 1.00 0.00 1.00
Poznámka: môžeme si všimnúť, že každý stĺpec má šírku 10 znakov. V každom stĺpci je hodnota zobrazená s presnosťou 2 desatinných miest. V každom stĺpci je hodnota zarovnaná doprava.
Odovzdávací systém otestuje a ohodnotí nasledovné oblasti funkcionality vášho programu. Na získanie bodov za konkrétny testovací scenár je nutné, aby testom prešli všetky testovacie prípady v danom scenári.
Scenár 1
Chybová situácia E1
|
1 b |
Scenár 2
Chybová situácia E2
|
1 b |
Scenár 3
Chybová situácia E3
|
1 b |
Scenár 4
Automatický režim - kontrola správnosti hodnôt v tabuľke
|
3 b |
Scenár 5
Manuálny režim - kontrola správnosti hodnôt v tabuľke
|
3 b |
Scenár 6
Dodržanie formátu tabuľky (presnosť, zarovnanie, šírka stĺpca)
|
1 b |
Súčet | 10 b |
Video zachytáva proces skompilovania zdrojového kódu prekladačom GCC a spustenia programu s rôznymi vstupmi.
./z1
Vstup:
5
Výstup:
E1
Spustenie 2:
./z1
Vstup:
P 2 3 0.2
Výstup:
E1
./z1
Vstup:
0 v 3 0.11
Výstup:
E2
Spustenie 2:
./z1
Vstup:
0 0.23 x x
Výstup:
E2
Spustenie 3:
./z1
Vstup:
0 -3 m 1.5
Výstup:
E2
./z1
Vstup:
0 5 5 5
Výstup:
E3
Spustenie 2:
./z1
Vstup:
0 10 -2 0.3
Výstup:
E3
Spustenie 3:
./z1
Vstup:
0 -2.2 -2.3 0.2
Výstup:
E3
./z1
Vstup:
0 -3 3 0.35
Výstup:
-3.00 0.00 0.05 -1.00 0.00 0.00 0.30
-2.65 0.00 0.07 -0.99 0.00 0.00 0.34
-2.30 0.00 0.09 -0.98 0.01 0.00 0.37
-1.95 0.00 0.12 -0.96 0.02 0.00 0.42
-1.60 0.00 0.17 -0.92 0.08 0.00 0.48
-1.25 0.00 0.22 -0.85 0.21 0.00 0.55
-0.90 0.00 0.29 -0.72 0.44 0.00 0.65
-0.55 0.00 0.37 -0.50 0.74 0.00 0.76
-0.20 0.00 0.45 -0.20 0.96 0.00 0.90
0.15 1.00 0.54 0.15 0.98 0.15 1.08
0.50 1.00 0.62 0.46 0.78 0.50 1.28
0.85 1.00 0.70 0.69 0.49 0.85 1.51
1.20 1.00 0.77 0.83 0.24 1.20 1.77
1.55 1.00 0.82 0.91 0.09 1.55 2.04
1.90 1.00 0.87 0.96 0.03 1.90 2.33
2.25 1.00 0.90 0.98 0.01 2.25 2.63
2.60 1.00 0.93 0.99 0.00 2.60 2.94
2.95 1.00 0.95 0.99 0.00 2.95 3.26
Spustenie 2:
./z1
Vstup:
0 0 0.7 0.3
Výstup:
0.00 1.00 0.50 0.00 1.00 0.00 1.00
0.30 1.00 0.57 0.29 0.91 0.30 1.16
0.60 1.00 0.65 0.54 0.70 0.60 1.34
Spustenie 3:
./z1
Vstup:
0 -9 -1 1
Výstup:
-9.00 0.00 0.00 -1.00 0.00 0.00 0.11
-8.00 0.00 0.00 -1.00 0.00 0.00 0.12
-7.00 0.00 0.00 -1.00 0.00 0.00 0.14
-6.00 0.00 0.00 -1.00 0.00 0.00 0.16
-5.00 0.00 0.01 -1.00 0.00 0.00 0.19
-4.00 0.00 0.02 -1.00 0.00 0.00 0.24
-3.00 0.00 0.05 -1.00 0.00 0.00 0.30
-2.00 0.00 0.12 -0.96 0.02 0.00 0.41
-1.00 0.00 0.27 -0.76 0.37 0.00 0.62
Spustenie 4:
./z1
Vstup:
0 -4.29 5.11 0.07
Výstup:
-4.29 0.00 0.01 -1.00 0.00 0.00 0.22
-4.22 0.00 0.01 -1.00 0.00 0.00 0.22
-4.15 0.00 0.02 -1.00 0.00 0.00 0.23
-4.08 0.00 0.02 -1.00 0.00 0.00 0.23
-4.01 0.00 0.02 -1.00 0.00 0.00 0.24
-3.94 0.00 0.02 -1.00 0.00 0.00 0.24
-3.87 0.00 0.02 -1.00 0.00 0.00 0.24
-3.80 0.00 0.02 -1.00 0.00 0.00 0.25
-3.73 0.00 0.02 -1.00 0.00 0.00 0.25
-3.66 0.00 0.03 -1.00 0.00 0.00 0.26
-3.59 0.00 0.03 -1.00 0.00 0.00 0.26
-3.52 0.00 0.03 -1.00 0.00 0.00 0.26
-3.45 0.00 0.03 -1.00 0.00 0.00 0.27
-3.38 0.00 0.03 -1.00 0.00 0.00 0.27
-3.31 0.00 0.04 -1.00 0.00 0.00 0.28
-3.24 0.00 0.04 -1.00 0.00 0.00 0.28
-3.17 0.00 0.04 -1.00 0.00 0.00 0.29
-3.10 0.00 0.04 -1.00 0.00 0.00 0.29
-3.03 0.00 0.05 -1.00 0.00 0.00 0.30
-2.96 0.00 0.05 -0.99 0.00 0.00 0.31
-2.89 0.00 0.05 -0.99 0.00 0.00 0.31
-2.82 0.00 0.06 -0.99 0.00 0.00 0.32
-2.75 0.00 0.06 -0.99 0.00 0.00 0.33
-2.68 0.00 0.06 -0.99 0.00 0.00 0.33
-2.61 0.00 0.07 -0.99 0.00 0.00 0.34
-2.54 0.00 0.07 -0.99 0.00 0.00 0.35
-2.47 0.00 0.08 -0.99 0.00 0.00 0.35
-2.40 0.00 0.08 -0.98 0.00 0.00 0.36
-2.33 0.00 0.09 -0.98 0.00 0.00 0.37
-2.26 0.00 0.09 -0.98 0.01 0.00 0.38
-2.19 0.00 0.10 -0.98 0.01 0.00 0.39
-2.12 0.00 0.11 -0.97 0.01 0.00 0.40
-2.05 0.00 0.11 -0.97 0.01 0.00 0.41
-1.98 0.00 0.12 -0.96 0.02 0.00 0.42
-1.91 0.00 0.13 -0.96 0.03 0.00 0.43
-1.84 0.00 0.14 -0.95 0.03 0.00 0.44
-1.77 0.00 0.15 -0.94 0.04 0.00 0.45
-1.70 0.00 0.15 -0.94 0.06 0.00 0.46
-1.63 0.00 0.16 -0.93 0.07 0.00 0.48
-1.56 0.00 0.17 -0.92 0.09 0.00 0.49
-1.49 0.00 0.18 -0.90 0.11 0.00 0.50
-1.42 0.00 0.19 -0.89 0.13 0.00 0.52
-1.35 0.00 0.21 -0.87 0.16 0.00 0.53
-1.28 0.00 0.22 -0.86 0.19 0.00 0.55
-1.21 0.00 0.23 -0.84 0.23 0.00 0.56
-1.14 0.00 0.24 -0.81 0.27 0.00 0.58
-1.07 0.00 0.26 -0.79 0.32 0.00 0.60
-1.00 0.00 0.27 -0.76 0.37 0.00 0.62
-0.93 0.00 0.28 -0.73 0.42 0.00 0.64
-0.86 0.00 0.30 -0.70 0.48 0.00 0.66
-0.79 0.00 0.31 -0.66 0.54 0.00 0.68
-0.72 0.00 0.33 -0.62 0.60 0.00 0.70
-0.65 0.00 0.34 -0.57 0.66 0.00 0.73
-0.58 0.00 0.36 -0.52 0.71 0.00 0.75
-0.51 0.00 0.38 -0.47 0.77 0.00 0.78
-0.44 0.00 0.39 -0.41 0.82 0.00 0.80
-0.37 0.00 0.41 -0.35 0.87 0.00 0.83
-0.30 0.00 0.43 -0.29 0.91 0.00 0.86
-0.23 0.00 0.44 -0.23 0.95 0.00 0.89
-0.16 0.00 0.46 -0.16 0.97 0.00 0.92
-0.09 0.00 0.48 -0.09 0.99 0.00 0.96
-0.02 0.00 0.50 -0.02 1.00 0.00 0.99
0.05 1.00 0.51 0.05 1.00 0.05 1.03
0.12 1.00 0.53 0.12 0.99 0.12 1.06
0.19 1.00 0.55 0.19 0.96 0.19 1.10
0.26 1.00 0.56 0.25 0.93 0.26 1.14
0.33 1.00 0.58 0.32 0.90 0.33 1.18
0.40 1.00 0.60 0.38 0.85 0.40 1.22
0.47 1.00 0.62 0.44 0.80 0.47 1.26
0.54 1.00 0.63 0.49 0.75 0.54 1.31
0.61 1.00 0.65 0.54 0.69 0.61 1.35
0.68 1.00 0.66 0.59 0.63 0.68 1.40
0.75 1.00 0.68 0.64 0.57 0.75 1.44
0.82 1.00 0.69 0.68 0.51 0.82 1.49
0.89 1.00 0.71 0.71 0.45 0.89 1.54
0.96 1.00 0.72 0.74 0.40 0.96 1.59
1.03 1.00 0.74 0.77 0.35 1.03 1.64
1.10 1.00 0.75 0.80 0.30 1.10 1.69
1.17 1.00 0.76 0.82 0.25 1.17 1.74
1.24 1.00 0.78 0.85 0.21 1.24 1.80
1.31 1.00 0.79 0.86 0.18 1.31 1.85
1.38 1.00 0.80 0.88 0.15 1.38 1.90
1.45 1.00 0.81 0.90 0.12 1.45 1.96
1.52 1.00 0.82 0.91 0.10 1.52 2.02
1.59 1.00 0.83 0.92 0.08 1.59 2.07
1.66 1.00 0.84 0.93 0.06 1.66 2.13
1.73 1.00 0.85 0.94 0.05 1.73 2.19
1.80 1.00 0.86 0.95 0.04 1.80 2.25
1.87 1.00 0.87 0.95 0.03 1.87 2.30
1.94 1.00 0.87 0.96 0.02 1.94 2.36
2.01 1.00 0.88 0.96 0.02 2.01 2.42
2.08 1.00 0.89 0.97 0.01 2.08 2.48
2.15 1.00 0.90 0.97 0.01 2.15 2.54
2.22 1.00 0.90 0.98 0.01 2.22 2.60
2.29 1.00 0.91 0.98 0.01 2.29 2.67
2.36 1.00 0.91 0.98 0.00 2.36 2.73
2.43 1.00 0.92 0.98 0.00 2.43 2.79
2.50 1.00 0.92 0.99 0.00 2.50 2.85
2.57 1.00 0.93 0.99 0.00 2.57 2.91
2.64 1.00 0.93 0.99 0.00 2.64 2.98
2.71 1.00 0.94 0.99 0.00 2.71 3.04
2.78 1.00 0.94 0.99 0.00 2.78 3.10
2.85 1.00 0.95 0.99 0.00 2.85 3.17
2.92 1.00 0.95 0.99 0.00 2.92 3.23
2.99 1.00 0.95 0.99 0.00 2.99 3.29
3.06 1.00 0.96 1.00 0.00 3.06 3.36
3.13 1.00 0.96 1.00 0.00 3.13 3.42
3.20 1.00 0.96 1.00 0.00 3.20 3.49
3.27 1.00 0.96 1.00 0.00 3.27 3.55
3.34 1.00 0.97 1.00 0.00 3.34 3.62
3.41 1.00 0.97 1.00 0.00 3.41 3.68
3.48 1.00 0.97 1.00 0.00 3.48 3.75
3.55 1.00 0.97 1.00 0.00 3.55 3.81
3.62 1.00 0.97 1.00 0.00 3.62 3.88
3.69 1.00 0.98 1.00 0.00 3.69 3.94
3.76 1.00 0.98 1.00 0.00 3.76 4.01
3.83 1.00 0.98 1.00 0.00 3.83 4.08
3.90 1.00 0.98 1.00 0.00 3.90 4.14
3.97 1.00 0.98 1.00 0.00 3.97 4.21
4.04 1.00 0.98 1.00 0.00 4.04 4.27
4.11 1.00 0.98 1.00 0.00 4.11 4.34
4.18 1.00 0.98 1.00 0.00 4.18 4.41
4.25 1.00 0.99 1.00 0.00 4.25 4.47
4.32 1.00 0.99 1.00 0.00 4.32 4.54
4.39 1.00 0.99 1.00 0.00 4.39 4.61
4.46 1.00 0.99 1.00 0.00 4.46 4.67
4.53 1.00 0.99 1.00 0.00 4.53 4.74
4.60 1.00 0.99 1.00 0.00 4.60 4.81
4.67 1.00 0.99 1.00 0.00 4.67 4.88
4.74 1.00 0.99 1.00 0.00 4.74 4.94
4.81 1.00 0.99 1.00 0.00 4.81 5.01
4.88 1.00 0.99 1.00 0.00 4.88 5.08
4.95 1.00 0.99 1.00 0.00 4.95 5.14
5.02 1.00 0.99 1.00 0.00 5.02 5.21
5.09 1.00 0.99 1.00 0.00 5.09 5.28
./z1
Vstup:
1 1 2 3 4 5 6 0 e
Výstup:
1.00 1.00 0.73 0.76 0.37 1.00 1.62
2.00 1.00 0.88 0.96 0.02 2.00 2.41
3.00 1.00 0.95 1.00 0.00 3.00 3.30
4.00 1.00 0.98 1.00 0.00 4.00 4.24
5.00 1.00 0.99 1.00 0.00 5.00 5.19
6.00 1.00 1.00 1.00 0.00 6.00 6.16
0.00 1.00 0.50 0.00 1.00 0.00 1.00
Spustenie 2:
./z1
Vstup:
1 -1 2.02 0.12 -4.67 0 2 3 1 Z
Výstup:
-1.00 0.00 0.27 -0.76 0.37 0.00 0.62
2.02 1.00 0.88 0.97 0.02 2.02 2.43
0.12 1.00 0.53 0.12 0.99 0.12 1.06
-4.67 0.00 0.01 -1.00 0.00 0.00 0.21
0.00 1.00 0.50 0.00 1.00 0.00 1.00
2.00 1.00 0.88 0.96 0.02 2.00 2.41
3.00 1.00 0.95 1.00 0.00 3.00 3.30
1.00 1.00 0.73 0.76 0.37 1.00 1.62
Spustenie 3:
./z1
Vstup:
1 -9.91 3.26 0.84 -6.34 0 0 1 1 0.11 0.12 -0.13 g
Výstup:
-9.91 0.00 0.00 -1.00 0.00 0.00 0.10
3.26 1.00 0.96 1.00 0.00 3.26 3.54
0.84 1.00 0.70 0.69 0.49 0.84 1.50
-6.34 0.00 0.00 -1.00 0.00 0.00 0.15
0.00 1.00 0.50 0.00 1.00 0.00 1.00
0.00 1.00 0.50 0.00 1.00 0.00 1.00
1.00 1.00 0.73 0.76 0.37 1.00 1.62
1.00 1.00 0.73 0.76 0.37 1.00 1.62
0.11 1.00 0.53 0.11 0.99 0.11 1.06
0.12 1.00 0.53 0.12 0.99 0.12 1.06
-0.13 0.00 0.47 -0.13 0.98 0.00 0.94
Nasledujúce zdroje vám môžu pomôcť pri programovaní zadania. Odporúčame si tieto zdroje preštudovať. Na prístup k niektorým zdrojom potrebujete byť prihlásení vo vašom Google STU konte.
Prednášky
Jazyk C
Funkcie printf
a scanf
Zdroje použité pri tvorbe zadania a prezentácie