sql >> Databáze >  >> RDS >> MariaDB

Část 2:Klasifikace obrázků pomocí serveru MariaDB a TensorFlow – výukový program

Formátování dat pro TensorFlow

Část 1 této série blogů demonstrovala výhody použití relační databáze k ukládání a provádění průzkumu dat obrázků pomocí jednoduchých příkazů SQL. V tomto tutoriálu, část 2, budou data použitá v části jedna zpřístupněna z databáze serveru MariaDB a převedena na datové struktury potřebné pro TensorFlow. Výsledky použití modelu pro klasifikaci nových obrázků budou uloženy v relační tabulce pro další analýzu.

Toto je rychlý návod k programu TensorFlow s podrobnostmi popsanými za pochodu. Pokud nejste obeznámeni se základními pojmy, dobrým začátkem je tento tutoriál TensorFlow „Základní klasifikace:Klasifikace obrázků oblečení“. Zde jsou použity některé příklady a kód ve výukovém programu.

Potřebné další balíčky

Pro vytvoření a trénování modelu klasifikace obrázků jsou potřeba některé další balíčky:

  1. Okurka implementuje binární protokoly pro serializaci a de-serializaci objektové struktury Pythonu.
  2. NumPy poskytuje podporu pro velká, vícerozměrná pole a matice spolu s matematickými funkcemi na vysoké úrovni, které s těmito poli pracují.
  3. TensorFlow je knihovna Pythonu pro rychlé numerické výpočty. Je to základní knihovna, kterou lze použít k vytváření modelů hlubokého učení přímo nebo pomocí knihoven obalů, které zjednodušují proces postavený na TensorFlow.
  4. Keras je open source knihovna neuronových sítí napsaná v Pythonu.
import pickleimport numpy jako npimport tensorflow jako tffrom tensorflow import kerasprint('Tensorflow verze:', tf.__version__)print('Numpy verze:', np.__version__)Tensorflow verze:2.0.0Numpy verze:1.2 před> 

Načíst obrázky

Jakmile jsou balíčky naimportovány, dalším krokem je načíst tréninkové obrázky z databáze a rozdělit data na dvě numpy pole. Nejprve musíme inicializovat pole tréninkových obrázků (train_images) a tréninkových štítků (train_labels). Protože jsme již vektorizovali obrázky, můžeme použít atribut img_vector k naplnění pole train_images příkazem SQL níže.

# Inicializujte numpy arraystrain_images =np.empty((60000,28,28), dtype='uint8')train_labels =np.empty((60000), dtype='uint8')# Získejte tréninkové obrázky z databasesql="SELECT img_label, img_vector, img_idx \FROM tf_images INNER JOIN img_use ON img_use =use_id \WHERE use_name ='Trénink'"cur.execute(sql)result =cur.fetchall()# Naplňte numpy pole. řádek[2] obsahuje index obrázku pro řádek ve výsledku:nparray =pickle.loads(řádek[1])train_images[řádek[2]] =nparraytrain_labels[řádek[2]] =řádek[0]

Podobným způsobem lze z databáze získat obrázky pro testování. numpy pole použitá v tomto případě jsou test_images a test_labels. V tomto případě jsou testovací data 10 000 snímků v rozlišení 28×28 pixelů.

# Inicializujte numpy arraystest_images =np.empty((10000,28,28), dtype='uint8')test_labels =np.empty((10000), dtype='uint8')# Načtěte testovací obrázky z databasesql="SELECT img_label, img_vector, img_idx \FROM tf_images INNER JOIN img_use ON img_use =use_id \WHERE use_name ='Testování'"cur.execute(sql)result =cur.fetchall()# Naplňte numpy pole. řádek[2] obsahuje index obrázku pro řádek ve výsledku:nparray =pickle.loads(řádek[1])test_images[řádek[2]] =nparraytest_labels[řádek[2]] =řádek[0]

Nakonec je každý obrázek namapován na jeden štítek. Názvy štítků jsou uloženy v tabulce kategorií a načteny do pole class_names:

sql="SELECT class_name FROM category"cur.execute(sql)class_names =cur.fetchall()

Předběžné zpracování dat

Data musí být před trénováním sítě předzpracována. Pokud si prohlédnete první obrázek v trénovací sadě, uvidíte, že hodnoty pixelů spadají do rozsahu 0 až 255:

plt.figure()plt.imshow(train_images[0])plt.colorbar()plt.grid(False)plt.show()


výše:obrázek z datové sady fashion_mnist

Před vložením obrázků do modelu neuronové sítě je třeba hodnoty upravit na rozsah 0 až 1. Chcete-li to provést, vydělte hodnoty 255. Je důležité, aby trénovací sada a testovací sada byly předzpracovány stejným způsobem. .

