How to normalize a convolutional network?

Crearea și Optimizarea Rețelelor Convoluționale

10/11/2023

Rating: 4.42 (6552 votes)

În lumea rapidă a inteligenței artificiale, Rețelele Neuronale Convoluționale (CNN) au devenit un pilon fundamental, în special în domeniul viziunii computerizate. De la recunoașterea facială la mașinile autonome, CNN-urile sunt motorul din spatele multor progrese tehnologice. Acest articol își propune să demistifice procesul de creare, antrenare și optimizare a unei rețele convoluționale, oferind un ghid detaliat pentru oricine dorește să exploreze această tehnologie fascinantă.

How to create a convolutional neural network?
Define a Convolutional Neural Network # Copy the neural network from the Neural Networks section before and modify it to take 3-channel images (instead of 1-channel images as it was defined). 3. Define a Loss function and optimizer # Let’s use a Classification Cross-Entropy loss and SGD with momentum. 4. Train the network #
Cuprins

1. Ce este o Rețea Neuronală Convoluțională (CNN)?

La baza unei CNN se află conceptul de strat convoluțional. Acesta este inima rețelei, unde se aplică mai multe filtre (cunoscute și sub numele de kernel-uri) de dimensiuni egale. Fiecare filtru este proiectat să recunoască un anumit model din imagine, cum ar fi marginile, curbele sau chiar forme mai complexe ale obiectelor. Prin deplasarea acestor filtrelor peste imagine, rețeaua extrage caracteristici relevante, transformând datele brute ale imaginii în reprezentări mai abstracte și mai utile. Acest proces de extracție a caracteristicilor este crucial pentru performanța ulterioară a rețelei.

Spre deosebire de rețelele neuronale tradiționale, care procesează fiecare pixel individual, CNN-urile exploatează structura spațială a imaginilor, făcându-le extrem de eficiente pentru sarcini vizuale.

2. Arhitectura unei Rețele Convoluționale: De la Bază la Clasificare

O rețea convoluțională tipică este alcătuită dintr-o serie de straturi interconectate, fiecare având un rol specific. O arhitectură comună începe cu o bază convoluțională, urmată de straturi dense pentru clasificare.

Baza Convoluțională

Baza convoluțională este responsabilă pentru extragerea caracteristicilor din imagini. Aceasta constă, de obicei, într-o stivă de straturi Conv2D și MaxPooling2D, intercalate cu funcții de activare, cum ar fi ReLU (Rectified Linear Unit). O arhitectură simplă ar putea arăta astfel:

  • Strat de intrare a imaginii: Specifică dimensiunile imaginii de intrare (de exemplu, 32x32 pixeli, 3 canale de culoare pentru RGB).
  • Conv2D: Aplică filtre convoluționale pentru a extrage caracteristici. Parametrul cheie este numărul de filtre și dimensiunea kernelului (de exemplu, 3x3). Funcția de activare ReLU este adesea aplicată imediat după un strat Conv2D pentru a introduce neliniaritatea, permițând rețelei să învețe modele mai complexe.
  • MaxPooling2D: Reduce dimensiunile spațiale (înălțimea și lățimea) ale volumului de intrare, reducând numărul de parametri și operații de calcul, ajutând la prevenirea supraînvățării și la extragerea celor mai relevante caracteristici.

Acest tipar (Conv2D -> ReLU -> MaxPooling2D) este adesea repetat de mai multe ori, cu un număr crescut de filtre în straturile Conv2D pe măsură ce avansăm în adâncimea rețelei. Rezultatul fiecărui strat Conv2D și MaxPooling2D este un tensor 3D (înălțime, lățime, canale).

Straturi Dense pentru Clasificare

După ce baza convoluțională a extras caracteristicile relevante, acestea trebuie transformate într-un format adecvat pentru clasificare. Aceasta se realizează prin adăugarea de straturi dense (complet conectate) în partea superioară a bazei convoluționale. Deoarece straturile dense acceptă vectori 1D ca intrare, este necesar un strat de aplatizare (Flatten) pentru a transforma ieșirea 3D a ultimului strat convoluțional într-un vector 1D.

  • Flatten: Aplatizează (desfășoară) ieșirea multi-dimensională a stratului convoluțional într-un vector 1D.
  • Dense (Complet Conectat): Aceste straturi iau vectorul aplatizat și efectuează operații de clasificare. De obicei, se folosește o funcție de activare ReLU pentru straturile dense intermediare.
  • Strat de ieșire Dense: Ultimul strat dens are un număr de neuroni egal cu numărul de clase de ieșire (de exemplu, 10 pentru CIFAR10). Pentru probleme de clasificare, se aplică o funcție de activare Softmax (sau LogSoftmax în PyTorch, combinată cu NLLLoss) pentru a obține probabilități de clasă.

