Esittely

”Rakenna syväoppimismalli muutamassa minuutissa?”. Sen harjoitteluun menee tunteja! Minulla ei ole edes tarpeeksi hyvää konetta.” Olen kuullut tämän lukemattomia kertoja aloittelevilta tietojenkäsittelytieteilijöiltä, jotka kavahtavat syväoppimismallien rakentamista omilla koneillaan.

Sinun ei tarvitse työskennellä Googlelle tai muille suurille teknologiayrityksille työskennellessäsi syväoppimisen datasettien parissa! On täysin mahdollista rakentaa oma neuroverkko alusta alkaen muutamassa minuutissa ilman, että tarvitsee vuokrata Googlen palvelimia. Fast.ai:n opiskelijat suunnittelivat mallin Imagenet-tietokantaan 18 minuutissa – ja esittelen jotain vastaavaa tässä artikkelissa.

Syväoppiminen on laaja ala, joten kavennamme hieman keskittymistämme ja otamme haasteen vastaan kuvanluokitteluprojektin ratkaisemisessa. Lisäksi käytämme hyvin yksinkertaista syväoppimisarkkitehtuuria saavuttaaksemme melko vaikuttavan tarkkuuden.

Voit pitää Python-koodia, jonka näemme tässä artikkelissa, vertailukohtana kuvien luokittelumallien rakentamisessa. Kun olet saanut hyvän käsityksen käsitteestä, voit mennä leikkimään koodilla, osallistua kilpailuihin ja kiivetä tulostaulukossa ylöspäin!

Jos syväoppiminen on sinulle uutta ja tietokonenäön ala kiehtoo sinua (ketä ei kiehdo?!), tutustu kurssille ’Computer Vision using Deep Learning’. Se on kattava johdatus tähän upeaan alaan ja antaa sinulle valmiudet lähitulevaisuuden väistämättä valtaville työmarkkinoille.

Projekti kuvanluokittelun soveltamiseksi

Moninkertainen osa sähköisen kaupankäynnin koko liikevaihdosta tulee vaatteista & asusteista. Suurena ongelmana on näiden vaatteiden luokittelu pelkkien kuvien perusteella, varsinkin kun tuotemerkkien antamat kategoriat ovat epäjohdonmukaisia. Tämä aiheuttaa mielenkiintoisen tietokonenäköongelman, joka on kiinnittänyt useiden syväoppimisen tutkijoiden huomion.

Fashion MNIST on drop-in-korvaus hyvin tunnetulle, koneoppimisen hello world – MNIST-tietoaineistolle, jonka voi tarkistaa osoitteessa ’Identify the digits’ practice problem. Numeroiden sijasta kuvissa näkyy vaatetyyppi, esim. t-paita, housut, laukku jne. Tässä ongelmassa käytetyn tietokokonaisuuden on luonut Zalando Research.

Harjoittele nyt

Sisällysluettelo

  1. Mitä on kuvien luokittelu ja sen käyttötapaukset
  2. Kuva-aineistomme rakenteen määrittäminen
  3. Mallin rakentamisen hajottaminen Prosessi
  4. Ongelmanasettelun laatiminen ja datan ymmärtäminen
  5. Vaiheet kuvanluokitusmallin rakentamiseen
  6. Taas uusi haaste

Mitä on kuvanluokitus?

Harkitse alla olevaa kuvaa:

Olet varmasti heti tunnistanut sen – se on (hieno) auto. Ota askel taaksepäin ja analysoi, miten päädyit tähän johtopäätökseen – sinulle näytettiin kuva ja luokittelit, mihin luokkaan se kuuluu (tässä tapauksessa auto). Siitä kuvien luokittelussa on pähkinänkuoressa kyse.

