Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Haaste: CNN:n Rakentaminen | Konvoluutioneuroverkot
Tietokonenäön Perusteet Pythonilla

Haaste: CNN:n Rakentaminen

Pyyhkäise näyttääksesi valikon

Konvoluutiohermoverkot (CNN:t) ovat laajasti käytössä kuvien luokittelussa niiden kyvyn ansiosta poimia hierarkkisia piirteitä. Tässä tehtävässä toteutetaan ja koulutetaan VGG-tyyppinen CNN TensorFlow'n ja Kerasin avulla CIFAR-10-aineistolla. Aineisto sisältää 60 000 kuvaa (32×32×3), jotka kuuluvat 10 eri luokkaan, kuten lentokoneet, autot, linnut, kissat ja muita.

Tässä projektissa käydään läpi aineiston lataaminen, kuvien esikäsittely, CNN-mallin määrittely, koulutus ja suorituskyvyn arviointi.

CIFAR10

1. Datan esikäsittely CNN:ille

Ennen CNN:n koulutusta datan esikäsittely on tärkeä vaihe paremman suorituskyvyn ja nopeamman konvergenssin varmistamiseksi. Yleisiä esikäsittelymenetelmiä ovat:

  • Normalisointi: tässä menetelmässä kuvien pikseliarvot skaalataan väliltä 0–255 välille 0–1. Tämä toteutetaan usein muodossa x_train / 255.0, x_test / 255.0;

  • One-hot-koodaus: luokittelutehtävissä luokat muunnetaan usein one-hot-koodatuiksi vektoreiksi. Tämä tehdään tyypillisesti keras.utils.to_categorical-funktiolla, joka muuntaa kokonaislukumerkinnät (esim. 0, 1, 2, jne.) one-hot-koodatuksi vektoriksi, kuten [1, 0, 0, 0] 4-luokan luokittelutehtävässä.

2. CNN-arkkitehtuurin rakentaminen

CNN-arkkitehtuuri koostuu useista kerroksista, jotka suorittavat erilaisia tehtäviä piirteiden erottamiseksi ja ennusteiden tekemiseksi. Keskeiset CNN-kerrokset voidaan toteuttaa seuraavasti:

Konvoluutiokerros (Conv2D)

keras.layers.Conv2D(filters, kernel_size, activation='relu', padding='same', input_shape=(height, width, channels))
Note
Huomio

input_shape-parametri tulee määrittää vain syötekerroksessa.

Poolauskerros (MaxPooling2D)

keras.layers.MaxPooling2D(pool_size=(2, 2))

Tasoituskerros

keras.layers.Flatten()

Tiheä kerros

layers.Dense(units=512, activation='relu')
layers.Dense(10, activation='softmax')
Note
Huomio

Viimeisessä tiheässä kerroksessa yksiköiden määrä on yleensä sama kuin luokkien määrä ja siinä käytetään softmax-aktivointifunktiota tuottamaan todennäköisyysjakauma luokkien välillä.

3. Mallin kokoaminen

Arkkitehtuurin määrittämisen jälkeen malli täytyy koota. Tässä vaiheessa määritellään tappiollinen funktio, optimointialgoritmi ja metriikat, jotka ohjaavat mallin oppimista koulutuksen aikana. Seuraavia menetelmiä käytetään yleisesti konvoluutiohermoverkoissa:

Optimointialgoritmi (Adam)

Optimointialgoritmi säätää mallin painoja minimoidakseen tappiollisen funktion. Adam-optimointialgoritmi on suosittu tehokkuutensa ja kyvynsä mukauttaa oppimisnopeutta koulutuksen aikana ansiosta.

keras.optimizers.Adam()

Tappiollinen funktio (Categorical Crossentropy)

Moniluokkaluokittelussa käytetään yleensä tappiollisena funktiona kategorista ristientropiaa. Tämä voidaan toteuttaa seuraavasti:

keras.losses.CategoricalCrossentropy()

Metriikat

Mallin suorituskykyä seurataan luokittelutehtävissä metriikoilla, kuten tarkkuus, precision ja recall. Nämä voidaan määritellä seuraavasti:

metrics = [
    keras.metrics.Accuracy(), 
    keras.metrics.Precision(), 
    keras.metrics.Recall()
]

Kokoaminen

model.compile(optimizer='adam', 
              loss='categorical_crossentropy', # Or keras.losses.CategoricalCrossentropy()
              metrics=metrics)

4. Mallin koulutus

CNN:n koulutus sisältää syötteen syöttämisen verkkoon, tappion laskemisen ja painojen päivittämisen takaisinkytkennän avulla. Koulutusprosessia ohjataan seuraavilla keskeisillä menetelmillä:

  • Mallin sovitus: fit()-metodia käytetään mallin kouluttamiseen. Tämä metodi ottaa syötteenä koulutusdatan, epochien määrän ja eräkoon. Lisäksi siinä voidaan käyttää valinnaista validointijakoa mallin suorituskyvyn arvioimiseksi koulutuksen aikana näkymättömällä datalla:
