{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Import Library" ] }, { "cell_type": "code", "execution_count": 517, "metadata": {}, "outputs": [], "source": [ "import mnist" ] }, { "cell_type": "code", "execution_count": 518, "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": 519, "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": 520, "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": 521, "metadata": {}, "outputs": [], "source": [ "class Generator(nn.Module):\n", "\n", " def __init__(self, z_dim:int = 10, im_dim:int = 784, hidden_dim: int = 64):\n", " super(Generator, self).__init__()\n", "\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", "\n", " nn.Linear(hidden_dim * 4,im_dim),\n", " )\n", " \n", " def __call__(self, noise):\n", " x = self.gen(noise)\n", " return mx.tanh(x)" ] }, { "cell_type": "code", "execution_count": 522, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Generator(\n", " (gen): Sequential(\n", " (layers.0): Sequential(\n", " (layers.0): Linear(input_dims=100, output_dims=64, bias=True)\n", " (layers.1): BatchNorm(64, 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=64, output_dims=128, bias=True)\n", " (layers.1): BatchNorm(128, 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=128, 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.3): Linear(input_dims=256, output_dims=784, bias=True)\n", " )\n", ")" ] }, "execution_count": 522, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gen = Generator(100)\n", "gen" ] }, { "cell_type": "code", "execution_count": 523, "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": 524, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "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": 525, "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", " nn.Dropout(0.3),\n", " )" ] }, { "cell_type": "code", "execution_count": 526, "metadata": {}, "outputs": [], "source": [ "class Discriminator(nn.Module):\n", "\n", " def __init__(self,im_dim:int = 784, hidden_dim:int = 64):\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.Linear(hidden_dim,1),\n", " nn.Sigmoid()\n", " )\n", " \n", " \n", " def __call__(self, noise):\n", " return self.disc(noise)" ] }, { "cell_type": "code", "execution_count": 527, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Discriminator(\n", " (disc): Sequential(\n", " (layers.0): Sequential(\n", " (layers.0): Linear(input_dims=784, output_dims=256, bias=True)\n", " (layers.1): LeakyReLU()\n", " (layers.2): Dropout(p=0.30000000000000004)\n", " )\n", " (layers.1): Sequential(\n", " (layers.0): Linear(input_dims=256, output_dims=128, bias=True)\n", " (layers.1): LeakyReLU()\n", " (layers.2): Dropout(p=0.30000000000000004)\n", " )\n", " (layers.2): Sequential(\n", " (layers.0): Linear(input_dims=128, output_dims=64, bias=True)\n", " (layers.1): LeakyReLU()\n", " (layers.2): Dropout(p=0.30000000000000004)\n", " )\n", " (layers.3): Linear(input_dims=64, output_dims=1, bias=True)\n", " (layers.4): Sigmoid()\n", " )\n", ")" ] }, "execution_count": 527, "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": 528, "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 = mx.mean(nn.losses.binary_cross_entropy(fake_disc,fake_labels,with_logits=True))\n", " \n", " real_disc = mx.array(disc(real))\n", " real_labels = mx.ones((real.shape[0],1))\n", " \n", " real_loss = mx.mean(nn.losses.binary_cross_entropy(real_disc,real_labels,with_logits=True))\n", " \n", " disc_loss = (fake_loss + real_loss)\n", "\n", " return disc_loss" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Generator Loss" ] }, { "cell_type": "code", "execution_count": 529, "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 = mx.array(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,with_logits=True)\n", " \n", " return mx.mean(gen_loss)" ] }, { "cell_type": "code", "execution_count": 530, "metadata": {}, "outputs": [], "source": [ "# Get only the training images\n", "train_images,train_labels,*_ = map(np.array, mnist.mnist())" ] }, { "cell_type": "code", "execution_count": 531, "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": 532, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 532, "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": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(train_images[0].reshape(28,28),cmap='gray')" ] }, { "cell_type": "code", "execution_count": 533, "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": 534, "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": 535, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "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": 536, "metadata": {}, "outputs": [], "source": [ "lr = 2e-6\n", "z_dim = 128\n", "\n", "gen = Generator(z_dim)\n", "mx.eval(gen.parameters())\n", "gen_opt = optim.Adam(learning_rate=lr, betas=[0.5, 0.999]) #,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.999])" ] }, { "cell_type": "code", "execution_count": 537, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 0%| | 0/50 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ " 6%|▌ | 3/50 [00:14<03:49, 4.89s/it]" ] } ], "source": [ "# Set your parameters\n", "n_epochs = 50\n", "display_step = 5000\n", "cur_step = 0\n", "\n", "batch_size = 128\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 idx,real in enumerate(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", " # 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\n", " \n", " if epoch%10==0:\n", " print(\"Epoch: {}, iteration: {}, Discriminator Loss:{}, Generator Loss: {}\".format(epoch,idx,D_loss,G_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", " \n", " # print('Losses D={0} G={1}'.format(D_loss,G_loss))" ] } ], "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 }