Můžete použít matplotlib zobrazíte prvních 25 obrázků, abyste si ověřili, že data jsou ve správném formátu a připravena k vytvoření a trénování sítě:

train_images =train_images / 255.0test_images =test_images / 255.0plt.figure(figsize=(10,10))for i in range(25):plt.subplot(5,5,i+1)plt.xticks([ ])plt.yticks([])plt.grid(False)plt.imshow(train_images[i], cmap=plt.cm.binary)plt.xlabel(class_names[train_labels[i]])plt.show() 


výše:obrázky z datové sady fashion_mnist

Sestavení modelu

Po předzpracování dat do dvou podmnožin můžete pokračovat v trénování modelu. Tento proces zahrnuje „krmení“ algoritmu tréninkovými daty. Algoritmus zpracuje data a vytvoří model, který je schopen v nových datech najít cílovou hodnotu (atribut) – tedy klasifikovat obraz prezentovaný neuronové síti.

Většina neuronových sítí s hlubokým učením se vytváří řetězením jednoduchých vrstev.

První vrstva v síti transformuje formát obrazu z dvourozměrného pole (28 x 28 pixelů) na jednorozměrné pole (28 * 28 =784 pixelů). Tato vrstva nemá žádné parametry k učení; pouze přeformátuje data.

Po zploštění pixelů se síť skládá ze dvou plně propojených vrstev, které je třeba aktivovat. V neuronové síti je aktivační funkce zodpovědná za transformaci sečteného váženého vstupu z uzlu na aktivaci uzlu nebo výstupu pro tento vstup.

První hustá vrstva má 128 uzlů (nebo neuronů) a používá aktivační metodu Rectified Linear Unit (ReLU). Upravená lineární aktivační funkce je po částech lineární funkce, která bude mít výstup přímo, pokud je kladný, jinak bude mít výstup nulu.

Druhá (a poslední) vrstva je vrstva softmax s 10 uzly. Funkce softmax vygeneruje vektor, který představuje rozdělení pravděpodobnosti seznamu potenciálních výsledků. Vrací pole 10 skóre pravděpodobnosti, jejichž součet je 1. Každý uzel obsahuje skóre, které označuje pravděpodobnost, že aktuální obrázek patří do jedné z 10 tříd.

Většina vrstev, jako je tf.keras.layers.Dense, má parametry, které se učí během tréninku.

model =keras.Sequential([keras.layers.Flatten(input_shape=(28, 28)),keras.layers.Dense(128, aktivace='relu'),keras.layers.Dense(10, aktivace='softmax')])

Kompilace modelu

Krok kompilace modelu se používá k přidání několika dalších nastavení, než bude model připraven k trénování. V tomto případě jsou povolena následující nastavení.

  1. Optimizer – Aktualizuje model na základě dat, která vidí, a jeho ztrátové funkce (viz níže).
  2. Funkce ztráty – Měří, jak přesný je model během tréninku. Chcete tuto funkci minimalizovat, abyste model „nasměrovali“ správným směrem.
  3. Metriky – Monitorujte kroky školení a testování. Následující příklad používá přesnost, zlomek obrázků, které jsou správně klasifikovány.
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

Trénink modelu

Trénink modelu neuronové sítě vyžaduje následující kroky.

  1. Vložte trénovací data do modelu.
  2. Model se naučí spojovat obrázky a štítky.
  3. Vytvářejte předpovědi o testovací sadě.
  4. Ověřte, že předpovědi odpovídají štítkům z pole test_labels.

Chcete-li začít trénovat, zavolejte metodu model.fit – tzv. proto, že „přizpůsobí“ model trénovacím datům:

model.fit(train_images, train_labels, epochs=10)Trénujte na 60 000 vzorcích Epocha 1/1060000/60000 [===============================] - 5s 83us/vzorek - ztráta:0,4964 - přesnost:0,8236 Epocha 2/1060000/60000 [================================] - 4s 65us/vzorek - ztráta:0,3735 - přesnost:0,8642 Epocha 3/1060000/60000 [================================] - 3 s 55 us/vzorek - ztráta:0,3347 - přesnost:0,8773 Epocha 4/1060000/60000 [===============================] - 3 s 56 us/vzorek - ztráta:0,3106 - přesnost:0,8861 Epocha 5/1060000/60000 [================================] - 3s 58us/vzorek - ztráta:0,2921 - přesnost:0,8924s - ztráta:0,2928 - přesnost - ETA:0s - ztráta:0,2925 - přesnostEpocha 6/1060000/60000 [===============================] - 3 s 57 us/vzorek - ztráta:0,2796 - přesnost:0,8969 s Epocha 7/1060000/60000 [==============================] - 4s 70us/vzorek - ztráta:0,2659 - přesnost:0,9007 Epocha 8/1060000/60000 [==============================] - 4s 61us/vzorek - ztráta:0,2548 - přesnost:0,9042 Epocha 9/1060000/60000 [ ==============================] - 4s 61us/vzorek - ztráta:0,2449 - přesnost:0,9084 Epocha 10/1060000/60000 [==============================] - 5 s 76 us/vzorek - ztráta:0,2358 - přesnost:0,9118