Tabel Comparativ: Straturi Comune în CNN

StratDescriereScopExemple de Parametri
Conv2DAplică filtre spațiale pentru a detecta caracteristici locale.Extracția caracteristicilor (margini, texturi).Număr de filtre (32, 64), dimensiune kernel (3x3, 5x5), padding.
ReLUFuncție de activare neliniară (max(0, x)).Introduce neliniaritatea, permite învățarea de modele complexe.N/A
MaxPooling2DReduce dimensiunea spațială, selectând valoarea maximă dintr-o regiune.Reducerea dimensionalității, extragerea celor mai importante caracteristici.Dimensiune pooling (2x2), stride (2).
Batch NormalizationNormalizează ieșirile stratului pentru a stabiliza antrenamentul.Accelerează antrenamentul, reduce sensibilitatea la inițializarea greutăților.N/A
FlattenTransformă ieșirea multi-dimensională într-un vector 1D.Pregătește datele pentru straturile complet conectate.N/A
Dense (Fully Connected)Strat complet conectat, fiecare neuron este conectat la toți neuronii din stratul anterior.Clasificare, regresie, învățare de relații complexe între caracteristici.Număr de neuroni (64, 500), funcție de activare (ReLU, Softmax).

3. Etapele Creării și Antrenării unei Rețele Convoluționale

Procesul de antrenare a unei CNN implică mai multe etape cheie, de la pregătirea datelor la evaluarea performanței.

3.1. Pregătirea Datelor

Prima etapă este încărcarea și pregătirea seturilor de date de antrenare și testare. Seturi de date precum CIFAR10 (imagini color cu 10 clase) sau Kuzushiji-MNIST (KMNIST, caractere Hiragana scrise de mână) sunt exemple populare. Un pas esențial este normalizarea valorilor pixelilor. Imaginile PIL (Python Imaging Library) din `torchvision` au, de obicei, un interval de [0, 1], iar acestea sunt transformate în tensori cu un interval normalizat de [-1, 1]. În Keras, imaginile sunt normalizate de la [0, 255] la [0, 1] prin împărțirea la 255.0. Această normalizare ajută la stabilizarea și accelerarea procesului de antrenare.

De asemenea, este importantă împărțirea datelor în seturi de antrenare, validare și testare. Setul de validare este folosit pentru a monitoriza performanța rețelei în timpul antrenamentului și pentru a ajusta hiperparametrii, fără a folosi aceste date pentru actualizarea directă a greutăților modelului.

Pentru a gestiona eficient datele, bibliotecile precum PyTorch oferă `DataLoader`, care ajută la încărcarea datelor în batch-uri, amestecarea acestora și pregătirea pentru antrenament. Pe Windows, o eroare `BrokenPipeError` poate fi rezolvată prin setarea `num_worker` din `DataLoader` la 0.

3.2. Definirea Modelului

După pregătirea datelor, se definește arhitectura rețelei. În PyTorch, aceasta implică, de obicei, crearea unei clase care moștenește `torch.nn.Module`. În constructorul `__init__`, se definesc straturile (e.g., `Conv2d`, `Linear`, `MaxPool2d`), iar în metoda `forward`, se specifică fluxul datelor prin aceste straturi. Această abordare oferă un control granular asupra arhitecturii. În Keras, crearea modelului este adesea mai simplă, folosind API-ul `Sequential` și adăugând straturi succesive cu `model.add()`. Indiferent de framework, primul strat trebuie să specifice `input_shape` pentru a inițializa corect rețeaua.

Can a convolutional neural network recognize handwritten hiragana characters?
This network will be able to recognize handwritten Hiragana characters. In training a Convolutional Neural Network (CNN), a dataset provides the necessary variety of inputs and labels that the network needs to learn from. This ensures the model can generalize well when encountering unseen data.

3.3. Configurația Antrenamentului

