{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Import Library" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "import mnist" ] }, { "cell_type": "code", "execution_count": 24, "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": "markdown", "metadata": {}, "source": [ "# GAN Architecture" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generator 👨🏻‍🎨" ] }, { "cell_type": "code", "execution_count": 25, "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),\n", " nn.ReLU()\n", " )" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "class Generator(nn.Module):\n", "\n", " def __init__(self, z_dim:int = 10, im_dim:int = 784, hidden_dim: int =128):\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", " nn.Sigmoid()\n", " )\n", " \n", " def __call__(self, noise):\n", "\n", " return self.gen(noise)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Generator(\n", " (gen): Sequential(\n", " (layers.0): Sequential(\n", " (layers.0): Linear(input_dims=100, output_dims=128, bias=True)\n", " (layers.1): BatchNorm(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (layers.2): ReLU()\n", " )\n", " (layers.1): Sequential(\n", " (layers.0): Linear(input_dims=128, output_dims=256, bias=True)\n", " (layers.1): BatchNorm(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (layers.2): ReLU()\n", " )\n", " (layers.2): Sequential(\n", " (layers.0): Linear(input_dims=256, output_dims=512, bias=True)\n", " (layers.1): BatchNorm(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (layers.2): ReLU()\n", " )\n", " (layers.3): Sequential(\n", " (layers.0): Linear(input_dims=512, output_dims=1024, bias=True)\n", " (layers.1): BatchNorm(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", " (layers.2): ReLU()\n", " )\n", " (layers.4): Linear(input_dims=1024, output_dims=784, bias=True)\n", " (layers.5): Sigmoid()\n", " )\n", ")" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gen = Generator(100)\n", "gen" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "def get_noise(n_samples, z_dim):\n", " return np.random.randn(n_samples,z_dim)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Discriminator 🕵🏻‍♂️" ] }, { "cell_type": "code", "execution_count": 29, "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": 30, "metadata": {}, "outputs": [], "source": [ "class Discriminator(nn.Module):\n", "\n", " def __init__(self,im_dim:int = 784, hidden_dim:int = 128):\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", " )\n", " \n", " def __call__(self, noise):\n", "\n", " return self.disc(noise)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Discriminator(\n", " (disc): Sequential(\n", " (layers.0): Sequential(\n", " (layers.0): Linear(input_dims=784, output_dims=512, bias=True)\n", " (layers.1): LeakyReLU()\n", " )\n", " (layers.1): Sequential(\n", " (layers.0): Linear(input_dims=512, output_dims=256, bias=True)\n", " (layers.1): LeakyReLU()\n", " )\n", " (layers.2): Sequential(\n", " (layers.0): Linear(input_dims=256, output_dims=128, bias=True)\n", " (layers.1): LeakyReLU()\n", " )\n", " (layers.3): Linear(input_dims=128, output_dims=1, bias=True)\n", " )\n", ")" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disc = Discriminator()\n", "disc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Model Training 🏋🏻‍♂️" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# Set your parameters\n", "criterion = nn.losses.binary_cross_entropy\n", "n_epochs = 200\n", "z_dim = 64\n", "display_step = 500\n", "batch_size = 128\n", "lr = 0.00001" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "gen = Generator(z_dim)\n", "mx.eval(gen.parameters())\n", "gen_opt = optim.Adam(learning_rate=lr)\n", "\n", "disc = Discriminator()\n", "mx.eval(disc.parameters())\n", "disc_opt = optim.Adam(learning_rate=lr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Losses" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "def disc_loss(gen, disc, real, num_images, z_dim):\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", " fake_loss = nn.losses.binary_cross_entropy(fake_disc,fake_labels,with_logits=True)\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,with_logits=True)\n", "\n", " disc_loss = (fake_loss + real_loss) / 2\n", "\n", " return disc_loss" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "def gen_loss(gen, disc, num_images, z_dim):\n", "\n", " noise = mx.array(get_noise(num_images, z_dim))\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,with_logits=True)\n", "\n", " return gen_loss" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "train_images, _, test_images, _ = map(\n", " mx.array, getattr(mnist, 'mnist')()\n", ")" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "def batch_iterate(batch_size:int, ipt:list):\n", " perm = mx.array(np.random.permutation(len(ipt)))\n", " for s in range(0, ipt.size, batch_size):\n", " ids = perm[s : s + batch_size]\n", " yield ipt[ids]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### show batch of images" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for X in batch_iterate(16, train_images):\n", " fig,axes = plt.subplots(4, 4, figsize=(4, 4))\n", "\n", " for i, ax in enumerate(axes.flat):\n", " img = mx.array(X[i]).reshape(28,28)\n", " ax.imshow(img,cmap='gray')\n", " ax.axis('off')\n", " break" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "def show_images(imgs:list[int],num_imgs:int = 25):\n", " fig,axes = plt.subplots(5, 5, figsize=(4, 4))\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": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(0.675341, dtype=float32)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z_dim = 64\n", "gen = Generator(z_dim)\n", "mx.eval(gen.parameters())\n", "gen_opt = optim.Adam(learning_rate=lr)\n", "\n", "disc = Discriminator()\n", "mx.eval(disc.parameters())\n", "disc_opt = optim.Adam(learning_rate=lr)\n", "\n", "g_loss = gen_loss(gen, disc, 8, z_dim)\n", "g_loss\n" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "60000" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(train_images)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 10%|█ | 20/200 [1:17:04<11:32:48, 230.94s/it]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Step 20: Generator loss: array(16.7247, dtype=float32), discriminator loss: array(nan, dtype=float32)\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ " 10%|█ | 20/200 [1:21:00<12:09:01, 243.01s/it]\n" ] }, { "ename": "ValueError", "evalue": "[take] Cannot do a non-empty take from an array with zero elements.", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[45], line 37\u001b[0m\n\u001b[1;32m 35\u001b[0m fake \u001b[38;5;241m=\u001b[39m gen(fake_noise)\n\u001b[1;32m 36\u001b[0m show_images(fake)\n\u001b[0;32m---> 37\u001b[0m \u001b[43mshow_images\u001b[49m\u001b[43m(\u001b[49m\u001b[43mreal\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 38\u001b[0m cur_step \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n", "Cell \u001b[0;32mIn[39], line 5\u001b[0m, in \u001b[0;36mshow_images\u001b[0;34m(imgs, num_imgs)\u001b[0m\n\u001b[1;32m 2\u001b[0m fig,axes \u001b[38;5;241m=\u001b[39m plt\u001b[38;5;241m.\u001b[39msubplots(\u001b[38;5;241m5\u001b[39m, \u001b[38;5;241m5\u001b[39m, figsize\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m4\u001b[39m, \u001b[38;5;241m4\u001b[39m))\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, ax \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(axes\u001b[38;5;241m.\u001b[39mflat):\n\u001b[0;32m----> 5\u001b[0m img \u001b[38;5;241m=\u001b[39m mx\u001b[38;5;241m.\u001b[39marray(\u001b[43mimgs\u001b[49m\u001b[43m[\u001b[49m\u001b[43mi\u001b[49m\u001b[43m]\u001b[49m)\u001b[38;5;241m.\u001b[39mreshape(\u001b[38;5;241m28\u001b[39m,\u001b[38;5;241m28\u001b[39m)\n\u001b[1;32m 6\u001b[0m ax\u001b[38;5;241m.\u001b[39mimshow(img,cmap\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgray\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 7\u001b[0m ax\u001b[38;5;241m.\u001b[39maxis(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "\u001b[0;31mValueError\u001b[0m: [take] Cannot do a non-empty take from an array with zero elements." ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Train the GAN for only 1000 images\n", "batch_size = 16\n", "display_step = 5\n", "cur_step = 0\n", "mean_generator_loss = 0\n", "mean_discriminator_loss = 0\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(50)):\n", "\n", " for real in batch_iterate(batch_size, train_images[:500]):\n", " \n", " D_loss,D_grads = D_loss_grad(gen, disc, 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", " 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 % display_step == 0 and cur_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", " print(real.shape)\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 }