history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
  • Eräkoko ja epochit: eräkoko määrittää kuinka monta näytettä käsitellään ennen mallin painojen päivitystä, ja epochien määrä viittaa siihen, kuinka monta kertaa koko aineisto käydään läpi mallissa.

5. Arviointi

Luokitteluraportti

sklearn.metrics.classification_report() vertaa todellisia ja ennustettuja arvoja testidatasta. Se sisältää precision-, recall- ja F1-arvot jokaiselle luokalle. Menetelmät vaativat kuitenkin pelkät luokkamerkinnät, joten muista muuntaa ne takaisin vektoreista ([0,0,1,0] -> 2):

y_pred = model.predict(x_test)
y_pred_classes = np.argmax(y_pred,axis = 1)
y_test_classes = np.argmax(y_test, axis = 1)

report = classification_report(y_test_classes, y_pred_classes, target_names=class_names)
print(report)

Arviointi

Kun malli on koulutettu, sitä arvioidaan testidatalla sen yleistyskyvyn mittaamiseksi. Arviointi antaa mittareita, jotka mainittiin .compile()-menetelmässä. Arviointi suoritetaan käyttämällä .evaluate():

results = model.evaluate(x_test, y_test, verbose=2, return_dict=True)

Sekoitusmatriisi

Mallin suorituskyvyn tarkempaan analysointiin voidaan visualisoida sekoitusmatriisi, joka näyttää todelliset positiiviset, väärät positiiviset, todelliset negatiiviset ja väärät negatiiviset ennusteet jokaiselle luokalle. Sekoitusmatriisi voidaan laskea TensorFlow'lla:

confusion_mtx = tf.math.confusion_matrix(y_test_classes, y_pred_classes)

Tämä matriisi voidaan visualisoida lämpökarttojen avulla, jolloin voidaan tarkastella, kuinka hyvin malli suoriutuu eri luokissa:

plt.figure(figsize=(12, 9))
c = sns.heatmap(confusion_mtx, annot=True, fmt='g')
c.set(xticklabels=class_names, yticklabels=class_names)

plt.show()

Tehtävä

1. Lataa ja esikäsittele aineisto

  • Tuo CIFAR-10-aineisto Keras-kirjastosta;
  • Normalisoi pikseliarvot välille [0,1] paremman konvergenssin saavuttamiseksi;
  • Muunna luokkamerkinnät one-hot encoded -muotoon kategorista luokittelua varten.

2. Määrittele CNN-malli

Toteuta VGG-tyylinen CNN-arkkitehtuuri seuraavilla keskeisillä kerroksilla: VGG like architecture

Konvoluutiokerrokset:

  • Ytimen koko: 3×3;
  • Aktivointifunktio: ReLU;
  • Täydennys: 'same'.

Pooling-kerrokset:

  • Pooling-tyyppi: max pooling;
  • Pooling-koko: 2×2.

Dropout-kerrokset (Ylisuorittamisen ehkäisy satunnaisesti poistamalla neuroneita):

  • Dropout-prosentti: 25%.

Flatten-kerros – muuntaa 2D-piirrekuvat 1D-vektoriksi luokittelua varten.

Täysin yhdistetyt kerrokset – tiheät kerrokset lopullista luokittelua varten, relu- tai softmax-lähtökerroksella.

Käännä malli käyttäen:

  • Adam optimizer (tehokkaaseen oppimiseen);
  • Categorical cross-entropy -tappiofunktio (moniluokkaluokitteluun);
  • Accuracy metric suorituskyvyn mittaamiseen (luokat ovat tasapainossa, ja voit lisätä muita mittareita halutessasi).

3. Kouluta malli

  • Määritä epochs ja batch_size -parametrit koulutukseen (esim. epochs=20, batch_size=64);
  • Määritä validation_split -parametri, joka määrittää kuinka suuri osa koulutusaineistosta käytetään validointiin mallin suorituskyvyn seuraamiseksi tuntemattomilla kuvilla;
  • Tallenna koulutushistoria, jotta voit visualisoida tarkkuuden ja tappion kehityksen.

4. Arvioi ja visualisoi tulokset

  • Testaa malli CIFAR-10 testiaineistolla ja tulosta tarkkuus;
  • Piirrä koulutustappio vs. validointitappio ylisuorittamisen tarkistamiseksi;
  • Piirrä koulutustarkkuus vs. validointitarkkuus oppimisen etenemisen varmistamiseksi.

COLAB CNN -PROJEKTI

question-icon

Syötä avaimen osat (Sait ne projektin suorittamisen jälkeen)

1.  2.  3.  4.  5.
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 7

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 3. Luku 7
some-alt