{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Denoising Diffusion Probabilistic Models (DDPMs) with fastai\n", "By Tanishq Abraham\n", "\n", "In this notebook, we will implement [Denoising Diffusion Probabilistic Models](https://arxiv.org/abs/2006.11239), a seminal paper in the diffusion model literature.\n", "\n", "A one-sentence summary: Train a denoising model conditioned on the amount of noise present in the image, and generate samples by iteratively denoising from pure noise to a final sample.\n", "\n", "Let's get started with the implementation!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports\n", "\n", "Here are all our imports. The unet file is taken from [lucidrains' DDPM implementation](https://github.com/lucidrains/denoising-diffusion-pytorch) just to focus on implementing the training process rather than architectural details." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "rCPJR6JRrqUp" }, "outputs": [], "source": [ "from fastai.vision.all import *\n", "from fastai.vision.gan import *\n", "from unet import Unet\n", "from copy import deepcopy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dataloading\n", "\n", "Let's load our data. We'll work with the FashionMNIST dataset." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "okr8kAqSvIUD" }, "outputs": [], "source": [ "bs = 128 # batch size\n", "size = 32 # image size" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "B8nsEdKXvKim" }, "outputs": [], "source": [ "path = untar_data('https://github.com/DeepLenin/fashion-mnist_png/raw/master/data.zip')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use the highly flexible DataBlock API in fastai to create our DataLoaders.\n", "\n", "Note that we start with pure noise, generated with the obviously named `generate_noise` function." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "DQF8UdVvvP4R" }, "outputs": [], "source": [ "dblock = DataBlock(blocks = (TransformBlock, ImageBlock(cls=PILImageBW)),\n", " get_x = partial(generate_noise, size=(1,size,size)),\n", " get_items = get_image_files,\n", " splitter = IndexSplitter(range(bs)),\n", " item_tfms=Resize(size), \n", " batch_tfms = Normalize.from_stats(torch.tensor([0.5]), torch.tensor([0.5])))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "L6iHHHFRvRPx" }, "outputs": [], "source": [ "dls = dblock.dataloaders(path, path=path, bs=bs)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "ANw0OdjzvRvY" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "dls.show_batch(max_n=8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A key aspect of the diffusion models is that our model has the same size input and output:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "XlII4jxmwUnS" }, "outputs": [], "source": [ "xb, yb = next(iter(dls.train))\n", "assert xb.shape == yb.shape" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "torch.Size([128, 1, 32, 32])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xb.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## DDPM Training as a Callback\n", "\n", "DDPM is trained quite simply in a few steps:\n", "1. randomly select some timesteps in an iterative noising process.\n", "2. Add noise corresponding to this timestep to the original image. For increasing timesteps, the variance of the noise increases.\n", "3. Pass in this noisy image to our model\n", "4. Model is trained with an MSE loss between the model output and the amount of noise added to the image\n", "\n", "\n", "We will implement this in a callback. The callback will randomly select the timestep and create the noisy image before setting up our input and ground truth tensors for the model forward pass and loss calculation.\n", "\n", "After training, we need to sample from this model. This is an iterative denoising process starting from pure noise. We simply keep removing noise predicted by the neural network, but we do it with an expected noise schedule that is reverse of what we saw during training. This is also done in our callback.\n", "\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "N-IV1WO0wyMT" }, "outputs": [], "source": [ "class DDPMCallback(Callback):\n", " def __init__(self, n_steps, beta_min, beta_max, tensor_type=TensorImage):\n", " store_attr()\n", "\n", " def before_fit(self):\n", " self.beta = torch.linspace(self.beta_min, self.beta_max, self.n_steps).to(self.dls.device) # variance schedule, linearly increased with timestep\n", " self.alpha = 1. - self.beta \n", " self.alpha_bar = torch.cumprod(self.alpha, dim=0)\n", " self.sigma = torch.sqrt(self.beta)\n", "\n", "\n", " def before_batch_training(self):\n", " eps = self.tensor_type(self.xb[0]) # noise, x_T\n", " x0 = self.yb[0] # original images, x_0\n", " batch_size = x0.shape[0]\n", " t = torch.randint(0, self.n_steps, (batch_size,), device=x0.device, dtype=torch.long) # select random timesteps\n", " alpha_bar_t = self.alpha_bar[t].reshape(-1, 1, 1, 1)\n", " \n", " xt = torch.sqrt(alpha_bar_t)*x0 + torch.sqrt(1-alpha_bar_t)*eps #noisify the image\n", " self.learn.xb = (xt, t) # input to our model is noisy image and timestep\n", " self.learn.yb = (eps,) # ground truth is the noise \n", "\n", "\n", " def before_batch_sampling(self):\n", " xt = self.tensor_type(self.xb[0])\n", " for t in reversed(range(self.n_steps)):\n", " t_batch = torch.full((xt.shape[0],), t, device=xt.device, dtype=torch.long)\n", " z = torch.randn(xt.shape, device=xt.device) if t > 0 else torch.zeros(xt.shape, device=xt.device)\n", " alpha_t = self.alpha[t] # get noise level at current timestep\n", " alpha_bar_t = self.alpha_bar[t]\n", " sigma_t = self.sigma[t]\n", " alpha_bar_t_1 = self.alpha_bar[t-1] if t > 0 else torch.tensor(1, device=xt.device)\n", " beta_bar_t = 1 - alpha_bar_t\n", " beta_bar_t_1 = 1 - alpha_bar_t_1\n", " x0hat = (xt - torch.sqrt(beta_bar_t) * self.model(xt, t_batch))/torch.sqrt(alpha_bar_t)\n", " x0hat = torch.clamp(x0hat, -1, 1)\n", " xt = x0hat * torch.sqrt(alpha_bar_t_1)*(1-alpha_t)/beta_bar_t + xt * torch.sqrt(alpha_t)*beta_bar_t_1/beta_bar_t + sigma_t*z \n", " \n", " #xt = 1/torch.sqrt(alpha_t) * (xt - (1-alpha_t)/torch.sqrt(1-alpha_bar_t) * self.model(xt, t_batch)) + sigma_t*z # predict x_(t-1) in accordance to Algorithm 2 in paper\n", " self.learn.pred = (xt,)\n", " raise CancelBatchException\n", "\n", " def before_batch(self):\n", " if not hasattr(self, 'gather_preds'): self.before_batch_training()\n", " else: self.before_batch_sampling()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now initialize our model:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "model = Unet(dim=32, channels=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can create a fastai Learner with our DataLoaders, Callback (with the appropriate number of timesteps and noise schedule) and the simple MSE loss that we use to train DDPM." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "id": "cGfe6KqaH0iP" }, "outputs": [], "source": [ "ddpm_learner = Learner(dls, model, cbs=[DDPMCallback(n_steps=1000, beta_min=0.0001, beta_max=0.02, tensor_type=TensorImageBW)], loss_func=nn.MSELoss())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's use fastai's amazing LR finder to select a good LR for training:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 300 }, "id": "i1N52U5QLEOp", "outputId": "6b691a2c-81ad-481f-d2b9-aa051cdbd947" }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "SuggestedLRs(valley=5.3703181038144976e-05)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ddpm_learner.lr_find(end_lr=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now let's train with one-cycle LR schedule:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 538 }, "id": "gXKdZ3mRR_4G", "outputId": "8b128c9b-a2d8-490e-ce11-1ba064f66877" }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_losstime
00.0435260.04669000:49
10.0325130.03924900:51
20.0277600.02899700:53
30.0260190.02239800:53
40.0248640.02045500:52
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ddpm_learner.fit_one_cycle(5,1e-3)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ddpm_learner.recorder.plot_loss()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sample generation\n", "\n", "Since we implemented sampling in the Callback, we simply can call fastai's built-in `get_preds` function to get our predictions and decode them into an image (rescale from [-1, 1] to [0,255])." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "preds, targ = ddpm_learner.get_preds()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "dls.after_batch.decode((preds,))[0][0].show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively we can use fastai's built-in `show_results` function as well:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "545" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(dls[0])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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VQjlTEReffXVIl6zZk3K2bp1axG//PLLPc/lDIU+97nPFfGVV16Zch544IEhjxsRcf755xfxmWeemXL27t1bxDt37kw5auDy/ve/P+WooZA718k+1moYTjFxzTqihjmrVq1KOUeOHCliZ2i1b9++InbzQefM6afnP1sqZr3rrrtSjgpcVTgYEbFw4cIh44g8H9zc02fmBK+DIAzkFwAAAIAGYQMAAADQIGwAAAAAGqTvGgBHl3pVvxqFjDZjUe8wkrqFsYqry69du7aIH3vssZRz4YUXFrHWSSOyyY/TEqipjmtIovX8Rx55JOVo7dY1Azr77LOLWOv97hqdMZFej2od3HEWL16ccrSpENTTpe6sTX0iIjZv3lzErr6va4Qb61u2bCniPXv2pBzVG6hZT0TEoUOHivjRRx9NOUePHi1iN2eWLl1axE43c+DAgSJ2hkLnnnvukHFE1jKMZHO7X8AvAAAAAA3CBgAAAKBB2AAAAAA0CBsAAACABhkREWAXxqLIbCQ7dPWLfplRdL33sYrriKcdyJww6oILLijiiy66KOWoaYiKjiKyGcn06dNTjoq37r777pTz4osvFvHHPvaxlKNive3bt6ccNeypGQ9PPfVUytFn9sUvfjHlzJw5s4idycrJPPbeiX6tIyrWPHjwYMp5+umni3jBggU9r8d1mty2bVsRv/DCCyln6tSpRXzxxRenHDW0cvNTx4kzmTp27FgRO0MrfR7f+973ep7rlltuSTlz584t4rPOOivlDLdZEL8AAAAANAgbAAAAgAZhAwAAANAgA6MBGK46+GjXpvX8rnGE5rhmF13OVdOYqctx3+nYLaGNbdxn8+bNSzlac3fGJ+ecc85xn2vWrFkpR2u5zrxIm6g43YJqAFytUu9Va6kRuZ66e/fulKNmLaqriIj41Kc+VcSqh4gYXV3NaNGl+Zcz+fnZz35WxOvWrUs5auqzadOmlLNs2bIiVvMqdz3uHrSermZaEdmMx80Z1RK4MapaAjX3isi1+9WrV6ccHetqZhQR8du//dtFPBqNr/gFAAAAoEHYAAAAADQIGwAAAIAGYQMAAADQIMelNhtOo5t+HWe4jROOFxX9OVMNFYioWCXCC0R6UfO+XI5ec81zHlShYL/EYHocJzJSkZ2KqSJyVzDXWU874LkOfWog5IxY7r///iKePHlyylFBn34n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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ddpm_learner.show_results()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Awesome, we have some fashionMNIST images!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another useful thing to check is the prediction of the completely denoised image at some timestep. Our sampling takes our prediction of noise in the image but takes only a fraction of it to remove from the noisy image during the iterative process. But we can also try to see the full denoising prediction by fully subtracting out the prediction. Of course, at higher noise levels this will be inaccurate, but at lower noise levels it should be quite accurate." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "eps = TensorImageBW(xb)\n", "x0 = yb # original images\n", "batch_size = x0.shape[0]\n", "with torch.no_grad():\n", " t = torch.randint(0, ddpm_learner.ddpm.n_steps, (batch_size,), device=x0.device, dtype=torch.long)\n", " alpha_bar_t = ddpm_learner.ddpm.alpha_bar[t].reshape(-1, 1, 1, 1)\n", " xt = torch.sqrt(alpha_bar_t)*x0 + torch.sqrt(1-alpha_bar_t)*eps # noisy images\n", " x0hat = (xt - torch.sqrt(1-alpha_bar_t)*ddpm_learner.model(xt,t))/torch.sqrt(alpha_bar_t) # predicted denoised images" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Timestep 73 is closer to 0 so less noisy but noise is still visible." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([61]),)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.where((t==73).cpu())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can see the original clean image (x0), the noisy image (xt), and the model's attempt to remove the noise (x0hat)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ctxs = get_grid(3,1,3)\n", "ax1 = dls.after_batch.decode((x0,))[0][61].show(ctx=ctxs[0], title='Original')\n", "ax2 = dls.after_batch.decode((xt,))[0][61].show(ctx=ctxs[1], title='Noisy')\n", "ax3 = dls.after_batch.decode((x0hat,))[0][61].show(ctx=ctxs[2], title='Predicted denoised')" ] } ], "metadata": { "accelerator": "GPU", "colab": { "collapsed_sections": [], "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.7.11" }, "vscode": { "interpreter": { "hash": "84a16fb30c7beb8b5c6f0f8edd9c578f92fd91eb92c51c6ca539939325bfb128" } } }, "nbformat": 4, "nbformat_minor": 4 }