This shows you the differences between two versions of the page.
|
gp:laboratoare:07 [2025/03/30 21:12] maria_anca.balutoiu [Implementarea unui GAN în PyTorch] |
gp:laboratoare:07 [2026/03/30 09:38] (current) maria_anca.balutoiu [Tasks] |
||
|---|---|---|---|
| Line 23: | Line 23: | ||
| În timp, Generatorul devine foarte bun la producerea de date care sunt aproape imposibil de distins de datele reale, în timp ce Discriminatorul devine din ce în ce mai bun în a distinge datele reale de cele false. | În timp, Generatorul devine foarte bun la producerea de date care sunt aproape imposibil de distins de datele reale, în timp ce Discriminatorul devine din ce în ce mai bun în a distinge datele reale de cele false. | ||
| + | |||
| + | ==== Concepte Cheie ==== | ||
| + | === Spațiul Latent (Latent Space) === | ||
| + | **Spațiul latent** este spațiul vectorilor aleatorii de intrare pentru Generator. Fiecare punct din spațiul latent va produce un teren diferit. Dacă folim vectori latenți apropiați, vom obține terenuri similare, iar dacă folosim vectori latenți îndepărtați, terenurile generate vor fi foarte diferite. | ||
| + | |||
| + | <code> | ||
| + | # Două vectori latenți diferiți | ||
| + | noise1 = torch.randn(1, 100) # Vector aleator 1 | ||
| + | noise2 = torch.randn(1, 100) # Vector aleator 2 | ||
| + | |||
| + | # Vor produce terenuri diferite | ||
| + | terrain1 = generator(noise1) | ||
| + | terrain2 = generator(noise2) | ||
| + | </code> | ||
| + | |||
| + | === Seed-uri pentru Reproducibilitate === | ||
| + | Un **seed** este un număr care inițializează generatorul de numere aleatorii. Pentru a obține vectori latenți aleatori diferiți, este necesar să setăm seed-uri diferite. | ||
| + | |||
| + | <code> | ||
| + | def generate_terrain_with_seed(generator, seed): | ||
| + | generator.eval() # Mod de evaluare | ||
| + | | ||
| + | with torch.no_grad(): # Nu calculăm gradienți | ||
| + | # Setăm seed-ul | ||
| + | torch.manual_seed(seed) | ||
| + | | ||
| + | # Generăm zgomot | ||
| + | noise = torch.randn(1, 100) | ||
| + | | ||
| + | # Generăm terenul | ||
| + | terrain = generator(noise) | ||
| + | | ||
| + | return terrain[0] | ||
| + | </code> | ||
| + | |||
| + | |||
| + | === Interpolare în Spațiul Latent === | ||
| + | Prin **interpolarea** putem crea o tranziție graduală între doi vectori latenți. | ||
| + | |||
| + | <code> | ||
| + | def interpolate_latent_vectors(generator, noise_start, noise_end, steps=10): | ||
| + | generator.eval() | ||
| + | | ||
| + | with torch.no_grad(): | ||
| + | for i in range(steps): | ||
| + | # Calculăm alpha (0 → 1) | ||
| + | alpha = i / (steps - 1) | ||
| + | | ||
| + | # Interpolare liniară | ||
| + | noise_interpolated = (1 - alpha) * noise_start + alpha * noise_end | ||
| + | | ||
| + | # Generăm terenul | ||
| + | terrain = generator(noise_interpolated) | ||
| + | </code> | ||
| + | |||
| ==== Layers ==== | ==== Layers ==== | ||
| Line 31: | Line 86: | ||
| * **Fully Connected (Linear) Layers:** Datele de input sunt trecute prin mai multe straturi complet conectate (adesea straturi **nn.Linear()** în PyTorch). Aceste straturi învață să mapeze inputul aleator la reprezentări de dimensiuni mai mari. Fiecare strat complet conectat efectuează o transformare liniară (o multiplicare a matricei) urmată de o funcție de activare neliniară. | * **Fully Connected (Linear) Layers:** Datele de input sunt trecute prin mai multe straturi complet conectate (adesea straturi **nn.Linear()** în PyTorch). Aceste straturi învață să mapeze inputul aleator la reprezentări de dimensiuni mai mari. Fiecare strat complet conectat efectuează o transformare liniară (o multiplicare a matricei) urmată de o funcție de activare neliniară. | ||
| * **Funcțiile de Activare:** Funcțiile des folosite de activare sunt **ReLU (Rectified Linear Unit)**, **LeakyReLU** sau **Tanh**. Acestea introduc neliniaritatea modelului, permițându-i să învețe modele complexe. | * **Funcțiile de Activare:** Funcțiile des folosite de activare sunt **ReLU (Rectified Linear Unit)**, **LeakyReLU** sau **Tanh**. Acestea introduc neliniaritatea modelului, permițându-i să învețe modele complexe. | ||
| - | * **ReLU** este utilizat pe scară largă în straturile intermediare ale generatorului, deoarece ajută rețeaua să învețe mai repede și să evite problema gradientului care dispare. | + | * **ReLU** este utilizat pe scară largă în straturile intermediare ale generatorului, deoarece ajută rețeaua să învețe mai repede și să evite problema gradientului care dispare prin introducerea de neliniaritate. |
| * **Tanh** (de obicei în stratul de ieșire) este adesea folosit pentru a scala ieșirea la un interval între -1 și 1, făcându-l potrivit pentru generarea de pixeli de imagine sau alte date continue. | * **Tanh** (de obicei în stratul de ieșire) este adesea folosit pentru a scala ieșirea la un interval între -1 și 1, făcându-l potrivit pentru generarea de pixeli de imagine sau alte date continue. | ||
| * **Output Layer:** Remodelează rezultatul pentru a se potrivi cu forma dorită (de exemplu, o imagine de 64x64). | * **Output Layer:** Remodelează rezultatul pentru a se potrivi cu forma dorită (de exemplu, o imagine de 64x64). | ||
| Line 44: | Line 99: | ||
| * Stratul de ieșire utilizează de obicei funcția **Sigmoid** (sau uneori **Softmax**) pentru a genera o probabilitate între 0 și 1. Această probabilitate reprezintă probabilitatea ca intrarea să fie reală (aproape de 1) sau falsă (aproape de 0). | * Stratul de ieșire utilizează de obicei funcția **Sigmoid** (sau uneori **Softmax**) pentru a genera o probabilitate între 0 și 1. Această probabilitate reprezintă probabilitatea ca intrarea să fie reală (aproape de 1) sau falsă (aproape de 0). | ||
| - | ==== Implementarea unui GAN în PyTorch ==== | + | ==== Implementarea unui Generator GAN în PyTorch ==== |
| <code> | <code> | ||
| class Generator(nn.Module): | class Generator(nn.Module): | ||
| Line 66: | Line 121: | ||
| ==== Tasks ==== | ==== Tasks ==== | ||
| - | - Generați o hartă aleatoare de teren folosind o rețea Generator. | + | - Generați 5 hărți aleatorii de teren folosind o rețea Generator: |
| - | - **Bonus.** Antrenați un GAN pentru generare de teren. | + | * Inițializați un Generator |
| + | * Generați 5 terenuri diferite folosind vectori latenți aleatorii | ||
| + | * Vizualizați cele 5 terenuri într-o grilă | ||
| + | * Salvați imaginea rezultată | ||
| + | - **Bonus.** Interpolați doi vectori latenți: | ||
| + | * Generați doi vectori latenți aleatorii (A și B) | ||
| + | * Interpolați între ei în 10 pași | ||
| + | * Vizualizați tranziția de la A la B | ||
| + | * Salvați imaginea rezultată | ||