Na konci každé epochy je neuronová síť vyhodnocena oproti ověřovací sadě. To je to, o čem ztráta a přesnost odkazují.

Vyhodnoťte přesnost a předvídejte

Chcete-li odhadnout celkovou přesnost modelu, vypočítejte průměr všech deseti výskytů hodnoty přesnosti, v tomto případě 88 %.

Poté spusťte model.evaluate na testovací sadě, abyste získali prediktivní přesnost trénované neuronové sítě na dříve neviděných datech.

test_loss, test_acc =model.evaluate(test_images, test_labels, verbose=2)10000/1 - 0s - ztráta:0,2766 - přesnost:0,8740

Testovací datový soubor je méně přesný než tréninkový datový soubor. V tomto případě tato mezera mezi přesností tréninku a přesností testu představuje nadměrné vybavení. Opakem je podvybavení. Pokud se chcete o tomto tématu dozvědět více, doporučuji Overfitting vs. Underfitting:A Conceptual Explanation by Will Koehrsen.

V tomto okamžiku můžeme provést nějaké předpovědi o obrázcích v našem souboru tréninkových dat.

predictions =model.predict(test_images)predictions[0]array([1.90860412e-08, 8.05085235e-11, 1.56402713e-08, 1.66699390e-10,7.569-29.06,06.06,06 -08, 1,20656565e-02,3,80084719e-09, 9,87929940e-01], dtype=float32)

Výstup model.predict je pole 10 čísel s pravděpodobností instance patřící do každé třídy. Uchování výsledků v databázi MariaDB pro další analýzu a podávání zpráv je dobrý nápad. Níže je příklad, jak opakovat pole předpovědí za účelem vytvoření n-tice a poté jej vložit do výsledků_předpovědi tabulka.

sql ="INSERT INTO forecast_results (img_idx, img_use, Tričko_Top, Kalhoty, Pulovr, Šaty, Kabát, Sandál, Košile, Tenisky, Taška, Kotníkové boty, štítek) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);"i =0pro řádek v předpovědích:insert_tuple =(str(i), str(2), str (řádek[0]), str(řádek[1]), str(řádek[2]), str(řádek[3]), str(řádek[4]), str(řádek[5]), str(řádek [6]), str(řádek[7]), str(řádek[8]), str(řádek[9]), str(testovací_štítky[i]))cur.execute(sql, insert_tuple)conn.commit() i +=1

Opět lze k ověření načtení dat použít jednoduchý příkaz SQL.

sql ="SELECT Tričko_Top, Kalhoty, Pulovry, Šaty, Kabát, Sandál, Košile, Tenisky, Taška, Kotníkové boty, class_name as 'Test Label'FROM forecast_results PŘIPOJTE SE ke kategoriím ON label =class_idx WHERE img_idx =1"display( pd. read_sql(sql,conn) )

T_shirt_Top Kalhoty pulovr Šaty Kabát Sandál Košile Tenisky Taška Kotníková_botka Testovací štítek
0,00001 0,0 0,997912 0,0 0,001267 0,0 0,00081 0,0 0,0 0,0 pulovr

Vykreslování předpovědí

Níže je definováno několik vykreslovacích funkcí pro zobrazení předpovědí (Grafické funkce).

Pojďme získat nový obrázek z testovací sady a zobrazit klasifikaci neuronové sítě na základě pravděpodobnosti předpovědi.

sql ="SELECT img_idx, label FROM forecast_results WHERE img_idx =1"cur.execute(sql)result =cur.fetchone()plt.figure(figsize=(6,3))plt.subplot(1,2, 1)plot_image(výsledek[0], předpovědi[výsledek[0]], testovací_štítky, testovací_obrázky)plt.subplot(1,2,2)plot_value_array(výsledek[0], předpovědi[výsledek[0]], testovací_štítky)plt. show()


výše:obrázek z datové sady fashion_mnist

V tomto případě byl model schopen správně zařadit obrázek se 100% přesností. Dále provedeme dotaz pro načtení prvních 15 obrázků z testovací sady a jejich klasifikaci.

sql ="SELECT img_idx, label FROM forecast_results LIMIT 15"num_rows =5num_cols =3plt.figure(figsize=(2*2*num_cols, 2*num_rows))cur.execute(sql)result =cur.fetchall() pro řádek ve výsledku:plt.subplot(počet_řádků, 2*počet_sloupců, 2*řádek[0]+1)obrázek_plot(řádek[0], předpovědi[řádek[0]], testovací_štítky, testovací_obrázky)plt.subplot(počet_řádků, 2 *num_cols, 2*row[0]+2)plot_value_array(řádek[0], předpovědi[řádek[0]], testovací_štítky)plt.tight_layout()plt.show()