Kuva voidaan mahdollisesti luokitella n luokkaan. Kuvien manuaalinen tarkastaminen ja luokittelu on hyvin työläs prosessi. Tehtävästä tulee lähes mahdoton, kun edessä on valtava määrä kuvia, esimerkiksi 10 000 tai jopa 100 000. Kuinka hyödyllistä olisi, jos voisimme automatisoida koko tämän prosessin ja merkitä kuvat nopeasti vastaavaan luokkaan?

Itsoajavat autot ovat hyvä esimerkki siitä, missä kuvien luokittelua käytetään reaalimaailmassa. Autonomisen ajamisen mahdollistamiseksi voimme rakentaa kuvanluokittelumallin, joka tunnistaa erilaisia kohteita, kuten ajoneuvoja, ihmisiä, liikkuvia kohteita jne. tiellä. Näemme pari muuta käyttötapausta myöhemmin tässä artikkelissa, mutta ympärillämme on paljon muitakin sovelluksia. Käytä artikkelin alla olevaa kommenttiosastoa kertoaksesi, mitä mahdollisia käyttötapauksia sinä keksit!

Nyt kun olemme päässeet käsiksi aiheeseemme, sukelletaanpa siihen, miten kuvanluokittelumalli rakennetaan, mitkä ovat sen edellytykset ja miten se voidaan toteuttaa Pythonilla.

Kuvanluokittelutehtävämme rakenteen määrittäminen

Kuvanluokittelutehtävämme ratkaisemiseksi tietojemme on oltava tietyssä muodossa. Näemme tämän käytännössä parissa kappaleessa, mutta pidä nämä vihjeet mielessä siihen asti.

Sinulla pitäisi olla kaksi kansiota, toinen harjoitusjoukolle ja toinen testijoukolle. Harjoitusjoukossa sinulla on .csv-tiedosto ja kuvakansio:

  • .csv-tiedosto sisältää kaikkien harjoituskuvien nimet ja niitä vastaavat todelliset merkinnät
  • Kuvakansiossa on kaikki harjoituskuvat.

Testijoukkomme .csv-tiedosto eroaa harjoitusjoukossa olevasta. Tämä testijoukon .csv-tiedosto sisältää kaikkien testikuvien nimet, mutta niillä ei ole vastaavia merkintöjä. Voitko arvata miksi? Mallimme koulutetaan harjoitusjoukossa olevilla kuvilla, ja etikettiennusteet tapahtuvat testijoukon kuvilla

Jos datasi ei ole edellä kuvatussa muodossa, sinun on muunnettava se vastaavasti (muutoin ennusteet ovat vinossa ja melko hyödyttömiä).

Mallin rakentamisen prosessin purkaminen

Ennen kuin sukellamme syvällisesti Python-koodiin, otetaan hetki aikaa ymmärtääksemme, miten kuvien luokittelumalli tyypillisesti suunnitellaan. Voimme jakaa tämän prosessin karkeasti neljään vaiheeseen. Jokaisen vaiheen suorittamiseen kuluu tietty määrä aikaa:

  1. Datan lataaminen ja esikäsittely – 30 % aikaa
  2. Malliarkkitehtuurin määrittely – 10 % aikaa
  3. Mallin harjoittelu – 50 % aikaa
  4. Suorituskyvyn arviointi – 10 % aikaa

Sallikaa minun selittää kutakin edellä mainittua vaihetta hieman yksityiskohtaisemmin. Tämä osio on ratkaisevan tärkeä, koska kaikkia malleja ei rakenneta ensimmäisellä kerralla. Sinun on palattava takaisin jokaisen iteraation jälkeen, hienosäädettävä vaiheita ja ajettava se uudelleen. Peruskäsitteiden vankka ymmärtäminen nopeuttaa koko prosessia huomattavasti.

Vaihe 1: Datan lataaminen ja esikäsittely

Data on kultaa syväoppimisen mallien kannalta. Kuvanluokittelumallillasi on paljon paremmat mahdollisuudet suoriutua hyvin, jos harjoitusjoukossa on hyvä määrä kuvia. Lisäksi datan muoto vaihtelee käyttämämme arkkitehtuurin/kehyksen mukaan.

