Kuvaluokittelu tehtävä, jonka jopa vauva voi suorittaa sekunneissa, mutta koneelle se on ollut vaikea tehtävä viimeisimpiin ja Syvä oppiminen . Itse ajavat autot voivat havaita esineitä ja toteuttaa tarvittavat toimet reaaliajassa, ja suurin osa tästä on mahdollista Kuvien luokittelu. Tässä artikkelissa opastan sinua seuraavista aiheista:
Mikä on TensorFlow?
TensorFlow on Googlen avoimen lähdekoodin koneoppimisen kehys tiedonkulun ohjelmointiin useille tehtäville. Kaavion solmut edustavat matemaattisia operaatioita, kun taas kaavion reunat edustavat niiden välisiä moniulotteisia tietojoukkoja.
Tensorit ovat vain moniulotteisia matriiseja, 2-ulotteisten taulukoiden laajennus dataan, jolla on suurempi ulottuvuus. Tensorflow-palvelussa on monia ominaisuuksia, jotka tekevät siitä sopivan syvälle oppimiselle, ja se on avoimen lähdekoodin kirjasto, joka auttaa sinua kehittämään ja kouluttamaan ML-malleja.
Mikä on kuvaluokitus?
Kuvaluokituksen tarkoituksena on luokitella kaikki digitaalisen kuvan pikselit yhdeksi useista maanpeite luokat tai teemoja . Tätä luokiteltuja tietoja voidaan sitten käyttää tuottamiseen aihekartat kuvassa olevasta maanpeitteestä.
Nyt riippuen analyytikon ja tietokoneen välisestä vuorovaikutuksesta luokituksen aikana, luokitusta on kahdenlaisia:
- Valvottu ja
- Valvomaton
Joten, tuhlaamatta aikaa, siirrymme TensorFlow-kuvaluokitukseen. Minulla on 2 esimerkkiä: helppo ja vaikea. Jatketaan helpompaa.
TensorFlow-kuvaluokitus: Muoti MNIST
Muoti MNIST-tietojoukko
Tässä käytetään Fashion MNIST -tietojoukkoa, joka sisältää 70 000 harmaasävykuvaa 10 kategoriassa. Käytämme 60000 koulutukseen ja loput 10000 testaamiseen. Pääset Fashion MNIST -palveluun suoraan TensorFlow-palvelusta, vain tuo ja lataa tiedot.
- Tuo ensin kirjastot
mistä __future__ tuonti absoluuttinen_jako, jako, tulostusfunktio # TensorFlow ja tf.keras tuovat tensorflow: n tf: stä tensorflow-tuontikeraista # Apukirjastot tuovat numpy: np tuonti matplotlib.pyplot plt: ksi
- Ladataan tiedot
fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = muoti_mnist.load_data ()
- Seuraavaksi aiomme kartoittaa kuvat luokkiin
class_names = ['T-paita / toppi', 'Housut', 'Pullover', 'Mekko', 'Takki', 'Sandaali', 'Paita', 'Sneaker', 'Laukku', 'Nilkkurit']
- Tietojen tutkiminen
juna_kuvia.muoto
#Jokainen tunniste on välillä 0–9
juna_tunnisteet
test_images.muoto
- Nyt on aika esikäsitellä tiedot.
plt.kuva() plt.näytä(juna_kuvia[0]) plt.väripalkki() plt.ruudukko(Väärä) plt.näytä()
#Jos tarkastat harjoitusjoukon ensimmäisen kuvan, huomaat, että pikseliarvot putoavat välillä 0-255.
- Meidän on skaalattava kuvat 0-1: stä syöttämään ne hermoverkkoon
juna_kuvia = juna_kuvia / 255,0 test_images = test_images / 255,0
- Näytetään joitain kuvia.
plt.kuva(figsize=(10,10)) varten i sisään alue(25): plt.sivujuoni(5,5,i+yksi) plt.xticks([]) plt.yticks([]) plt.ruudukko(Väärä) plt.näytä(juna_kuvia[i], cmap=plt.cm.binääri) plt.xlabel(luokan_nimet[juna_tunnisteet[i]]) plt.näytä()
- Määritä tasot
malli- = kovaa.Peräkkäinen([ kovaa.kerroksia.Litistä(input_shape=(28, 28)), kovaa.kerroksia.Tiheä(128, aktivointi=tf.Nro.relu), kovaa.kerroksia.Tiheä(10, aktivointi=tf.Nro.softmax) ])
- Kokoa malli
malli-.koota(optimoija='adam', menetys='harva_kategorinen_ristikopio', mittarit=['tarkkuus'])
- Mallikoulutus
malli-.sovi(juna_kuvia, juna_tunnisteet, aikakausia=10)
- Tarkkuuden arviointi
test_loss, test_acc = malli-.arvioida(test_images, test_labels) Tulosta('Testitarkkuus:', test_acc)
- Ennusteiden tekeminen
ennusteita = malli-.ennustaa(test_images)
ennusteita[0]
mitkä ovat rajoituksia sql: ssä
Ennuste on 10 numeron taulukko. Nämä kuvaavat mallin 'luottamusta' siihen, että kuva vastaa kutakin 10 erilaista vaatetuotetta. Voimme nähdä, millä etiketillä on korkein luotettavuusarvo.
esim..argmax(ennusteita[0])#Model on varma siitä, että se on nilkkurit. Katsotaanpa, onko se oikein
Lähtö: 9
test_labels[0]
Lähtö: 9
- Nyt on aika tarkastella kaikkia 10 kanavan sarjaa
def plot_image(i, ennusteet_haarukka, true_label, img): ennusteet_haarukka, true_label, img = ennusteet_haarukka[i], true_label[i], img[i] plt.ruudukko(Väärä) plt.xticks([]) plt.yticks([]) plt.näytä(img, cmap=plt.cm.binääri) ennustettu_tunniste = esim..argmax(ennusteet_haarukka) jos ennustettu_tunniste == true_label: väri = 'vihreä' muu: väri = 'netto' plt.xlabel('{} {: 2.0f}% ({}) ''.muoto(luokan_nimet[ennustettu_tunniste], 100*esim..enint(ennusteet_haarukka), luokan_nimet[true_label]), väri=väri) def plot_value_array(i, ennusteet_haarukka, true_label): ennusteet_haarukka, true_label = ennusteet_haarukka[i], true_label[i] plt.ruudukko(Väärä) plt.xticks([]) plt.yticks([]) tämä juoni = plt.baari(alue(10), ennusteet_haarukka, väri='# 777777') plt.ylim([0, yksi]) ennustettu_tunniste = esim..argmax(ennusteet_haarukka) tämä juoni[ennustettu_tunniste].set_color('netto') tämä juoni[true_label].set_color('vihreä')
- Tarkastellaan ensin 0. ja 10. kuvaa
i = 0 plt.kuva(figsize=(6,3)) plt.sivujuoni(yksi,2,yksi) plot_image(i, ennusteita, test_labels, test_images) plt.sivujuoni(yksi,2,2) plot_value_array(i, ennusteita, test_labels) plt.näytä()
i = 10 plt.kuva(figsize=(6,3)) plt.sivujuoni(yksi,2,yksi) plot_image(i, ennusteita, test_labels, test_images) plt.sivujuoni(yksi,2,2) plot_value_array(i, ennusteita, test_labels) plt.näytä()
- Piirretään nyt useita kuvia ja niiden ennusteita. Oikeat ovat vihreitä, kun taas väärät ovat punaisia.
num_rows = 5 num_cols = 3 num_images = num_rows*num_cols plt.kuva(figsize=(2*2*num_cols, 2*num_rows)) varten i sisään alue(num_images): plt.sivujuoni(num_rows, 2*num_cols, 2*i+yksi) plot_image(i, ennusteita, test_labels, test_images) plt.sivujuoni(num_rows, 2*num_cols, 2*i+2) plot_value_array(i, ennusteita, test_labels) plt.näytä()
- Lopuksi käytämme koulutettua mallia ennustamaan yksittäistä kuvaa.
# Tartu kuva testitiedostosta img = test_images[0] Tulosta(img.muoto)
# Lisää kuva erään, jossa se on ainoa jäsen. img = (esim..expand_dims(img,0)) Tulosta(img.muoto)
ennusteet_yhden = malli-.ennustaa(img) Tulosta(ennusteet_yhden)
plot_value_array(0, ennusteet_yhden, test_labels) plt.xticks(alue(10), luokan_nimet, kierto=Neljä viisi) plt.näytä()
ennustus_tulos = esim..argmax(ennusteet_yhden[0])
Lähtö: 9
CIFAR-10: CNN
CIFAR-10-tietojoukko koostuu lentokoneista, koirista, kissoista ja muista esineistä. Esikäsittele kuvat ja kouluta sitten konvoluutiohermoverkko kaikille näytteille. Kuvat on normalisoitava ja tarrat on koodattava yksisuuntaisesti. Tämä käyttötapaus varmasti poistaa epäilyt TensorFlow-kuvaluokituksesta.
- Tietojen lataaminen
alkaen urllib.request tuonti urlretrieve alkaen os. polku tuonti isfile, on nokea alkaen tqdm tuonti tqdm tuonti tarfile cifar10_dataset_folder_path = 'cifar-10-erät-py' luokassa Lataa edistyminen(tqdm): last_block = 0 def koukku(itse, block_num=yksi, block_size=yksi, total_size=Ei mitään): itse.kaikki yhteensä = total_size itse.päivittää((block_num - itse.last_block) * block_size) itse.last_block = block_num '' Tarkista, onko data (zip) tiedosto jo ladattu jos ei, lataa se osoitteesta https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz ja tallenna nimellä cifar-10-python.tar.gz '' jos ei isfile('cifar-10-python.tar.gz'): kanssa Lataa edistyminen(yksikkö='B', unit_scale=Totta, miniters=yksi, kuva='CIFAR-10-tietojoukko') kuten pbar: urlretrieve( 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz', 'cifar-10-python.tar.gz', pbar.koukku) jos ei on nokea(cifar10_dataset_folder_path): kanssa tarfile.avata('cifar-10-python.tar.gz') kuten terva: terva.Pura kaikki() terva.kiinni()
- Tarvittavien kirjastojen tuominen
tuonti suolakurkku tuonti numpy kuten esim. tuonti matplotlib.pyplot kuten plt
- Tietojen ymmärtäminen
Alkuperäinen dataerä on 10000 × 3072 tensori ilmaistuna numpy-taulukossa, jossa 10000 on näytetietojen määrä. Kuva on värillinen ja kooltaan 32 × 32. Syöttö voidaan tehdä joko muodossa (leveys x korkeus x num_kanava) tai (num_kanava x leveys x korkeus). Määritellään tunnisteet.
def lataa_etiketin_nimet(): palata ['lentokone', 'auto', 'lintu', 'kissa', 'Peura', 'koira', 'sammakko', 'hevonen', 'laiva', 'kuorma']
- Tietojen muokkaaminen
Aiomme muuttaa tietoja kahdessa vaiheessa
Jaa ensin rivivektori (3072) 3 osaan. Jokainen kappale vastaa kutakin kanavaa. Tämä johtaa tensorin (3 x 1024) ulottuvuuteen. Jaa sitten tuloksena oleva tensori edellisestä vaiheesta luvulla 32. 32 tarkoittaa tässä kuvan leveyttä. Tuloksena on (3x32x32).
Toiseksi meidän on siirrettävä tiedot kohteesta (num_kanava, leveys, korkeus) kohtaan (leveys, korkeus, num_kanava). Tätä varten aiomme käyttää transponointitoimintoa.
def load_cfar10_batch(cifar10_dataset_folder_path, batch_id): kanssa avata(cifar10_dataset_folder_path + '/ data_batch_' + s(batch_id), -tilassa='rb') kuten tiedosto: # Huomaa, että koodaustyyppi on 'latin1' erä = suolakurkku.ladata(tiedosto, koodaus='latin1') ominaisuudet = erä['data'].muotoilla uudelleen((len(erä['data']), 3, 32, 32)).osaksi kansallista lainsäädäntöä(0, 2, 3, yksi) tarrat = erä['tarrat'] palata ominaisuudet, etiketti
- Tietojen tutkiminen
def display_stats(cifar10_dataset_folder_path, batch_id, näyte_id): ominaisuudet, tarrat = load_cfar10_batch(cifar10_dataset_folder_path, batch_id) jos ei (0 <= näyte_id < len(ominaisuudet)): Tulosta('{}näytteet erässä{}.{}on kantaman ulkopuolella. '.muoto(len(ominaisuudet), batch_id, näyte_id)) palata Ei mitään Tulosta(' Erätilastot #{}: '.muoto(batch_id)) Tulosta('Näytteiden lukumäärä:{} '.muoto(len(ominaisuudet))) label_names = lataa_etiketin_nimet() label_counts = sanella(postinumero(*esim..ainutlaatuinen(tarrat, return_counts=Totta))) varten avain, arvo sisään label_counts.kohteita(): Tulosta('Etiketit [{}] ({}):{}'.muoto(avain, label_names[avain].ylempi(), arvo)) näyte_kuva = ominaisuudet[näyte_id] sample_label = tarrat[näyte_id] Tulosta(' Esimerkki kuvasta{}: '.muoto(näyte_id)) Tulosta('Kuva - Minimi arvo:{}Suurin arvo:{}'.muoto(näyte_kuva.min(), näyte_kuva.enint())) Tulosta('Kuva - muoto:{}'.muoto(näyte_kuva.muoto)) Tulosta('Label - Label Id:{}Nimi:{}'.muoto(sample_label, label_names[sample_label])) plt.näytä(näyte_kuva)
%matplotlib linjassa %kokoonpano InlineBackend.kuva_muoto = 'verkkokalvo' tuonti numpy kuten esim. # Tutki tietoaineistoa batch_id = 3 näyte_id = 7000 display_stats(cifar10_dataset_folder_path, batch_id, näyte_id)
- Esikäsittelytoimintojen toteuttaminen
Aiomme normalisoida tiedot Min-Max-normalisoinnin avulla. Tämä yksinkertaisesti saa kaikki x-arvot vaihtelemaan välillä 0 ja 1.
y = (x-min) / (max-min)
def normalisoitua(x): '' Perustelu - x: syötä kuvadata numpy-taulukossa [32, 32, 3] palata - normalisoitu x '' min_val = esim..min(x) max_val = esim..enint(x) x = (x-min_val) / (max_val-min_val) palata x
- Yksi kuuma koodaus
def one_hot_encode(x): '' Perustelu - x: luettelo tarroista palata - yksi kuumakoodausmatriisi (tarrojen lukumäärä, luokan numero) '' koodattu = esim..nollat((len(x), 10)) varten idx, tuntia sisään luetella(x): koodattu[idx] [tuntia] = yksi palata koodattu
- Esikäsittele ja tallenna tiedot
def _preprocess_and_save(normalisoitua, one_hot_encode, ominaisuudet, tarrat, Tiedoston nimi): ominaisuudet = normalisoitua(ominaisuudet) tarrat = one_hot_encode(tarrat) suolakurkku.kaataa((ominaisuudet, tarrat), avata(Tiedoston nimi, 'wb')) def preprocess_and_save_data(cifar10_dataset_folder_path, normalisoitua, one_hot_encode): n_erät = 5 kelvolliset_ominaisuudet = [] valid_labels = [] varten erä_i sisään alue(yksi, n_erät + yksi): ominaisuudet, tarrat = load_cfar10_batch(cifar10_dataset_folder_path, erä_i) # etsi hakemisto pisteeksi validointitiedoina koko erän tietojoukossa (10%) index_of_validation = int(len(ominaisuudet) * 0,1) # esikäsittele 90% koko erän tietojoukosta # - normalisoi ominaisuudet # - one_hot_encode lables # - tallenna uuteen tiedostoon nimeltä 'preprocess_batch_' + eränumero # - kukin tiedosto jokaiselle erälle _preprocess_and_save(normalisoitua, one_hot_encode, ominaisuudet[:-index_of_validation], tarrat[:-index_of_validation], 'preprocess_batch_' + s(erä_i) + '.p') # toisin kuin koulutustietojoukko, validointitiedosto lisätään kaikkien eräajojen kautta # - ota 10% erän kokonaismäärästä # - lisää ne luetteloon # - valid_features # - kelvolliset tunnisteet kelvolliset_ominaisuudet.pidentää(ominaisuudet[-index_of_validation:]) valid_labels.pidentää(tarrat[-index_of_validation:]) # esikäsittele kaikki pinotut validointitiedot _preprocess_and_save(normalisoitua, one_hot_encode, esim..taulukko(kelvolliset_ominaisuudet), esim..taulukko(valid_labels), 'preprocess_validation.p') # lataa testitietojoukko kanssa avata(cifar10_dataset_folder_path + '/ test_batch', -tilassa='rb') kuten tiedosto: erä = suolakurkku.ladata(tiedosto, koodaus='latin1') # esikäsittele testaustiedot test_ominaisuudet = erä['data'].muotoilla uudelleen((len(erä['data']), 3, 32, 32)).osaksi kansallista lainsäädäntöä(0, 2, 3, yksi) test_labels = erä['tarrat'] # Esikäsittele ja tallenna kaikki testaustiedot _preprocess_and_save(normalisoitua, one_hot_encode, esim..taulukko(test_ominaisuudet), esim..taulukko(test_labels), 'preprocess_training.p')
preprocess_and_save_data(cifar10_dataset_folder_path, normalisoitua, one_hot_encode)
- Tarkastuspiste
tuonti suolakurkku kelvolliset_ominaisuudet, valid_labels = suolakurkku.ladata(avata('preprocess_validation.p', -tilassa='rb'))
- Verkoston rakentaminen
Koko malli koostuu yhteensä 14 kerroksesta.
tuonti tensorflow kuten tf def conv_net(x, keep_prob): conv1_filter = tf.Vaihteleva(tf.katkaistu_normaali(muoto=[3, 3, 3, 64], tarkoittaa=0, keskihajonta=0,08)) conv2_filter = tf.Vaihteleva(tf.katkaistu_normaali(muoto=[3, 3, 64, 128], tarkoittaa=0, keskihajonta=0,08)) conv3_filter = tf.Vaihteleva(tf.katkaistu_normaali(muoto=[5, 5, 128, 256], tarkoittaa=0, keskihajonta=0,08)) conv4_filter = tf.Vaihteleva(tf.katkaistu_normaali(muoto=[5, 5, 256, 512], tarkoittaa=0, keskihajonta=0,08)) # 1, 2 conv1 = tf.Nro.conv2d(x, conv1_filter, harppauksia=[yksi,yksi,yksi,yksi], pehmuste='SAMA') conv1 = tf.Nro.relu(conv1) conv1_pool = tf.Nro.max_pool(conv1, ksize=[yksi,2,2,yksi], harppauksia=[yksi,2,2,yksi], pehmuste='SAMA') conv1_bn = tf.kerroksia.erän_normalisointi(conv1_pool) # 3. 4 conv2 = tf.Nro.conv2d(conv1_bn, conv2_filter, harppauksia=[yksi,yksi,yksi,yksi], pehmuste='SAMA') conv2 = tf.Nro.relu(conv2) conv2_pool = tf.Nro.max_pool(conv2, ksize=[yksi,2,2,yksi], harppauksia=[yksi,2,2,yksi], pehmuste='SAMA') conv2_bn = tf.kerroksia.erän_normalisointi(conv2_pool) # 5, 6 conv3 = tf.Nro.conv2d(conv2_bn, conv3_filter, harppauksia=[yksi,yksi,yksi,yksi], pehmuste='SAMA') conv3 = tf.Nro.relu(conv3) conv3_pool = tf.Nro.max_pool(conv3, ksize=[yksi,2,2,yksi], harppauksia=[yksi,2,2,yksi], pehmuste='SAMA') conv3_bn = tf.kerroksia.erän_normalisointi(conv3_pool) # 7, 8 conv4 = tf.Nro.conv2d(conv3_bn, conv4_filter, harppauksia=[yksi,yksi,yksi,yksi], pehmuste='SAMA') conv4 = tf.Nro.relu(conv4) conv4_pool = tf.Nro.max_pool(conv4, ksize=[yksi,2,2,yksi], harppauksia=[yksi,2,2,yksi], pehmuste='SAMA') conv4_bn = tf.kerroksia.erän_normalisointi(conv4_pool) # 9 tasainen = tf.avustaja.kerroksia.tasoittaa(conv4_bn) # 10 1 = tf.avustaja.kerroksia.täysin kytketty(tulot=tasainen, num_lähdöt=128, activation_fn=tf.Nro.relu) 1 = tf.Nro.lopettaa(1, keep_prob) 1 = tf.kerroksia.erän_normalisointi(1) # yksitoista täysi 2 = tf.avustaja.kerroksia.täysin kytketty(tulot=1, num_lähdöt=256, activation_fn=tf.Nro.relu) täysi 2 = tf.Nro.lopettaa(täysi 2, keep_prob) täysi 2 = tf.kerroksia.erän_normalisointi(täysi 2) # 12 täysi 3 = tf.avustaja.kerroksia.täysin kytketty(tulot=täysi 2, num_lähdöt=512, activation_fn=tf.Nro.relu) täysi 3 = tf.Nro.lopettaa(täysi 3, keep_prob) täysi 3 = tf.kerroksia.erän_normalisointi(täysi 3) # 13 4 = tf.avustaja.kerroksia.täysin kytketty(tulot=täysi 3, num_lähdöt=1024, activation_fn=tf.Nro.relu) 4 = tf.Nro.lopettaa(4, keep_prob) 4 = tf.kerroksia.erän_normalisointi(4) # 14 ulos = tf.avustaja.kerroksia.täysin kytketty(tulot=täysi 3, num_lähdöt=10, activation_fn=Ei mitään) palata ulos
- Hyperparametrit
aikakausia = 10 erä_koko = 128 pidä todennäköisyys = 0.7 oppimisnopeus = 0,001
logit = conv_net(x, keep_prob) malli- = tf.henkilöllisyys(logit, nimi='logit') # Nimi logit Tensor, jotta se voidaan ladata levyltä harjoituksen jälkeen # Tappio ja optimoija kustannus = tf.vähennä(tf.Nro.softmax_cross_entropy_with_logits(logit=logit, tarrat=Y)) optimoija = tf.kouluttaa.AdamOptimizer(oppimisnopeus=oppimisnopeus).minimoida(kustannus) # Tarkkuus correct_pred = tf.yhtä suuri(tf.argmax(logit, yksi), tf.argmax(Y, yksi)) tarkkuus = tf.vähennä(tf.heittää(correct_pred, tf.kellua32), nimi='tarkkuus')
- Harjoittele hermoverkkoa
#Yksi optimointi
def juna_hermoverkko(istunto, optimoija, pidä todennäköisyys, ominaisuus_erä, label_batch): istunto.juosta(optimoija, feed_dict={ x: ominaisuus_erä, Y: label_batch, keep_prob: pidä todennäköisyys })
#Showing Stats def print_stats(istunto, ominaisuus_erä, label_batch, kustannus, tarkkuus): menetys = sess.juosta(kustannus, feed_dict={ x: ominaisuus_erä, Y: label_batch, keep_prob: yksi. }) valid_acc = sess.juosta(tarkkuus, feed_dict={ x: kelvolliset_ominaisuudet, Y: valid_labels, keep_prob: yksi. }) Tulosta('Menetys:{:> 10.4f}Vahvistuksen tarkkuus:{: .6f}'.muoto(menetys, valid_acc))
- Täysi koulutus ja mallin tallentaminen
def erän_ominaisuudet_etiketit(ominaisuudet, tarrat, erä_koko): '' Jaa ominaisuudet ja tarrat eriin '' varten alkaa sisään alue(0, len(ominaisuudet), erä_koko): loppuun = min(alkaa + erä_koko, len(ominaisuudet)) saanto ominaisuudet[alkaa:loppuun], tarrat[alkaa:loppuun] def load_preprocess_training_batch(batch_id, erä_koko): '' Lataa esikäsitelty harjoittelutiedot ja palauta ne erissä tai vähemmän '' Tiedoston nimi = 'preprocess_batch_' + s(batch_id) + '.p' ominaisuudet, tarrat = suolakurkku.ladata(avata(Tiedoston nimi, -tilassa='rb')) # Palauta harjoitustiedot erissä, joiden koko on tai vähemmän palata erän_ominaisuudet_etiketit(ominaisuudet, tarrat, erä_koko)
#Tallennusmalli ja polku
save_model_path = './kuva_luokitus' Tulosta('Koulutus ...') kanssa tf.Istunto() kuten sess: # Muuttujien alustaminen sess.juosta(tf.global_variables_initializer()) # Harjoittelujakso varten aikakausi sisään alue(aikakausia): # Kierrä kaikki erät n_erät = 5 varten erä_i sisään alue(yksi, n_erät + yksi): varten eräominaisuudet, erän_etiketit sisään load_preprocess_training_batch(erä_i, erä_koko): juna_hermoverkko(sess, optimoija, pidä todennäköisyys, eräominaisuudet, erän_etiketit) Tulosta('Epoch{:> 2}, CIFAR-10-erä{}: '.muoto(aikakausi + yksi, erä_i), loppuun='') print_stats(sess, eräominaisuudet, erän_etiketit, kustannus, tarkkuus) # Tallenna malli säästäjä = tf.kouluttaa.Säästäjä() tallenna_polku = säästäjä.Tallentaa(sess, save_model_path)
Tensorflow-kuvaluokituksen tärkeä osa on nyt tehty. Nyt on aika testata mallia.
- Mallin testaaminen
tuonti suolakurkku tuonti numpy kuten esim. tuonti matplotlib.pyplot kuten plt alkaen sklearn.preprocinging tuonti LabelBinarizer def erän_ominaisuudet_etiketit(ominaisuudet, tarrat, erä_koko): '' Jaa ominaisuudet ja tarrat eriin '' varten alkaa sisään alue(0, len(ominaisuudet), erä_koko): loppuun = min(alkaa + erä_koko, len(ominaisuudet)) saanto ominaisuudet[alkaa:loppuun], tarrat[alkaa:loppuun] def display_image_predictions(ominaisuudet, tarrat, ennusteita, top_n_ennusteet): n_luokkia = 10 label_names = lataa_etiketin_nimet() label_binarizer = LabelBinarizer() label_binarizer.sovi(alue(n_luokkia)) label_ids = label_binarizer.käänteinen_muunnos(esim..taulukko(tarrat)) kuva, akselit = plt.osa-alueet(nrows=top_n_ennusteet, ncols=2, figsize=(kaksikymmentä, 10)) kuva.tiukka_asettelu() kuva.suptitle('Softmax-ennusteet', Fonttikoko=kaksikymmentä, Y=1.1) n_ennusteet = 3 marginaali = 0,05 ind = esim..outo(n_ennusteet) leveys = (yksi. - 2. * marginaali) / n_ennusteet varten kuva_i, (ominaisuus, label_id, ennakkotiedot, pred_values) sisään luetella(postinumero(ominaisuudet, label_ids, ennusteita.indeksit, ennusteita.arvot)): jos (kuva_i < top_n_ennusteet): etunimet = [label_names[pred_i] varten pred_i sisään ennakkotiedot] oikea_nimi = label_names[label_id] akselit[kuva_i] [0].näytä((ominaisuus*255).tyyppinen(esim..int32, kopio=Väärä)) akselit[kuva_i] [0].set_title(oikea_nimi) akselit[kuva_i] [0].set_axis_off() akselit[kuva_i] [yksi].barh(ind + marginaali, pred_values[:3], leveys) akselit[kuva_i] [yksi].set_yticks(ind + marginaali) akselit[kuva_i] [yksi].set_yticklabels(etunimet[::-yksi]) akselit[kuva_i] [yksi].set_xticks([0, 0.5, 1.0])
%matplotlib linjassa %kokoonpano InlineBackend.kuva_muoto = 'verkkokalvo' tuonti tensorflow kuten tf tuonti suolakurkku tuonti satunnainen save_model_path = './kuva_luokitus' erä_koko = 64 n_näytteet = 10 top_n_ennusteet = 5 def test_model(): test_ominaisuudet, test_labels = suolakurkku.ladata(avata('preprocess_training.p', -tilassa='rb')) ladattu_graafi = tf.Kaavio() kanssa tf.Istunto(kaavio=ladattu_graafi) kuten sess: # Lataa malli kuormaaja = tf.kouluttaa.import_meta_graph(save_model_path + '.meta') kuormaaja.palauttaa(sess, save_model_path) # Hanki tensorit ladatusta mallista ladattu_x = ladattu_graafi.get_tensor_by_name('input_x: 0') ladattu_y = ladattu_graafi.get_tensor_by_name('output_y: 0') loaded_keep_prob = ladattu_graafi.get_tensor_by_name('keep_prob: 0') ladattu_logit = ladattu_graafi.get_tensor_by_name('logits: 0') ladattu_acc = ladattu_graafi.get_tensor_by_name('tarkkuus: 0') # Hanki erien tarkkuus muistirajoituksia varten test_batch_acc_total = 0 test_batch_count = 0 varten juna_ominaisuus_erä, train_label_batch sisään erän_ominaisuudet_etiketit(test_ominaisuudet, test_labels, erä_koko): test_batch_acc_total + = sess.juosta( ladattu_acc, feed_dict={ladattu_x: juna_ominaisuus_erä, ladattu_y: train_label_batch, loaded_keep_prob: 1.0}) test_batch_count + = yksi Tulosta('Tarkkuuden testaaminen:{} '.muoto(test_batch_acc_total/test_batch_count)) # Tulosta satunnaisia näytteitä random_test_features, random_test_labels = kaksinkertainen(postinumero(*satunnainen.näyte(lista(postinumero(test_ominaisuudet, test_labels)), n_näytteet))) satunnainen_testiennusteet = sess.juosta( tf.Nro.top_k(tf.Nro.softmax(ladattu_logit), top_n_ennusteet), feed_dict={ladattu_x: random_test_features, ladattu_y: random_test_labels, loaded_keep_prob: 1.0}) display_image_predictions(random_test_features, random_test_labels, satunnainen_testiennusteet, top_n_ennusteet) test_model()
Tuotos: Tarkkuuden testaus: 0.5882762738853503
Jos nyt koulutat hermoverkkoasi uusiin aikakausiin tai muutat aktivointitoimintoa, saatat saada toisen tuloksen, jolla voi olla parempi tarkkuus.
Joten tällä olemme päässeet tämän TensorFlow Image Classification -artikkelin loppuun. Olen varma, että voit nyt käyttää samaa luokittelemaan kaikenlaisia kuvia, etkä ole aloittelija kuvaluokituksessa.
Edurekan Python-sertifioinnin avulla alan ammattilaiset ovat kuratoineet alan vaatimukset ja vaatimukset. Opit käsitteet, kuten SoftMax-toiminto, Autoencoder Neural Networks, Restricted Boltzmann Machine (RBM), Keras & TFLearn. Kurssin ovat erikoistuneet alan asiantuntijat reaaliaikaisilla tapaustutkimuksilla.