Umelá inteligencia - prvé kroky k programovaniu

19.03 | 22:06 | Žumpa | bedňa

V minulom zápisku som písal o umelej inteligencií v rozpoznávaní obrazu.

V tomto blogu si konečne užijete malé začiatky programovania, ako to vyzerá a pripravíme si prostredie pre prácu.

Budeme sa baviť o Keras. Čo je vysokoúrovňové API nad knižnicami TensorFlow, CNTK, alebo theano.


Prečo Keras? Je vysokoúrovňový, takže riešime len úlohu a nemusíme sa starať o nejaké nízkoúrovňové problémy, ale pokiaľ by sme na ne chceli siahnuť, tak nám tu tá možnosť stále ostáva.

Keď si zoberieme príklad z prvého blogu.


Tak počítačový model bude vyzerať takto jednoducho:
# Zadefinujeme si sekvenčný model
model = Sequential ()

# Pridáme si vrstvu "Dense", ktorá má tri neuróny a dva vstupy.
model.add (Dense (3, input_dim=2))

# Pridáme si ďalšiu vrstvu, čo je vlastne výstup s jedným neurónom.
model.add (Dense (1))
A teraz poskočíme na zložitejší model z druhého blogu, ale kód bude stále dobre čitateľný a v tom je krása Kerasu.

Ten model nie je úplne kompletne popísaný, tak si tie údaje doplníme ako to býva zvykom. Vstup bude nejak rozumne veľký. Teda aby nebol moc veľký a zas dostatočný na rozpoznanie objektu, ja som zvolil 50x50 pixelov, vidíte, že črty je stále možné rozpoznať.


Väčšinu kódu tvoria komentáre.
input_shape = 50, 50
num_classes = 2

# Zadefinujeme si sekvenčný model
model = Sequential ()

# Pridáme si prvú konvolučnú vrstvu s 32 kernelmi (filtrami).
# Kernel má veľkosť 3x3.
# So skokom (stride) o jeden pixel.
# S aktivačnou funkciou 'relu'.
# Vstup je uložený v premennej 'input_shape'.
model.add (Conv2D (32, kernel_size = (3, 3), strides = (1, 1), activation = 'relu', input_shape = input_shape))

# Sploštenie dát som spomínal už v minulom blogu.
# Takto sa to píše v Keras.
model.add (MaxPooling2D (pool_size = (2, 2)))

# Pridáme si ďalšiu konvolučnú vrstvu.
# Ak nezadáme všetky nastavenia, tak sa použijú štandartné hodnoty
model.add (Conv2D (64, kernel_size = (3, 3), activation='relu'))

# Pridáme ešte jedno sploštenie dát.
model.add (MaxPooling2D (pool_size=(2, 2)))

# Teraz dáta sploštíme na 1 x 1 a roztiahneme na dĺžku.
model.add (Flatten ())

# Tu máme plne prepojenú vrstvu s 512 neurónmi.
model.add (Dense (512, activation = 'relu'))

# No a na záver tu máme dva neórony.
# Softmax rozhodne o tom či sa nám rozsvieti neurón 'mama', alebo 'nie mama'
model.add (Dense (num_classes, activation='softmax'))
A teraz si náš model zobrazíme.
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 48, 48, 32)        320       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 24, 24, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 22, 22, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 11, 11, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 7744)              0         
_________________________________________________________________
dense (Dense)                (None, 512)               3965440   
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 1026      
=================================================================
Total params: 3,985,282
Trainable params: 3,985,282
Non-trainable params: 0
_________________________________________________________________
Vidíme, že model má 3 985 282 parametrov. Toto je zatiaľ všetko, prejdeme na prípravu postredia, aby sme sa s ním mohli pohrať.

Predprogramátorské prípravy

Aby sme mohli začať, potrebujeme si nainštalovať TensorFlow a Keras. Najpohodlnejšie to bude nainštalovať cez pip.

V Debian/Ubuntu si pip nainštalujeme príkazom
sudo apt install python3-pip
V Arch Linuxe
sudo pacman -S python-pip
Všetky možnosti inštalácie nájdete tu.
Teraz pip upgradneme. (Tu môže byť problém podľa distra. Tiež je potrebné si pozrieť --user a venv.)
python3 -m pip install --upgrade pip
Teraz nainštalujeme TensorFlow a Keras
python3 -m pip install tensorflow keras
Chvíľu to potrvá, keď je všetko nainštalované, zapneme si python konzolu
python3
Vybehne na nás približne takýto výstup
Python 3.7.6 (default, Jan 19 2020, 22:34:52) 
[GCC 9.2.1 20200117] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Zadáme tam
import tensorflow
Pokiaľ na nás nevybehne nejaká chybová hláška, tak sme za vodou a môžeme si pozrieť akú verziu sme nainštalovali
tensorflow.__version__
U mňa to je '2.1.0'.

Ak to vyhodí nejaký fault, tak máte smolu a budete si musieť TensorFlow skompilovať, alebo použiť nejaké wheels pre svoju platformu, prípadne ak máte v sieti nejaký modernejší HW, tak ho spúšťať po sieti.

Doinštalujeme si ešte knižnice, čo sa nám na prácu s NN hodia a to Numpy a OpenCV.
python3 -m pip install numpy opencv-python

Slovník

Tu nájdete na jednom mieste veci s ktorými sme sa stretli a aj tie ktoré som preskočil.

Backpropagation
Feedforward neural network
Neurónová sieť
Umelý neurón

Kernel (filter) = Slúži na extrahovanie vlastností z dát, prípadne len na splošťovanie dát.
Konvolučné neurónové siete = Vyťahujú z údajov vlastnosti.
Počet parametrov siete = Počet neurónov a prepojení.

Keras
Keras vrstvy
Základné vstvy
Konvolučné vrstvy
Aktivačné funkcie
Optimalizačné algoritmy
Loss funkcie
Metriky

Prílohy