Kriittinen datan esikäsittelyvaihe (ikuisesti tärkeä vaihe kaikissa projekteissa). Suosittelen lämpimästi käymään läpi ’Basics of Image Processing in Python’, jotta ymmärrät enemmän siitä, miten esikäsittely toimii kuvatiedon kanssa.

Mutta emme ole vielä aivan perillä. Nähdäksemme, miten mallimme suoriutuu näkymättömästä datasta (ja ennen sen altistamista testijoukolle), meidän on luotava validointijoukko. Tämä tehdään jakamalla harjoitusjoukon data.

Lyhyesti sanottuna koulutamme mallin harjoitusdatalla ja validoimme sen validointidatalla. Kun olemme tyytyväisiä mallin suorituskykyyn validointijoukossa, voimme käyttää sitä ennusteiden tekemiseen testidatassa.

Tämän vaiheen vaatima aika: Tarvitsemme tähän tehtävään noin 2-3 minuuttia.

Vaihe 2: Mallin arkkitehtuurin määrittäminen

Tämä on toinen ratkaiseva vaihe syväoppimisen mallinrakennusprosessissamme. Meidän on määriteltävä, miltä mallimme tulee näyttämään, ja se edellyttää vastaamista seuraaviin kysymyksiin:

  • Miten monta konvoluutiokerrosta haluamme?
  • Minkälainen aktivointifunktion pitäisi olla kullakin kerroksella?
  • Miten monta piilotettua yksikköä kullakin kerroksella pitäisi olla?

Ja paljon muuta. Nämä ovat pohjimmiltaan mallin hyperparametreja, joilla on MASSIIVINEN rooli päätettäessä, kuinka hyviä ennusteita saadaan aikaan.

Miten päätämme nämä arvot? Erinomainen kysymys! Hyvä idea on valita nämä arvot olemassa olevien tutkimusten/tutkimusten perusteella. Toinen idea on kokeilla arvoja, kunnes löydät parhaan mahdollisen, mutta tämä voi olla melko aikaa vievä prosessi.

Tämän vaiheen vaatima aika: Mallin arkkitehtuurin määrittelyyn pitäisi kulua noin 1 minuutti.

Vaihe 3: Mallin harjoittelu

Mallin harjoittelua varten tarvitsemme:

  • Harjoituskuvat ja niitä vastaavat todelliset merkinnät
  • Validointikuvat ja niitä vastaavat todelliset merkinnät (käytämme näitä merkintöjä vain mallin validoimiseen, emmekä harjoitteluvaiheen aikana).

Määritämme myös epookkien määrän tässä vaiheessa. Aluksi ajamme mallia 10 epookin ajan (epookkien määrää voi muuttaa myöhemmin).

Tämän vaiheen vaatima aika: Koska harjoittelu vaatii mallia oppimaan rakenteita, tarvitsemme noin 5 minuuttia tämän vaiheen läpikäymiseen.

Ja nyt on aika tehdä ennusteita!

Vaihe 4: Mallin suorituskyvyn arviointi

Lopuksi lataamme testidatan (kuvat) ja käymme tässäkin vaiheessa läpi esikäsittelyvaiheen. Tämän jälkeen ennustamme näiden kuvien luokat koulutetun mallin avulla.

Tämän vaiheen vaatima aika: ~ 1 minuutti.

Ongelmanasettelun asettaminen ja datan ymmärtäminen

Poimimme todella hienon haasteen kuvien luokittelun ymmärtämiseksi. Meidän on rakennettava malli, joka pystyy luokittelemaan annetun kuvajoukon vaatteiden (paita, housut, kengät, sukat jne.) mukaan. Kyseessä on itse asiassa ongelma, jonka monet verkkokauppiaat kohtaavat, mikä tekee siitä entistäkin mielenkiintoisemman tietokonenäköongelman.

