A mai laboron a https://www.tensorflow.org/versions/r0.12/tutorials/deep_cnn/index.html tutoriál példával indítunk. A háttér kapcsán lásd magát a tutoriált és persze az előadásban is bevezetjük: https://prezi.com/0u8ncvvoabcr/no-programming-programming/.
A tanítást érdemes otthon végezni, mert órákig tart, amit persze kis paraméterezgetéssel lehet csökkenteni, ezt a fészen megbeszélhetjük. Maga a feladat egy saját kép felismerése. Konkrétan lefényképeztem a gyerekek egy Prius matchboxát és azt szeretnénk, ha ezt a hálózat felismerné mint CIFAR-10 kategáriát és azt mondaná rá, hogy: "automobil".
kicsiben, azaz a matchbox.png így fest:
De nem ezzel a saját képpel indítunk, hanem azzal, hogy egy egyedi CIFAR-10 képet felismerjen a program, ezt: https://www.cs.toronto.edu/~kriz/cifar-10-sample/deer6.png
Folyamatában így néz ki a labormérés:
Oké-zsoké, lássuk mit kell ehhez forrás szinten módosítani a tutoriál példájában.
- Először is a két tesztelendő képet olyan bináris állománnyá kell alakítani, amit a tutoriál tud értelmezni. Ehhez a legegyszerűbb egy olyan kis progit írni, ami páldául a http://stackoverflow.com/questions/35032675/how-to-create-dataset-similar-to-cifar-10 kis progija mintájára ezt a konverziót elvégzi (itt mi a bemenő képek címkéjét 0-ra állítottuk, mert a pontossággal nem akarunk foglalkozni, csak azzal, hogy az egyedi bemenő képeket felismeri-e a háló).
- Aztán a cifar10_input.py-ban módosítsuk az input() fgv.-t, hogy a mi input.bin állományunkat olvassa be:
else:
#filenames = [os.path.join(data_dir, 'test_batch.bin')]
filenames = [os.path.join(data_dir, 'input.bin')] - Majd a cifar10_eval.py forrást butítsuk le, hogy ne számoljon pontosságot, hanem csak nézze meg, hogy minek ismerte fel leginkább a hálózat a bemenő képet, az eval_once() fgv.-ben:
#while step < num_iter and not coord.should_stop():
# predictions = sess.run([top_k_op])
predictions = sess.run([top_k_op])
print(sess.run(logits[0]))
classification = sess.run(tf.argmax(logits[0], 0))
cifar10classes = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"]
print(cifar10classes[classification])
true_count += np.sum(predictions)
step += 1
# Compute precision @ 1.
precision = true_count / total_sample_count
# print('%s: precision @ 1 = %.3f' % (datetime.now(), precision))
Van még pár apróság, mint páldául a cifar10.py-ban a batch_size 1-re állítása, de ha minden eszünkbe jutna most, akkor nem lenne olyan izgalmas a labor :)
Nyelvi bevezetés
Az előző MNIST és az iménti CIFAR-10 példa azt domborítja ki, hogy a TF egy ML (Machine Learning) nyelv. Most lássuk a "klasszikus" megközelítést. Láttuk, hogy a hivatalos tutoriál szerint a TF "Helló, Világ!" program az a MNIST-es példa, de lássuk egy szokásos Helló Világot:
a részleteket majd az előadáson megbeszéljük. A mi (UDPROG) "klasszikus" példánk a Mandelbrot halmaz (számoltuk C-ben, C++-ban, Qt-vel, P-szálakkal, Open MP-vel, CUDA-val és elosztva, ja és még Javából is megismételtük a számolást, nagyítást, utazást) s lássunk csodát a hivatalos TF tutoriálnak is van Mandelbrotos példája: https://www.tensorflow.org/versions/r0.12/tutorials/mandelbrot/index.html Csináljuk meg ugyanazt az első példát, mint C++-ban és Javában: csak zöld árnyalatokkal rajzolja a halmazt. Magam a TF példájából forkolva csinátam egy csak vöröset:
és meg is jeleníti valóban (vegyük észre, hogy ez az ablak egy jupyter-console)
De a kis nyelvi bemelegítő után máris térjünk vissza a ML témához. Végezetül próbáljuk ki a hivatalos TF tutoriál képfelismerés példáját, futtatva egy saját képre (itt ehhez nem kell programozni szemben az eddigiekkel)
nbatfai@robopsy:~/Robopsychology/repos/gpu/tensorflow$ bazel-bin/tensorflow/examples/label_image/label_image --image=palyan.png
W tensorflow/core/framework/op_def_util.cc:332] Op BatchNormWithGlobalNormalization is deprecated. It will cease to work in GraphDef version 9. Use tf.nn.batch_normalization().
I tensorflow/examples/label_image/main.cc:206] bathing cap (785): 0.415266
I tensorflow/examples/label_image/main.cc:206] rule (519): 0.163412
I tensorflow/examples/label_image/main.cc:206] swimming trunks (945): 0.0780062
I tensorflow/examples/label_image/main.cc:206] snorkel (507): 0.0300284
I tensorflow/examples/label_image/main.cc:206] maillot (977): 0.017797
nbatfai@robopsy:~/Robopsychology/repos/gpu/tensorflow$
Ugyanez az And-os demóval:
S innentől már majd következik ESAMU arcfelismerése!