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ä 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.
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))
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')
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:

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 metricsuorituskyvyn mittaamiseen (luokat ovat tasapainossa, voit lisätä muita mittareita itse).
3. Kouluta malli
- Määritä
epochsjabatch_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.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme