Iti0210lab12: erinevus redaktsioonide vahel
| (ei näidata sama kasutaja 8 vahepealset redaktsiooni) | |||
| 3. rida: | 3. rida: | ||
== Sissejuhatus == | == Sissejuhatus == | ||
Selle ülesande eesmärgiks on katsetada närvivõrgu treenimist. Ülesandes teeme objektituvastust pildilt. | |||
Endale sobiv närvivõrk vali ise, juhendi näited kasutavad <code>sklearn</code> paketti. | |||
Kõigepealt treenime närvivõrgu, kasutades [https://github.com/zalandoresearch/fashion-mnist Fashion-MNIST] andmestikku. See sisaldab 60000 rasterformaadis pilti treenimiseks ning 10000 samas formaadis pilti testimiseks. | Kõigepealt treenime närvivõrgu, kasutades [https://github.com/zalandoresearch/fashion-mnist Fashion-MNIST] andmestikku. See sisaldab 60000 rasterformaadis pilti treenimiseks ning 10000 samas formaadis pilti testimiseks. | ||
| 12. rida: | 12. rida: | ||
== Ettevalmistus == | == Ettevalmistus == | ||
Vali endale sobiv närvivõrgu implementatsioon: | |||
* [https://scikit-learn.org/stable/ scikit-learn]. Kõige lihtsam: on Anacondas juba sees, kõik näited on sellega tehtud. Miinus: närvivõrkude tegemiseks väga piiratud. | |||
* [https://www.tensorflow.org/guide/keras/overview Keras]. Suht lihtne kasutada. | |||
* [https://pytorch.org/ PyTorch]. | |||
* [http://deeplearning4j.org/ Deeplearning4j]. Java. | |||
Andmed: | |||
# Loe läbi [https://github.com/zalandoresearch/fashion-mnist#why-we-made-fashion-mnist "Why we made Fashion-MNIST"]. | # Loe läbi [https://github.com/zalandoresearch/fashion-mnist#why-we-made-fashion-mnist "Why we made Fashion-MNIST"]. | ||
| 24. rida: | 33. rida: | ||
</pre> | </pre> | ||
== Närvivõrgu treenimine == | * <code>X_train</code> - treeningpildid (60000x784 massiiv, iga pilt on 784 pikslit) | ||
* <code>y_train</code> - pildi klassifikaator (0-9) | |||
* <code>X_test</code> - testpildid klassifitseerimiseks | |||
* <code>y_test</code> - testpildi õige klassifikatsioon, et kontrollida närvivõrgu väljundi õigsust | |||
== Närvivõrgu treenimine <code>sklearn</code> paketiga == | |||
Kui kasutad muud paketti, uuri selle juhendit ja näiteid Internetist ([https://www.tensorflow.org/tutorials/keras/classification Keras],[https://www.marktechpost.com/2019/07/30/introduction-to-image-classification-using-pytorch-to-classify-fashionmnist-dataset/ PyTorch]). | |||
Kasutame mitmekihilist ''perceptron'' tüüpi närvivõrku ([http://scikit-learn.org/stable/modules/neural_networks_supervised.html dokumentatsioon]). | Kasutame mitmekihilist ''perceptron'' tüüpi närvivõrku ([http://scikit-learn.org/stable/modules/neural_networks_supervised.html dokumentatsioon]). | ||
| 44. rida: | 60. rida: | ||
Huvitavad parameetrid: | Huvitavad parameetrid: | ||
* <code>max_iter</code> - mitu treenimise "epohhi" tehakse. Vähem on kiirem, aga | * <code>max_iter</code> - mitu treenimise "epohhi" tehakse. Vähem on kiirem, aga mudeli parameetrid ei pruugi konvergeeruda. | ||
* <code>hidden_layer_sizes</code> - annab närvivõrgu struktuuri. Toodud näites on ühe peidetud kihiga struktuur | * <code>hidden_layer_sizes</code> - annab närvivõrgu struktuuri. Toodud näites on ühe peidetud kihiga (10 sõlme) struktuur. Sisendite ja väljundite arv leitakse automaatselt treeningandmete pealt. | ||
Katseta peidetud kihtide arvu, suuruse ja treeningiteratsioonide arvu muutmisega. | |||
[http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html Muud parameetrid]. | [http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html Muud parameetrid]. | ||
| 60. rida: | 78. rida: | ||
== Katsetamine == | == Katsetamine == | ||
Otsi Google pildiotsinguga sobivaid pilte ja konverteeri need 28x28, ''grayscale'' formaati. Pane tähele kuidas MNIST-Fashion treeningandmetes on kujundid esitatud: taust on must ja objektid on heledad, seetõttu on tõenäoliselt vajalik inverteerimine. | Otsi Google pildiotsinguga sobivaid pilte (umbes 5-15 tk) ja konverteeri need 28x28, ''grayscale'' formaati. Pane tähele kuidas MNIST-Fashion treeningandmetes on kujundid esitatud: taust on must ja objektid on heledad, seetõttu on tõenäoliselt vajalik inverteerimine. | ||
Enne: | Enne: | ||
| 66. rida: | 84. rida: | ||
[[Image:Ifi6057lab12_before.jpg|240px|kott]] | [[Image:Ifi6057lab12_before.jpg|240px|kott]] | ||
Pärast: | Pärast (märkus: testis on kasutatud BMP formaati, wiki seda ei toeta): | ||
[[Image:Ifi6057lab12_after. | [[Image:Ifi6057lab12_after.jpg|kott, 28x28]] | ||
Proovime laadida ja klassifitseerida. Pildifail tuleks saada ühemõõtmelise massiivi kujule ning iga piksli väärtus normaliseerida samuti kui treenimisel. | Proovime laadida ja klassifitseerida. Pildifail tuleks saada ühemõõtmelise massiivi kujule ning iga piksli väärtus normaliseerida samuti kui treenimisel. | ||
| 74. rida: | 92. rida: | ||
<pre> | <pre> | ||
import numpy as np | import numpy as np | ||
from scipy.misc import imread | #from scipy.misc import imread | ||
from imageio import imread | |||
bla = imread("test1_28.bmp", | bla = imread("test1_28.bmp", pilmode='L') | ||
X = np.reshape(bla, (1,28*28)) / 255.0 | X = np.reshape(bla, (1,28*28)) / 255.0 | ||
print(X.shape) | print(X.shape) | ||
</pre> | |||
[sklearn] | |||
<pre> | |||
print(clf.predict(X)) | print(clf.predict(X)) | ||
</pre> | </pre> | ||
Märkus: <code>predict()</code> meetod tahab parameetrina sisendite massiivi ja annab vastuseks ka klasside massiivi. Antud näites on aga üks pilt ja seega mõlema massiivi pikkuseks 1. | Märkus: <code>predict()</code> meetod tahab parameetrina sisendite massiivi ja annab vastuseks ka klasside massiivi. Antud näites on aga üks pilt ja seega mõlema massiivi pikkuseks 1. | ||
Klassifikaatorite [https://github.com/zalandoresearch/fashion-mnist#labels tähendused]. | |||
<!-- | |||
== Esitamine == | |||
Esita: | |||
* oma programmikood | |||
* testpildid | |||
* lühike kommentaar tulemuste kohta (eraldi failis või programmikoodi juures) | |||
Kui faile on palju, pane need .zip (vm levinud formaadis) arhiivi. | |||
Viimane redaktsioon: 26. november 2019, kell 19:05
Närvivõrk: pildituvastus
Sissejuhatus
Selle ülesande eesmärgiks on katsetada närvivõrgu treenimist. Ülesandes teeme objektituvastust pildilt.
Endale sobiv närvivõrk vali ise, juhendi näited kasutavad sklearn paketti.
Kõigepealt treenime närvivõrgu, kasutades Fashion-MNIST andmestikku. See sisaldab 60000 rasterformaadis pilti treenimiseks ning 10000 samas formaadis pilti testimiseks.
Siis proovime närvivõrku rakendada suvaliste piltide tuvastamiseks.
Ettevalmistus
Vali endale sobiv närvivõrgu implementatsioon:
- scikit-learn. Kõige lihtsam: on Anacondas juba sees, kõik näited on sellega tehtud. Miinus: närvivõrkude tegemiseks väga piiratud.
- Keras. Suht lihtne kasutada.
- PyTorch.
- Deeplearning4j. Java.
Andmed:
- Loe läbi "Why we made Fashion-MNIST".
- Laadi andmed alla: juhend / lingid.
- Tee selgeks, kuidas andmefaile avada ja pildiandmeid sisse laadida]. Näiteks Pythoni ja
scikit-learnkasutamisel on abi sellest skriptist.
import mnist_reader
X_train, y_train = mnist_reader.load_mnist('', kind='train')
X_test, y_test = mnist_reader.load_mnist('', kind='t10k')
X_train- treeningpildid (60000x784 massiiv, iga pilt on 784 pikslit)y_train- pildi klassifikaator (0-9)X_test- testpildid klassifitseerimiseksy_test- testpildi õige klassifikatsioon, et kontrollida närvivõrgu väljundi õigsust
Närvivõrgu treenimine sklearn paketiga
Kui kasutad muud paketti, uuri selle juhendit ja näiteid Internetist (Keras,PyTorch).
Kasutame mitmekihilist perceptron tüüpi närvivõrku (dokumentatsioon).
Kuna tegu on 8-bitiste piltidega, kus iga piksli väärtus on 0 kuni 255, siis on soovitatav sisendid normaliseerida vahemikku (0, 1).
from sklearn.neural_network import MLPClassifier
clf = MLPClassifier(max_iter = 50,
hidden_layer_sizes=(10,), random_state=1)
X_train = X_train / 255.0
X_test = X_test / 255.0
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
Huvitavad parameetrid:
max_iter- mitu treenimise "epohhi" tehakse. Vähem on kiirem, aga mudeli parameetrid ei pruugi konvergeeruda.hidden_layer_sizes- annab närvivõrgu struktuuri. Toodud näites on ühe peidetud kihiga (10 sõlme) struktuur. Sisendite ja väljundite arv leitakse automaatselt treeningandmete pealt.
Katseta peidetud kihtide arvu, suuruse ja treeningiteratsioonide arvu muutmisega.
Põhimõtteliselt on võimalik kiiruse huvides ka treeningandmete suurust vähendada, aga lõplik treenimine tuleks kindlasti teha täisandmete pealt.
import random X_small, y_small = zip(*random.sample(list(zip(X_train, y_train)), 6000)) clf.fit(X_small, y_small)
Katsetamine
Otsi Google pildiotsinguga sobivaid pilte (umbes 5-15 tk) ja konverteeri need 28x28, grayscale formaati. Pane tähele kuidas MNIST-Fashion treeningandmetes on kujundid esitatud: taust on must ja objektid on heledad, seetõttu on tõenäoliselt vajalik inverteerimine.
Enne:
Pärast (märkus: testis on kasutatud BMP formaati, wiki seda ei toeta):
Proovime laadida ja klassifitseerida. Pildifail tuleks saada ühemõõtmelise massiivi kujule ning iga piksli väärtus normaliseerida samuti kui treenimisel.
import numpy as np
#from scipy.misc import imread
from imageio import imread
bla = imread("test1_28.bmp", pilmode='L')
X = np.reshape(bla, (1,28*28)) / 255.0
print(X.shape)
[sklearn]
print(clf.predict(X))
Märkus: predict() meetod tahab parameetrina sisendite massiivi ja annab vastuseks ka klasside massiivi. Antud näites on aga üks pilt ja seega mõlema massiivi pikkuseks 1.
Klassifikaatorite tähendused.
