Yash Nagraj commited on
Commit
ef356ee
·
1 Parent(s): 501b204

Add the components

Browse files
Files changed (2) hide show
  1. BIG_GAN.ipynb +0 -0
  2. Components.ipynb +345 -0
BIG_GAN.ipynb ADDED
File without changes
Components.ipynb ADDED
@@ -0,0 +1,345 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "### In this notebook we will progressively make our GAN bigger and this notebook is to get all the important compoenents of GAN ready"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "code",
12
+ "execution_count": 27,
13
+ "metadata": {},
14
+ "outputs": [],
15
+ "source": [
16
+ "import torch \n",
17
+ "import torch.nn as nn\n",
18
+ "import torch.nn.functional as F\n",
19
+ "import matplotlib.pyplot as plt\n",
20
+ "from torchvision.utils import make_grid\n",
21
+ "import numpy as np\n",
22
+ "\n",
23
+ "def show_tensor_images(image_tensor, num_images=16, size=(3, 64, 64), nrow=3):\n",
24
+ " image_tensor = (image_tensor + 1) / 2\n",
25
+ " image_unflat = image_tensor.detach().cpu().clamp_(0, 1)\n",
26
+ " image_grid = make_grid(image_unflat[:num_images], nrow=nrow, padding=0)\n",
27
+ " plt.imshow(image_grid.permute(1, 2, 0).squeeze())\n",
28
+ " plt.axis('off')\n",
29
+ " plt.show()"
30
+ ]
31
+ },
32
+ {
33
+ "cell_type": "markdown",
34
+ "metadata": {},
35
+ "source": [
36
+ "## First Compoenent: Truncation Trick "
37
+ ]
38
+ },
39
+ {
40
+ "cell_type": "code",
41
+ "execution_count": 28,
42
+ "metadata": {},
43
+ "outputs": [
44
+ {
45
+ "name": "stdout",
46
+ "output_type": "stream",
47
+ "text": [
48
+ "tensor([[-0.2315, 0.0048, -0.2320, -0.3880, 0.2526],\n",
49
+ " [-0.5487, 0.1226, -0.1517, 0.2025, -0.2520],\n",
50
+ " [ 0.4763, 0.3456, -0.0343, -0.4841, -0.1099],\n",
51
+ " [-0.4019, 0.2144, -0.0699, 0.3820, 0.6575],\n",
52
+ " [ 0.1799, 0.1322, -0.0643, -0.2355, 0.2239],\n",
53
+ " [-0.2393, 0.3488, 0.5433, 0.1308, -0.6126],\n",
54
+ " [ 0.3897, -0.4254, 0.1158, -0.4022, 0.3057],\n",
55
+ " [-0.2150, -0.2679, 0.5940, -0.1898, 0.6011],\n",
56
+ " [ 0.6472, 0.5487, -0.4950, 0.1833, 0.0635],\n",
57
+ " [ 0.3793, -0.3444, 0.6242, 0.2853, -0.6278]])\n"
58
+ ]
59
+ }
60
+ ],
61
+ "source": [
62
+ "from scipy.stats import truncnorm\n",
63
+ "\n",
64
+ "def get_truncated_noise(n_samples, z_dim, truncation):\n",
65
+ " truncated_noise = truncnorm.rvs(-truncation, truncation, size=(n_samples, z_dim))\n",
66
+ " return torch.Tensor(truncated_noise)\n",
67
+ "\n",
68
+ "noise = get_truncated_noise(10,5,0.7)\n",
69
+ "print(noise)"
70
+ ]
71
+ },
72
+ {
73
+ "cell_type": "markdown",
74
+ "metadata": {},
75
+ "source": [
76
+ "## Mapping Z -> w"
77
+ ]
78
+ },
79
+ {
80
+ "cell_type": "code",
81
+ "execution_count": 29,
82
+ "metadata": {},
83
+ "outputs": [],
84
+ "source": [
85
+ "class MappingLayers(nn.Module):\n",
86
+ " def __init__(self, z_dim, hidden_dim, w_dim) -> None:\n",
87
+ " super().__init__()\n",
88
+ " self.mapping = nn.Sequential(\n",
89
+ " nn.Linear(z_dim,hidden_dim),\n",
90
+ " nn.ReLU(),\n",
91
+ " nn.Linear(hidden_dim, hidden_dim),\n",
92
+ " nn.ReLU(),\n",
93
+ " nn.Linear(hidden_dim, hidden_dim),\n",
94
+ " nn.ReLU(),\n",
95
+ " nn.Linear(hidden_dim, hidden_dim),\n",
96
+ " nn.ReLU(),\n",
97
+ " nn.Linear(hidden_dim, hidden_dim),\n",
98
+ " nn.ReLU(),\n",
99
+ " nn.Linear(hidden_dim, hidden_dim),\n",
100
+ " nn.ReLU(),\n",
101
+ " nn.Linear(hidden_dim, hidden_dim),\n",
102
+ " nn.ReLU(),\n",
103
+ " nn.Linear(hidden_dim, w_dim)\n",
104
+ " )\n",
105
+ "\n",
106
+ " def forward(self, noise):\n",
107
+ " return self.mapping(noise)\n",
108
+ " \n",
109
+ " def get_mapping(self):\n",
110
+ " return self.mapping\n"
111
+ ]
112
+ },
113
+ {
114
+ "cell_type": "markdown",
115
+ "metadata": {},
116
+ "source": [
117
+ "## Random Noise Injection"
118
+ ]
119
+ },
120
+ {
121
+ "cell_type": "code",
122
+ "execution_count": 30,
123
+ "metadata": {},
124
+ "outputs": [],
125
+ "source": [
126
+ "class InjectNoise(nn.Module):\n",
127
+ " def __init__(self, channels) :\n",
128
+ " super().__init__()\n",
129
+ " self.weight = nn.Parameter(\n",
130
+ " torch.randn((1,channels,1,1))\n",
131
+ " )\n",
132
+ " \n",
133
+ " def forward(self, image):\n",
134
+ " noise_shape = (image.shape[0], 1, image.shape[2], image.shape[3])\n",
135
+ " noise = torch.randn(noise_shape, device=image.device)\n",
136
+ " return image + self.weight * noise\n",
137
+ " "
138
+ ]
139
+ },
140
+ {
141
+ "cell_type": "code",
142
+ "execution_count": 31,
143
+ "metadata": {},
144
+ "outputs": [
145
+ {
146
+ "name": "stdout",
147
+ "output_type": "stream",
148
+ "text": [
149
+ "torch.Size([1, 3000, 1, 1])\n",
150
+ "\n"
151
+ ]
152
+ }
153
+ ],
154
+ "source": [
155
+ "test_noise_channels = 3000\n",
156
+ "test_noise_samples = 20\n",
157
+ "fake_images = torch.randn(test_noise_samples, test_noise_channels, 10, 10)\n",
158
+ "inject_noise = InjectNoise(test_noise_channels)\n",
159
+ "print(inject_noise.weight.shape)\n",
160
+ "print()"
161
+ ]
162
+ },
163
+ {
164
+ "cell_type": "markdown",
165
+ "metadata": {},
166
+ "source": [
167
+ "## Adaptive Instance Normalization (AdaIN)"
168
+ ]
169
+ },
170
+ {
171
+ "cell_type": "code",
172
+ "execution_count": 32,
173
+ "metadata": {},
174
+ "outputs": [],
175
+ "source": [
176
+ "class AdaIN(nn.Module):\n",
177
+ " def __init__(self,channels, w_dim) -> None:\n",
178
+ " super().__init__()\n",
179
+ " self.instance_norm = nn.InstanceNorm2d(channels)\n",
180
+ "\n",
181
+ " self.style_scale_transform = nn.Linear(w_dim, channels)\n",
182
+ " self.style_shift_transform = nn.Linear(w_dim, channels)\n",
183
+ "\n",
184
+ " def forward(self, image, w):\n",
185
+ " normalized_image = self.instance_norm(image)\n",
186
+ " style_scale = self.style_scale_transform(w)[:,:,None,None]\n",
187
+ " style_shift = self.style_shift_transform(w)[:,:,None,None]\n",
188
+ " transformed_image = style_scale * normalized_image + style_shift\n",
189
+ " return transformed_image"
190
+ ]
191
+ },
192
+ {
193
+ "cell_type": "markdown",
194
+ "metadata": {},
195
+ "source": [
196
+ "## Progressive Growing "
197
+ ]
198
+ },
199
+ {
200
+ "cell_type": "code",
201
+ "execution_count": 33,
202
+ "metadata": {},
203
+ "outputs": [],
204
+ "source": [
205
+ "class MicroStylGANGeneratorBlock(nn.Module):\n",
206
+ " def __init__(self, in_chan, out_chan, kernel_size, starting_size, w_dim, use_upsample=True) -> None:\n",
207
+ " super().__init__()\n",
208
+ " self.use_upsample = use_upsample\n",
209
+ " if self.use_upsample:\n",
210
+ " self.upsample = nn.Upsample((starting_size), mode='bilinear')\n",
211
+ " self.conv = nn.Conv2d(in_chan, out_chan, kernel_size, padding=1)\n",
212
+ " self.inject_noise = InjectNoise(out_chan)\n",
213
+ " self.AdaIN= AdaIN(out_chan, w_dim)\n",
214
+ " self.activation = nn.LeakyReLU(0.2)\n",
215
+ "\n",
216
+ " def forward(self, x, w):\n",
217
+ " if self.use_upsample:\n",
218
+ " x = self.upsample(x)\n",
219
+ " x = self.conv(x)\n",
220
+ " x = self.inject_noise(x)\n",
221
+ " x = self.AdaIN(x,w)\n",
222
+ " x = self.activation(x)\n",
223
+ " return x\n",
224
+ " "
225
+ ]
226
+ },
227
+ {
228
+ "cell_type": "code",
229
+ "execution_count": 34,
230
+ "metadata": {},
231
+ "outputs": [],
232
+ "source": [
233
+ "class MicroStyleGANGenerator(nn.Module):\n",
234
+ " def __init__(self, z_dim, map_hidden_dim, w_dim, in_chan, out_chan, kernel_size, hidden_chan) -> None:\n",
235
+ " super().__init__()\n",
236
+ " self.map = MappingLayers(z_dim, map_hidden_dim, w_dim)\n",
237
+ " self.starting_constant = nn.Parameter(torch.randn(1,in_chan, 4,4))\n",
238
+ " self.block0 = MicroStylGANGeneratorBlock(in_chan, hidden_chan, kernel_size, 4, w_dim=w_dim, use_upsample=False)\n",
239
+ " self.block1 = MicroStylGANGeneratorBlock(hidden_chan, hidden_chan, kernel_size, w_dim=w_dim, starting_size=8)\n",
240
+ " self.block2 = MicroStylGANGeneratorBlock(hidden_chan, hidden_chan, kernel_size, w_dim=w_dim, starting_size=16)\n",
241
+ "\n",
242
+ " self.block1_to_image = nn.Conv2d(hidden_chan, out_chan, kernel_size=1)\n",
243
+ " self.block2_to_image = nn.Conv2d(hidden_chan, out_chan, kernel_size=1)\n",
244
+ " self.alpha = 0.2\n",
245
+ "\n",
246
+ " def upsample_to_match_size(self, smaller_image, bigger_image):\n",
247
+ " return F.interpolate(smaller_image, size=bigger_image.shape[-2:], mode='bilinear')\n",
248
+ " \n",
249
+ " def forward(self, noise, return_intermediate=False):\n",
250
+ " x = self.starting_constant\n",
251
+ " w = self.map(noise)\n",
252
+ " x = self.block0(x,w)\n",
253
+ " x_small = self.block1(x, w)\n",
254
+ " x_small_image = self.block1_to_image(x_small)\n",
255
+ " x_big = self.block2(x_small, w)\n",
256
+ " x_big_image = self.block2_to_image(x_big)\n",
257
+ " x_small_upsample = self.upsample_to_match_size(x_small_image, x_big_image)\n",
258
+ "\n",
259
+ " interpolation = torch.lerp(x_small_upsample, x_big_image, self.alpha)\n",
260
+ "\n",
261
+ " if return_intermediate:\n",
262
+ " return interpolation , x_small_upsample, x_big_image\n",
263
+ " return interpolation\n",
264
+ " "
265
+ ]
266
+ },
267
+ {
268
+ "cell_type": "code",
269
+ "execution_count": 39,
270
+ "metadata": {},
271
+ "outputs": [
272
+ {
273
+ "data": {
274
+ "image/png": "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",
275
+ "text/plain": [
276
+ "<Figure size 1500x1500 with 1 Axes>"
277
+ ]
278
+ },
279
+ "metadata": {},
280
+ "output_type": "display_data"
281
+ }
282
+ ],
283
+ "source": [
284
+ "z_dim = 128\n",
285
+ "out_chan = 3\n",
286
+ "truncation = 0.7\n",
287
+ "\n",
288
+ "mu_stylegan = MicroStyleGANGenerator(\n",
289
+ " z_dim=z_dim, \n",
290
+ " map_hidden_dim=1024,\n",
291
+ " w_dim=496,\n",
292
+ " in_chan=512,\n",
293
+ " out_chan=out_chan, \n",
294
+ " kernel_size=3, \n",
295
+ " hidden_chan=256\n",
296
+ ")\n",
297
+ "\n",
298
+ "plt.rcParams['figure.figsize'] = [15, 15]\n",
299
+ "viz_samples = 10\n",
300
+ "# The noise is exaggerated for visual effect\n",
301
+ "viz_noise = get_truncated_noise(viz_samples, z_dim, truncation) * 100\n",
302
+ "\n",
303
+ "mu_stylegan.eval()\n",
304
+ "images = []\n",
305
+ "for alpha in np.linspace(0, 1, num=5):\n",
306
+ " mu_stylegan.alpha = alpha\n",
307
+ " viz_result, _, _ = mu_stylegan(\n",
308
+ " viz_noise, \n",
309
+ " return_intermediate=True)\n",
310
+ " images += [tensor for tensor in viz_result]\n",
311
+ "\n",
312
+ "show_tensor_images(torch.stack(images), nrow=viz_samples, num_images=len(images))\n",
313
+ "mu_stylegan = mu_stylegan.train()"
314
+ ]
315
+ },
316
+ {
317
+ "cell_type": "code",
318
+ "execution_count": null,
319
+ "metadata": {},
320
+ "outputs": [],
321
+ "source": []
322
+ }
323
+ ],
324
+ "metadata": {
325
+ "kernelspec": {
326
+ "display_name": "Python 3",
327
+ "language": "python",
328
+ "name": "python3"
329
+ },
330
+ "language_info": {
331
+ "codemirror_mode": {
332
+ "name": "ipython",
333
+ "version": 3
334
+ },
335
+ "file_extension": ".py",
336
+ "mimetype": "text/x-python",
337
+ "name": "python",
338
+ "nbconvert_exporter": "python",
339
+ "pygments_lexer": "ipython3",
340
+ "version": "3.12.3"
341
+ }
342
+ },
343
+ "nbformat": 4,
344
+ "nbformat_minor": 2
345
+ }