Tämän haasteen nimi on ”Tunnista vaatteet”, ja se on yksi DataHack-alustallamme olevista harjoitusongelmista. Sinun on rekisteröidyttävä ja ladattava tietokokonaisuus yllä olevasta linkistä.

Meillä on yhteensä 70 000 kuvaa (ulottuvuus 28 x 28), joista 60 000 on harjoitusjoukosta ja 10 000 testijoukosta. Harjoittelukuvat on valmiiksi merkitty vaatetyypin mukaan, ja luokkia on yhteensä 10. Testikuvia ei tietenkään ole merkitty. Haasteena on tunnistaa kaikissa testikuvissa esiintyvä vaatetyyppi.

Rakennamme mallimme Google Colabilla, koska se tarjoaa ilmaisen GPU:n mallien harjoitteluun.

Vaiheet mallin rakentamiseen

Aika käynnistää Python-taidot ja liata kädet. Olemme vihdoin oppimisemme toteutusosassa!

  1. Google Colabin käyttöönotto
  2. Kirjastojen tuonti
  3. Datan lataaminen ja esikäsittely – (3 min)
  4. Validointijoukon luominen
  5. .

  6. Mallin rakenteen määrittäminen – (1 min)
  7. Mallin harjoittelu – (5 min)
  8. Ennusteiden tekeminen – (1 min)

Katsotaan jokaista vaihetta tarkemmin.

Vaihe 1: Google Colabin määrittäminen

Koska tuomme datamme Google Drive -linkistä, meidän on lisättävä muutama koodirivi Google Colab -muistikirjaamme. Luo uusi Python 3 -muistikirja ja kirjoita seuraavat koodilohkot:

!pip install PyDrive

Tämä asentaa PyDriven. Nyt tuomme muutamia tarvittavia kirjastoja:

import osfrom pydrive.auth import GoogleAuthfrom pydrive.drive import GoogleDrivefrom google.colab import authfrom oauth2client.client import GoogleCredentials

Seuraavaksi luomme drive-muuttujan, jolla pääsemme Google Driveen:

auth.authenticate_user()gauth = GoogleAuth()gauth.credentials = GoogleCredentials.get_application_default()drive = GoogleDrive(gauth)

Lataaksemme tietokokonaisuuden käytämme Google Driveen ladatun tiedoston ID:tä:

download = drive.CreateFile({'id': '1BZOv422XJvxFUnGh-0xVeSvgFgqVY45q'})

Korvaamme yllä olevassa koodissa olevan ’id’:n tiedoston ID:llä. Nyt lataamme tämän tiedoston ja puramme sen pakkauksen:

download.GetContentFile('train_LbELtWX.zip')!unzip train_LbELtWX.zip

Tämä koodilohko on suoritettava joka kerta, kun käynnistät muistikirjasi.

Vaihe 2 : Tuo kirjastot, joita tarvitsemme mallinrakentamisvaiheessa.

import kerasfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Flattenfrom keras.layers import Conv2D, MaxPooling2Dfrom keras.utils import to_categoricalfrom keras.preprocessing import imageimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom keras.utils import to_categoricalfrom tqdm import tqdm

Vaihe 3 : Palauta mieleen aiemmin käsittelemämme esikäsittelyvaiheet. Käytämme niitä tässä datan lataamisen jälkeen.

train = pd.read_csv('train.csv')

Seuraavaksi luemme kaikki harjoituskuvat, tallennamme ne luetteloon ja lopuksi muunnamme tuon luettelon numpy-massaksi.

# We have grayscale images, so while loading the images we will keep grayscale=True, if you have RGB images, you should set grayscale as Falsetrain_image = for i in tqdm(range(train.shape)): img = image.load_img('train/'+train.astype('str')+'.png', target_size=(28,28,1), grayscale=True) img = image.img_to_array(img) img = img/255 train_image.append(img)X = np.array(train_image)