Înainte de a începe antrenamentul, trebuie specificate opțiunile de antrenament. Acestea includ:

  • Optimizatorul: Algoritmul folosit pentru a ajusta greutățile rețelei pe baza gradientului funcției de pierdere. Exemple comune sunt Adam sau SGD cu momentum.
  • Funcția de pierdere (Loss Function): Măsoară eroarea dintre predicțiile rețelei și etichetele reale. Pentru clasificarea multi-clasă, `Cross-Entropy Loss` (sau `nn.NLLLoss` combinat cu `LogSoftmax` în PyTorch) este o alegere comună. Pentru sarcini de regresie, se utilizează `Mean Squared Error (MSE)`.
  • Hiperparametri: Rate de învățare (learning rate), dimensiunea batch-ului (miniBatchSize) și numărul de epoci (epochs). Alegerea acestora necesită adesea analiză empirică și experimentare.
  • Monitorizarea: Specificarea datelor de validare și a frecvenței de validare pentru a urmări acuratețea rețelei pe un set de date nevăzut în timpul antrenamentului.

3.4. Procesul de Antrenare

Antrenarea rețelei implică o buclă iterativă peste setul de date de antrenament. Pentru fiecare batch de date:

  1. Se trimit intrările către dispozitivul de antrenament (CPU sau GPU).
  2. Se efectuează o trecere înainte (forward pass) prin rețea pentru a obține predicțiile.
  3. Se calculează pierderea (loss) pe baza predicțiilor și a etichetelor reale.
  4. În PyTorch, este esențial să se golească gradientul (`opt.zero_grad()`) de la iterația anterioară.
  5. Se efectuează retropropagarea (backpropagation) (`loss.backward()`) pentru a calcula gradienții.
  6. Se actualizează greutățile rețelei (`opt.step()`) pe baza gradienților.

Acest proces se repetă pentru un număr predefinit de epoci, iar la sfârșitul fiecărei epoci, se evaluează performanța rețelei pe seturile de antrenare și validare.

3.5. Testarea și Evaluarea Performanței

După antrenament, este crucial să se evalueze performanța rețelei pe setul de date de testare, care nu a fost folosit deloc în timpul antrenamentului sau validării. Pentru aceasta, se dezactivează calculul automat al gradientului (`torch.no_grad()` în PyTorch) și se pune modelul în modul de evaluare (`model.eval()`).

Se calculează acuratețea generală a rețelei pe întregul set de testare. De exemplu, o acuratețe de 53% pe CIFAR10 este mult mai bună decât o șansă aleatorie de 10% (deoarece sunt 10 clase). De asemenea, se poate analiza performanța pe fiecare clasă în parte (e.g., "Accuracy for class: ship is 78.8 %", "Accuracy for class: dog is 38.2 %"), identificând clasele la care rețeaua se descurcă bine și cele la care are dificultăți. Un raport de clasificare detaliat (precizie, rechemare, scor F1) oferă o imagine mai completă a performanței.

4. Normalizarea Datelor și Stratificarea Batch-ului în CNN-uri

Normalizarea este un aspect esențial în antrenarea rețelelor neuronale, inclusiv a CNN-urilor. Aceasta ajută la stabilizarea și accelerarea procesului de antrenare prin descendentă de gradient. O scalare necorespunzătoare a datelor poate duce la o pierdere (loss) care devine NaN și la divergența parametrilor rețelei.

Există mai multe puncte în rețea unde se poate aplica normalizarea:

  • Datele de intrare: Predictorii ar trebui normalizați înainte de a fi introduși în rețea. Cel mai adesea, imaginile sunt scalate la intervalul [0, 1] sau [-1, 1].
  • Ieșirile straturilor: Straturile de Normalizare pe Batch (Batch Normalization Layer) normalizează ieșirile fiecărui strat convoluțional și complet conectat. Acest lucru stabilizează distribuția activărilor în rețea, permițând utilizarea unor rate de învățare mai mari și reducând dependența de inițializarea greutăților.
  • Răspunsurile (pentru regresie): În sarcinile de regresie, unde se prezic valori numerice continue (de exemplu, unghiuri de rotație), dacă răspunsul are o scară foarte diferită de predicțiile normalizează, antrenamentul poate eșua. Normalizarea răspunsului înainte de antrenament poate îmbunătăți convergența. Dacă se normalizează răspunsul, predicțiile rețelei antrenate trebuie transformate înapoi la scara originală.

Deși datele nu trebuie să fie perfect normalizate, o distribuție foarte inegală sau asimetrică a intrărilor sau răspunsurilor poate necesita transformări neliniare (de exemplu, logaritmice) pentru a îmbunătăți antrenamentul.

5. Aplicații Practice: Recunoașterea Caracterelor Hiragana

Un exemplu concret de aplicare a CNN-urilor este recunoașterea caracterelor scrise de mână. Tutorialul menționat demonstrează antrenarea unei CNN (arhitectura LeNet) pentru a recunoaște caracterele Hiragana din setul de date Kuzushiji-MNIST (KMNIST). Acest set de date este o alternativă la MNIST clasic și conține 70.000 de imagini (60.000 pentru antrenament, 10.000 pentru testare) cu 10 clase de caractere Hiragana.

