mlx-examples/gan/playground.ipynb
2024-07-30 02:37:09 +03:00

554 lines
106 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Import Library"
]
},
{
"cell_type": "code",
"execution_count": 573,
"metadata": {},
"outputs": [],
"source": [
"import mnist"
]
},
{
"cell_type": "code",
"execution_count": 574,
"metadata": {},
"outputs": [],
"source": [
"import mlx.core as mx\n",
"import mlx.nn as nn\n",
"import mlx.optimizers as optim\n",
"\n",
"from tqdm import tqdm\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 575,
"metadata": {},
"outputs": [],
"source": [
"# mx.set_default_device(mx.gpu)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# GAN Architecture"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generator 👨🏻‍🎨"
]
},
{
"cell_type": "code",
"execution_count": 576,
"metadata": {},
"outputs": [],
"source": [
"def GenBlock(in_dim:int,out_dim:int):\n",
" \n",
" return nn.Sequential(\n",
" nn.Linear(in_dim,out_dim),\n",
" nn.BatchNorm(out_dim, 0.8),\n",
" nn.LeakyReLU(0.2)\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 577,
"metadata": {},
"outputs": [],
"source": [
"class Generator(nn.Module):\n",
"\n",
" def __init__(self, z_dim:int = 10, im_dim:int = 784, hidden_dim: int = 256):\n",
" super(Generator, self).__init__()\n",
" # Build the neural network\n",
" self.gen = nn.Sequential(\n",
" GenBlock(z_dim, hidden_dim),\n",
" GenBlock(hidden_dim, hidden_dim * 2),\n",
" GenBlock(hidden_dim * 2, hidden_dim * 4),\n",
" GenBlock(hidden_dim * 4, hidden_dim * 8),\n",
"\n",
"\n",
" nn.Linear(hidden_dim * 8,im_dim),\n",
" )\n",
" \n",
" def __call__(self, noise):\n",
" x = self.gen(noise)\n",
" return mx.tanh(x)"
]
},
{
"cell_type": "code",
"execution_count": 578,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Generator(\n",
" (gen): Sequential(\n",
" (layers.0): Sequential(\n",
" (layers.0): Linear(input_dims=100, output_dims=256, bias=True)\n",
" (layers.1): BatchNorm(256, eps=0.8, momentum=0.1, affine=True, track_running_stats=True)\n",
" (layers.2): LeakyReLU()\n",
" )\n",
" (layers.1): Sequential(\n",
" (layers.0): Linear(input_dims=256, output_dims=512, bias=True)\n",
" (layers.1): BatchNorm(512, eps=0.8, momentum=0.1, affine=True, track_running_stats=True)\n",
" (layers.2): LeakyReLU()\n",
" )\n",
" (layers.2): Sequential(\n",
" (layers.0): Linear(input_dims=512, output_dims=1024, bias=True)\n",
" (layers.1): BatchNorm(1024, eps=0.8, momentum=0.1, affine=True, track_running_stats=True)\n",
" (layers.2): LeakyReLU()\n",
" )\n",
" (layers.3): Sequential(\n",
" (layers.0): Linear(input_dims=1024, output_dims=2048, bias=True)\n",
" (layers.1): BatchNorm(2048, eps=0.8, momentum=0.1, affine=True, track_running_stats=True)\n",
" (layers.2): LeakyReLU()\n",
" )\n",
" (layers.4): Linear(input_dims=2048, output_dims=784, bias=True)\n",
" )\n",
")"
]
},
"execution_count": 578,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gen = Generator(100)\n",
"gen"
]
},
{
"cell_type": "code",
"execution_count": 579,
"metadata": {},
"outputs": [],
"source": [
"# make 2D noise with shape n_samples x z_dim\n",
"def get_noise(n_samples:list[int], z_dim:int)->list[int]:\n",
" return mx.random.normal(shape=(n_samples, z_dim))"
]
},
{
"cell_type": "code",
"execution_count": 580,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"img = get_noise(28,28)\n",
"plt.imshow(img, cmap='gray')\n",
"plt.axis('off')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Discriminator 🕵🏻‍♂️"
]
},
{
"cell_type": "code",
"execution_count": 581,
"metadata": {},
"outputs": [],
"source": [
"def DisBlock(in_dim:int,out_dim:int):\n",
" return nn.Sequential(\n",
" nn.Linear(in_dim,out_dim),\n",
" nn.LeakyReLU(negative_slope=0.2),\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 582,
"metadata": {},
"outputs": [],
"source": [
"class Discriminator(nn.Module):\n",
"\n",
" def __init__(self,im_dim:int = 784, hidden_dim:int = 256):\n",
" super(Discriminator, self).__init__()\n",
"\n",
" self.disc = nn.Sequential(\n",
" DisBlock(im_dim, hidden_dim * 4),\n",
" DisBlock(hidden_dim * 4, hidden_dim * 2),\n",
" DisBlock(hidden_dim * 2, hidden_dim),\n",
" \n",
" nn.Dropout(0.3),\n",
" nn.Linear(hidden_dim,1),\n",
" # nn.Sigmoid()\n",
" )\n",
" \n",
" def __call__(self, noise):\n",
" x = noise + 1.0\n",
" x = self.disc(noise)\n",
" out = mx.log(mx.softmax(x)) \n",
" return out"
]
},
{
"cell_type": "code",
"execution_count": 583,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Discriminator(\n",
" (disc): Sequential(\n",
" (layers.0): Sequential(\n",
" (layers.0): Linear(input_dims=784, output_dims=1024, bias=True)\n",
" (layers.1): LeakyReLU()\n",
" )\n",
" (layers.1): Sequential(\n",
" (layers.0): Linear(input_dims=1024, output_dims=512, bias=True)\n",
" (layers.1): LeakyReLU()\n",
" )\n",
" (layers.2): Sequential(\n",
" (layers.0): Linear(input_dims=512, output_dims=256, bias=True)\n",
" (layers.1): LeakyReLU()\n",
" )\n",
" (layers.3): Dropout(p=0.30000000000000004)\n",
" (layers.4): Linear(input_dims=256, output_dims=1, bias=True)\n",
" )\n",
")"
]
},
"execution_count": 583,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"disc = Discriminator()\n",
"disc"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model Training 🏋🏻‍♂️"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Losses"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Discriminator Loss"
]
},
{
"cell_type": "code",
"execution_count": 584,
"metadata": {},
"outputs": [],
"source": [
"def disc_loss(gen, disc, real, num_images, z_dim):\n",
" \n",
" noise = mx.array(get_noise(num_images, z_dim))\n",
" fake_images = gen(noise)\n",
" \n",
" fake_disc = disc(fake_images)\n",
" \n",
" fake_labels = mx.zeros((fake_images.shape[0],1))\n",
" \n",
" fake_loss = nn.losses.binary_cross_entropy(fake_disc,fake_labels)\n",
" \n",
" real_disc = disc(real)\n",
" real_labels = mx.ones((real.shape[0],1))\n",
"\n",
" real_loss = nn.losses.binary_cross_entropy(real_disc,real_labels)\n",
"\n",
" disc_loss = (fake_loss + real_loss) / 2\n",
"\n",
" return disc_loss"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Generator Loss"
]
},
{
"cell_type": "code",
"execution_count": 585,
"metadata": {},
"outputs": [],
"source": [
"def gen_loss(gen, disc, num_images, z_dim):\n",
"\n",
" noise = mx.array(get_noise(num_images, z_dim))\n",
" \n",
" fake_images = gen(noise)\n",
" fake_disc = disc(fake_images)\n",
"\n",
" fake_labels = mx.ones((fake_images.shape[0],1))\n",
" \n",
" gen_loss = nn.losses.binary_cross_entropy(fake_disc,fake_labels)\n",
"\n",
" return gen_loss"
]
},
{
"cell_type": "code",
"execution_count": 586,
"metadata": {},
"outputs": [],
"source": [
"# Get only the training images\n",
"train_images,*_ = map(np.array, mnist.mnist())"
]
},
{
"cell_type": "code",
"execution_count": 587,
"metadata": {},
"outputs": [],
"source": [
"# Normalize the images to fall between -1,1\n",
"train_images = train_images * 2.0 - 1.0"
]
},
{
"cell_type": "code",
"execution_count": 588,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x156eb0df0>"
]
},
"execution_count": 588,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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WqRt27Zpz549cT/6pbudD992HG4nXc+HjIhQ7969NXLkSFVVVcU9XlVVpaKiIqNV2Wtra9OXX36pcDhsvRQzhYWFCoVCcefGtWvXVFNT063PDUlqbm5WfX19lzo/nHNauHChtmzZot27d6uwsDDu+e5yPtztONxO2p4Phl8U4cknn3zievXq5f7whz+4EydOuMWLF7t+/fq5M2fOWC/tgXnttddcdXW1O336tNu/f797/vnnXSAQ6PLHoKWlxR05csQdOXLESXJr1qxxR44ccf/5z3+cc86tXLnSBYNBt2XLFnfs2DE3Z84cFw6HXTQaNV55ct3pOLS0tLjXXnvN1dbWurq6Ordnzx43btw49+ijj3ap4/CLX/zCBYNBV11d7RoaGmLb5cuXY/t0h/Phbschk86HjImQc869//77rqCgwPXu3ds99dRTcV+O2B3Mnj3bhcNh16tXL5eXl+dmzpzpjh8/br2slNuzZ4+T1GkrLS11zt34stzly5e7UCjk/H6/mzBhgjt27JjtolPgTsfh8uXLrri42A0YMMD16tXLDRo0yJWWlrqzZ89aLzupbvfnl+QqKytj+3SH8+FuxyGTzgd+lAMAwExGvCcEAOiaiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAz/wdVbyhNmNF0pQAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(train_images[0].reshape(28,28),cmap='gray')"
]
},
{
"cell_type": "code",
"execution_count": 589,
"metadata": {},
"outputs": [],
"source": [
"def batch_iterate(batch_size: int, ipt: list[int])-> list[int]:\n",
" perm = np.random.permutation(len(ipt))\n",
" for s in range(0, len(ipt), batch_size):\n",
" ids = perm[s : s + batch_size]\n",
" yield ipt[ids]"
]
},
{
"cell_type": "code",
"execution_count": 590,
"metadata": {},
"outputs": [],
"source": [
"def show_images(imgs:list[int],num_imgs:int = 25):\n",
" if (imgs.shape[0] > 0): \n",
" fig,axes = plt.subplots(5, 5, figsize=(5, 5))\n",
" \n",
" for i, ax in enumerate(axes.flat):\n",
" img = mx.array(imgs[i]).reshape(28,28)\n",
" ax.imshow(img,cmap='gray')\n",
" ax.axis('off')\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### show first batch of images"
]
},
{
"cell_type": "code",
"execution_count": 591,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 500x500 with 25 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"X = batch_iterate(25, train_images)\n",
"for x in X: \n",
" show_images(x)\n",
" break"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Training Cycle"
]
},
{
"cell_type": "code",
"execution_count": 592,
"metadata": {},
"outputs": [],
"source": [
"lr = 2e-8\n",
"z_dim = 64\n",
"\n",
"gen = Generator(z_dim)\n",
"mx.eval(gen.parameters())\n",
"gen_opt = optim.Adam(learning_rate=lr, betas=[0.5, 0.9]) #,betas=[0.5, 0.9]\n",
"\n",
"disc = Discriminator()\n",
"mx.eval(disc.parameters())\n",
"disc_opt = optim.Adam(learning_rate=lr, betas=[0.5, 0.9])"
]
},
{
"cell_type": "code",
"execution_count": 593,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" 0%| | 0/200 [00:00<?, ?it/s]"
]
}
],
"source": [
"# Set your parameters\n",
"n_epochs = 200\n",
"display_step = 5000\n",
"cur_step = 0\n",
"\n",
"batch_size = 64\n",
"\n",
"D_loss_grad = nn.value_and_grad(disc, disc_loss)\n",
"G_loss_grad = nn.value_and_grad(gen, gen_loss)\n",
"\n",
"\n",
"for epoch in tqdm(range(n_epochs)):\n",
"\n",
" for real in batch_iterate(batch_size, train_images):\n",
" \n",
" # TODO Train Discriminator\n",
" D_loss,D_grads = D_loss_grad(gen, disc,mx.array(real), batch_size, z_dim)\n",
"\n",
" # Update optimizer\n",
" disc_opt.update(disc, D_grads)\n",
" \n",
" # Update gradients\n",
" mx.eval(disc.parameters(), disc_opt.state)\n",
"\n",
" # TODO Train Generator\n",
" G_loss,G_grads = G_loss_grad(gen, disc, batch_size, z_dim)\n",
" \n",
" # Update optimizer\n",
" gen_opt.update(gen, G_grads)\n",
" \n",
" # Update gradients\n",
" mx.eval(gen.parameters(), gen_opt.state) \n",
" \n",
" print('Losses D={0} G={1}'.format(D_loss,G_loss))\n",
" \n",
" if (cur_step + 1) % display_step == 0:\n",
" print(f\"Step {epoch}: Generator loss: {G_loss}, discriminator loss: {D_loss}\")\n",
" fake_noise = mx.array(get_noise(batch_size, z_dim))\n",
" fake = gen(fake_noise)\n",
" show_images(fake)\n",
" show_images(real)\n",
" cur_step += 1"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "base",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}