This shows you the differences between two versions of the page.
|
gp:laboratoare:07 [2026/03/30 09:28] maria_anca.balutoiu [Concepte Cheie] |
gp:laboratoare:07 [2026/03/30 09:38] (current) maria_anca.balutoiu [Tasks] |
||
|---|---|---|---|
| Line 121: | 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ă | ||
| - | <hidden> | ||
| - | |||
| - | ==== Implementare ==== | ||
| - | |||
| - | === Generarea unui Teren Aleatoriu === | ||
| - | |||
| - | |||
| - | === Interpolarea între Terenuri === | ||
| - | |||
| - | |||
| - | |||
| - | **Exemplu vizual al interpolării:** | ||
| - | <code> | ||
| - | Pas 1: 100% Start + 0% End → Terenul A | ||
| - | Pas 2: 87.5% Start + 12.5% End → Aproape de A | ||
| - | Pas 3: 75% Start + 25% End → Mai aproape de mijloc | ||
| - | ... | ||
| - | Pas 8: 25% Start + 75% End → Aproape de B | ||
| - | Pas 9: 12.5% Start + 87.5% End → Foarte aproape de B | ||
| - | Pas 10: 0% Start + 100% End → Terenul B | ||
| - | </code> | ||
| - | |||
| - | === Vizualizare === | ||
| - | |||
| - | <code python> | ||
| - | import matplotlib.pyplot as plt | ||
| - | |||
| - | def visualize_terrains(terrains, titles=None): | ||
| - | fig, axes = plt.subplots(1, len(terrains), figsize=(15, 5)) | ||
| - | | ||
| - | for idx, terrain in enumerate(terrains): | ||
| - | # Convertim la numpy | ||
| - | terrain_np = terrain.cpu().numpy() | ||
| - | | ||
| - | # Plotăm cu colormap 'terrain' | ||
| - | axes[idx].imshow(terrain_np, cmap='terrain', vmin=-1, vmax=1) | ||
| - | axes[idx].axis('off') | ||
| - | | ||
| - | if titles: | ||
| - | axes[idx].set_title(titles[idx]) | ||
| - | | ||
| - | plt.colorbar(label='Altitudine') | ||
| - | plt.show() | ||
| - | </code> | ||
| - | |||
| - | **Colormap 'terrain'**: Palet de culori special pentru reprezentarea terenurilor: | ||
| - | * Albastru închis → ape adânci (valori foarte negative) | ||
| - | * Albastru deschis → ape puțin adânci | ||
| - | * Verde → câmpii, păduri (valori aproape de 0) | ||
| - | * Maro → dealuri (valori pozitive mici) | ||
| - | * Gri/Alb → munți înalți (valori foarte pozitive) | ||
| - | |||
| - | ==== Tasks ==== | ||
| - | |||
| - | === Task Obligatoriu === | ||
| - | |||
| - | **Generați 5 hărți aleatorii de teren folosind o rețea Generator.** | ||
| - | |||
| - | **Cerințe:** | ||
| - | - 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ă | ||
| - | |||
| - | **Cod de pornire:** | ||
| - | <code python> | ||
| - | # Inițializare | ||
| - | generator = Generator(latent_dim=100, terrain_size=64) | ||
| - | |||
| - | # Generare | ||
| - | terrains = generate_random_terrain(generator, num_samples=5) | ||
| - | |||
| - | # Vizualizare | ||
| - | titles = [f"Teren #{i+1}" for i in range(5)] | ||
| - | visualize_terrains(terrains, titles=titles) | ||
| - | </code> | ||
| - | |||
| - | **Ce să observați:** | ||
| - | * Fiecare teren este diferit (vectori latenți diferiți) | ||
| - | * Terenurile arată ca zgomot structurat (generatorul nu e antrenat) | ||
| - | * Valorile sunt în intervalul [-1, 1] datorită funcției Tanh | ||
| - | |||
| - | **Întrebări de reflecție:** | ||
| - | - De ce terenurile arată diferit unul de altul? | ||
| - | - Cum ar arăta terenurile dacă generatorul ar fi antrenat pe date reale? | ||
| - | - Ce rol are vectorul latent în generarea de teren? | ||
| - | |||
| - | === Task Bonus === | ||
| - | |||
| - | **Explorați spațiul latent prin interpolarea între doi vectori latenți.** | ||
| - | |||
| - | **Cerințe:** | ||
| - | - 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ă | ||
| - | |||
| - | **Cod de pornire:** | ||
| - | <code python> | ||
| - | # Generare vectori latenți | ||
| - | torch.manual_seed(42) | ||
| - | noise_start = torch.randn(1, 100) | ||
| - | |||
| - | torch.manual_seed(123) | ||
| - | noise_end = torch.randn(1, 100) | ||
| - | |||
| - | # Interpolare | ||
| - | terrains = interpolate_latent_vectors(generator, noise_start, noise_end, steps=10) | ||
| - | |||
| - | # Vizualizare | ||
| - | titles = [f"Pas {i+1}/10" for i in range(10)] | ||
| - | visualize_terrains(terrains, titles=titles) | ||
| - | </code> | ||
| - | |||
| - | **Ce să observați:** | ||
| - | * Primul teren (Pas 1) corespunde vectorului de start | ||
| - | * Ultimul teren (Pas 10) corespunde vectorului de final | ||
| - | * Terenurile intermediare sunt combinații ale celor doi vectori | ||
| - | * Tranziția este graduală și continuă (nu sunt salturi bruște) | ||
| - | |||
| - | **Întrebări de reflecție:** | ||
| - | - Cum ați putea folosi interpolarea în game development? | ||
| - | - Ce se întâmplă dacă folosiți mai mulți pași de interpolare (ex: 50)? | ||
| - | - De ce e importantă continuitatea în spațiul latent? | ||
| - | |||
| - | **Aplicații practice:** | ||
| - | * **Biome transitions**: Tranziție smoothă de la deșert la pădure | ||
| - | * **Level variations**: Generarea de variații ale aceluiași level | ||
| - | * **Artistic control**: Designer-ul ajustează terenul prin deplasarea în spațiul latent | ||
| - | |||
| - | === Demonstrație Extra (Opțional) === | ||
| - | |||
| - | **Reproducibilitatea cu seed-uri** | ||
| - | |||
| - | Demonstrați că același seed produce întotdeauna același teren: | ||
| - | |||
| - | <code python> | ||
| - | # Generăm același teren de 3 ori | ||
| - | terrain1 = generate_terrain_with_seed(generator, seed=42) | ||
| - | terrain2 = generate_terrain_with_seed(generator, seed=42) | ||
| - | terrain3 = generate_terrain_with_seed(generator, seed=42) | ||
| - | |||
| - | # Generăm un teren diferit | ||
| - | terrain4 = generate_terrain_with_seed(generator, seed=999) | ||
| - | |||
| - | # Vizualizare | ||
| - | terrains = [terrain1, terrain2, terrain3, terrain4] | ||
| - | titles = ["Seed 42 (run 1)", "Seed 42 (run 2)", "Seed 42 (run 3)", "Seed 999"] | ||
| - | visualize_terrains(terrains, titles=titles) | ||
| - | </code> | ||
| - | |||
| - | **Observații:** | ||
| - | * Primele 3 terenuri sunt **IDENTICE** | ||
| - | * Al 4-lea teren este **DIFERIT** | ||
| - | |||
| - | ==== Întrebări de Reflecție Generale ==== | ||
| - | |||
| - | - **Î1:** Care este rolul vectorului latent în generarea procedurală? | ||
| - | - **Î2:** De ce folosim funcția Tanh la sfârșitul Generatorului? | ||
| - | - **Î3:** Cum ar putea fi folosită interpolarea în spațiul latent pentru a crea tranziții între biome-uri într-un joc? | ||
| - | - **Î4:** Ce avantaje oferă generarea bazată pe seed-uri în game development? | ||
| - | - **Î5:** Dacă generatorul ar fi antrenat pe un dataset de munți reali, ce ați aștepta să genereze? | ||
| - | |||
| - | ==== Notițe Tehnice ==== | ||
| - | |||
| - | === Dimensiuni și Parametri === | ||
| - | |||
| - | ^ Parametru ^ Valoare ^ Semnificație ^ | ||
| - | | **latent_dim** | 100 | Dimensiunea vectorului de zgomot (tipic: 64-256) | | ||
| - | | **terrain_size** | 64 | Rezoluția terenului generat (64×64 pixeli) | | ||
| - | | **hidden layers** | 256, 512, 1024 | Dimensiunile straturilor ascunse | | ||
| - | | **output range** | [-1, 1] | Intervalul valorilor de ieșire (datorită Tanh) | | ||
| - | |||
| - | === Funcții de Activare === | ||
| - | |||
| - | **ReLU (Rectified Linear Unit):** | ||
| - | * Formula: f(x) = max(0, x) | ||
| - | * Introduce neliniaritate în rețea | ||
| - | * Permite învățarea de pattern-uri complexe | ||
| - | * Rapid de calculat | ||
| - | |||
| - | **Tanh (Tangentă Hiperbolică):** | ||
| - | * Formula: f(x) = (e^x - e^(-x)) / (e^x + e^(-x)) | ||
| - | * Output în intervalul [-1, 1] | ||
| - | * Folosit la stratul final | ||
| - | * Perfect pentru reprezentarea altitudinii normalizate | ||
| - | |||
| - | === De ce Generatorul Neantrenant Produce Zgomot? === | ||
| - | |||
| - | Un Generator **neantrenant** (cu greutăți aleatorii inițiale) produce zgomot structurat pentru că: | ||
| - | - Nu a învățat pattern-urile din date reale | ||
| - | - Greutățile sunt aleatorii → transformări aleatorii | ||
| - | - Structura rețelei impune o formă de bază (64×64), dar conținutul e aleatoriu | ||
| - | |||
| - | **Pentru terenuri realiste**, generatorul ar trebui: | ||
| - | - Antrenat pe un dataset de terenuri reale | ||
| - | - Învățat în tandem cu un Discriminator | ||
| - | - Antrenat pentru mii de iterații | ||
| - | |||
| - | **În acest laborator**, scopul este să înțelegeți: | ||
| - | - Cum funcționează un Generator | ||
| - | - Cum spațiul latent controlează output-ul | ||
| - | - Conceptul de interpolare | ||
| - | - Reproducibilitatea cu seed-uri | ||
| - | |||
| - | ==== Resurse Suplimentare ==== | ||
| - | |||
| - | === Cod Complet === | ||
| - | |||
| - | Codul complet pentru laborator se găsește în fișierul: | ||
| - | * **gan_terrain_simple.py** - implementarea completă cu toate funcțiile | ||
| - | |||
| - | === Rulare === | ||
| - | |||
| - | <code bash> | ||
| - | # Rulează tot laboratorul (task obligatoriu + bonus + demo) | ||
| - | python gan_terrain_simple.py | ||
| - | |||
| - | # Sau importă funcțiile individual | ||
| - | python | ||
| - | >>> from gan_terrain_simple import Generator, generate_random_terrain | ||
| - | >>> generator = Generator() | ||
| - | >>> terrains = generate_random_terrain(generator, num_samples=3) | ||
| - | </code> | ||
| - | |||
| - | === Dependințe Necesare === | ||
| - | |||
| - | <code bash> | ||
| - | pip install torch torchvision matplotlib numpy | ||
| - | </code> | ||
| - | |||
| - | === Extensii Posibile === | ||
| - | |||
| - | Dacă vreți să mergeți mai departe: | ||
| - | * **Antrenarea efectivă a unui GAN** pe terenuri reale (Lab 08?) | ||
| - | * **3D Terrain Generation**: Generare de terenuri tridimensionale | ||
| - | * **Conditional GAN**: Control asupra tipului de teren generat (muntos/plat/ondulat) | ||
| - | * **Higher Resolution**: Generare de terenuri 128×128 sau 256×256 | ||
| - | * **Export pentru Unity/Unreal**: Integrare în engine-uri de jocuri | ||
| - | |||
| - | ==== Referințe ==== | ||
| - | |||
| - | * **Goodfellow et al. (2014)** - "Generative Adversarial Networks" (paper-ul original GAN) | ||
| - | * **PyTorch Documentation** - https://pytorch.org/docs/stable/index.html | ||
| - | * **Procedural Generation Wiki** - https://pcg.fandom.com/wiki/Procedural_Generation_Wiki | ||
| - | </hidden> | ||