{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generative Adversarial Networks\n",
"\n",
"Gregor Cerar \n",
"2023-10-10\n",
"\n",
"Generative Adversarial Networks (GANs) represent an innovative class of\n",
"unsupervised neural networks that have revolutionized the field of\n",
"artificial intelligence. Eager to learn how they work, I’ve implemented\n",
"foundational “vanilla” GAN and its more complex counterpart, the Deep\n",
"Convolutional GAN (DCGAN), from scratch. I’ve put them on a test run on\n",
"MNIST Digits and Fashion toy datasets.\n",
"\n",
"# Introduction\n",
"\n",
"Generative Adversarial Networks (GANs) are an innovative class of\n",
"unsupervised neural networks that have revolutionized the field of\n",
"artificial intelligence. They were first introduced in [Generative\n",
"Adversarial Networks](https://arxiv.org/abs/1406.2661) (Goodfellow et\n",
"al. 2014) and consist of two separate neural networks: the **generator**\n",
"(creates data) and the **discriminator** (evaluates data authenticity).\n",
"The generator aims to fool the discriminator by producing realistic\n",
"data, while the discriminator tries to differentiate real from fake.\n",
"Over iterations, the generator’s data becomes more convincing.\n",
"\n",
"As an analogy, consider two kids, one drawing counterfeit money\n",
"(“Generator”) and another assessing its realism (“Discriminator”). Over\n",
"time, the counterfeit drawings become increasingly convincing.\n",
"\n",
"# Vanilla GAN\n",
"\n",
"The most fundamental variant of GAN is the “vanilla” GAN, where\n",
"“vanilla” signifies the model in its original and most straightforward\n",
"form rather than a flavor. To better understand its mechanism, I’ve\n",
"illustrated its structure on\n",
"Figure 1.\n",
"\n",
"\n",
"
\n",
"Figure 1: GAN architecture\n",
"\n",
"\n",
"- **Generator** $G(z; w_g)$ takes random noise $z$ as input and\n",
" produces fabricated data $x_f$.\n",
" - $z$ represents the input vector, a noise vector from the\n",
" Gaussian distribution.\n",
" - $w_g$ denotes generator neural network weights.\n",
" - $x_f$ is a fabricated data sample meant for the discriminator.\n",
"- **Discriminator** $D(x; w_d)$ differentiates between real and\n",
" generated data.\n",
" - $x$ represents input vectors, which come from either a real\n",
" dataset ($x_r \\sim p_\\textrm{data}(x)$) or from the set of\n",
" fabricated samples ($x_f = G(z \\sim p_z(z); w_g)$).\n",
" - $w_d$ denodes discriminator neural network weights.\n",
"\n",
"## Objective Function\n",
"\n",
"The interaction between the Generator and the Discriminator can be\n",
"quantified by their objective or loss functions:\n",
"\n",
"- **Discriminator’s Objective:** For real data $x$, $D$ wants $D(x)$\n",
" near $1$. For generated data $G(z)$, it targets $D(G(z))$ close to\n",
" $0$. Its objective is:\n",
"\n",
"$$\n",
"\\mathcal{L}(D) = \\log(D(x)) + \\log(1 - D(G(z))).\n",
"$$\n",
"\n",
"- **Generator’s Objective:** $G$ aims for $D(G(z))$ to approach $1$,\n",
" given by:\n",
"\n",
"$$\n",
"\\mathcal{L}(G) = \\log(1 − D(G(z)))\n",
"$$\n",
"\n",
"Both $G$ and $D$ continuously improve to outperform each other in this\n",
"game.\n",
"\n",
"### Minimax Game in GANs\n",
"\n",
"Vanilla GANs are structured around the minimax game from game theory:\n",
"\n",
"$$\n",
"\\min_{G}\\max_{D} \\mathcal{L}(D, G) = \\log(D(x)) + \\log(1 - D(G(z)))\n",
"$$\n",
"\n",
"In essence:\n",
"\n",
"- **Discriminator:** Maximizes its capacity to differentiate real data\n",
" from generated.\n",
"- **Generator:** Minimizes the discriminator’s success rate by\n",
" producing superior forgeries.\n",
"\n",
"The iterative competition refines both, targeting a proficient Generator\n",
"and a perceptive Discriminator.\n",
"\n",
"## Prepare Environment\n",
"\n",
"In the upcoming sections, we’ll do the following steps to prepare the\n",
"development environment:\n",
"\n",
"- Import necessary libraries, primarily PyTorch and Matplotlib.\n",
"- Define constants, including project path and seed, for consistency.\n",
"- Determine the computational device (e.g., GPU).\n",
"- Provide a weight initialization helper function."
],
"attachments": {
"./figures/GAN-architecture.png": {
"image/png": "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\nqUcVInVNPCLVHHkrQ9gQj3ailggggAACCCCAAAIIIIAAAggggAACCMRZIFZhg6DXXnttu/baa61L\nly41c//5559t7NixNnr0aFtqqaXs9ttvd/VIa8EjXi1P2BCv9qK2CCCAAAIIIIAAAggggAACCCCA\nAAIIxFGgbmHDBhtsUHDQ/o8//rB58+bZ22+/bddff73deeed9u233zrjli1b2i233GKdOnWqifnX\nX3/tlp6ZMmWKFat3TSpU54vgUecGKPHyhA0lgnE4AggggAACCCCAAAIIIIAAAggggAACCJQsENmw\nwX8nCh4eeughO/zww+3jjz92P+rTp49b0mjllVcu+aZLfQGD6w3F8Ci1B9X3eMKG+vpzdQQQQAAB\nBBBAAAEEEEAAAQQQQAABBNIgEIuwQQ2xYMECmzBhgh1yyCGZGQ5aTmnw4MFV3zSawXXChji/GRA2\nxLn1qDsCCCCAAAIIIIAAAggggAACCCCAAALxEIhN2CBO7RVw8skn24UXXuh0e/bsaePHj7dmzZpV\nVZuwgbChqh2syicnbKgyMKdHAAEEEEAAAQQQQAABBBBAAAEEEEAAAYtV2KD2euGFF6x37972xRdf\n2HLLLeeWVyq0d8Ps2bPtscces/vvv9/eeecdmzFjhmt2vbZDhw7WtWtX69evn6277rq26KKLNugS\nTz/9tG255ZYFu8m0adNyXr+S62ZfUOeaNGmSu4dnnnnG5s6d6+rfsWNH6969u+2yyy621lprBZrh\noSWpnn/+ebvtttvsqaeeynhsuOGG1rlzZ9tjjz1s0003tUaNGi1035V4BPldC/M+w/D3Bun9+3R8\n8skndtNNN9kDDzxgzz33XKYddtttN9tnn31smWWWydyqQirNxtF+I08++WTBY/0+/nDA618fffSR\nXXbZZe666sdNmza1LbbYwvr37+/a33/dbOtSwoZK+keQNuYYBBBAAAEEEEAAAQQQQAABBBBAAAEE\nEEimQOzChvnz57ulkzSAq3LRRRfZP//5z4Va58cff7Srr77azjrrLDc4X6wcdthhpkFZDeJ6pZzB\n9TCu613/t99+cxthH3vssUXv4bjjjrOTTjqpQf2z71n7XcjqnnvuKcjRq1cvu+CCC2ydddZpcFw5\nHsXc9fMw7zNMf3/YoHZ48cUXC7aFgp/LL7/c1lxzTbeZ+DHHHOOCgVxFAZk2Pl977bUX+nF22PDp\n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\n6eahcggggAACCCCAAAIIIIAAAggggAACCJQlQNhQFhsvQgCBcgWgp5+SAAAgAElEQVQIG8qV43UI\nIIAAAggggAACCCCAAAIIIIAAAghEV4CwIbptQ80QSKQAYUMim5WbQgABBBBAAAEEEEAAAQQQQAAB\nBBBIuQBhQ8o7ALePQK0FCBtqLc71EEAAAQQQQAABBBBAAAEEEEAAAQQQqL4AYUP1jbkCAgj4BAgb\n6A4IIIAAAggggAACCCCAAAIIIIAAAggkT4CwIXltyh0hEGkBwoZINw+VQwABBBBAAAEEEEAAAQQQ\nQAABBBBAoCwBwoay2HgRAgiUK0DYUK4cr0MAAQQQQAABBBBAAAEEEEAAAQQQQCC6AoQN0W0baoZA\nIgUIGxLZrNwUAggggAACVRH4+eef7dtvv7UffvjBFltsMWvatKk1bty4wbV+//1303Hz5883fc5Y\nYYUVbKmllqpKfTgpAggggAACCCCAAAII5BcgbKB3IIBATQUIG2rKzcUQQAABBBCIpcAvv/xiTz31\nlE2bNs39+/HHH7dtt93WNttsM9tpp51sk002sUUXXdQFDDfeeKM9//zzduutt1q7du1sxx13tCFD\nhlizZs1iee9UGgEEEEAAAQQQQACBuAoQNsS15ag3AjEVIGyIacNRbQQQQAABBGok8OOPP9rll19u\nZ599tgsT1lhjDVtiiSXsP//5j6vBOuusY1deeaV16NDBzjzzTLv44ottiy22sDlz5ti7777rjhkw\nYICNHj2awKFGbcZlEEAAAQQQQAABBBCQAGED/QABBGoqQNhQU24uhgACCCCAQKwENKNh6NChdskl\nl7h633XXXW5Gg5ZQevrpp61Hjx7uz9dee23r3r27XXbZZTZo0CAXOGippXHjxtmJJ57ojrn66qvt\noIMOcksrURBAAAEEEEAAAQQQQKD6AoQN1TfmCggg4BMgbKA7IIAAAggggEA+galTp1rXrl1t2WWX\ndbMUmjdvnjl0wYIF1q1bN9MxXtGSSRMnTrRGjRrZcccd58IHrwwfPtzOOOMMsBFAAAEEEEAAAQQQ\nQKBGAoQNNYLmMggg8KcAYQM9AQEEEEAAAQRyCWjJpN69e9vnn39uY8aMsS5dujQ47I8//nCzGDR7\nwSv333+/9erVy2bPnm077LCDvfTSS5mfXXHFFXbYYYeBjQACCCCAAAIIIBCSwG233WZ77rlnSGfj\n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\nikEDgUM6+h9hQzrambuso4D2ahg0aJDdcccd7sm5mTNnWuvWretYo/yXfv/9961Dhw7uKb/u3bvb\nzTffbCuvvHKodSVsCJWTkyGAAAIIIIBAiQK//fab/fLLL7bEEktUZcnIEqvD4QgggAACCCCAQKgC\nUQ4aCBxCbepInoywIZLNQqWSJDB9+nTr1q2b/fDDD7bJJpvYM888Y4svvngkb1Ffvrt27erqqDJ1\n6lS3/FOYhbAhTE3OhQACCCCAAAIIIIAAAggggAACCPwpEIeggcAh2b2VsCHZ7cvdRUBg1KhRdvzx\nx7uaDBw40LQRc5TLYYcdZldddZWropYW+Oc//xlqOELYEOXWp24IIIAAAggggAACCCCAAAIIIBBH\ngTgFDQQOcexhweocybDhxx9/NG2oqw1rF1tsMWvSpIktu+yyDe5IU5/1cx2ndVZXXHFFW2qppYLd\nNUflFdA6tnLVMjqNGzd2pksuuWSD4/X0u9pIx2rgWE/p61i1FaWhwDfffGNHHXVUJmC47LLL7Igj\njiibSe2ivv/TTz+5qf9alkn2/qJj1D5qp0aNGrlNnktpm5tuusn23Xdfd8q99trLxowZs9A1yr4B\nbRSzyCKZly9YsKCSU/FaBBBAAAEEEEAAAQQQQAABBBBAIPUCcQwavEb75JNPbMcdd7TXX389044T\nJkywPffcM/XtGkeASIUNGkB94IEHbPLkyfbaa6/ZSy+9ZNttt51tvvnm1rFjR/ffGmCdO3euDRs2\nzN544w2bNm2atWvXzh1z6KGHuvXmKeUJKLjRwPI111xjn3/+ua233nq29tpr2ymnnGJrrbWW/fHH\nHzZnzhw799xz3b4DL774oq266qrWvn17t9SONhNWMET5n8D8+fPdskTyUtGSSlpKqdSifR+uu+46\ne+GFF+yVV16x2bNnuz0VNtpoI+vbt6+1atXKtY+WP9JxOubDDz+0dddd17bZZhs78cQTbfnllw90\n2c8++8z++te/umPV/s8++6wL88IqhA1hSXIeBBBAAAEEEEAAAQQQQAABBBBIu0Ccgwav7QgcktOL\nIxM26GnsSy65xA1sKzzQ4Onf//53e+ihh+zdd991/69Bbg3cHnLIIXbfffe55V0+/fRTN5D73nvv\nuUFXLf+y0korJaeFanQnms0wcuRIO+2002znnXd2T8Lfc8897uo9e/a0G264wR599FG7/PLL3YD5\n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\nsCFtLc79IoAAAggggEC1BaL8+arc2Q1+s5VWWsmOPfZY93SkFzokYfCu0rBBRi+88IL17t3bNHiz\n3HLLueWVOnXq1KDLBd07YPbs2aYnTrWW9jPPPGNz58515+zYsaN1797dPYm61lprBZo58dtvv9nz\nzz9v2rtDg0QzZsxwddpwww2tc+fOtueee9qmm25qiy666EK/Hl59vX0CNNNFszbGjRvnBty6du1q\nu+++u/Xv39/UN4rdX/b5tMmxBnNuuukme+CBB+y5557L3Oduu+3mlvvwh1sadNcsEu2T8eSTTxY8\n1n8z5dRLbSAztYPaVvtyyGzHHXe0vfbay617HmTpEZ3nsccec20pM89f7amNWmWoPVUUBma3wdNP\nP21bbrllwbetadOm5dwjRAHYs88+a/fcc0/Odt9jjz1cuzdq1Cjv+Utt/2q/v4Zx/iS8X4XhEPY5\n0hI0lBo25Hv/1Xvf5ptv7t4/tQRRdogfdvvofN98842tscYamRl4el/Xe642nS+lfP7559aiRYvM\nS/Q+pgBD72lJLHEPHEILG5LYuNwTAghUV0BT6igIIIAAAggggAAClQkEGXys7ArReHXTpk3t+OOP\nd3sV6Gl+rfmscuqpp5oG8+JWwggb5s+f75ZO0kC4ykUXXWT//Oc/G1AUG/TWwJQ2mFago4ChUNHy\nVieddJKpLfKVV155xbQm9+TJkwue64ADDrCzzz57oSdc/YPNo0ePNv1z7733NjhX27Zt7Y477rD1\n1luvpLBB9/niiy8WvFcFK5dffrmtueaabnPkY445xg3Y5yoKdrRhtwbxsksx9+xB9TfffNPZ5ruW\nBtUUuJ144ol5Bwn1FPHVV19tZ511VtG2VH0PO+ww5+dvz3LCBn2ve+mll5yVXl+o9OrVy23u6t8w\n1n98qe0fh997wobwWylNQYP0gs5s0D4++jtAgV+hokF//T269dZbBwowy21BhZ7bbbdd5uUHHnig\n21+o1M8t2v9J4ahXVlhhBfvoo4+sSZMm5VYt8q+Lc+BA2BD57kUFEUiuAGFDctuWO0MAAQQQQACB\n2gmU+qW9djWrzpX0dP1OO+2UWT4ozWGDPk8rdPGCFw0eawDJ/9RosUFvDdoddNBBmSdP9dS7nmzX\n4LaerNdT7Hqi3ytaN/v888/PuXyFjtt3330zG1frHNtss4394x//cC+fPn26Pf7445lrabaEBp5W\nXXXVzPm9+jZv3twFEXoqX4P5WjZD59M19HS87llP1I77EgAAIABJREFUyBe7P+/n7dq1c8t5aDBe\n96VzbLvttrb00ksvVK/99tvPNMtB96rBO/+xenLfH6ToWIUT2U8Jl1sv7141a0PX1kao3kbgQlL4\nctRRRy00WPf999/b0KFD7corr8xYalaE7lHn+v33301BkPz9odKwYcMylnrhe++9Z3fffbcpuNAs\nCw3yqS323nvvTCix6667Wps2bdx11Ac1sKmwyqunv911Xc2UUQghdxXdo2ardOnSZaE3iVLbvzrv\nMuGelbAhXM+0BQ3SCxI2fPXVV3bwwQdngoaWLVu6GQwKZ1X0u/zEE09kfk/1cwWw2bPhwmotbeys\nvq/faa/oepqlVWp5+OGHbfvtt8+8TCGD3m+SHDboZuMaOBA2lNrDOR4BBEITIGwIjZITIYAAAggg\ngECKBdISNvz1r391g6mDBg2y8847j5kN/7/PazkgDfCraLkd7duw4oorZn4jCg16a/klLRukp081\n8KRNODWg419aRwNGWp5JM0o0uKOBZA0uK0TwFz1lOnDgwMyT7Vrm6JxzzrFWrVplDtPnf80s0D4c\nWmZJRceoXb2NPv311c/1JOzIkSMzA92qz6+//mpLLrmke33QQX2vErnuM9eG2zo+37Ea+NIGpfLQ\nQLyWPdJyU/5STr00I6Fv376Ze9P5FAxoNsN1113nTq/BQw3Y/eUvf2lwPc3+UCCgAX3Ve8yYMe6p\n5exlkhRKaGaBF1B5y1Vlz84IumeD2lPLsnhBg+qgNvUveaKKfvDBB27jd++JawU46qteaOHdTKnt\nH4e3fsKG8FopjUGD9IKEDZplpZlu3vumZo5pGTp/USChvX6895N8YWkYLabAUoHyo48+mjndl19+\n2SBcDnodzdrTHk5eUXisADOpyyj5XeIYOFQUNgTtFByHAAIIIIAAAggggAACCCCQPgEt76PB00qK\n1nvW09cKGby13pMweBfGMkpy1cCzBvlVevTo4f5fT7J7pdCgt9bO1rJBGqDWEj461hv097eZBuMv\nvvjizGCPjtOAlRd0Zf8814wF//n+9a9/uTor7Nhiiy3s1ltvdQPkKv766olcDS62b98+bxcqZVBf\nA1Oa2aAgJDuk0yC8ZjJobwiVQsdqbwIFJJdeeqk79sYbb3Shjb+EVS+d87PPPnNPA2v/CxXN7vDP\nCsiuu2YNaNAxXxA5b9489/vkDfxnn0/XCBI2aDBRS7ZodoqKZtZo1ku+teBnzZrlnrz2lsXSclua\nmeTvc6W2fyXvLbV6bRLer2plVeg6aQ0aZFIsbPjpp5/c+7NmNinA09+9+d43P/zwQ/ceqMA3X9gY\nRnvrPUQPCeh9QkUBo2ZWlLpfg16rZffGjh2bqZZCcd2jZqalocQtcCBsSEOv5B4RQAABBBBAAAEE\nEEAAgToIaI1lLd1QTskVMnjnScLgXRTCBv/6/FqaRwPF3oyB7DbTmvw6ZpVVVnGbUmuwaokllnCH\nzZkzxz1Vryf+88188J9Pg+Paf0CD6JtssombmeE94e4fbNY5Ndui0NOrpQzqaxklPU3frFmznF3y\n3HPPdcGWSrFjNcB+yCGHuGPPOOMMt0+Fv5RSrz59+ri9H/wzUvzn+uWXX9zsBgU+KjfffLMNGDAg\nc4g2hNYgo9pTwY/O5YU3uW5USxupvrrfXOfTnwUJG9544w0XJup3PEgwpPNqU1dtEJ4raNLPS23/\nct5bav2aJLxf1dos+3ppDhpkUSxs8Ad/+WZbeaZ6P1FYrPd0/d5qr5XsGUZhtLf21dGm8F7RdbTM\nX/Zsq2LXUrirWVpajs0rmvGm97xCm80XO2/cfh6nwIGwIW69i/oigAACCCCAAAIIIIAAAjEQyB5o\nCFplDZJqwFdPMuYbSEjC4F0Uwgb/YLEG9EeMGOGeeM836J2vDTVopX00NIBcbJC+WD/wDzbrqXf9\nU2ipsFIG9QvN3lC9/LNESjm20rCh2LVUt2L3Wcw1++fFzhckbLj99ttdcKCiGQsKQxo3blywKtmb\nmj/yyCMNNpAttf1Lve96HJ+E96t6uHnXTHvQIIdiYYMCRC2N5u2PoBlrWpZN+7bUY0Bey92dcMIJ\nNmrUqEzX0WcCLblWatHST6uvvrpbPs8rWgbKWzKq1PPF+fi4BA6EDXHuZdQdAQQQQAABBBBAAAEE\nEIioQKmzGoKEDN6tJmHwLgphg54Y1ROuetrUX7QfQ69evdzmwtqQ25vBkK+r+Qedc21SXUoX9Q82\n51qeKPtcxQbN/T/XXgIa2M9X/GFDrgDB/7pix5ZSLy3tpMH6QqXY+YoZf/fdd/bpp5+6Dbc1A+WB\nBx7IbBSdPVNC5woSNvjrpDXVtaRSsZK9qXn2vZfa/sWuF4WfJ+H9ql6OBA1/yhcLG3RM9v4p+jP9\nvbrDDju4/Xw222wzt/dNLfZ50kwLLXWkJdpU9HeIZrJl7yERpF9lL8e40UYbuX2GSg3Fg1wrDsfE\nIXAgbIhDT6KOCCCAAAIIIIAAAggggECMBEqZ1VBKyOARJGHwLqywQU+TH3vssY5GT41qY+AmTZpk\nekuxQWpt7KvNnzX4nKtocEoDVf369bPOnTvb8ssvv9BhxQbeS+m6xeqbfa5ixxf7uf98pdxHsWOL\nXbfYz0u9T+94PVH83nvv2bRp0+zll192SxzNnDkzEyzkaotywgb/GvE6Z65z5Gt3f5/NDnVKdSml\nb9Xr2CS8X9XDjqDhf+pBwobffvvN7R+j0E/78OQq2jdh1113dTPRtCl8qUsaBe0Heg/SEk2acaHS\nqVMnFxCUul+D7kkzJBRm+v/+17Jy+Zb8C1rHOB8X9cCBsCHOvYu6I4AAAggggAACCCCAAAIRFGjX\nrp29/vrrBWumkOGUU06x/fbbr+RlHpIweBdG2JC9lr8GmUaOHNlgJkKQwVvtoXDTTTfZVVddZa+9\n9lredlPwoDbTXgX+5XL81yg2I6BYdw1SX/85ih1f7Of+cxULEEo5tth1i/0826nY8Zox8Oyzz7q9\nHbyNpPNZa+aKBgG1WatKOWFD9ubQpYQNhZyL3Wex/hPFnyfh/arWrgQNDcWDhA16hd4HXn31VTc4\nrw3g84UOOlaz1/T71qFDh9Cb94YbbnBL8nlF+/2MHj265FkVuu9u3brZl19+6U6lvZw0M0tBRtpL\nlAMHwoa0907uHwEEEEAAAQQQQAABBBAIUWDixInuKfh8RSGDlu7Zf//9Sw4ZvHMmYfAujLDBvzGz\nbHItx1PK4K2eitdSOw8++KDdd999bsPhXINVGtBWG3hPliqo0CbPKoQNf/bSYu7Ffp79+1PoeA0w\naikrzVCZO3du5qUKhzbYYAO3CbeeYt54441tzTXXtGWXXbZo/Yoto1TJzAb/RtzMbAjxzTchpyJo\nWLghg4YN/lcqRJ4+fboLHaZMmeKWYsouel9Q+Kf3hrCKgkwF0ppl5xW1aaHPBbmurfe1IUOGuL1g\nvHLBBRfYkUcemepZDX6rqAYOhA1h/TZxHgQQQAABBBBAAAEEEEAAAcs3q6GSmQzZrIQNf4o8/vjj\n1qdPHxcING/e3O6///6FBo1KHdT2W2vmhGY6KHy4/vrrTUsuqehakyZNso4dO7r/9z+pHuaeDUGe\nli92f8V+7r/fuM5s+Oijj2zgwIEuHFLp37+/2yy2devWOZdJyd43oZyZDbpOOXs2aCBy+PDhpsBB\nJXtfjlLaKy5vt0l4v6qVNUFDbulywgb/mfQ7P2vWLDf7SbMOJk+enPmxZh2cf/75oQ3g//DDD6bl\nmrzZjc2aNbO3337bVlpppZK60d1332277bZb5jW9e/e2sWPH2gorrFDSeZJ+cBQDB8KGpPc67g8B\nBBBAAAEEEEAAAQQQqJFArlkNrVq1smHDhlU0kyG7+kkYvKt0ZoM2dx46dKhdeumljifXfg3ZA8JB\nBu/zdRVt7qmnVb29HfyzKJ577jnr3r27Cz169uxp48ePNw0wFSresk3qHxoo174Q5dS32OB0sZ/7\n6xjXsEFB0ODBg92t7LzzznbdddfZKquskpdfg4FHH3105snjcsMG/8bg2uBaTyD7l9fKVYF58+a5\n5VX0tLXKI488Ytttt13m0FLaq0ZvaxVfJgnvVxUjBDgBQUN+pErDBv+ZNYNN79FawlBFyxTpve8v\nf/lLgFYqfsjUqVOta9eumQMViN96660l7degZdo0I+vNN99051HAoPcM1ZWysEDUAgfCBnopAggg\ngAACCCCAAAIIIIBAKAL+WQ1hzmTIrlwSBu8qCRv0lOqECRPc4L+3zNFdd93lNv7MLvkGbzVr4f+x\ndyZgV03t/1+vyNyEDCmKyqxSaKRZCZEIGZIpZUpkCNcfUUmmRKYicgkZQpnKTCIykyGXWeZZeN//\n9Vnvb593P6cz7H3Ons7Z3/u6noues8bvWns9Z9/fdX9v6uDs5dbp+PHjTZcuXQruA3dbF110kTnz\nzDNt+S+++MIcdthhNgEoUQ84DQu1lU2U3HfffdZJjvl1NhcrX+xz94QrlWzwmzMj23FZKtnw5ptv\nmoEDB9ok1Gios+477LBDwT2EI3LQoEF2z3D7mX3ctGnTTB0/6xXIoRVBI9VwXoUNk4iGwggXIxtI\nyEyU0CuvvGIgcJEbWmuttfI26m4PCSXwR2ItCEMa7bzzzss0xVhGjRrluWnIUCKziLbA1l57bXPV\nVVeZQw89tGTpRc+dV3DBJBEOIhsqeCNp6EJACAgBISAEhIAQEAJCQAgIgaQg4NxyxtFBToZSEj97\nnUs1OO9KJRu4lTp37lyrz+/IGuHoxxlTp06dlSAs5LzlJvrIkSNtHbSxx44dm1dKIzshsJsggPyg\nLdrACo2Hz5988kmb44Hx9+jRwyanhqTA/Dqbi5Uv9rkbsGogG4pJoqDjTkTMlClTMlMvlWzIJo2Q\n0MJBiHMwlyHjQgQEewcj4gmn4qqrrpop7me9vJ4XcZerhvMqTAxFNBRHtxjZwFl68MEHm+eee85A\n9N911102MiCfuUm/fFFxxUe1cglk0pA7css0LVy4MCO5V6zNn376yZ4JJLjGGjVqZBNL77PPPma1\n1VYrVj31nyeFcBDZkPqtKACEgBAQAkJACAgBISAEhIAQEALlI9C3b197sz5MksEZZTU47/yQDX//\n/bchYe9LL71kb6/eeeedmQXjdjg61twsz2WFnLfum+nrrruuOffcc82wYcNWchbjVL7uuussiUQk\nRdeuXa0MB44gx7LzBhx99NGWvNhggw0yZSAlmAMJPnFAYbSLBNC//vUv+2+/zuZi5Yt97sasUskG\nknnjjMNYR4gEHI+rrLJKDew/+ugjM2bMGBtN4LbsvAl85k4QnZ2jw133tddes5EKRDdg5Isg6gXS\n0W0ffvihvd3syCfl27d+1qv8UyuaFuI+r4hiAnuIqKBurweFnIgGb0gWIxtw8uOk5/nBkLUjL0rr\n1q0zZ6vTE5FsyKgR1ZbrDPY2otylIDNbtGhhPv/8c1sAOb3333/f1K1bt2Cz/I3hXDrjjDNsbgmM\nKCnIy+7duyuiwceiJIFwENngY8FUVAgIASEgBISAEBACQkAICAEhIARWRuCPP/6wzgD3DeUwcYrb\neRfE3LKdR6W0icP26quvXikptLutQs5bnP/kfDj55JMzVbgViy62Q17guCARNePFGjRoYMjXgHxO\ntrkjFpyy5GLYdtttDQ5PPqctx3LdhPfrbC5Wvtjn7jlUKtlAHgQiBrJJKKJGIB8giJ555hmLP9ay\nZUtLGLGOGLInJG12G880kSpOBAQSaUhd0R6kYvPmzW1x9hAEAhEyTqQNZXAQtmvXzuAE5bY1yasd\nyS/6h2TKJbXlZ71KeWbiqJOE8wqZNCJJDjjgAMN4WIO4TUSD9xUoRjbQUjbhy+/IndCpUyf73HIG\nZz+LBx54oI2Kc5PC3kdlbJsQDETcEXkAcQmp5diuu+5q5fqIuoNQ/uuvv0zt2rXtx5AQJKxesmSJ\nzc3gnE98jxgxYoQ9fyC0HSLaz7jSXjZuwkFkQ9p3oOYvBISAEBACQkAICAEhIASEgBCoMASS4Lwr\nF7JyyAYcRzjqccYUcxIVc94SNUFCYW68f/fddwWnhYMSSYvevXvndQC9+uqr1nHtltHIbpTxI+XD\n+LMTChcbb3ZbxcoX+9zdXqWSDcwBzXYc/oVwpxwSV9yAJnJhr732srkT0EKHtGJd3JZNHjmf4STG\nSekYhANOQ0irRYsWFdxD/fr1s3ryW221Vc5yftar3GcwqvpJOK+QQWvSpIn55ptv7LQHDBhgb8Hn\ni4gKGxsRDf4Q9kI2+DkHKMvfEPYABHKpNn36dDN16lQD4fn111/b/+YyzhaIA/qCPHjvvffM8uXL\naxQlxwQEJERDt27diiabL3XMaakXJ+EgsiEtu0zzFAJCQAgIASEgBISAEBACQkAIVAkCSXDelQul\nH7IBR02rVq0Mt8s7d+5sHTENGzb0NASvzlscRffee6/NB4EkjhPJAMHQvn17g643EQ/59Pjdg0ES\nA03wmTNnWie00xa3XIl0GDx4sNUVz3Vj1et4nf6KlS/2uXvclUw2MA8cyqwf+VOQqSLSgL2z8847\nW1kVpJaQOAF3nM6QDPPmzcub3BkSgYSzEydONA8//HCGjHInB8+37txWpi7GuhNlgZY7si5ueafs\nTexnvTw9AAkolJTzCpIHks9tRDqQzHebbbaJDCkRDf6h9ko20DIEMs//rFmz7DMIAUxUUb6zwP9o\n/luDfoiacCTxSmmnTZs29nzgXIBoaNy4sUiGUoDMUycuwkFkQ4CLqKaEgBAQAkJACAgBISAEhIAQ\nEAJCIHwEkuK8C3+m6kEICIFKRyAp5xVkFCRf9o1y8EUai3FCaIZpIhrCRDf6tpFb++2330ytWrWs\npFo2gYzEEgR1PikkZNaIaOBzR14p+llUd49xEA4iG6p7T2l2QkAICAEhIASEgBAQAkJACAiBqkMg\nKc67qgNWExICQiBwBJJ0XpG7gSS8uQyHL9EnF154YSiRDiIaAt9aalAIeEIgasJBZIOnZVEhISAE\nhIAQEAJCQAgIASEgBISAEEgKAkly3iUFE41DCAiBZCKQpPOqUHSDGz0ktxg38m1BmIiGIFBUG0Kg\ndASiJBxENpS+TqopBISAEBACQkAICAEhIASEgBAQAjEgkCTnXQzTV5dCQAhUEAJJO68mTJhgRo8e\n7QlBkoiPHTu2LHklEQ2eoFYhIRA6AlERDiIbQl9KdSAEhIAQEAJCQAgIASEgBISAEBACQSKQNOdd\nkHNTW0JACFQXAkk7r9DZ33TTTc23337rGWgSu5O8m0S+fkxEgx+0VFYIhI9AFISDyIbw11E9CAEh\nIASEgBAQAkJACAgBISAEhECACCTNeRfg1NSUEBACVYZAEs8rP9EN7uXo27evzenghXQQ0VBlG1nT\nqRoEwiYcRDZUzVbRRISAEBACQkAICAEhIASEgBAQAulAIInOu3Qgr1kKASHgF4EknlelRDe4573H\nHnvYSIe2bdvmhENEg99dovJCIFoEwiQcRDZEu5bqTQgIASEgBISAEBACQkAICAEhIATKRCCJzrsy\np6TqQkAIVCkCST2vxo8fb84444yyUO/Vq5fN6eAmHUQ0lAWpKguByBAIi3AQ2RDZEqojISAEhIAQ\nEAJCQAgIASEgBISAEAgCgaQ674KYm9oQAkKguhBwn1fbbrut2W677RIxwX/++cfMmTPH/Pnnn2WP\nh5wOY8aMMcuWLTMHHXRQpj3m+uCDD5omTZqU3YcaEAJCIHgEwiAcRDYEv05qUQgIASEgBISAEBAC\nQkAICAEhIARCREBkQ4jgqmkhIAQCRcB9XgXacMIbE9GQ8AXS8ITA/yEQNOEgskFbSwgIASEgBISA\nEBACQkAICAEhIAQqCgGRDRW1XBqsEEg1Av/v//0/w5lV7dasWTPz999/GxyXjt1+++1m0KBB1T51\nzU8IVDQCQUufiWyo6O2gwQsBISAEhIAQEAJCQAgIASEgBNKHgMiG9K151DP+5ptvTK1atUy9evXM\nv/71r8i6//XXX63Dtm7dupH1qY7CRcB9Xu2///6GnyTY999/b0444QS738qxRo0amfPOO88MGTLE\nfP755wZJpTfeeEOEQzmgqq4QiAiBoIkGhi2yIaLFUzdCQAikE4EoX0zSibBmLQSEQBgI/Oc//wmj\nWbUpBISAEAgMAZENgUGphnIg8NVXX5kjjzzSLF261OCIadOmTSQ44fTt1KmT+fLLL80jjzxittxy\nS7PKKqtE0rc6CQ8Bd2QDZxeO+STYiBEjzNVXX13yUMjDcNZZZ5mhQ4eaVVddNdNO0JIsJQ9QFYWA\nECiIQBhEAx2KbNDGEwJCQAiEiIDIhhDBVdNCQAiEhoDIhtCgVcNCQAgEhIDIhoCAVDMrIfD888+b\nY4891ixfvtxMnz7d9O7dO1KUSKZ76KGHmr/++suSHeuvv34NR26kg1FngSCQRLIBQmuzzTYzK1as\n8D1H6kEyQMi5SQZ3QyIcfMOqCkIgUgTCIhpENkS6jOpMCAiBNCIgsiGNq645C4HKR0BkQ+WvoWYg\nBKodAZEN1bHC/L2ZM2eO+fe//513Qn/++adZffXVc37OZ3zf3nrrrQ1SLkgPIX1Uqr399ttmv/32\nM++8846ZMmWKGTZsWKlNlVWPvocPH246duxoZs+ebRo2bFhWe6ocLwJJJBvYX+wzP+aFZBDh4AdR\nlRUC8SAQJtEgsiGeNVWvQkAIpAgBN9kg512KFl5TFQIViIDOqwpcNA1ZCKQYAZEN1bH4v/zyi+nR\no4dZuHBh2RPafffdLVFwyCGHmAYNGvhu78cffzSDBw82DzzwgDn55JPNuHHj8pIcvhv3WeGff/4x\no0aNMpdffrm9PT5x4kRTv359n62oeFIQSBrZ4DeqwS/JIMIhKTtP4xACKyMQNtEgskG7TggIASEQ\nMgJy3oUMsJoXAkIgMAR0XgUGpRoSAkIgAgRENkQAcgRdkAy5W7dupnbt2ub999+3uQqyrUOHDplf\ncXmHH/IY8F8S3H788cfm999/z5Rp1aqVueKKKwz18km8ZPfhdu63aNHCPPbYY6Zx48YRIJC/C4iY\nww8/3EY2oK1/ySWXmDXWWCPWManz0hBIGtngNVdDOSSDGylJKpW2b1RLCASNQBREA2NWzoagV07t\nCQEhIARcCMh5p+0gBIRApSCg86pSVkrjFAJCAARENlTPPvjtt9+s9BFSSXPnzjV9+/bNTG7zzTc3\nS5YsMXXq1DF//PGHzWPA3ysSKWPIL+HIJLfCtddea5BVwrbaaisrEdOlSxdPskrkaaDfH374wTr1\niSpIgt13332mf//+dii33367GTRoUBKGpTH4RCBJZMNnn31mmjVrVjBXA5JknLFHHHGEZ8KuGCQi\nHIohpM+FQLgIREU0MAuRDeGupVoXAkIg5QjIeZfyDaDpC4EKQkDnVQUtloYqBISAyIYq3QNOrgJn\nejjXZ8yYUdThSZLbe+65x5x++umWfHAIh5kzZ5rWrVsXRAuC4rjjjrOERdeuXQ0O/nXXXTcRCBOx\nseeee5oFCxaYAQMGmGnTpiVmbIkAqEIG4SZH+f/zzjsvtpEff/zx5pprrsnZP+QeiZ+HDBlS9Jkr\nZQIiHEpBTXWEQPkIREk0iGwof73UghAQAkKgIAJy3mmDCAEhUCkI6LyqlJXSOIWAEAABRTZU3z4g\nSgGn//XXX5+ZHHkTRo8e7Xmyt9xyi5Uecuzoo482l156aUEH/VNPPWV22203W+Xqq682OGOTZFde\neaU56aST7JAefvhh06tXryQNT2PxgEBSIhvy5WoIm2RwQ5RGwoGz7d1337XPL8Qh0VrIv2EtW7a0\nhCi5a/baay8lg/fwPKmIPwSiJhoYnSIb/K2RSgsBISAEfCEg550vuFRYCAiBGBHQeRUj+OpaCAgB\n3wiIbPANWeIrIKfUs2dP89xzz2XG+sQTT2SIAC8TIPfCHnvsYXMuOHb33XfbxNG5jD7POeccM2nS\nJCu9hJxSvXr1vHQVWZlvvvnGtG/f3ua0gDwhafRaa60VWf/qqHwEkhLZkJ2rgZwMY8aMCVQuyQta\naSEcIBmefPJJM378eEs0FDMiqiA7Tz31VLPBBhsUK67PA0Jg+fLlZurUqebAAw80zZs3D6jVZDQT\nB9HAzEU2JGP9NQohIASqFAE576p0YTUtIVCFCOi8qsJF1ZSEQBUjILKh+hb3iy++MJtssklmYuut\nt55ZtmyZWWeddXxNdsKECTWiIYgEmDNnjk1CnW048jt16mRvHZ9yyimGul6TSvsaVBmF3cmr69ev\nbx555BHTtm3bMlpU1agRcEc2IKHE+RW1uaMaiGQ4++yzIycZ3HOudsLh559/NhdddJEhOsttu+66\nq+ncubPhfMPefvttA6nqRDrwu44dOxoimtq0aRP1NklVf0joIU0HgbvGGmuYO+64w0aaVIvFRTSA\nn8iGatlFmocQEAKJREDOu0QuiwYlBIRADgR0XmlbCAEhUEkIiGyopNXyNlbyKxxyyCGZwvvss4+5\n8847zWqrreatgf8rxQ1iohsca9q0qZUtyZWHgaTSw4YNs0WRbzrqqKN89RVVYcZ2zDHH2O64JU1u\nClnlIJCE84p9Pm/evNhJBveqVSvh8N1335kzzjgjIwnH2UPSeSKTNt5445U2Lk5vorEggDirsF12\n2cU6wrfeeuvK2egVNtJvv/3W/s3hb8aOO+5YVWRDnEQD20BkQ4U9DBquEBAClYWAnHeVtV4arRBI\nMwI6r9K8+pq7EKg8BJLgvKs81JI7YuRGkHhxJ66dOHGilRPxa9kREkQqfPbZZytpoePgO/LIIw0k\nB/bGG2+Ybbfd1m93kZR/6aWXTLt27WxfSH2QW8K5GR3JANRJWQjEHdnwxx9/WEcqjtWkRe5UG+HA\nuQJpQK4YjJvykJrkhXF/1861oYhyIDn3woWEm06GAAAgAElEQVQL7ccDBw608j5ENMmCR6BayYa4\niQZWSmRD8PtVLQoBISAEMgjIeafNIASEQKUgoPOqUlZK4xQCQgAERDZU1z4gdwLOOJzqjvH/O+20\nk++JIr1ENIPbFi1atJL0EDrd3bp1syQDsjKvv/66b8kmpw/Gzw9OXeSauMm85ppr1hjDDz/8YP7+\n+2+zyiqrmNVXX93mXSjmfHQa+P33303jxo0NzjFyS5DXQg5I31sjtgpxkw2xTdxjx9VEOCBztv/+\n+xtklMiJcfPNN/vKOzN//nwzePBgA2mKFco54xFeFcuDQDWSDUkgGoBbZIMeOyEgBIRAiAjIeRci\nuGpaCAiBQBHQeRUonGpMCAiBkBEQ2RAywBE3/+abb5rtttsu0ytSI+RRyCV9VGxozz77rM3D4LZ7\n7rnH9O/fv8bvaB/HPdanTx9DGUgAPwYJgNTJ008/bd566y3z2muvmX79+pkOHTqYww47zDRq1Mj8\n9ddftsyjjz5qXnzxRbNixQorjbL33nub4447zmqFFzPyNqDzTgJrbPHixaZ169bFqunzhCAgsqH4\nQlQD4fD999+bY4891sq/YWeddZZh7f1EkxAZgUwaORuwI444wkyePNmsvfbaxUFUCV8IVBvZkBSi\ngUUQ2eBrK6qwEBACQsAfAnLe+cNLpYWAEIgPAZ1X8WGvnoWAEPCPgMgG/5glucZ1111nnXSO4Yi/\n6667fOdroH527gd+9/LLL6+UbPXWW281hx56qO0SLXWkTog68Gq//PKLueSSS8z5559viZItt9zS\njveVV14x77//viHnBLJQ999/vyUVIBj69u1riLKgDDefcUpyC9qLgQ84YbRLm7LKQEBkg7d1qnTC\nAaIT4pJnu3nz5vYM22GHHbxN3lWK/A3IMPXu3dt06dLFtpGPsICcgISELIX05GzBICMhKA844ACb\n/6EQ4XHBBReYc889N5O3YIMNNrBnzfTp0y3pS9QZ59RBBx1k5dv8lncDgGQeMlE4xksdr7s9osVo\nb9asWTnbGzRokJ2/+2zPRUhnL9IzzzxjE3VXiiWJaAAzkQ2VsnM0TiEgBCoSATnvKnLZNGghkEoE\ndF6lctk1aSFQsQiIbKjYpVtp4DifSH584403Zj678MILre55KTZmzBgzduzYGlW5wdqgQYMavzvl\n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\nhQik7WU4bfOtwi2rKQmB1CAQ13mVK6rh0ksvtY7gcg1H9GmnnWaIHhg0aJDNe5DPFixYYLp162Y/\n3nLLLW1+hFKSMNMXRAnJqF966aUa3Z100knmggsuyBAOn376qc0p8cUXX5ibbrrJdOjQIe/4IGW2\n2GIL8+2335qGDRuad99919SrV69ciCq6PtEo5OEA648++milufB7foh2GDp0qC3rtu22287MmjXL\nbL311hWNA4OP6/mNEziRDXGir76FgBDwg4DOKz9oJaesCIfkrEXSRiKiofCKiGxI2o7VeIRAlSOQ\ntpfhtM23yrevpicEqhqBOM4rnMX9+/c3jz76aAbbuBzpEyZMyCSj5mY8YypFZufzzz83jRo1yrtX\niLCAdMBGjBhhZZtmzJhh9t5774KySGDVu3dvQ4QDBqGBNFRaDQLh3nvvNQcddJDZdtttzahRo0yb\nNm1s1AJrx3pi3CaF9IFogOg54YQTzH333WcWL15sI14ge6688sqKJ27ieH7j3nty3sW9AupfCAgB\nrwjovPKKVPLKiXBI3prEPSIRDcVXQGRDcYxUQggIgQARSNvLcNrmG+BWUVNCQAhEjEAc59Xs2bPN\ngAEDaswUR/8jjzxiVltttUgRGD58uJkyZYrtk2TMt956q+/+cXQTkYF8Erbpppua+vXr2ygJt5FP\ngBwNSDZBPIwbN65oFMWKFStMv379MsTMjTfeaI488kjfY8yugLwQTpCorHXr1mbw4MF2/qUa0SNL\nliyx5AL75YYbbrBRH47lInzIcUGuizfeeMPi9vLLL9vi66+/vpVeypa38jM2iA/ynBAJ436O/LRR\nbtk4nt9yx1xufTnvykVQ9YWAEIgKAZ1XUSEdTj8iHMLBtRJbFdHgbdVENnjDSaWEgBAICIG0vQyn\nbb4BbRM1IwSEQAwIxHFeXXXVVebEE0+sMVuc/pMnT44UARz5w4YNs1JGGLfkL7nkEt9jICcAhAAk\nA/JNONVJ4oyc09tvv20d3e+8844lU/hvnz59rIzPOuusU7Qv8k/su+++GSmgiy66yEoElWvIMW21\n1VblNuO5PhEcd9xxR1FypVCDX331lcX2s88+szkxdtxxxxrFyZfRo0cP88orr9jfb7/99jZXA7JT\n5Lo47rjjMuW7dOliHnjggZLIhr/++svceeedmTwQSHWRTyNfMnDPIJVQMI7nt4RhBlpFzrtA4VRj\n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\nGsYQyJJdUrKhZAGpUnVi6mkM1v/lL3/J1Y5lgGIt8kEGxLq1NxIBkWiITUc333zz/LTsgQcemH7+\n85/P9ZbYbDpmPSy99NJ90d111135qd577703bbXVVumUU04ppL59XbztpFjWZMstt8xPN6+44op5\noG+qjWIHLb/M5zdtMKtp7S1z3+tVt3jCP2YexFP5rWPJJZfMg/MLLbRQr7cX+vonPvGJdMQRR+Qy\nI0G6zz779F1+3EjHLIVIzsZx5ZVX5k3sI7kRyYQPfvCDeR+cOGJ2w6WXXprienPmzMkbYkfS4Vvf\n+lZ+PT7T99hjj76uHe+PhG4csZzeUUcd1XWZqL4KdNLIBXxejZzcBQkQIEBghAJnnnlmvgcs8og9\nuD7wgQ8UWaSyCBAgMFKBIhMOEg0jDV1pLybZUNrQlLNirT0U/uu//isvcRRLe7SOeEo/Zh286lWv\nygPn8VTsdI4///nP+QnZX//61+naa6/NA2QxeBZrgMc66vG0bqwNHgNmsRxSLAsyyHHooYfmwbQ4\n4injjTbaaJC3F3JuuLV+lJ544om5HU05mjaY1bT2VrkfxwyG2Mej/YgN3GMJpelsbj9di0hG7rDD\nDilmN8QR/47kZL9HzPyKz7X4/PzVr371nGRsLCEXidzWEUslffe7382fs9tss00699xzJ16LPSZi\nL5l+jkgu7LrrrvnUSBJHMrfXjLN+ynXO6AR8Xo3O2pUIECBAYLQC/cxqiAfZYrZCJBDiiCUv42G3\nqfZmMLthtHF0NQIEhiNQRMJBomE4saliqZINVYzaGOt8//33581Kex0zeao1NnOOmQ2xbvhiiy02\n16VieaXLL788JzVe9KIXTWtWQpQRT+rGEiLvfOc78+yChRdeuFeTCns91lCPAcyf/OQnac8990z/\n+q//mtdNb8rRtMGsprW3qv04PnfiKf7Yu6D92HfffdN+++030mbF7IO4uY2l1uKIwf/3v//9fdUh\nPt9iGajYhLpbIjPaGZ89reP000/PT/nFJtKx504kk1tHzHCIz6t+jvYfl+uuu25e3m6++ebr563O\nKYmAz6uSBEI1CBAgQKBwgalmNbzuda/LMzzj91f87mv99os/i38i+RB/FstMTnaY3VB4uBRIgMAY\nBGaScJBoGEPASnxJyYYSB6eMVYunOuKJ2JhN0BpEikG61gDF73//+3TPPffkJZU23XTTMjYh1ymW\n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\nO1HRs3FOGImAz6uRMLsIAQIECJRYQLKhxMFRNQIExi7gfmHsIahEBSQbKhEmlSRQH4GmfTk1rb1V\n76kPP/xwWm211dKdd9450ZRYXilmCPR7xCD+Jz7xiby5dOtYfvnl07XXXpte8pKX9FVMzGqI2QVx\n7LTTTumYY47pmfCI2RSbbLLJxPJL8d4vfvGLae+990533XVXTn7EUkpxLLXUUin2WGh/MiX+/IEH\nHkiRYLnmmmvSDTfckFZeeeW+6htLNn34wx+eSGZE/TfddNO+3uuk8gj4vCpPLNSEAAECBMYjINkw\nHndXJUCgGgLuF6oRp3HXUrJh3BFwfQINE2jal1PT2lv17hyzGyK5sOGGG87VlEgcbLfddukFL3jB\nlE2MvRpiRsJee+0113kxqyD+vN9ZArGk0xJLLJGiPrGM0ze/+c2e+yfcd9996ZWvfOVc173++utz\nkqF9iaM4Ydlll0233377XO15/PHH8+yH0047Lc9MOOSQQ3omOFoXi+Wb3vzmN09sah1LOcU1HNUS\n8HlVrXipLQECBAgULyDZULypEgkQqI+A+4X6xHKYLZFsGKausgkQeI5A076cmtbeOnT5SBjEckO7\n7bbbXM3ZeOON85JE73znO/Mmz639CGKJohhsj/0NTj311HTVVVelNdZYIy255JL5/+O47LLL5tp8\nupdTzFKImQ0XXXRRTiDEPgovfelLp3xbbOq8yy675GWfYibGjjvumGKj5pihEJtVr7jiinnD5gsv\nvDCXc9ZZZ+U/jw2hf/azn+VZEN/4xjfyrIxYuik2yO73uPfee9OrX/3qfPo///M/542xX/GKV/T7\ndueVRMDnVUkCoRoECBAgMDYByYax0bswAQIVEHC/UIEglaCKkg0lCIIqEGiSQNO+nJrW3rr05ZhR\nEDMFvvKVr+S9B9qPGESPgfvYgDmWD4qB9h/96EcplmCKAfdYTmj33XdPTz31VE4YxCbTsYxRzFTo\n93jsscfSYYcdlveQiOPSSy9N73rXu6Z8eyQNIqkRCYY4YnZG1C+WRHrNa16TkyELLrhgXpbpggsu\nSK961avSSiutlOJaN998cz43llz6l3/5l76Xe2pV6Otf/3qaPXt2/t9IyJxwwgnpRS96Ub/NdV5J\nBHxelSQQqkGAAAECYxOQbBgbvQsTIFABAfcLFQhSCaoo2VCCIKgCgSYJNO3LqWntrVtffuihh9J3\n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\n80xa1ZZ79Itzzjknr3H+u9/9Lp1++unp4osvTjfccMOE7/vf//48O+bFL37xRFkPP/xw7k/nnntu\nuuqqq6Y8t70C7fG+5ppr0lve8pZ09913543M47rRnkUWWSS9+c1vzkuhRFzbr9vZmH77T7xvHHEf\ntJ84nwCB6Qm09mqIpZPaj+233z6dfPLJ0yvUuwgQIECAAAECBAoRkGwohFEhBAjUVECyoaaBLbhZ\nY082nHXWWempp55KH/rQh/Igbhw77rhjOvzww7sO3vabbHj22WfTj3/84/Txj388XXvttVPSbbDB\nBunggw9Oyy233KTn9Rosfvrpp1O0Zffdd88JhqmOT37yk+kzn/lMHqzudvz2t7/NMz4iQTLV0ave\n/faXIuv/+OOPp+OOOy7tv//+PS2ifrvssksK38k82pMN4fujH/1oSuNI6HzlK19JSy21VPr2t7+d\nY99apqvTIhIIMbgXCYzOozPZcM8996SPfvSjXdvzxje+MR1xxBFptdVWmzSR1Kv/tK4/6rj32z+c\nR4BAMQKtvRo6S4u9G+688870mte8ppgLKYUAAQIECBAgQGBgAcmGgcm8gQCBBglINjQo2DNoaimS\nDYsuumj67ne/m7bccsuJ5ZTOOOOMtMUWW0w6cNtPsiESDTFQH4P/MYAbRzxR/453vCPFwPAzzzyT\nZx5EEuIvf/lLfj0GnWMZpzXXXHPKweczzzwz1639iAGknXbaaaKseGp/9dVXz9eM8uPp+HiyvnV8\n7GMfSwcddFCab775nnOtn/70pzn5ErMaOusd/3/rrbemK6+8cmLgO2ZlHH300en1r3/9tLtCUfV/\n7LHH0l577ZWOOeaYibrEDJJ3vvOdKeIc7p31jxP33nvvtN9++z1ndklrkH755ZdP73rXu3ISIzyj\nzVHm/PPPn2666abs0Yrjtttum2KWQxhH7NvPjRkuF1100UTd4txITnTOSmhPDuy55545KRFJpNjE\ndb311sv/vuOOO3KCrJVcij+LmToR+86jn2TDOOI+7Q7jjQQIDCzQbVZDqyCzGwYm9QYCBAgQIECA\nQKECcU8aCYc45syZM/HfhV5EYQQIEKiogGRDRQM34mqXJtkQT9Z/6Utf6ms5pX6SDfEE/Ac+8IGJ\nRMNWW22VDjjggPTqV796LuK77rorxUyD1gyCGJiORMfSSy8913lTDRbHfhOxfE8sGRQDzjHw/+53\n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\nAgQI1E5AsqF2IdUgAgQIECBAgAABAgQIECBAgAABAgQIECAwWgHJhtF6uxoBAgQIECBAgAABAgQI\nECBAgAABAgQIEKidgGRD7UKqQQQIECBAgAABAgQIECBAgAABAgQIECBAYLQCkg2j9XY1AgQIECBA\ngAABAgQIECBAgAABAgQIECBQOwHJhtqFVIMIECBAgAABAgQIECBAgAABAgQIECBAgMBoBSQbRuvt\nagQIECBAgAABAgQIECBAgAABAgQIECBAoHYCkg21C6kGESBAgAABAgQIECBAgAABAgQIECBAgACB\n0QpINozW29UIECBAgAABAgQIECBAgAABAgQIECBAgEDtBCQbahdSDSJAgAABAgQIECBAgAABAgQI\nECBAgAABAqMVkGwYrberESBAgAABAgQIECBAgAABAgQIECBAgACB2glINtQupBpEgAABAgQIECBA\ngAABAgQIECBAgAABAgRGKyDZMFpvVyNAgAABAgQIECBAgAABAgQIECBAgAABArUTkGyoXUg1iAAB\nAgQIECBAgAABAgQIECBAgAABAgQIjFZAsmG03q5GgAABAgQIECBAgAABAgQIECBAgAABAgRqJyDZ\nULuQahABAgQIECBAgAABAgQIECBAgAABAgQIEBitgGTDaL1djQABAgQIECBAgAABAgQIECBAgAAB\nAgQI1E5AsqF2IdUgAgQIECBAgAABAgQIECBAgAABAgQIECAwWgHJhtF6uxoBAgQIECBAgAABAgQI\nECBAgAABAgQIEKidgGRD7UKqQQQIECBAgAABAgQIECBAgAABAgQIECBAYLQCkg2j9XY1AgQIECBA\ngAABAgQIECBAgAABAgQIECBQOwHJhtqFVIMIECBAgAABAgQIECBAgAABAgQIECBAgMBoBSQbRuvt\nagQIECBAgAABAgQIECBAgAABAgQIECBAoHYCkg21C6kGESBAgAABAgQIECBAgMB0BL7whS+kfffd\nN7/1zDPPTFtsscV0ivGeMQuMOo6jvt6YeV2eAAECBAh0FZBs0DkIECBAgAABAgQIECBAgEBKaVyD\nxg8++GA6/vjj0+zZs9PSSy8tFjMUGHUch3U9/WKGHcHbCRAgQGDkApINIyd3QQIECBAgQIAAAQIE\nCBAoo8CwBo27tfWJJ55Ip5xySjriiCPSi170onTOOeekZZddtow0larTqONY9PX0i0p1N5UlQIAA\ngTYByQbdgQABAgQIECBAgAABAgQIjGFmw8MPP5yXavr2t7+dVlxxRcmGgnph0YP/vapV9PX0i17i\nXidAgACBsgpINpQ1MupFgAABAgQIECBAgAABAiMVKHrQuFflDSr3EqrG60X3G/2iGnFXSwIECBB4\nroBkg15BgAABAgQIECBAgAABAgTMbNAHpikg2TBNOG8jQIAAgdoJSDbULqQaRIAAAQIECBAgQIAA\nAQLTESh60LhXHTzB3kuoGq8X3W/0i2rEXS0JECBA4LkCkg16BQECBAgQIECAAAECBAhMS2DQQdZe\n57e/fs0116S3vOUt6e67705HHXVUuvjii9Mvf/nLtMgii6Q3v/nNabPNNksbbbRRevGLX9xX3WMA\n95vf/GY677zz0rXXXpv+8pe/pLe+9a3pAx/4QC5r0UUXTb3q136hBx54IF1xxRXpwgsvzPW65ZZb\n8ssveclL0korrZTLnj17dnrd616X5plnnrnqGNdfffXVp6x3q/2dJ/3tb39LN954Y/ra176Wrr76\n6onrrrzyymmNNdZIH/zgB9Oqq66a5p133r5cOk965pln0uc+97l04IEH5pcuv/zytPbaa09a1pNP\nPpk+/elPp8MPPzy//q53vSudccYZ6WUve9mk58d5u+++e37tpJNOSjvssMNzziuifYPEcbJ+EZbv\ne9/70tZbb53+4R/+IfeXVrw+//nPZ5/2Y7LrRblnn312Ov/889MPf/jD3N+i3LXWWit96EMfSsst\nt1z6u7/7u0L6RfTFuE70xeuuuy498sgjuR+ussoqaZ111sl/T5ZZZpnnXG9aHcSbCBAgQIDAFAKS\nDboHAQIECBAgQIAAAQIECExLYJBB3bhAr/M7kw333HNP+uhHP5oHTyc73vjGN6Yjjjgirbbaal0H\nUp9++un0jW98I+233345KTDZseyyy+ZyYlB4zpw5+ZQzzzwzb97ceTz++OPpuOOOS/vvv3/XerW/\nZ5dddsntjiRJ65husuG3v/1t+sQnPpETJlMdG2ywQTr44IPzgPZ0ju985zt5kLoVs89+9rOT+j74\n4INp8803z0mXOJZeeul07rnnphVWWOE5l43B9ohlJCO6nVdU+3r1s6hcJDX+4z/+I+2zzz5d+0XE\n7LDDDkuvec1r0tve9rbcpl7JhtNPPz3NN998U5YbiYC99tor7bHHHvnc6faL6NtnnXVWTuB0+zvS\n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\nINlQr3hqDQECBAgQIECAAAECBEYm0D6oe8ABB6TPfOYzXa99xx13pE022SRvphxHr2TD1ltvnY46\n6qgpN7WNmQyxl0AkMmK/gKOPPjrFEj5x/OY3v0kx++DGG29Mr33ta/NmwLEEULej/fzJ6jfocj+/\n/OUv88a8sXF0t/b2k2xo3x8hyplsKaLONt17771p++23T0899VT6+7//+7xsTueMgn47SfvySDGT\nYf/998+zFSKB0Dlo/eCDD+a9HK644oqcGIkYxj9xdBvgHkb7pko2tPfDVVddNZ199tlpiSWW6MoR\nm2NHG6JNcZQh2RCJsegH0f9/8YtfpC9/+cs9ZwEN8ne1377hPAIECBAg0Ckg2aBPECBAgAABAgQI\nECBAgMC0BGJZnE033TS/N5baiaf/F1544eeU9fTTT6cvfelLee3/1tEr2RBJgxigjoTB3/3d3z2n\nzPvvvz8/WX/BBRfk1zrLi0HyWOYoBlnj2GWXXdJBBx30nCfr47V+6tc+WLvrrrvmsl74whdO6hab\n9saA/DHHHDNle/tJNnS2IwbITznllJxAmeyIthx66KF5lkYcRcyGaM0SiZjstNNOufzJ9tVonx0S\nM01ieaVYDmuqPTiG0b6pkg1PPPHExNJO4RP9co899kjzzjvvpP223TJOKEOyIerRWsoq/jvqH3tr\ndOuPncuNxd+ZmJ3jIECAAAECRQtINhQtqjwCBAgQIECAAAECBAg0RKBztkI8QR+D7O3LFf35z39O\n//Zv/5YOPvjguTas7ZVsCMLFF188P0kfMyLaB1Lvuuuu9MlPfjKdd955WTpej7X/OxMdd955Z57x\nELMb4oiEQ9Tx5S9/+USEIjFw2GGH9axf+7JMMegeiYR4ir99v4ZYcidmSOyzzz75ifn247TTTpt4\nyr/15+3JhqnW0u9sR2zIfMQRR+TNqNsTMdGWY489Ng+Ix2yPqOcJJ5wwkRCabrfsnPUR5XTu19Aq\nu30PhtafxeyTWE7qpS996aRVKLp9vZb3uv3227NJzLIJoz333DPvQdG+xFOnZavio042dOsX7X/3\nog2xEXksW9W5TFUkV6IPxPJX0SfWWmutvATWYostNt3u4H0ECBAgQKCrgGSDzkGAAAECBAgQIECA\nAAEC0xKYbEZALNcTT00vuuiiKQZEY534Rx55JMUT+bFufwyIxtEr2RCDrLGETRzx3nhCf/755083\n3XRTik2LY+C09dpUT/rHk/XbbLPNxAa5iyyySE5OxNI5sYRPbKDbvnlu65qd9Xv00UfzTIpvfOMb\nE1atesVgb9TnmmuuyU/yxxEOMbAbszPimGyQunPT7OWXXz7bRXnve9/78j4UreMHP/hBnlUQyzO1\njre+9a1p9dVXz+d3tiXOmeqp/UEC3vlkfLy3234HN9xwQ95johWfODdmB8T5k81QGUb7eiUbIikU\nyaDYx6BVz0hsrbfeejnB9bvf/S73sbAO20iePfDAA13j2Ot6ndbt+0ZM9vegn34RbYiNtz/+8Y9P\nFB91jyRQa9ZLezvipOj70R+j/zsIECBAgMAwBCQbhqGqTAIECBAgQIAAAQIECDREIAZrY7+GGNju\ndsTgc8xuiCf5Y3A8jl7JhlNPPTUPBO+9995zDVy3XyOWborlZGKQtdsRg7LXX399HpSNRMVkRwwo\nx2yEl73sZWmHHXboWr94Aj+egL/oooumjG6s8R9LOEV7N9xww5w06dxTolVAZzKk9eexx0Ts+dB+\n3HrrrXkpql7Xj0HlSG7EhtbdltYZtHu2D5DHeyebqRF/3r6hdPx/2F566aUpZmP0OopqXz+D/3/7\n29/yvgcxq6GVbOqsX/SrmPXy05/+NM2ZMye/PNneE/1cr73sXsmGOLeffhHJvtioPPpuJPSmOiL5\nFbNh1l133SmTPr1i5HUCBAgQIDCVgGSD/kGAAAECBAgQIECAAAECMxKIgduf/exneS+BmMkQT4TH\ngPc73vGOvFzNu9/97vx0+LXXXtt3siGSEbFMUWyAG0vwtMqNQdMYMI1yY2ZB+zJGUzUilsW58MIL\n03/8x3/kp9ZjcDbKWn/99fOg/HLLLZe++tWvpi233DIXM1kyJP48nvKPwfPYryKWZ4qB6hhQX2WV\nVfIT/RtttFFaZpll8oDuQw89lJMMl112WddNqiMZcsstt6RDDjkkffvb354YNO624XYMMMd1v/71\nr6cf/vCHKWYSxBED4+ERdYgEx6xZs2YU0843x9JDsRxSJFym2oOhcxbEoHtGFNG+QQb/Y8ZCWJ5/\n/vnZMxJcK6+8cp5ZEkmjf/iHf8j7fsQyRd36Ra/XOy37STYM0i+iDVH/6JexNFRr9kv079VWWy3H\nLWY8dC6xVGgHURgBAgQIEEgpSTboBgQIECBAgAABAgQIECBQCoFBB21LUWmVqL1Ae7+8/PLL09pr\nr137NmsgAQIECBCYjoBkw3TUvIcAAQIECBAgQIAAAQIECheQbCicVIEdAvHU/2677ZY3E3/Xu96V\nZ8hMtdRUzHT46Ec/mjdVjj00zj333LTCCitwJUCAAAECBCYRkGzQLQgQIECAAAECBAgQIECgFAKS\nDaUIQ60rEctexfJc1113XV52KjaKjs3Cux3f/e5389Jase9G7BFy8skn50SFgwABAgQIEHiugGSD\nXkGAAAECBAgQIECAAAECpRCQbChFGGpdiSeeeCLttdde6cgjj8zt3HHHHdMXv/jF9PKXv3yudsc+\nJLG3R2wgfdttt+XXuu3jUWswjSNAgAABAgMISDYMgOVUAgQIECBAgAABAgQIEBiegGTD8GyV/H8C\nsdl1bP7cSiK0NjNfaaWV0vOe97z08MMPpyuuuCJv3N06YumlSErYZFlPIkCAAAEC3QUkG/QOAgQI\nECBAgAABAgQIECiFgGRDKcLQiErcfPPNadddd03XXnvtlO2NRMQ+++yTdt555zTffPM1wkYjCRAg\nQIDAdAUkG6Yr530ECBAgQIAAAQIECBAgUKiAZEOhnArrIRBLKl1//fXpvPPOS1dfffXETIbFF188\nrbjiimn99ddP733ve9OsWbNYEiBAgAABAn0ISDb0geQUAgQIECBAgAABAgQIECBAgAABAgQIECBA\noLuAZIPeQYAAAQIECBAgQIAAAQIECBAgQIAAAQIECMxIQLJhRnzeTIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECEg26AMECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAjAQkG2bE580ECBAgQIAAAQIECBAg\nQIAAAQIECBAgQICAZIM+QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMxIQLJhRnzeTIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECEg26AMECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAjAQkG2bE580ECBAg\nQIAAAQIECBAgQIAAAQIECBAgQICAZIM+QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMxIQLJhRnze\nTIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEg26AMECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAjAQk\nG2bE580ECBAgQIAAAQIECBAgQIAAAQIECBAgQICAZIM+QIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCMz505osAAADoklEQVRIQLJhRnzeTIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEg26AMECBAgQIAA\nAQIECBAgQIAAAQIECBAgQIDAjAQkG2bE580ECBAgQIAAAQIECBAgQIAAAQIECBAgQICAZIM+QIAA\nAQIECBAgQIAAAQIECBAgQIAAAQIECMxIQLJhRnzeTIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEg2\n6AMECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAjAQkG2bE580ECBAgQIAAAQIECBAgQIAAAQIECBAg\nQICAZIM+QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMxIQLJhRnzeTIAAAQIECBAgQIAAAQIECBAg\nQIAAAQIECEg26AMECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAjAQkG2bE580ECBAgQIAAAQIECBAg\nQIAAAQIECBAgQICAZIM+QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMxIQLJhRnzeTIAAAQIECBAg\nQIAAAQIECBAgQIAAAQIECEg26AMECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAjAQkG2bE580ECBAg\nQIAAAQIECBAgQIAAAQIECBAgQICAZIM+QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECMxIQLJhRnze\nTIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEg26AMECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAjAQk\nG2bE580ECBAgQIAAAQIECBAgQIAAAQIECBAgQICAZIM+QIAAAQIECBAgQIAAAQIECBAgQIAAAQIE\nCMxIQLJhRnzeTIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEg26AMECBAgQIAAAQIECBAgQIAAAQIE\nCBAgQIDAjAQkG2bE580ECBAgQIAAAQIECBAgQIAAAQIECBAgQICAZIM+QIAAAQIECBAgQIAAAQIE\nCBAgQIAAAQIECMxIQLJhRnzeTIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEg26AMECBAgQIAAAQIE\nCBAgQIAAAQIECBAgQIDAjAQkG2bE580ECBAgQIAAAQIECBAgQIAAAQIECBAgQICAZIM+QIAAAQIE\nCBAgQIAAAQIECBAgQIAAAQIECMxIQLJhRnzeTIAAAQIECBAgQIAAAQIECBAgQIAAAQIECEg26AME\nCBAgQIAAAQIECBAgQIAAAQIECBAgQIDAjAT+P3Wkq0ZTu5GWAAAAAElFTkSuQmCC\n"
}
},
"id": "52461d62-0533-4e9f-81b6-b8e7d12cf623"
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from pathlib import Path\n",
"from typing import Callable, Sequence\n",
"\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"\n",
"%config InlineBackend.figure_formats = {'retina', 'png'}\n",
"\n",
"import torch\n",
"from torch import Tensor, nn, optim\n",
"from torch.utils.data import ConcatDataset, DataLoader, Dataset\n",
"from torchinfo import summary\n",
"from torchvision import transforms as T\n",
"from torchvision.utils import make_grid\n",
"from tqdm import tqdm\n",
"\n",
"SEED = 42\n",
"\n",
"PROJECT_PATH = Path(\".\").resolve()\n",
"FIGURE_PATH = PROJECT_PATH / \"figures\"\n",
"DATASET_PATH = Path.home() / \"datasets\""
],
"id": "cell-7"
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# Disable functionalities for speed-up\n",
"torch.autograd.set_detect_anomaly(False)\n",
"torch.autograd.profiler.profile(False)\n",
"torch.autograd.profiler.emit_nvtx(False)\n",
"\n",
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
"if torch.cuda.is_available():\n",
" # Allow CuDNN internal benchmarking for architecture-specific optimizations\n",
" torch.backends.cudnn.benchmark = True"
],
"id": "cell-8"
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def weights_init(net: nn.Module) -> None:\n",
" for m in net.modules():\n",
" if isinstance(m, (nn.Conv2d, nn.ConvTranspose2d)):\n",
" nn.init.normal_(m.weight, 0.0, 0.02)\n",
" if m.bias is not None:\n",
" nn.init.constant_(m.bias, 0.0)\n",
"\n",
" elif isinstance(m, (nn.BatchNorm1d, nn.BatchNorm2d)):\n",
" nn.init.normal_(m.weight, 1.0, 0.02)\n",
" if m.bias is not None:\n",
" nn.init.constant_(m.bias, 0.0)\n",
"\n",
" elif isinstance(m, nn.Linear):\n",
" nn.init.normal_(m.weight, 0, 0.02)\n",
" if m.bias is not None:\n",
" nn.init.constant_(m.bias, 0.0)"
],
"id": "cell-9"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generator\n",
"\n",
"The Generator in GANs acts as an artist, crafting data.\n",
"\n",
"- **Input:** Takes random noise, typically from a standard normal\n",
" distribution.\n",
"- **Architecture:** Uses dense layers, progressively increasing data\n",
" dimensions.\n",
"- **Output:** Reshapes data to desired format (e.g., image). Often\n",
" uses ‘tanh’ for activation.\n",
"- **Objective:** Generate data indistinguishable from real by the\n",
" Discriminator."
],
"id": "683bc331-c279-4ccf-887d-e426390c66b7"
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"metadata": {},
"data": {
"text/plain": [
"==========================================================================================\n",
"Layer (type:depth-idx) Output Shape Param #\n",
"==========================================================================================\n",
"Generator [128, 1, 28, 28] --\n",
"├─Sequential: 1-1 [128, 784] --\n",
"│ └─Linear: 2-1 [128, 256] 25,856\n",
"│ └─LeakyReLU: 2-2 [128, 256] --\n",
"│ └─Linear: 2-3 [128, 512] 131,584\n",
"│ └─LeakyReLU: 2-4 [128, 512] --\n",
"│ └─Linear: 2-5 [128, 1024] 525,312\n",
"│ └─LeakyReLU: 2-6 [128, 1024] --\n",
"│ └─Linear: 2-7 [128, 784] 803,600\n",
"│ └─Tanh: 2-8 [128, 784] --\n",
"==========================================================================================\n",
"Total params: 1,486,352\n",
"Trainable params: 1,486,352\n",
"Non-trainable params: 0\n",
"Total mult-adds (M): 190.25\n",
"==========================================================================================\n",
"Input size (MB): 0.05\n",
"Forward/backward pass size (MB): 2.64\n",
"Params size (MB): 5.95\n",
"Estimated Total Size (MB): 8.63\n",
"=========================================================================================="
]
}
}
],
"source": [
"class Generator(nn.Module):\n",
" def __init__(self, out_dim: Sequence[int], nz: int = 100, ngf: int = 256, alpha: float = 0.2):\n",
" \"\"\"\n",
" :param out_dim: output image dimension / shape\n",
" :param nz: size of the latent z vector $z$\n",
" :param ngf: size of feature maps (units in the hidden layers) in the generator\n",
" :param alpha: negative slope of leaky ReLU activation\n",
" \"\"\"\n",
" super().__init__()\n",
" self.out_dim = out_dim\n",
" self.model = nn.Sequential(\n",
" nn.Linear(nz, ngf),\n",
" nn.LeakyReLU(alpha, inplace=True),\n",
" nn.Linear(ngf, 2 * ngf),\n",
" nn.LeakyReLU(alpha, inplace=True),\n",
" nn.Linear(2 * ngf, 2 * ngf),\n",
" nn.LeakyReLU(alpha, inplace=True),\n",
" nn.Linear(4 * ngf, int(np.prod(self.out_dim))),\n",
" nn.Tanh(),\n",
" )\n",
"\n",
" def forward(self, x: Tensor) -> Tensor:\n",
" x = self.model(x)\n",
" x = torch.reshape(x, (x.size(0), *self.out_dim))\n",
" return x\n",
"\n",
"\n",
"summary(Generator(out_dim=(1, 28, 28)), input_size=[128, 100])"
],
"id": "cell-12"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Discriminator\n",
"\n",
"The Discriminator is GAN’s evaluator, distinguishing real from fake\n",
"data.\n",
"\n",
"- **Input:** Takes either real data samples or those from the\n",
" Generator.\n",
"- **Architecture:** Employs dense layers for binary classification of\n",
" the input.\n",
"- **Output:** Uses a sigmoid activation, yielding a score between 0-1,\n",
" reflecting the data’s authenticity.\n",
"- **Objective:** Recognize real data and identify fake data from the\n",
" Generator."
],
"id": "60620f7c-ba6f-4ec9-b57e-8c62ea62f814"
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"metadata": {},
"data": {
"text/plain": [
"==========================================================================================\n",
"Layer (type:depth-idx) Output Shape Param #\n",
"==========================================================================================\n",
"Discriminator [128, 1] --\n",
"├─Sequential: 1-1 [128, 1] --\n",
"│ └─Linear: 2-1 [128, 512] 401,920\n",
"│ └─LeakyReLU: 2-2 [128, 512] --\n",
"│ └─Dropout: 2-3 [128, 512] --\n",
"│ └─Linear: 2-4 [128, 256] 131,328\n",
"│ └─LeakyReLU: 2-5 [128, 256] --\n",
"│ └─Dropout: 2-6 [128, 256] --\n",
"│ └─Linear: 2-7 [128, 128] 32,896\n",
"│ └─LeakyReLU: 2-8 [128, 128] --\n",
"│ └─Dropout: 2-9 [128, 128] --\n",
"│ └─Linear: 2-10 [128, 1] 129\n",
"│ └─Sigmoid: 2-11 [128, 1] --\n",
"==========================================================================================\n",
"Total params: 566,273\n",
"Trainable params: 566,273\n",
"Non-trainable params: 0\n",
"Total mult-adds (M): 72.48\n",
"==========================================================================================\n",
"Input size (MB): 0.40\n",
"Forward/backward pass size (MB): 0.92\n",
"Params size (MB): 2.27\n",
"Estimated Total Size (MB): 3.59\n",
"=========================================================================================="
]
}
}
],
"source": [
"class Discriminator(nn.Module):\n",
" def __init__(self, input_dim: Sequence[int], ndf: int = 128, alpha: float = 0.2):\n",
" super().__init__()\n",
" self.model = nn.Sequential(\n",
" nn.Linear(int(np.prod(input_dim)), 4 * ndf),\n",
" nn.LeakyReLU(alpha, inplace=True),\n",
" nn.Dropout(0.3),\n",
" nn.Linear(4 * ndf, 2 * ndf),\n",
" nn.LeakyReLU(alpha, inplace=True),\n",
" nn.Dropout(0.3),\n",
" nn.Linear(2 * ndf, ndf),\n",
" nn.LeakyReLU(alpha, inplace=True),\n",
" nn.Dropout(0.3),\n",
" nn.Linear(ndf, 1),\n",
" nn.Sigmoid(),\n",
" )\n",
"\n",
" def forward(self, x: Tensor) -> Tensor:\n",
" x = torch.reshape(x, (x.size(0), -1))\n",
" return self.model(x)\n",
"\n",
"\n",
"summary(Discriminator(input_dim=(1, 28, 28)), input_size=[128, 1, 28, 28])"
],
"id": "cell-14"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Traning Loop\n",
"\n",
"The training process is iterative:\n",
"\n",
"- **Update Discriminator:** With the Generator static, improve the\n",
" Discriminator’s detection of real vs. fake.\n",
"- **Update Generator:** With a static Discriminator, enhance the\n",
" Generator’s ability to deceive.\n",
"\n",
"Training continues until the Generator produces almost authentic data.\n",
"Equilibrium is reached when the Discriminator sees every input as\n",
"equally likely real or fake, assigning a probability of $\\frac{1}{2}$.\n",
"\n",
"> **Note**\n",
">\n",
"> Using `.eval()` and `.train()` modes initially seemed promising for\n",
"> faster training. However, they affected layers like `BatchNorm2d` and\n",
"> `Dropout`, making the GAN diverge. Also, switching between eval and\n",
"> train modes is not free of charge."
],
"id": "37e989b9-1372-45bf-9410-06c761f97b0a"
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def train_step(\n",
" generator: nn.Module,\n",
" discriminator: nn.Module,\n",
" optim_G: optim.Optimizer,\n",
" optim_D: optim.Optimizer,\n",
" criterion: Callable[[torch.Tensor, torch.Tensor], torch.Tensor],\n",
" real_data: torch.Tensor,\n",
" noise_dim: int,\n",
" device: torch.device,\n",
") -> tuple[float, float]:\n",
" batch_size = real_data.size(0)\n",
"\n",
" real_data = real_data.to(device)\n",
"\n",
" # Labels for real and fake data\n",
" real_labels = torch.ones(batch_size, 1, device=device)\n",
" fake_labels = torch.zeros(batch_size, 1, device=device)\n",
"\n",
" ### Train Discriminator\n",
"\n",
" # Real data\n",
" output_real = discriminator(real_data)\n",
" loss_D_real = criterion(output_real, real_labels)\n",
"\n",
" # Fake data\n",
" noise = torch.randn(batch_size, noise_dim, dtype=torch.float, device=device)\n",
" fake_data = generator(noise)\n",
" output_fake = discriminator(fake_data.detach())\n",
" loss_D_fake = criterion(output_fake, fake_labels)\n",
"\n",
" # Backprop and optimize for discriminator\n",
" loss_D = (loss_D_real + loss_D_fake) / 2.0\n",
" discriminator.zero_grad()\n",
" loss_D.backward()\n",
" optim_D.step()\n",
"\n",
" ### Train Generator\n",
"\n",
" # Recompute fake data’s discriminator scores\n",
" output_fake = discriminator(fake_data)\n",
" loss_G = criterion(output_fake, real_labels)\n",
"\n",
" # Backprop and optimize for generator\n",
" generator.zero_grad()\n",
" loss_G.backward()\n",
" optim_G.step()\n",
"\n",
" return loss_G.item(), loss_D.item()"
],
"id": "cell-16"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Evaluation\n",
"\n",
"Before evaluation, we configured the learning rate (LR), optimizer’s\n",
"$\\beta$ parameters, batch size, and data loader settings for all\n",
"experiments. We used the MNIST digits and MNIST fashion datasets for\n",
"assessment."
],
"id": "972383c9-c4ae-40b6-9ea8-f8136021b4e4"
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"OPTIMIZER_LR = 0.0002\n",
"L2_NORM = 1e-5\n",
"OPTIMIZER_BETAS = (0.5, 0.999)\n",
"N_EPOCHS = 100\n",
"BATCH_SIZE = 128"
],
"id": "cell-18"
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"loader_kwargs = {\n",
" \"num_workers\": 8,\n",
" \"pin_memory\": True,\n",
" \"shuffle\": True,\n",
" \"batch_size\": BATCH_SIZE,\n",
" \"prefetch_factor\": 16,\n",
" \"pin_memory_device\": device.type,\n",
" \"persistent_workers\": False,\n",
"}"
],
"id": "cell-19"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### MNIST Digits Dataset\n",
"\n",
"The MNIST (Modified National Institute of Standards and Technology)\n",
"dataset is a well-known collection of handwritten digits, extensively\n",
"used in the fields of machine learning and computer vision for training\n",
"and testing purposes. Its simplicity and size make it a popular choice\n",
"for introductory courses and experiments in image recognition.\n",
"\n",
"In total, the dataset contains 70,000 grayscale images of handwritten\n",
"digits (from 0 to 9). Each image is 28x28 pixels."
],
"id": "b315f7cc-c92d-481e-b5af-0e033ba94890"
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"def get_minst_dataset(transform=None) -> Dataset:\n",
" from torchvision.datasets import MNIST\n",
"\n",
" root = str(DATASET_PATH)\n",
" trainset = MNIST(root=root, train=True, download=True, transform=transform)\n",
" testset = MNIST(root=root, train=False, download=True, transform=transform)\n",
" # Combine train and test dataset for more samples.\n",
" dataset = ConcatDataset([trainset, testset])\n",
" return dataset"
],
"id": "cell-21"
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"IMG_DIM = (1, 28, 28)\n",
"NOISE_DIM = 100"
],
"id": "cell-23"
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"transform = T.Compose([T.ToTensor(), T.Normalize(0.5, 0.5)])\n",
"\n",
"data = get_minst_dataset(transform=transform)\n",
"dataloader = DataLoader(data, **loader_kwargs)\n",
"\n",
"torch.manual_seed(SEED)\n",
"torch.cuda.manual_seed_all(SEED)\n",
"\n",
"# benchmark_noise is used for the animation to show how output evolve on the same vector\n",
"benchmark_noise = torch.randn(16 * 16, NOISE_DIM, device=device)\n",
"\n",
"generator = Generator(out_dim=IMG_DIM, nz=NOISE_DIM).to(device)\n",
"generator.apply(weights_init)\n",
"\n",
"discriminator = Discriminator(input_dim=IMG_DIM).to(device)\n",
"discriminator.apply(weights_init)\n",
"\n",
"optimizer_G = optim.AdamW(\n",
" generator.parameters(),\n",
" lr=OPTIMIZER_LR,\n",
" betas=OPTIMIZER_BETAS,\n",
" weight_decay=L2_NORM,\n",
")\n",
"\n",
"optimizer_D = optim.AdamW(\n",
" discriminator.parameters(),\n",
" lr=OPTIMIZER_LR,\n",
" betas=OPTIMIZER_BETAS,\n",
" weight_decay=L2_NORM,\n",
")\n",
"\n",
"criterion = nn.BCELoss().to(device)"
],
"id": "cell-24"
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"100%|████████████████████████████████████████████████████████████████████████████████| 100/100 [03:43<00:00, 2.23s/epochs]"
]
}
],
"source": [
"animation = []\n",
"\n",
"g_losses, d_losses = [], []\n",
"for _ in tqdm(range(N_EPOCHS), unit=\"epochs\"):\n",
" generator.train()\n",
" discriminator.train()\n",
"\n",
" for samples_real, _ in dataloader:\n",
" g_loss, d_loss = train_step(generator, discriminator, optimizer_G, optimizer_D, criterion, samples_real, NOISE_DIM, device)\n",
"\n",
" g_losses.append(g_loss)\n",
" d_losses.append(d_loss)\n",
"\n",
" generator.eval()\n",
" with torch.inference_mode():\n",
" images = generator(benchmark_noise)\n",
" images = images.detach().cpu()\n",
"\n",
" images = make_grid(images, nrow=16, normalize=True)\n",
" animation.append(images)"
],
"id": "cell-25"
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [],
"id": "cell-26"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[./figures/gan-mnist.mp4](./figures/gan-mnist.mp4)\n",
"\n",
"### MNIST Fashion Dataset\n",
"\n",
"The Fashion MNIST dataset is a collection of grayscale images of 10\n",
"different categories of clothing items, designed as a more challenging\n",
"alternative to the classic MNIST dataset of handwritten digits. Each\n",
"image in the dataset is 28x28 pixels. The 10 categories include items\n",
"like t-shirts/tops, trousers, pullovers, dresses, coats, sandals, and\n",
"more. With 70,000 images, Fashion MNIST is commonly used for\n",
"benchmarking machine learning algorithms, especially in image\n",
"classification tasks."
],
"id": "bd947847-e31c-435e-95f4-88eb48728b0d"
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"IMG_DIM = (1, 28, 28)\n",
"NOISE_DIM = 100"
],
"id": "cell-30"
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"def get_mnist_fashion_dataset(transform=None):\n",
" from torchvision.datasets import FashionMNIST\n",
"\n",
" root = str(DATASET_PATH)\n",
" trainset = FashionMNIST(root=root, train=True, download=True, transform=transform)\n",
" testset = FashionMNIST(root=root, train=False, download=True, transform=transform)\n",
" # Combine train and test dataset for more samples.\n",
" dataset = ConcatDataset([trainset, testset])\n",
" return dataset"
],
"id": "cell-31"
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"transform = T.Compose([T.ToTensor(), T.Normalize(0.5, 0.5)])\n",
"\n",
"data = get_mnist_fashion_dataset(transform=transform)\n",
"dataloader = DataLoader(data, **loader_kwargs)\n",
"\n",
"torch.manual_seed(SEED)\n",
"torch.cuda.manual_seed_all(SEED)\n",
"\n",
"# benchmark_noise is used for the animation to show how output evolve on same vector\n",
"benchmark_noise = torch.randn(16 * 16, NOISE_DIM, device=device)\n",
"\n",
"generator = Generator(out_dim=IMG_DIM, nz=NOISE_DIM).to(device)\n",
"generator.apply(weights_init)\n",
"\n",
"discriminator = Discriminator(input_dim=IMG_DIM).to(device)\n",
"discriminator.apply(weights_init)\n",
"\n",
"optimizer_G = optim.AdamW(\n",
" generator.parameters(),\n",
" lr=OPTIMIZER_LR,\n",
" betas=OPTIMIZER_BETAS,\n",
" weight_decay=L2_NORM,\n",
")\n",
"\n",
"optimizer_D = optim.AdamW(\n",
" discriminator.parameters(),\n",
" lr=OPTIMIZER_LR,\n",
" betas=OPTIMIZER_BETAS,\n",
" weight_decay=L2_NORM,\n",
")\n",
"\n",
"criterion = nn.BCELoss().to(device)"
],
"id": "cell-32"
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"100%|████████████████████████████████████████████████████████████████████████████████| 100/100 [03:49<00:00, 2.30s/epochs]"
]
}
],
"source": [
"animation = []\n",
"\n",
"g_losses, d_losses = [], []\n",
"for _ in tqdm(range(N_EPOCHS), unit=\"epochs\"):\n",
" generator.train()\n",
" discriminator.train()\n",
"\n",
" for samples_real, _ in dataloader:\n",
" g_loss, d_loss = train_step(generator, discriminator, optimizer_G, optimizer_D, criterion, samples_real, NOISE_DIM, device)\n",
"\n",
" g_losses.append(g_loss)\n",
" d_losses.append(d_loss)\n",
"\n",
" generator.eval()\n",
" with torch.inference_mode():\n",
" images = generator(benchmark_noise)\n",
" images = images.detach().cpu()\n",
"\n",
" images = make_grid(images, nrow=16, normalize=True)\n",
"\n",
" animation.append(images)"
],
"id": "cell-33"
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [],
"id": "cell-34"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[./figures/gan-fashion.mp4](./figures/gan-fashion.mp4)\n",
"\n",
"# DCGAN\n",
"\n",
"DCGAN, short for Deep Convolutional Generative Adversarial Network,\n",
"differs from vanilla GAN by using convolutional layers. This design\n",
"makes DCGAN better for image data. With specific architectural\n",
"guidelines, DCGAN trains more consistently and generates clearer images\n",
"than vanilla GANs across various hyperparameters.\n",
"\n",
"## Setting Up DCGANs\n",
"\n",
"### Generator"
],
"id": "7418abba-68c6-48ce-b234-8777c79c3ff1"
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"metadata": {},
"data": {
"text/plain": [
"==========================================================================================\n",
"Layer (type:depth-idx) Output Shape Param #\n",
"==========================================================================================\n",
"Generator [128, 1, 28, 28] --\n",
"├─Sequential: 1-1 [128, 1, 28, 28] --\n",
"│ └─ConvTranspose2d: 2-1 [128, 128, 4, 4] 204,800\n",
"│ └─BatchNorm2d: 2-2 [128, 128, 4, 4] 256\n",
"│ └─ReLU: 2-3 [128, 128, 4, 4] --\n",
"│ └─ConvTranspose2d: 2-4 [128, 64, 7, 7] 73,728\n",
"│ └─BatchNorm2d: 2-5 [128, 64, 7, 7] 128\n",
"│ └─ReLU: 2-6 [128, 64, 7, 7] --\n",
"│ └─ConvTranspose2d: 2-7 [128, 32, 14, 14] 32,768\n",
"│ └─BatchNorm2d: 2-8 [128, 32, 14, 14] 64\n",
"│ └─ReLU: 2-9 [128, 32, 14, 14] --\n",
"│ └─ConvTranspose2d: 2-10 [128, 1, 28, 28] 512\n",
"│ └─Tanh: 2-11 [128, 1, 28, 28] --\n",
"==========================================================================================\n",
"Total params: 312,256\n",
"Trainable params: 312,256\n",
"Non-trainable params: 0\n",
"Total mult-adds (G): 1.76\n",
"==========================================================================================\n",
"Input size (MB): 0.05\n",
"Forward/backward pass size (MB): 24.26\n",
"Params size (MB): 1.25\n",
"Estimated Total Size (MB): 25.56\n",
"=========================================================================================="
]
}
}
],
"source": [
"class Generator(nn.Module):\n",
" def __init__(self, nz: int = 100, ngf: int = 32, nc: int = 1):\n",
" \"\"\"\n",
" :param nz: size of the latent z vector\n",
" :param ngf: size of feature maps in generator\n",
" :param nc: number of channels in the training images.\n",
" \"\"\"\n",
" super().__init__()\n",
" self.layers = nn.Sequential(\n",
" nn.ConvTranspose2d(nz, 4 * ngf, 4, 1, 0, bias=False),\n",
" nn.BatchNorm2d(4 * ngf),\n",
" nn.ReLU(inplace=True),\n",
" nn.ConvTranspose2d(4 * ngf, 2 * ngf, 3, 2, 1, bias=False),\n",
" nn.BatchNorm2d(2 * ngf),\n",
" nn.ReLU(inplace=True),\n",
" nn.ConvTranspose2d(2 * ngf, ngf, 4, 2, 1, bias=False),\n",
" nn.BatchNorm2d(ngf),\n",
" nn.ReLU(inplace=True),\n",
" nn.ConvTranspose2d(ngf, nc, 4, 2, 1, bias=False),\n",
" nn.Tanh(),\n",
" )\n",
"\n",
" def forward(self, x: Tensor) -> Tensor:\n",
" x = torch.reshape(x, (x.size(0), -1, 1, 1))\n",
" return self.layers(x)\n",
"\n",
"\n",
"summary(Generator(), input_size=(128, 100))"
],
"id": "cell-40"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Discriminator"
],
"id": "fc6c2a00-f940-4a53-a78a-0da1021ce580"
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"metadata": {},
"data": {
"text/plain": [
"==========================================================================================\n",
"Layer (type:depth-idx) Output Shape Param #\n",
"==========================================================================================\n",
"Discriminator [128, 1] --\n",
"├─Sequential: 1-1 [128, 1, 1, 1] --\n",
"│ └─Conv2d: 2-1 [128, 32, 14, 14] 512\n",
"│ └─BatchNorm2d: 2-2 [128, 32, 14, 14] 64\n",
"│ └─LeakyReLU: 2-3 [128, 32, 14, 14] --\n",
"│ └─Conv2d: 2-4 [128, 64, 7, 7] 32,768\n",
"│ └─BatchNorm2d: 2-5 [128, 64, 7, 7] 128\n",
"│ └─LeakyReLU: 2-6 [128, 64, 7, 7] --\n",
"│ └─Conv2d: 2-7 [128, 128, 4, 4] 73,728\n",
"│ └─BatchNorm2d: 2-8 [128, 128, 4, 4] 256\n",
"│ └─LeakyReLU: 2-9 [128, 128, 4, 4] --\n",
"│ └─Conv2d: 2-10 [128, 1, 1, 1] 2,048\n",
"│ └─Sigmoid: 2-11 [128, 1, 1, 1] --\n",
"==========================================================================================\n",
"Total params: 109,504\n",
"Trainable params: 109,504\n",
"Non-trainable params: 0\n",
"Total mult-adds (M): 369.68\n",
"==========================================================================================\n",
"Input size (MB): 0.40\n",
"Forward/backward pass size (MB): 23.46\n",
"Params size (MB): 0.44\n",
"Estimated Total Size (MB): 24.30\n",
"=========================================================================================="
]
}
}
],
"source": [
"class Discriminator(nn.Module):\n",
" def __init__(self, ndf: int = 32, nc: int = 1, alpha: float = 0.2):\n",
" super().__init__()\n",
" self.layers = nn.Sequential(\n",
" nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),\n",
" nn.BatchNorm2d(ndf),\n",
" nn.LeakyReLU(alpha, inplace=True),\n",
" nn.Conv2d(ndf, 2 * ndf, 4, 2, 1, bias=False),\n",
" nn.BatchNorm2d(2 * ndf),\n",
" nn.LeakyReLU(alpha, inplace=True),\n",
" nn.Conv2d(2 * ndf, 4 * ndf, 3, 2, 1, bias=False),\n",
" nn.BatchNorm2d(ndf * 4),\n",
" nn.LeakyReLU(alpha, inplace=True),\n",
" nn.Conv2d(4 * ndf, 1, 4, 1, 0, bias=False),\n",
" nn.Sigmoid(),\n",
" )\n",
"\n",
" def forward(self, x: Tensor) -> Tensor:\n",
" x = self.layers(x)\n",
" x = torch.reshape(x, (x.size(0), -1))\n",
" return x\n",
"\n",
"\n",
"summary(Discriminator(), input_size=(BATCH_SIZE, 1, 28, 28))"
],
"id": "cell-42"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Evaluation\n",
"\n",
"### MNIST Digits Dataset"
],
"id": "facfd49f-efc9-42c7-a704-67da04498ba3"
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"IMG_DIM = (1, 28, 28)\n",
"NOISE_DIM = 128\n",
"\n",
"transform = T.Compose(\n",
" [\n",
" T.ToTensor(),\n",
" T.Normalize(0.5, 0.5),\n",
" ]\n",
")\n",
"\n",
"data = get_minst_dataset(transform)\n",
"dataloader = DataLoader(data, **loader_kwargs)\n",
"\n",
"torch.manual_seed(SEED)\n",
"torch.cuda.manual_seed_all(SEED)\n",
"\n",
"# benchmark_noise is used for the animation to show how output evolve on same vector\n",
"benchmark_noise = torch.randn(16 * 16, NOISE_DIM, device=device)\n",
"\n",
"generator = Generator(nz=NOISE_DIM, ngf=32, nc=IMG_DIM[0]).to(device)\n",
"generator.apply(weights_init)\n",
"\n",
"discriminator = Discriminator(ndf=32, nc=IMG_DIM[0]).to(device)\n",
"discriminator.apply(weights_init)\n",
"\n",
"optimizer_G = optim.AdamW(\n",
" generator.parameters(),\n",
" lr=OPTIMIZER_LR,\n",
" betas=OPTIMIZER_BETAS,\n",
" weight_decay=L2_NORM,\n",
")\n",
"\n",
"optimizer_D = optim.AdamW(\n",
" discriminator.parameters(),\n",
" lr=OPTIMIZER_LR,\n",
" betas=OPTIMIZER_BETAS,\n",
" weight_decay=L2_NORM,\n",
")\n",
"\n",
"criterion = nn.BCELoss().to(device)"
],
"id": "cell-45"
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"100%|████████████████████████████████████████████████████████████████████████████████| 100/100 [04:54<00:00, 2.94s/epochs]"
]
}
],
"source": [
"animation = []\n",
"\n",
"g_losses, d_losses = [], []\n",
"for _ in tqdm(range(N_EPOCHS), unit=\"epochs\"):\n",
" generator.train()\n",
" discriminator.train()\n",
"\n",
" for samples_real, _ in dataloader:\n",
" g_loss, d_loss = train_step(generator, discriminator, optimizer_G, optimizer_D, criterion, samples_real, NOISE_DIM, device)\n",
"\n",
" g_losses.append(g_loss)\n",
" d_losses.append(d_loss)\n",
"\n",
" generator.eval()\n",
" with torch.inference_mode():\n",
" images = generator(benchmark_noise)\n",
" images = images.detach().cpu()\n",
"\n",
" images = make_grid(images, nrow=16, normalize=True)\n",
"\n",
" animation.append(images)"
],
"id": "cell-46"
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [],
"id": "cell-47"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[./figures/dcgan-mnist.mp4](./figures/dcgan-mnist.mp4)\n",
"\n",
"### MNIST Fashion Dataset"
],
"id": "231a682a-037c-4d73-ba4e-a6fa4ee736df"
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"IMG_DIM = (1, 28, 28)\n",
"NOISE_DIM = 128\n",
"\n",
"transform = T.Compose(\n",
" [\n",
" T.ToTensor(),\n",
" T.Normalize(0.5, 0.5),\n",
" ]\n",
")\n",
"\n",
"data = get_mnist_fashion_dataset(transform)\n",
"dataloader = DataLoader(data, **loader_kwargs)\n",
"\n",
"torch.manual_seed(SEED)\n",
"torch.cuda.manual_seed_all(SEED)\n",
"\n",
"# benchmark_noise is used for the animation to show how output evolve on same vector\n",
"benchmark_noise = torch.randn(16 * 16, NOISE_DIM, device=device)\n",
"\n",
"generator = Generator(nz=NOISE_DIM, ngf=32, nc=IMG_DIM[0]).to(device)\n",
"generator.apply(weights_init)\n",
"\n",
"discriminator = Discriminator(ndf=32, nc=IMG_DIM[0]).to(device)\n",
"discriminator.apply(weights_init)\n",
"\n",
"optimizer_G = optim.AdamW(\n",
" generator.parameters(),\n",
" lr=OPTIMIZER_LR,\n",
" betas=OPTIMIZER_BETAS,\n",
" weight_decay=L2_NORM,\n",
")\n",
"\n",
"optimizer_D = optim.AdamW(discriminator.parameters(), lr=OPTIMIZER_LR, betas=OPTIMIZER_BETAS, weight_decay=L2_NORM)\n",
"\n",
"criterion = nn.BCELoss().to(device) # F.binary_cross_entropy_with_logits #nn.BCELoss().to(device)"
],
"id": "cell-51"
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"100%|████████████████████████████████████████████████████████████████████████████████| 100/100 [04:55<00:00, 2.95s/epochs]"
]
}
],
"source": [
"animation = []\n",
"\n",
"g_losses, d_losses = [], []\n",
"for _ in tqdm(range(N_EPOCHS), unit=\"epochs\"):\n",
" generator.train()\n",
" discriminator.train()\n",
"\n",
" for samples_real, _ in dataloader:\n",
" g_loss, d_loss = train_step(generator, discriminator, optimizer_G, optimizer_D, criterion, samples_real, NOISE_DIM, device)\n",
"\n",
" g_losses.append(g_loss)\n",
" d_losses.append(d_loss)\n",
"\n",
" generator.eval()\n",
" with torch.inference_mode():\n",
" images = generator(benchmark_noise)\n",
" images = images.detach().cpu()\n",
"\n",
" images = make_grid(images, nrow=16, normalize=True)\n",
"\n",
" animation.append(images)"
],
"id": "cell-52"
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [],
"id": "cell-53"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[./figures/dcgan-mnist-fashion.mp4](./figures/dcgan-mnist-fashion.mp4)\n",
"\n",
"# Conclusion\n",
"\n",
"Generative Adversarial Networks (GANs) represent an innovative class of\n",
"unsupervised neural networks that have significantly impacted the field\n",
"of artificial intelligence (AI). They consist of two components: a\n",
"Generator that improves its output and a Discriminator that enhances its\n",
"evaluative skills. In a competitive yet symbiotic relationship, these\n",
"two networks converge towards a dynamic equilibrium. This interaction\n",
"exemplifies the strength of GANs and the adaptability of adversarial\n",
"learning in AI, blending creative generation with critical assessment.\n",
"\n",
"In this post, I explore the original GAN, often referred to as the\n",
"“vanilla” GAN. My aim was to understand the basic mechanics of how GANs\n",
"operate. Meanwhile, others have advanced this technology, applying it to\n",
"a range of innovative and fascinating new areas.\n",
"\n",
"- [18 Impressive Applications of Generative Adversarial Networks\n",
" (GANs)](https://machinelearningmastery.com/impressive-applications-of-generative-adversarial-networks/)\n",
"\n",
"Goodfellow, Ian J., Jean Pouget-Abadie, Mehdi Mirza, Bing Xu, David\n",
"Warde-Farley, Sherjil Ozair, Aaron Courville, and Yoshua Bengio. 2014.\n",
"“Generative Adversarial Networks.” ."
],
"id": "56543af2-b836-4d70-8640-b8e322cbc216"
}
],
"nbformat": 4,
"nbformat_minor": 5,
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3 (ipykernel)",
"language": "python"
},
"language_info": {
"name": "python",
"codemirror_mode": {
"name": "ipython",
"version": "3"
},
"file_extension": ".py",
"mimetype": "text/x-python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.5"
}
}
}