Skip to content

Commit 0ba9a58

Browse files
committed
Correct ambiguous marks
1 parent ce6f2c6 commit 0ba9a58

1 file changed

Lines changed: 36 additions & 36 deletions

File tree

18_Autoencoders/index.ipynb

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@
119119
},
120120
{
121121
"cell_type": "code",
122-
"execution_count": 3,
122+
"execution_count": null,
123123
"id": "9638499c",
124124
"metadata": {},
125125
"outputs": [
@@ -151,21 +151,21 @@
151151
" \"\"\"Convolutional Denoising Autoencoder\"\"\"\n",
152152
" def __init__(self):\n",
153153
" super().__init__()\n",
154-
" # Encoder: 28×2814×147×7\n",
154+
" # Encoder: 28x2814x147x7\n",
155155
" self.encoder = nn.Sequential(\n",
156-
" nn.Conv2d(1, 16, 3, stride=2, padding=1), # → 14×14×16\n",
156+
" nn.Conv2d(1, 16, 3, stride=2, padding=1), # → 14x14x16\n",
157157
" nn.ReLU(),\n",
158-
" nn.Conv2d(16, 32, 3, stride=2, padding=1), # → 7×7×32\n",
158+
" nn.Conv2d(16, 32, 3, stride=2, padding=1), # → 7x7x32\n",
159159
" nn.ReLU(),\n",
160160
" )\n",
161-
" # Decoder: 7×714×1428×28\n",
161+
" # Decoder: 7x714x1428x28\n",
162162
" self.decoder = nn.Sequential(\n",
163-
" nn.ConvTranspose2d(32, 16, 4, stride=2, padding=1), # → 14×14×16\n",
163+
" nn.ConvTranspose2d(32, 16, 4, stride=2, padding=1), # → 14x14x16\n",
164164
" nn.ReLU(),\n",
165-
" nn.ConvTranspose2d(16, 1, 4, stride=2, padding=1), # → 28×28×1\n",
165+
" nn.ConvTranspose2d(16, 1, 4, stride=2, padding=1), # → 28x28x1\n",
166166
" nn.Sigmoid() # Output in [0, 1]\n",
167167
" )\n",
168-
" \n",
168+
"\n",
169169
" def forward(self, x):\n",
170170
" z = self.encoder(x)\n",
171171
" x_recon = self.decoder(z)\n",
@@ -250,7 +250,7 @@
250250
" x_clean = x_clean.to(device)\n",
251251
" x_noisy = add_noise(x_clean, sigma)\n",
252252
" x_recon = model(x_noisy)\n",
253-
" \n",
253+
"\n",
254254
" n = 8\n",
255255
" fig, axes = plt.subplots(3, n, figsize=(1.5*n, 4.5))\n",
256256
" for i in range(n):\n",
@@ -260,7 +260,7 @@
260260
" axes[1, i].axis('off')\n",
261261
" axes[2, i].imshow(x_recon[i, 0].cpu(), cmap='gray')\n",
262262
" axes[2, i].axis('off')\n",
263-
" \n",
263+
"\n",
264264
" axes[0, 0].set_ylabel('Clean', fontsize=12)\n",
265265
" axes[1, 0].set_ylabel('Noisy', fontsize=12)\n",
266266
" axes[2, 0].set_ylabel('Reconstructed', fontsize=12)\n",
@@ -353,21 +353,21 @@
353353
" except StopIteration:\n",
354354
" train_iter = iter(train_loader)\n",
355355
" x_clean, _ = next(train_iter)\n",
356-
" \n",
356+
"\n",
357357
" x_clean = x_clean.to(device)\n",
358358
" x_noisy = add_noise(x_clean, sigma=noise_sigma)\n",
359-
" \n",
359+
"\n",
360360
" # Forward pass\n",
361361
" x_recon = dae(x_noisy)\n",
362362
" loss = F.mse_loss(x_recon, x_clean)\n",
363-
" \n",
363+
"\n",
364364
" # Backward pass\n",
365365
" optimizer_dae.zero_grad()\n",
366366
" loss.backward()\n",
367367
" optimizer_dae.step()\n",
368-
" \n",
368+
"\n",
369369
" losses.append(loss.item())\n",
370-
" \n",
370+
"\n",
371371
" if step % 200 == 0:\n",
372372
" print(f\"Step {step}/{num_steps} | Loss: {loss.item():.4f}\")\n",
373373
"\n",
@@ -554,36 +554,36 @@
554554
" def __init__(self, latent_dim=8):\n",
555555
" super().__init__()\n",
556556
" self.latent_dim = latent_dim\n",
557-
" \n",
557+
"\n",
558558
" # Encoder\n",
559559
" self.fc1 = nn.Linear(28*28, 256)\n",
560560
" self.fc_mu = nn.Linear(256, latent_dim)\n",
561561
" self.fc_logvar = nn.Linear(256, latent_dim)\n",
562-
" \n",
562+
"\n",
563563
" # Decoder\n",
564564
" self.fc2 = nn.Linear(latent_dim, 256)\n",
565565
" self.fc3 = nn.Linear(256, 28*28)\n",
566-
" \n",
566+
"\n",
567567
" def encode(self, x):\n",
568568
" \"\"\"Encode input to latent distribution parameters.\"\"\"\n",
569569
" h = F.relu(self.fc1(x))\n",
570570
" mu = self.fc_mu(h)\n",
571571
" logvar = self.fc_logvar(h)\n",
572572
" return mu, logvar\n",
573-
" \n",
573+
"\n",
574574
" def reparameterize(self, mu, logvar):\n",
575575
" \"\"\"Sample z from N(mu, sigma^2) using reparameterization trick.\"\"\"\n",
576576
" std = torch.exp(0.5 * logvar)\n",
577577
" eps = torch.randn_like(std)\n",
578578
" z = mu + eps * std\n",
579579
" return z\n",
580-
" \n",
580+
"\n",
581581
" def decode(self, z):\n",
582582
" \"\"\"Decode latent code to reconstruction.\"\"\"\n",
583583
" h = F.relu(self.fc2(z))\n",
584584
" x_recon = torch.sigmoid(self.fc3(h))\n",
585585
" return x_recon\n",
586-
" \n",
586+
"\n",
587587
" def forward(self, x):\n",
588588
" mu, logvar = self.encode(x)\n",
589589
" z = self.reparameterize(mu, logvar)\n",
@@ -634,16 +634,16 @@
634634
"def vae_loss(x_recon, x, mu, logvar, beta=1.0):\n",
635635
" \"\"\"Compute VAE loss = reconstruction + beta * KL divergence.\"\"\"\n",
636636
" batch_size = x.size(0)\n",
637-
" \n",
637+
"\n",
638638
" # Reconstruction loss (binary cross-entropy)\n",
639639
" recon_loss = F.binary_cross_entropy(x_recon, x, reduction='sum') / batch_size\n",
640-
" \n",
640+
"\n",
641641
" # KL divergence: KL(N(mu, sigma^2) || N(0, 1))\n",
642642
" # = 0.5 * sum(exp(logvar) + mu^2 - 1 - logvar)\n",
643643
" kl_loss = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp()) / batch_size\n",
644-
" \n",
644+
"\n",
645645
" total_loss = recon_loss + beta * kl_loss\n",
646-
" \n",
646+
"\n",
647647
" return total_loss, recon_loss, kl_loss"
648648
]
649649
},
@@ -668,7 +668,7 @@
668668
" model.eval()\n",
669669
" z = torch.randn(n, model.latent_dim).to(device)\n",
670670
" x_samples = model.decode(z).view(n, 1, 28, 28).cpu()\n",
671-
" \n",
671+
"\n",
672672
" fig, axes = plt.subplots(4, 4, figsize=(6, 6))\n",
673673
" for i, ax in enumerate(axes.flat):\n",
674674
" ax.imshow(x_samples[i, 0], cmap='gray')\n",
@@ -683,18 +683,18 @@
683683
" model.eval()\n",
684684
" x1 = x1.view(1, -1).to(device)\n",
685685
" x2 = x2.view(1, -1).to(device)\n",
686-
" \n",
686+
"\n",
687687
" # Encode to latent space (use mean for cleaner interpolation)\n",
688688
" mu1, _ = model.encode(x1)\n",
689689
" mu2, _ = model.encode(x2)\n",
690-
" \n",
690+
"\n",
691691
" # Linear interpolation in latent space\n",
692692
" alphas = torch.linspace(0, 1, steps)\n",
693693
" latents = [(1 - alpha) * mu1 + alpha * mu2 for alpha in alphas]\n",
694-
" \n",
694+
"\n",
695695
" # Decode interpolated latents\n",
696696
" images = [model.decode(z).view(28, 28).cpu() for z in latents]\n",
697-
" \n",
697+
"\n",
698698
" fig, axes = plt.subplots(1, steps, figsize=(1.5*steps, 2))\n",
699699
" for i, ax in enumerate(axes):\n",
700700
" ax.imshow(images[i], cmap='gray')\n",
@@ -712,7 +712,7 @@
712712
" x_flat = x.view(x.size(0), -1)\n",
713713
" x_recon, _, _ = model(x_flat)\n",
714714
" x_recon = x_recon.view(-1, 1, 28, 28)\n",
715-
" \n",
715+
"\n",
716716
" fig, axes = plt.subplots(2, n, figsize=(1.5*n, 3))\n",
717717
" for i in range(n):\n",
718718
" axes[0, i].imshow(x[i, 0].cpu(), cmap='gray')\n",
@@ -776,22 +776,22 @@
776776
" except StopIteration:\n",
777777
" train_iter = iter(train_loader)\n",
778778
" x, _ = next(train_iter)\n",
779-
" \n",
779+
"\n",
780780
" x = x.view(x.size(0), -1).to(device)\n",
781-
" \n",
781+
"\n",
782782
" # Forward pass\n",
783783
" x_recon, mu, logvar = vae(x)\n",
784784
" loss, recon, kl = vae_loss(x_recon, x, mu, logvar, beta=beta)\n",
785-
" \n",
785+
"\n",
786786
" # Backward pass\n",
787787
" optimizer_vae.zero_grad()\n",
788788
" loss.backward()\n",
789789
" optimizer_vae.step()\n",
790-
" \n",
790+
"\n",
791791
" total_losses.append(loss.item())\n",
792792
" recon_losses.append(recon.item())\n",
793793
" kl_losses.append(kl.item())\n",
794-
" \n",
794+
"\n",
795795
" if step % 200 == 0:\n",
796796
" print(f\"Step {step}/{num_steps} | Total: {loss.item():.2f} | Recon: {recon.item():.2f} | KL: {kl.item():.2f}\")\n",
797797
"\n",

0 commit comments

Comments
 (0)