mlx-examples/gan/playground.ipynb
2024-07-31 11:25:39 +03:00

631 lines
147 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Import Library"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"import mnist"
]
},
{
"cell_type": "code",
"execution_count": 64,
"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": 65,
"metadata": {},
"outputs": [],
"source": [
"# mx.set_default_device(mx.gpu)\n",
"mx.random.seed(42)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# GAN Architecture"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generator 👨🏻‍🎨"
]
},
{
"cell_type": "code",
"execution_count": 66,
"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": 67,
"metadata": {},
"outputs": [],
"source": [
"class Generator(nn.Module):\n",
"\n",
" def __init__(self, z_dim:int = 32, im_dim:int = 784, hidden_dim: int = 256):\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": 68,
"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): Linear(input_dims=1024, output_dims=784, bias=True)\n",
" )\n",
")"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gen = Generator(100)\n",
"gen"
]
},
{
"cell_type": "code",
"execution_count": 69,
"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": 70,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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ABAYBQBAyPlK6t///nf74S0tLXYzdOhQu5Gkd999124uueQSuykuLraba665xm5effVVu5Gk/Hx/58ePH283zz33nN3MnTvXbiTp4MGDdpPyc2hsbLSbHj162E2qLl262E1eXp7dbN++3W6WLl1qNw8//LDdSNLp06ftJuVv8G9/+5vdnDt3zm4k6eTJk3azbNkyu8nln3veFAAAgVEAAARGAQAQGAUAQGAUAACBUQAABEYBABAYBQBAYBQAAIFRAAAERgEAEBgFAEDI+SDeL3/5S/vhdXV1dnP77bfbjSSdPXvWbnr37m03b731lt3cd999dnP48GG7kaT58+fbza9//Wu7OX78uN2kHgs7duyY3Vy8eNFuJk+ebDcpR9MOHTpkN5I0b948u1m1apXdnD9/3m7atWtnNzfeeKPdSGl/Gym/D2VlZXbz4osv2o2UdpyztbXVbv76179m/QxvCgCAwCgAAAKjAAAIjAIAIDAKAIDAKAAAAqMAAAiMAgAgMAoAgMAoAAACowAACIwCACAU5PrBAwcO2A/Pz/c3Z8uWLXYjSfv377ebsWPH2k3K4aozZ87Yzb59++xGkiorK+0m5b9Tiry8vKSuqKjIbj755BO7qaiosJu2tja7GT9+vN1IUn19vd2kHJ1rbGy0m5RDjN27d7cbSSouLrablL+nhoYGu0k9+njZZZfZzYgRI5K+KxveFAAAgVEAAARGAQAQGAUAQGAUAACBUQAABEYBABAYBQBAYBQAAIFRAAAERgEAEBgFAEDI+SDek08+aT98+fLldpNyPE6SVqxYYTf9+/e3m5TDVS+++KLdfOc737EbSZo2bZrdLFmyxG5SDu+99957diNJPXv2tJtBgwbZzeLFi+3mtttus5uamhq7kdKO76UoLS21mxkzZtjN0KFD7UaSZs2aZTePPPKI3aT8+1VVVWU3kvTxxx/bzZgxY5K+KxveFAAAgVEAAARGAQAQGAUAQGAUAACBUQAABEYBABAYBQBAYBQAAIFRAAAERgEAEBgFAEDIy2QymVw+eN9999kP79evn92MHj3abiSpurrabu688067ee211+ymffv2dpNylEyS8vP9nT9y5IjdDBkyxG4OHjxoN5LU3NxsN5dffnnSd7lSjvV99NFHSd81YcIEuykvL7ebtWvX2s358+ft5sKFC3YjSQcOHLCblpYWuxk3bpzdnDhxwm4kacCAAXazbt06u3n00UezfoY3BQBAYBQAAIFRAAAERgEAEBgFAEBgFAAAgVEAAARGAQAQGAUAQGAUAACBUQAABEYBABAYBQBAKMj1g5deeqn98J07d9rNHXfcYTdS2iXNlGuQKZdVU6467tq1y24kqbCw0G7a2trspm/fvnazcOFCu5GkSZMm2U1ra6vdbNmyxW569eplN4MHD7YbSbruuuvs5vXXX7ebG2+80W62bdtmNxs2bLAbKe3n8PXXX9vN7t277ebUqVN2I6X9vQ8dOjTpu7LhTQEAEBgFAEBgFAAAgVEAAARGAQAQGAUAQGAUAACBUQAABEYBABAYBQBAYBQAAIFRAACEvEwmk8nlg1OnTrUf/tVXX9nNLbfcYjeSVFVVZTcpx8L69etnN1dffbXdNDQ02I0k3XDDDXazePFiu7nsssvspqWlxW4kacGCBXYzevRou5k1a5bdrF692m7ee+89u5HSDgOm6Ny5s93s3bvXboqKiuxGkpYuXWo306dPt5ujR4/aTWlpqd1IUl1dnd106NDBbn71q19l/QxvCgCAwCgAAAKjAAAIjAIAIDAKAIDAKAAAAqMAAAiMAgAgMAoAgMAoAAACowAACIwCACAU5PrBYcOG2Q8fOXKk3aQegtuzZ4/dpBy3y8/3dzTlcNUnn3xiN5LUp08fu6mvr7ebX/ziF3bTv39/u0n9rlWrVtnN1q1b7SblyF/KoUhJ6tu3r93s2LHDbo4fP243vXv3tpvU3/GJEyfazdmzZ+2mrKzMbnr27Gk3kjR//ny7KS8vT/qubHhTAAAERgEAEBgFAEBgFAAAgVEAAARGAQAQGAUAQGAUAACBUQAABEYBABAYBQBAYBQAACEvk8lkcvngSy+9ZD98/fr1djNjxgy7kaTHHnvMbiZNmmQ3Q4cOtZuDBw/aTarCwkK76dixo91UVlbazcqVK+1GkoYPH243KcftRo0aZTe1tbV206tXL7uRpD//+c92k3Kg7eabb7ab3bt32833vvc9u5GkM2fO2M2FCxfsZtu2bXaTcvxSSvt7evbZZ+1m4cKFWT/DmwIAIDAKAIDAKAAAAqMAAAiMAgAgMAoAgMAoAAACowAACIwCACAwCgCAwCgAAAKjAAAIjAIAIOR8JfXNN9+0H55yDTLlUqUkffrpp3azb98+uzl37pzdjBgxwm6WLVtmN5J01VVX2U3Xrl3tpqamxm7y89P+P8hdd91lN5s3b7abDz74wG5uvfVWu1mzZo3dSNLXX39tNyk/u5TvOXbsmN2sXr3abiSpR48edtPU1GQ3M2fOtJtFixbZjZR2mfaLL76wmwceeCDrZ3hTAAAERgEAEBgFAEBgFAAAgVEAAARGAQAQGAUAQGAUAACBUQAABEYBABAYBQBAYBQAACHng3gpx+M2btxoN3V1dXYjSXv27LGb0tJSu7nnnnvs5tChQ3bT1tZmN5J0//3328306dPtpl+/fnbz05/+1G4kac6cOXbz/vvv283s2bPt5uLFi3bz4Ycf2o0kjR071m769u1rN88++6zd7N+/324mTJhgN1La0ceU43EDBgywm5KSEruRpIKCgm/ku6ZOnZr1M7wpAAACowAACIwCACAwCgCAwCgAAAKjAAAIjAIAIDAKAIDAKAAAAqMAAAiMAgAgMAoAgJDzQTwAwP9/vCkAAAKjAAAIjAIAIDAKAIDAKAAAAqMAAAiMAgAgMAoAgMAoAADCfwHU7sr23+duHgAAAABJRU5ErkJggg==",
"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": 71,
"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": 72,
"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.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": 73,
"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",
" (layers.2): Dropout(p=0.30000000000000004)\n",
" )\n",
" (layers.1): Sequential(\n",
" (layers.0): Linear(input_dims=1024, output_dims=512, bias=True)\n",
" (layers.1): LeakyReLU()\n",
" (layers.2): Dropout(p=0.30000000000000004)\n",
" )\n",
" (layers.2): Sequential(\n",
" (layers.0): Linear(input_dims=512, output_dims=256, bias=True)\n",
" (layers.1): LeakyReLU()\n",
" (layers.2): Dropout(p=0.30000000000000004)\n",
" )\n",
" (layers.3): Linear(input_dims=256, output_dims=1, bias=True)\n",
" (layers.4): Sigmoid()\n",
" )\n",
")"
]
},
"execution_count": 73,
"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": 74,
"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) / 2.0\n",
"\n",
" return disc_loss"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Generator Loss"
]
},
{
"cell_type": "code",
"execution_count": 75,
"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": 76,
"metadata": {},
"outputs": [],
"source": [
"# Get only the training images\n",
"train_images,train_labels,*_ = map(np.array, mnist.mnist())"
]
},
{
"cell_type": "code",
"execution_count": 77,
"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": 78,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x10ed09990>"
]
},
"execution_count": 78,
"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": 79,
"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": 80,
"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": 81,
"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": 82,
"metadata": {},
"outputs": [],
"source": [
"lr = 2e-5\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": 83,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" 0%| | 0/500 [00:00<?, ?it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch: 0, iteration: 468, Discriminator Loss:array(0.527415, dtype=float32), Generator Loss: array(0.672361, dtype=float32)\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
" 20%|██ | 100/500 [09:47<38:39, 5.80s/it]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch: 100, iteration: 468, Discriminator Loss:array(0.535585, dtype=float32), Generator Loss: array(0.68229, dtype=float32)\n"
]
},
{
"data": {
"image/png": "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8rPy/Lj33nv13HPP6eWXX+711i9D7Xz4U8fhVAbq+TAoSigrK0uXXXaZampqet1fU1OjadOmeVqVf4lEQm+//bZKSkp8L8WbiooKFRcX9zo3Ojs7VVtbO6TPDUlqbm5WQ0PDWXV+OOc0b948Pf3001q3bp0qKip6fX6onA9nOg6nMmDPB49PijB56qmnXGZmpvvRj37k3nrrLTd//nyXl5fndu/e7Xtpn5r77rvPrV+/3u3atctt2rTJffGLX3T5+fln/TFoa2tzW7dudVu3bnWS3NKlS93WrVvdBx984Jxz7qGHHnLxeNw9/fTTbvv27e722293JSUlrrW11fPK+9bpjkNbW5u777773MaNG119fb17+eWX3ZVXXulGjx59Vh2Hb3zjGy4ej7v169e7/fv399za29t7thkK58OZjsNgOh8GTQk559wPfvADV15e7rKystyll17a6+mIQ8GsWbNcSUmJy8zMdKWlpW7mzJlux44dvpfV715++WUn6aTb7NmznXPHn5b7wAMPuOLiYheLxdw111zjtm/f7nfR/eB0x6G9vd1VVVW5UaNGuczMTDd27Fg3e/Zst2fPHt/L7lOn+voluRUrVvRsMxTOhzMdh8F0PvBWDgAAbwbF34QAAGcnSggA4A0lBADwhhICAHhDCQEAvKGEAADeUEIAAG8oIQCAN5QQAMAbSggA4A0lBADwhhICAHjz/wGu7dLCc6/nLgAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
" 40%|████ | 200/500 [19:30<29:44, 5.95s/it]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch: 200, iteration: 468, Discriminator Loss:array(0.550168, dtype=float32), Generator Loss: array(0.68665, dtype=float32)\n"
]
},
{
"data": {
"image/png": "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MVq2bJleeOEF7dq1S7W1tUMeHynnwycdh8vJ2fPB4YsirDz//POmpKTE/PSnPzXvvPOOWbFihRkzZow5evSo66VlzaOPPmpaWlrMkSNHzN69e81Xv/pVEwqFCv4Y9PX1mQMHDpgDBw4YSWbt2rXmwIED5v333zfGGPPkk0+acDhsXnjhBXPw4EFz//33m2g0amKxmOOVp9eVjkNfX5959NFHzZ49e0x7e7t59dVXza233mpuuOGGgjoO3/72t004HDYtLS2ms7MzdTt9+nRqm5FwPnzSccin8yFvSsgYY370ox+ZmpoaU1paar70pS8NeTniSLBo0SITjUZNSUmJqaqqMgsXLjSHDh1yvayMe/XVV42kS26LFy82xpx/We4TTzxhIpGICQaDZu7cuebgwYNuF50BVzoOp0+fNvX19Wb8+PGmpKTE3HjjjWbx4sXm2LFjrpedVpf780syGzduTG0zEs6HTzoO+XQ+8FEOAABn8uI5IQBAYaKEAADOUEIAAGcoIQCAM5QQAMAZSggA4AwlBABwhhICADhDCQEAnKGEAADOUEIAAGcoIQCAM/8PpjrQaeqMMjgAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
" 49%|████▉ | 246/500 [24:09<26:17, 6.21s/it]"
]
}
],
"source": [
"# Set your parameters\n",
"n_epochs = 500\n",
"display_step = 5000\n",
"cur_step = 0\n",
"\n",
"batch_size = 128 # 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%100==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",
" plt.imshow(fake[0].reshape(28,28))\n",
" plt.show()\n",
" # show_images(fake[:25])\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
}