Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Haaste: CNN:n Rakentaminen | Osio
Soveltava tietokonenäkö

bookHaaste: 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ä toteutat ja koulutat VGG-tyyppisen CNN:n käyttäen TensorFlow'ta ja Kerasia 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ämä projekti ohjaa sinut läpi aineiston lataamisen, kuvien esikäsittelyn, CNN-mallin määrittelyn, sen kouluttamisen ja suorituskyvyn arvioinnin.

CIFAR10

1. Datan esikäsittely CNN:lle

Ennen CNN:n kouluttamista datan esikäsittely on olennainen 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 kokonaislukuluokat (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.

Pooling-kerros (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 tyypillisesti 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, optimointimenetelmä ja metriikat, jotka ohjaavat mallin oppimista koulutuksen aikana. Seuraavia menetelmiä käytetään yleisesti konvoluutiohermoverkoissa (CNN):

Optimointimenetelmä (Adam)

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

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

Konvoluutioneuroverkon (CNN) koulutus sisältää syötteen syöttämisen verkkoon, tappion laskemisen ja painojen päivittämisen takaisinlevityksen 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 tuntemattomalla 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äivittämistä, ja epochien määrä viittaa siihen, kuinka monta kertaa koko aineisto käydään läpi mallissa.

5. Arviointi

Luokitteluraportti

sklearn.metrics.classification_report() vertailee todellisia ja ennustettuja arvoja testidatasta. Se sisältää precision-, recall- ja F1-arvot jokaiselle luokalle. Menetelmät vaativat vain 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 tuottaa 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

Lisätietojen saamiseksi mallin suorituskyvystä 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, jotta voidaan tarkastella, kuinka hyvin malli suoriutuu jokaisesta luokasta:

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

plt.show()

1. Lataa ja esikäsittele aineisto

  • Tuo CIFAR-10-aineisto Kerasista;
  • Normalisoi pikseliarvot välille [0,1] paremman konvergenssin saavuttamiseksi;
  • Muunna luokkien tunnisteet 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 (Ylisuoriutumisen ehkäisy satunnaisesti poistamalla neuroneja):

  • 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, voit lisätä muita mittareita itse).

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 toimii validointiaineistona mallin suorituskyvyn seuraamiseksi tuntemattomilla kuvilla;
  • Tallenna koulutushistoria, jotta voidaan visualisoida tarkkuuden ja tappion kehitys.

4. Arvioi ja visualisoi tulokset

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

COLAB CNN -PROJEKTI

question-icon

Syötä avaimen osat (Sait ne projektin suoritettuasi)

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

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 18

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Osio 1. Luku 18
some-alt