Procesul implică definirea arhitecturii LeNet în PyTorch, încărcarea și preprocesarea setului de date KMNIST (care este disponibil direct în `torchvision`), configurarea optimizatorului (Adam) și a funcției de pierdere (`nn.NLLLoss`), apoi antrenarea modelului. Performanța obținută (aproximativ 95% acuratețe pe setul de testare) demonstrează eficacitatea CNN-urilor chiar și pentru sarcini vizuale complexe precum recunoașterea caracterelor.

Un aspect practic important este salvarea modelului antrenat pe disc (`torch.save()`) și reîncărcarea acestuia (`torch.load()`) pentru a face predicții ulterioare pe imagini noi, fără a fi nevoie să se reantreneze rețeaua. Această practică este fundamentală în dezvoltarea aplicațiilor de inteligență artificială.

6. Accelerarea Antrenamentului: Utilizarea GPU

Antrenarea rețelelor neuronale convoluționale, în special a celor mai profunde și complexe, poate fi un proces intensiv din punct de vedere computațional. Utilizarea unei Unități de Procesare Grafică (GPU) accelerează semnificativ acest proces. Biblioteci precum PyTorch și TensorFlow sunt optimizate pentru a profita de capabilitățile de calcul paralel ale GPU-urilor.

În PyTorch, trecerea modelului și a datelor pe GPU este simplă, folosind `tensor.to(device)` sau `model.to(device)`, unde `device` este "cuda" dacă un GPU este disponibil, sau "cpu" în caz contrar. Această optimizare poate reduce drastic timpul de antrenament, de la minute sau ore pe CPU la secunde sau minute pe GPU, permițând experimentarea și iterarea mai rapidă a modelelor.

Întrebări Frecvente (FAQ)

Ce rol are funcția de activare ReLU într-o CNN?
ReLU (Rectified Linear Unit) introduce neliniaritatea în rețea. Fără funcții de activare neliniare, o rețea neuronală, indiferent de cât de multe straturi are, ar acționa ca un singur strat liniar, limitându-i capacitatea de a învăța modele complexe și de a modela relații non-liniare în date.
De ce se utilizează stratul MaxPooling?
Stratul MaxPooling are două scopuri principale: reduce dimensiunea spațială a reprezentării (e.g., de la 28x28 la 14x14 pixeli), ceea ce scade numărul de parametri și complexitatea computațională, și face rețeaua mai robustă la mici variații sau translații ale obiectelor în imagine, deoarece extrage cele mai proeminente caracteristici dintr-o regiune.
Care este diferența dintre o sarcină de clasificare și una de regresie pentru CNN-uri?
Într-o sarcină de clasificare, CNN-ul prezice o etichetă de clasă discretă (de exemplu, "pisică", "avion", "câine"). Ieșirea finală este, de obicei, un strat Softmax care produce probabilități pentru fiecare clasă. Într-o sarcină de regresie, CNN-ul prezice o valoare numerică continuă (de exemplu, un unghi de rotație, o coordonată de pixel). Stratul de ieșire final este, de obicei, un strat dens cu un singur neuron și fără funcție de activare (sau o funcție liniară), iar funcția de pierdere este adesea MSE.
De ce este importantă normalizarea datelor în antrenarea CNN-urilor?
Normalizarea datelor este crucială deoarece: 1) ajută la stabilizarea antrenamentului, prevenind ca gradienții să devină prea mari sau prea mici (probleme de gradient exploziv/dispărut), 2) accelerează convergența procesului de antrenare, permițând utilizarea unor rate de învățare mai mari, și 3) reduce sensibilitatea modelului la inițializarea greutăților.
Pot fi utilizate CNN-urile pentru alte sarcini în afară de clasificarea imaginilor?
Absolut! CNN-urile sunt versatile și sunt utilizate pe scară largă pentru: detecția obiectelor (identificarea și localizarea mai multor obiecte într-o imagine), segmentarea semantică (etichetarea fiecărui pixel dintr-o imagine cu o clasă), generarea de imagini (e.g., cu Generative Adversarial Networks - GANs), recunoașterea facială, recunoașterea vocală (prin conversia semnalelor audio în spectrograme, tratate ca imagini) și multe altele.

Dacă vrei să descoperi și alte articole similare cu Crearea și Optimizarea Rețelelor Convoluționale, poți vizita categoria Fitness.

Go up