výše:obrázky z datové sady fashion_mnist

Jak vidíte, nastanou případy, kdy může být model chybný, jak je znázorněno v posledním řádku, levém sloupci. V tomto případě byly tenisky klasifikovány jako sandály (v červené barvě).

V souhrnu

Ačkoli je integrace mezi TensorFlow a MariaDB Server snadná, výhody této integrace jsou značné:

  • Použití relačních dat v rámci strojového učení může snížit složitost implementace. Datoví vědci i datoví inženýři mohou používat společný jazyk k provádění úkolů s daty a průzkumu.
  • Efektivita získaná při přístupu, aktualizaci, vkládání, manipulaci a úpravách dat může urychlit dobu uvedení na trh.
  • Možnost ukládat výsledky modelu zpět do databáze umožňuje koncovým uživatelům a analytikům spouštět dotazy a sestavy pomocí přátelských nástrojů pro vytváření sestav, jako je Tableau.

Licence MIT

Datová sada Fashion MNIST (fashion_mnist) využívaná tímto blogem je licencována pod licencí MIT, Copyright © 2017 Zalando SE, https://tech.zalando.com

Zdrojový kód využívaný tímto blogem je převzat z výukového programu „Základní klasifikace:Klasifikace obrázků oblečení“, který je licencován pod licencí MIT, Copyright (c) 2017 François Chollet.

Tímto se bezplatně uděluje povolení jakékoli osobě, která získá kopii tohoto softwaru a souvisejících souborů dokumentace (dále jen „Software“), nakládat se softwarem bez omezení, včetně, bez omezení, práv na používání, kopírování, úpravy, slučování publikovat, distribuovat, poskytovat sublicence a/nebo prodávat kopie Softwaru a umožnit osobám, kterým je Software poskytnut, aby tak činily, za následujících podmínek:

Výše uvedené upozornění na autorská práva a toto upozornění na povolení budou součástí všech kopií nebo podstatných částí Softwaru.

SOFTWARE JE POSKYTOVÁN „TAK, JAK JE“, BEZ ZÁRUKY JAKÉHOKOLI DRUHU, VÝSLOVNÉ NEBO PŘEDPOKLÁDANÉ, VČETNĚ ZÁRUK PRODEJNOSTI, VHODNOSTI PRO KONKRÉTNÍ ÚČEL A NEPORUŠENÍ PRÁV. V ŽÁDNÉM PŘÍPADĚ NENESOU AUTOŘI NEBO NOSITELÉ AUTORSKÝCH PRÁV ODPOVĚDNÍ ZA JAKÉKOLI NÁROKY, ŠKODY NEBO JINÉ ODPOVĚDNOSTI, AŤ JIŽ PŘI SMLUVNÍ AKCI, DELIKTŮ ČI JINAK, VYPLÝVAJÍCÍCH Z TOHOTO POUŽÍVÁNÍ NEBO V SOUVISLOSTI S NÍM SOFTWARE.

Odkazy

Převeďte vlastní obrázek na obrázek MNIST
matplotlib:Výukový program pro obrázky
5 způsobů, jak umělá inteligence mění zákaznickou zkušenost
Digitalizace znovuobjevuje podnikání
Co je klasifikace obrázků?
Úvod do Pythonu Knihovna hlubokého učení TensorFlow

Funkce vytváření grafů

def plot_image(i, předpovědi_pole, pravdivé_štítky, img):pole_předpovědí, pravdivé_štítky, img =pole_předpovědí, pravdivé_štítek[i], img[i]plt.grid(False)plt.xticks([])plt.yticks([ ])plt.imshow(img, cmap=plt.cm.binary)predicted_label =np.argmax(predikce_pole)if predpovedany_label ==true_label:color ='blue'else:color ='red'plt.xlabel("{} { :2.0f}% ({})".format(názvy_tříd[předpovězený_štítek],100*np.max(pole_předpovědí),názvy_tříd[skutečný_štítek]),barva=barva)def pole_hodnoty_plot(i, pole_předpovědí, pravý_štítek):pole_předpovědí, skutečný_štítek =předpovědi_pole, true_label[i]plt.grid(False)plt.xticks(rozsah(10))plt.yticks([])thisplot =plt.bar(rozsah(10), pole_předpovědí, color="#777777")plt .ylim([0, 1])predicted_label =np.argmax(predictions_array)thisplot[predicted_label].set_color('red')thisplot[true_label].set_color('blue')

  1. Jak přidat soubor protokolu do databáze SQL Server (T-SQL)

  2. Použití pysparku pro připojení k PostgreSQL

  3. PostgreSQL procedurální jazyk C nenalezen

  4. Python 3.4.0 s databází MySQL