mirror of
https://github.com/ml-explore/mlx-examples.git
synced 2025-06-25 09:51:19 +08:00
548 lines
108 KiB
Plaintext
548 lines
108 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Import Library"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 427,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import mnist"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 428,
|
|
"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": 429,
|
|
"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": 430,
|
|
"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": 431,
|
|
"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": 432,
|
|
"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": 432,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"gen = Generator(100)\n",
|
|
"gen"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 433,
|
|
"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": 434,
|
|
"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": 435,
|
|
"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": 436,
|
|
"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",
|
|
" DisBlock(im_dim, hidden_dim * 2),\n",
|
|
" DisBlock(hidden_dim * 2, hidden_dim),\n",
|
|
"\n",
|
|
" nn.Linear(hidden_dim,1),\n",
|
|
" nn.Sigmoid()\n",
|
|
" )\n",
|
|
" \n",
|
|
" def __call__(self, noise):\n",
|
|
" return self.disc(noise)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 437,
|
|
"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",
|
|
" )\n",
|
|
" (layers.1): Sequential(\n",
|
|
" (layers.0): Linear(input_dims=256, output_dims=128, bias=True)\n",
|
|
" (layers.1): LeakyReLU()\n",
|
|
" )\n",
|
|
" (layers.2): Linear(input_dims=128, output_dims=1, bias=True)\n",
|
|
" (layers.3): Sigmoid()\n",
|
|
" )\n",
|
|
")"
|
|
]
|
|
},
|
|
"execution_count": 437,
|
|
"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": 438,
|
|
"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": 439,
|
|
"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": 440,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Get only the training images\n",
|
|
"train_images,*_ = map(np.array, mnist.mnist())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 441,
|
|
"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": 442,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<matplotlib.image.AxesImage at 0x156d411b0>"
|
|
]
|
|
},
|
|
"execution_count": 442,
|
|
"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": 443,
|
|
"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": 444,
|
|
"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": 445,
|
|
"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": 446,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"lr = 2e-4\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.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": 447,
|
|
"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 = 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 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",
|
|
" \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
|
|
}
|