Koska kyseessä on moniluokkainen luokitusongelma (10 luokkaa), koodaamme kohdemuuttujan one-hot-koodilla.

y=train.valuesy = to_categorical(y)

Vaihe 4: Validointijoukon luominen harjoitusdatasta.

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)

Vaihe 5: Mallin rakenteen määrittäminen.

Luomme yksinkertaisen arkkitehtuurin, jossa on kaksi konvoluutiokerrosta, yksi tiheä piilotettu kerros ja ulostulokerros.

model = Sequential()model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(28,28,1)))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(128, activation='relu'))model.add(Dropout(0.5))model.add(Dense(10, activation='softmax'))

Seuraavaksi kokoamme luomamme mallin.

model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=)

Vaihe 6: Mallin harjoittelu.

Tässä vaiheessa harjoittelemme mallia harjoitusjoukon kuvilla ja validoimme sen käyttäen, arvasit varmaan, validointijoukkoa.

model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))

Vaihe 7: Ennusteiden tekeminen!

Aluksi noudatamme samoja vaiheita, jotka suoritimme harjoitusdataa käsitellessämme. Lataa testikuvat ja ennusta niiden luokat käyttämällä model.predict_classes()-funktiota.

download = drive.CreateFile({'id': '1KuyWGFEpj7Fr2DgBsW8qsWvjqEzfoJBY'})download.GetContentFile('test_ScVgIM0.zip')!unzip test_ScVgIM0.zip

Tuodaan testitiedosto:

test = pd.read_csv('test.csv')

Luemme ja tallennamme nyt kaikki testikuvat:

test_image = for i in tqdm(range(test.shape)): img = image.load_img('test/'+test.astype('str')+'.png', target_size=(28,28,1), grayscale=True) img = image.img_to_array(img) img = img/255 test_image.append(img)test = np.array(test_image)
# making predictionsprediction = model.predict_classes(test)

Luomme myös lähetystiedoston ladattavaksi DataHack-alustan sivulle (nähdäksemme, miten tuloksemme pärjäävät tulostaulukkoon).

download = drive.CreateFile({'id': '1z4QXy7WravpSj-S4Cs9Fk8ZNaX-qh5HF'})download.GetContentFile('sample_submission_I5njJSF.csv')
# creating submission filesample = pd.read_csv('sample_submission_I5njJSF.csv')sample = predictionsample.to_csv('sample_cnn.csv', header=True, index=False)

Lataa tämä sample_cnn.csv-tiedosto ja lataa se kilpailusivulle luodaksesi tuloksesi ja tarkistaaksesi sijoituksesi leaderboardilla. Näin saat vertailuratkaisun, jonka avulla pääset alkuun minkä tahansa kuvanluokitusongelman kanssa!

Voit kokeilla hyperparametrien virittämistä ja regularisointitekniikoita parantaaksesi mallisi suorituskykyä entisestään. Suosittelen tutustumaan tähän artikkeliin, jotta ymmärrät tämän hienosäätövaiheen paljon yksityiskohtaisemmin – ’A Comprehensive Tutorial to learn Convolutional Neural Networks from Scratch’.

Picking up a Different Challenge

Testataan oppimistamme erilaisella aineistolla. Ratkaisemme tässä osiossa ’Tunnista numerot’ -harjoitusongelman. Siirry eteenpäin ja lataa tietokokonaisuus. Ennen kuin jatkat eteenpäin, yritä ratkaista tämä itse. Sinulla on jo työkalut sen ratkaisemiseen – sinun on vain sovellettava niitä! Palaa tänne tarkistaaksesi tuloksesi tai jos jäät jossakin vaiheessa jumiin.

Tässä haasteessa meidän on tunnistettava annetun kuvan numero. Meillä on yhteensä 70 000 kuvaa – 49 000 merkittyä kuvaa harjoitusjoukossa ja loput 21 000 testijoukossa (testikuvat ovat merkitsemättömiä). Meidän on tunnistettava/ennustettava näiden merkitsemättömien kuvien luokka.

Valmiina aloittamaan? Mahtavaa! Luo uusi Python 3 -muistikirja ja suorita seuraava koodi:

# Setting up Colab!pip install PyDrive
import osfrom pydrive.auth import GoogleAuthfrom pydrive.drive import GoogleDrivefrom google.colab import authfrom oauth2client.client import GoogleCredentials
auth.authenticate_user()gauth = GoogleAuth()gauth.credentials = GoogleCredentials.get_application_default()drive = GoogleDrive(gauth)
# Replace the id and filename in the below codesdownload = drive.CreateFile({'id': '1ZCzHDAfwgLdQke_GNnHp_4OheRRtNPs-'})download.GetContentFile('Train_UQcUa52.zip')!unzip Train_UQcUa52.zip
# Importing librariesimport kerasfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Flattenfrom keras.layers import Conv2D, MaxPooling2Dfrom keras.utils import to_categoricalfrom keras.preprocessing import imageimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom keras.utils import to_categoricalfrom tqdm import tqdm
train = pd.read_csv('train.csv')
# Reading the training imagestrain_image = for i in tqdm(range(train.shape)): img = image.load_img('Images/train/'+train, target_size=(28,28,1), grayscale=True) img = image.img_to_array(img) img = img/255 train_image.append(img)X = np.array(train_image)
# Creating the target variabley=train.valuesy = to_categorical(y)
# Creating validation setX_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)
# Define the model structuremodel = Sequential()model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(28,28,1)))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(128, activation='relu'))model.add(Dropout(0.5))model.add(Dense(10, activation='softmax'))
# Compile the modelmodel.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=)
# Training the modelmodel.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
download = drive.CreateFile({'id': '1zHJR6yiI06ao-UAh_LXZQRIOzBO3sNDq'})download.GetContentFile('Test_fCbTej3.csv')
test_file = pd.read_csv('Test_fCbTej3.csv')
test_image = for i in tqdm(range(test_file.shape)): img = image.load_img('Images/test/'+test_file, target_size=(28,28,1), grayscale=True) img = image.img_to_array(img) img = img/255 test_image.append(img)test = np.array(test_image)
prediction = model.predict_classes(test)
download = drive.CreateFile({'id': '1nRz5bD7ReGrdinpdFcHVIEyjqtPGPyHx'})download.GetContentFile('Sample_Submission_lxuyBuB.csv')
sample = pd.read_csv('Sample_Submission_lxuyBuB.csv')sample = test_filesample = predictionsample.to_csv('sample.csv', header=True, index=False)

Siirrä tämä tiedosto harjoitustehtäväsivulle saadaksesi melkoisen kunnon tarkkuusluvun. Se on hyvä alku, mutta parantamisen varaa on aina. Jatka hyperparametrien arvojen kanssa leikkimistä ja katso, voitko parantaa perusmalliamme.

Loppuhuomautukset

Kuka sanoi, että syväoppimismallien harjoittelu vaatii tunteja tai päiviä? Tarkoitukseni oli tässä esitellä, että voit saada aikaan ihan kelpo syväoppimisen mallin tuplasti nopeammin. Kannattaa poimia vastaavia haasteita ja yrittää koodata niitä myös omasta päästä. Mikään ei voita tekemällä oppimista!

Huipputietotutkijoilla ja -analyytikoilla on nämä koodit valmiina jo ennen kuin hackathon edes alkaa. He käyttävät näitä koodeja tekemään varhaisia esityksiä ennen kuin he sukeltavat yksityiskohtaiseen analyysiin. Kun heillä on vertailuratkaisu, he alkavat parantaa malliaan eri tekniikoiden avulla.

Vastaa

Sähköpostiosoitettasi ei julkaista.