{"cells": [{"cell_type": "markdown", "id": "bdec8c9b", "metadata": {"papermill": {"duration": 0.008108, "end_time": "2021-09-09T13:20:18.870349", "exception": false, "start_time": "2021-09-09T13:20:18.862241", "status": "completed"}, "tags": []}, "source": ["\n", "# PyTorch Lightning Basic GAN Tutorial\n", "\n", "* **Author:** PL team\n", "* **License:** CC BY-SA\n", "* **Generated:** 2021-09-09T15:08:28.322630\n", "\n", "How to train a GAN!\n", "\n", "Main takeaways:\n", "1. Generator and discriminator are arbitrary PyTorch modules.\n", "2. training_step does both the generator and discriminator training.\n", "\n", "\n", "---\n", "Open in [![Open In Colab](data:image/png;base64,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){height=\"20px\" width=\"117px\"}](https://colab.research.google.com/github/PytorchLightning/lightning-tutorials/blob/publication/.notebooks/lightning_examples/basic-gan.ipynb)\n", "\n", "Give us a \u2b50 [on Github](https://www.github.com/PytorchLightning/pytorch-lightning/)\n", "| Check out [the documentation](https://pytorch-lightning.readthedocs.io/en/latest/)\n", "| Join us [on Slack](https://join.slack.com/t/pytorch-lightning/shared_invite/zt-pw5v393p-qRaDgEk24~EjiZNBpSQFgQ)"]}, {"cell_type": "markdown", "id": "9f242a79", "metadata": {"papermill": {"duration": 0.006659, "end_time": "2021-09-09T13:20:18.884263", "exception": false, "start_time": "2021-09-09T13:20:18.877604", "status": "completed"}, "tags": []}, "source": ["## Setup\n", "This notebook requires some packages besides pytorch-lightning."]}, {"cell_type": "code", "execution_count": 1, "id": "6deebb04", "metadata": {"colab": {}, "colab_type": "code", "execution": {"iopub.execute_input": "2021-09-09T13:20:18.901922Z", "iopub.status.busy": "2021-09-09T13:20:18.901452Z", "iopub.status.idle": "2021-09-09T13:20:18.904360Z", "shell.execute_reply": "2021-09-09T13:20:18.903838Z"}, "id": "LfrJLKPFyhsK", "lines_to_next_cell": 0, "papermill": {"duration": 0.013341, "end_time": "2021-09-09T13:20:18.904472", "exception": false, "start_time": "2021-09-09T13:20:18.891131", "status": "completed"}, "tags": []}, "outputs": [], "source": ["# ! pip install --quiet \"pytorch-lightning>=1.3\" \"torch>=1.6, <1.9\" \"torchvision\" \"torchmetrics>=0.3\""]}, {"cell_type": "code", "execution_count": 2, "id": "e24f349d", "metadata": {"execution": {"iopub.execute_input": "2021-09-09T13:20:18.926320Z", "iopub.status.busy": "2021-09-09T13:20:18.925848Z", "iopub.status.idle": "2021-09-09T13:20:20.005775Z", "shell.execute_reply": "2021-09-09T13:20:20.005309Z"}, "papermill": {"duration": 1.094307, "end_time": "2021-09-09T13:20:20.005890", "exception": false, "start_time": "2021-09-09T13:20:18.911583", "status": "completed"}, "tags": []}, "outputs": [], "source": ["import os\n", "from collections import OrderedDict\n", "\n", "import numpy as np\n", "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "from pytorch_lightning import LightningDataModule, LightningModule, Trainer\n", "from torch.utils.data import DataLoader, random_split\n", "from torchvision.datasets import MNIST\n", "\n", "PATH_DATASETS = os.environ.get(\"PATH_DATASETS\", \".\")\n", "AVAIL_GPUS = min(1, torch.cuda.device_count())\n", "BATCH_SIZE = 256 if AVAIL_GPUS else 64\n", "NUM_WORKERS = int(os.cpu_count() / 2)"]}, {"cell_type": "markdown", "id": "a666589a", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.006778, "end_time": "2021-09-09T13:20:20.020013", "exception": false, "start_time": "2021-09-09T13:20:20.013235", "status": "completed"}, "tags": []}, "source": ["### MNIST DataModule\n", "\n", "Below, we define a DataModule for the MNIST Dataset. To learn more about DataModules, check out our tutorial\n", "on them or see the [latest docs](https://pytorch-lightning.readthedocs.io/en/latest/extensions/datamodules.html)."]}, {"cell_type": "code", "execution_count": 3, "id": "90f2067a", "metadata": {"execution": {"iopub.execute_input": "2021-09-09T13:20:20.042212Z", "iopub.status.busy": "2021-09-09T13:20:20.041153Z", "iopub.status.idle": "2021-09-09T13:20:20.044348Z", "shell.execute_reply": "2021-09-09T13:20:20.043889Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.0172, "end_time": "2021-09-09T13:20:20.044446", "exception": false, "start_time": "2021-09-09T13:20:20.027246", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class MNISTDataModule(LightningDataModule):\n", "    def __init__(\n", "        self,\n", "        data_dir: str = PATH_DATASETS,\n", "        batch_size: int = BATCH_SIZE,\n", "        num_workers: int = NUM_WORKERS,\n", "    ):\n", "        super().__init__()\n", "        self.data_dir = data_dir\n", "        self.batch_size = batch_size\n", "        self.num_workers = num_workers\n", "\n", "        self.transform = transforms.Compose(\n", "            [\n", "                transforms.ToTensor(),\n", "                transforms.Normalize((0.1307,), (0.3081,)),\n", "            ]\n", "        )\n", "\n", "        # self.dims is returned when you call dm.size()\n", "        # Setting default dims here because we know them.\n", "        # Could optionally be assigned dynamically in dm.setup()\n", "        self.dims = (1, 28, 28)\n", "        self.num_classes = 10\n", "\n", "    def prepare_data(self):\n", "        # download\n", "        MNIST(self.data_dir, train=True, download=True)\n", "        MNIST(self.data_dir, train=False, download=True)\n", "\n", "    def setup(self, stage=None):\n", "        # Assign train/val datasets for use in dataloaders\n", "        if stage == \"fit\" or stage is None:\n", "            mnist_full = MNIST(self.data_dir, train=True, transform=self.transform)\n", "            self.mnist_train, self.mnist_val = random_split(mnist_full, [55000, 5000])\n", "\n", "        # Assign test dataset for use in dataloader(s)\n", "        if stage == \"test\" or stage is None:\n", "            self.mnist_test = MNIST(self.data_dir, train=False, transform=self.transform)\n", "\n", "    def train_dataloader(self):\n", "        return DataLoader(\n", "            self.mnist_train,\n", "            batch_size=self.batch_size,\n", "            num_workers=self.num_workers,\n", "        )\n", "\n", "    def val_dataloader(self):\n", "        return DataLoader(self.mnist_val, batch_size=self.batch_size, num_workers=self.num_workers)\n", "\n", "    def test_dataloader(self):\n", "        return DataLoader(self.mnist_test, batch_size=self.batch_size, num_workers=self.num_workers)"]}, {"cell_type": "markdown", "id": "8a15e6b5", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.006938, "end_time": "2021-09-09T13:20:20.058387", "exception": false, "start_time": "2021-09-09T13:20:20.051449", "status": "completed"}, "tags": []}, "source": ["### A. Generator"]}, {"cell_type": "code", "execution_count": 4, "id": "e6cb2832", "metadata": {"execution": {"iopub.execute_input": "2021-09-09T13:20:20.078127Z", "iopub.status.busy": "2021-09-09T13:20:20.077652Z", "iopub.status.idle": "2021-09-09T13:20:20.079885Z", "shell.execute_reply": "2021-09-09T13:20:20.079427Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.014603, "end_time": "2021-09-09T13:20:20.079978", "exception": false, "start_time": "2021-09-09T13:20:20.065375", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class Generator(nn.Module):\n", "    def __init__(self, latent_dim, img_shape):\n", "        super().__init__()\n", "        self.img_shape = img_shape\n", "\n", "        def block(in_feat, out_feat, normalize=True):\n", "            layers = [nn.Linear(in_feat, out_feat)]\n", "            if normalize:\n", "                layers.append(nn.BatchNorm1d(out_feat, 0.8))\n", "            layers.append(nn.LeakyReLU(0.2, inplace=True))\n", "            return layers\n", "\n", "        self.model = nn.Sequential(\n", "            *block(latent_dim, 128, normalize=False),\n", "            *block(128, 256),\n", "            *block(256, 512),\n", "            *block(512, 1024),\n", "            nn.Linear(1024, int(np.prod(img_shape))),\n", "            nn.Tanh(),\n", "        )\n", "\n", "    def forward(self, z):\n", "        img = self.model(z)\n", "        img = img.view(img.size(0), *self.img_shape)\n", "        return img"]}, {"cell_type": "markdown", "id": "0802db9a", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.007295, "end_time": "2021-09-09T13:20:20.110849", "exception": false, "start_time": "2021-09-09T13:20:20.103554", "status": "completed"}, "tags": []}, "source": ["### B. Discriminator"]}, {"cell_type": "code", "execution_count": 5, "id": "af46f802", "metadata": {"execution": {"iopub.execute_input": "2021-09-09T13:20:20.131267Z", "iopub.status.busy": "2021-09-09T13:20:20.130793Z", "iopub.status.idle": "2021-09-09T13:20:20.132847Z", "shell.execute_reply": "2021-09-09T13:20:20.132379Z"}, "lines_to_next_cell": 2, "papermill": {"duration": 0.014411, "end_time": "2021-09-09T13:20:20.132950", "exception": false, "start_time": "2021-09-09T13:20:20.118539", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class Discriminator(nn.Module):\n", "    def __init__(self, img_shape):\n", "        super().__init__()\n", "\n", "        self.model = nn.Sequential(\n", "            nn.Linear(int(np.prod(img_shape)), 512),\n", "            nn.LeakyReLU(0.2, inplace=True),\n", "            nn.Linear(512, 256),\n", "            nn.LeakyReLU(0.2, inplace=True),\n", "            nn.Linear(256, 1),\n", "            nn.Sigmoid(),\n", "        )\n", "\n", "    def forward(self, img):\n", "        img_flat = img.view(img.size(0), -1)\n", "        validity = self.model(img_flat)\n", "\n", "        return validity"]}, {"cell_type": "markdown", "id": "35cfa85f", "metadata": {"lines_to_next_cell": 2, "papermill": {"duration": 0.010453, "end_time": "2021-09-09T13:20:20.151538", "exception": false, "start_time": "2021-09-09T13:20:20.141085", "status": "completed"}, "tags": []}, "source": ["### C. GAN\n", "\n", "#### A couple of cool features to check out in this example...\n", "\n", "  - We use `some_tensor.type_as(another_tensor)` to make sure we initialize new tensors on the right device (i.e. GPU, CPU).\n", "    - Lightning will put your dataloader data on the right device automatically\n", "    - In this example, we pull from latent dim on the fly, so we need to dynamically add tensors to the right device.\n", "    - `type_as` is the way we recommend to do this.\n", "  - This example shows how to use multiple dataloaders in your `LightningModule`."]}, {"cell_type": "code", "execution_count": 6, "id": "c03d4d75", "metadata": {"execution": {"iopub.execute_input": "2021-09-09T13:20:20.182014Z", "iopub.status.busy": "2021-09-09T13:20:20.181514Z", "iopub.status.idle": "2021-09-09T13:20:20.183781Z", "shell.execute_reply": "2021-09-09T13:20:20.183302Z"}, "papermill": {"duration": 0.023137, "end_time": "2021-09-09T13:20:20.183887", "exception": false, "start_time": "2021-09-09T13:20:20.160750", "status": "completed"}, "tags": []}, "outputs": [], "source": ["class GAN(LightningModule):\n", "    def __init__(\n", "        self,\n", "        channels,\n", "        width,\n", "        height,\n", "        latent_dim: int = 100,\n", "        lr: float = 0.0002,\n", "        b1: float = 0.5,\n", "        b2: float = 0.999,\n", "        batch_size: int = BATCH_SIZE,\n", "        **kwargs\n", "    ):\n", "        super().__init__()\n", "        self.save_hyperparameters()\n", "\n", "        # networks\n", "        data_shape = (channels, width, height)\n", "        self.generator = Generator(latent_dim=self.hparams.latent_dim, img_shape=data_shape)\n", "        self.discriminator = Discriminator(img_shape=data_shape)\n", "\n", "        self.validation_z = torch.randn(8, self.hparams.latent_dim)\n", "\n", "        self.example_input_array = torch.zeros(2, self.hparams.latent_dim)\n", "\n", "    def forward(self, z):\n", "        return self.generator(z)\n", "\n", "    def adversarial_loss(self, y_hat, y):\n", "        return F.binary_cross_entropy(y_hat, y)\n", "\n", "    def training_step(self, batch, batch_idx, optimizer_idx):\n", "        imgs, _ = batch\n", "\n", "        # sample noise\n", "        z = torch.randn(imgs.shape[0], self.hparams.latent_dim)\n", "        z = z.type_as(imgs)\n", "\n", "        # train generator\n", "        if optimizer_idx == 0:\n", "\n", "            # generate images\n", "            self.generated_imgs = self(z)\n", "\n", "            # log sampled images\n", "            sample_imgs = self.generated_imgs[:6]\n", "            grid = torchvision.utils.make_grid(sample_imgs)\n", "            self.logger.experiment.add_image(\"generated_images\", grid, 0)\n", "\n", "            # ground truth result (ie: all fake)\n", "            # put on GPU because we created this tensor inside training_loop\n", "            valid = torch.ones(imgs.size(0), 1)\n", "            valid = valid.type_as(imgs)\n", "\n", "            # adversarial loss is binary cross-entropy\n", "            g_loss = self.adversarial_loss(self.discriminator(self(z)), valid)\n", "            tqdm_dict = {\"g_loss\": g_loss}\n", "            output = OrderedDict({\"loss\": g_loss, \"progress_bar\": tqdm_dict, \"log\": tqdm_dict})\n", "            return output\n", "\n", "        # train discriminator\n", "        if optimizer_idx == 1:\n", "            # Measure discriminator's ability to classify real from generated samples\n", "\n", "            # how well can it label as real?\n", "            valid = torch.ones(imgs.size(0), 1)\n", "            valid = valid.type_as(imgs)\n", "\n", "            real_loss = self.adversarial_loss(self.discriminator(imgs), valid)\n", "\n", "            # how well can it label as fake?\n", "            fake = torch.zeros(imgs.size(0), 1)\n", "            fake = fake.type_as(imgs)\n", "\n", "            fake_loss = self.adversarial_loss(self.discriminator(self(z).detach()), fake)\n", "\n", "            # discriminator loss is the average of these\n", "            d_loss = (real_loss + fake_loss) / 2\n", "            tqdm_dict = {\"d_loss\": d_loss}\n", "            output = OrderedDict({\"loss\": d_loss, \"progress_bar\": tqdm_dict, \"log\": tqdm_dict})\n", "            return output\n", "\n", "    def configure_optimizers(self):\n", "        lr = self.hparams.lr\n", "        b1 = self.hparams.b1\n", "        b2 = self.hparams.b2\n", "\n", "        opt_g = torch.optim.Adam(self.generator.parameters(), lr=lr, betas=(b1, b2))\n", "        opt_d = torch.optim.Adam(self.discriminator.parameters(), lr=lr, betas=(b1, b2))\n", "        return [opt_g, opt_d], []\n", "\n", "    def on_epoch_end(self):\n", "        z = self.validation_z.type_as(self.generator.model[0].weight)\n", "\n", "        # log sampled images\n", "        sample_imgs = self(z)\n", "        grid = torchvision.utils.make_grid(sample_imgs)\n", "        self.logger.experiment.add_image(\"generated_images\", grid, self.current_epoch)"]}, {"cell_type": "code", "execution_count": 7, "id": "239a8875", "metadata": {"execution": {"iopub.execute_input": "2021-09-09T13:20:20.202337Z", "iopub.status.busy": "2021-09-09T13:20:20.201868Z", "iopub.status.idle": "2021-09-09T13:20:42.180320Z", "shell.execute_reply": "2021-09-09T13:20:42.179750Z"}, "papermill": {"duration": 21.989268, "end_time": "2021-09-09T13:20:42.180442", "exception": false, "start_time": "2021-09-09T13:20:20.191174", "status": "completed"}, "tags": []}, "outputs": [{"name": "stderr", "output_type": "stream", "text": ["GPU available: True, used: True\n"]}, {"name": "stderr", "output_type": "stream", "text": ["TPU available: False, using: 0 TPU cores\n"]}, {"name": "stderr", "output_type": "stream", "text": ["IPU available: False, using: 0 IPUs\n"]}, {"name": "stderr", "output_type": "stream", "text": ["/home/AzDevOps_azpcontainer/.local/lib/python3.9/site-packages/pytorch_lightning/trainer/configuration_validator.py:99: UserWarning: you passed in a val_dataloader but have no validation_step. Skipping val loop\n", "  rank_zero_warn(f\"you passed in a {loader_name} but have no {step_name}. Skipping {stage} loop\")\n", "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n"]}, {"name": "stderr", "output_type": "stream", "text": ["\n", "  | Name          | Type          | Params | In sizes | Out sizes     \n", "----------------------------------------------------------------------------\n", "0 | generator     | Generator     | 1.5 M  | [2, 100] | [2, 1, 28, 28]\n", "1 | discriminator | Discriminator | 533 K  | ?        | ?             \n", "----------------------------------------------------------------------------\n", "2.0 M     Trainable params\n", "0         Non-trainable params\n", "2.0 M     Total params\n", "8.174     Total estimated model params size (MB)\n"]}, {"data": {"application/vnd.jupyter.widget-view+json": {"model_id": "de9ba680bbcc4700acf95102f4837035", "version_major": 2, "version_minor": 0}, "text/plain": ["Training: -1it [00:00, ?it/s]"]}, "metadata": {}, "output_type": "display_data"}, {"name": "stderr", "output_type": "stream", "text": ["/home/AzDevOps_azpcontainer/.local/lib/python3.9/site-packages/pytorch_lightning/trainer/connectors/logger_connector/result.py:405: LightningDeprecationWarning: One of the returned values {'progress_bar', 'log'} has a `grad_fn`. We will detach it automatically but this behaviour will change in v1.6. Please detach it manually: `return {'loss': ..., 'something': something.detach()}`\n", "  warning_cache.deprecation(\n"]}], "source": ["dm = MNISTDataModule()\n", "model = GAN(*dm.size())\n", "trainer = Trainer(gpus=AVAIL_GPUS, max_epochs=5, progress_bar_refresh_rate=20)\n", "trainer.fit(model, dm)"]}, {"cell_type": "code", "execution_count": 8, "id": "28e960d9", "metadata": {"execution": {"iopub.execute_input": "2021-09-09T13:20:42.202343Z", "iopub.status.busy": "2021-09-09T13:20:42.201872Z", "iopub.status.idle": "2021-09-09T13:20:42.203977Z", "shell.execute_reply": "2021-09-09T13:20:42.203515Z"}, "papermill": {"duration": 0.013867, "end_time": "2021-09-09T13:20:42.204076", "exception": false, "start_time": "2021-09-09T13:20:42.190209", "status": "completed"}, "tags": []}, "outputs": [], "source": ["# Start tensorboard.\n", "# %load_ext tensorboard\n", "# %tensorboard --logdir lightning_logs/"]}, {"cell_type": "markdown", "id": "bbe2c8c5", "metadata": {"papermill": {"duration": 0.008883, "end_time": "2021-09-09T13:20:42.221829", "exception": false, "start_time": "2021-09-09T13:20:42.212946", "status": "completed"}, "tags": []}, "source": ["## Congratulations - Time to Join the Community!\n", "\n", "Congratulations on completing this notebook tutorial! If you enjoyed this and would like to join the Lightning\n", "movement, you can do so in the following ways!\n", "\n", "### Star [Lightning](https://github.com/PyTorchLightning/pytorch-lightning) on GitHub\n", "The easiest way to help our community is just by starring the GitHub repos! This helps raise awareness of the cool\n", "tools we're building.\n", "\n", "### Join our [Slack](https://join.slack.com/t/pytorch-lightning/shared_invite/zt-pw5v393p-qRaDgEk24~EjiZNBpSQFgQ)!\n", "The best way to keep up to date on the latest advancements is to join our community! Make sure to introduce yourself\n", "and share your interests in `#general` channel\n", "\n", "\n", "### Contributions !\n", "The best way to contribute to our community is to become a code contributor! At any time you can go to\n", "[Lightning](https://github.com/PyTorchLightning/pytorch-lightning) or [Bolt](https://github.com/PyTorchLightning/lightning-bolts)\n", "GitHub Issues page and filter for \"good first issue\".\n", "\n", "* [Lightning good first issue](https://github.com/PyTorchLightning/pytorch-lightning/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n", "* [Bolt good first issue](https://github.com/PyTorchLightning/lightning-bolts/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n", "* You can also contribute your own notebooks with useful examples !\n", "\n", "### Great thanks from the entire Pytorch Lightning Team for your interest !\n", "\n", "![Pytorch Lightning](data:image/png;base64,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){height=\"60px\" width=\"240px\"}"]}, {"cell_type": "raw", "metadata": {"raw_mimetype": "text/restructuredtext"}, "source": [".. customcarditem::\n", "   :header: PyTorch Lightning Basic GAN Tutorial\n", "   :card_description: How to train a GAN!  Main takeaways: 1. Generator and discriminator are arbitrary PyTorch modules. 2. training_step does both the generator and discriminator training.\n", "   :tags: Image,GPU/TPU,Lightning-Examples"]}], "metadata": {"jupytext": {"cell_metadata_filter": "id,colab,colab_type,-all", "formats": "ipynb,py:percent", "main_language": "python"}, "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.9.6"}, "papermill": {"default_parameters": {}, "duration": 25.027239, "end_time": "2021-09-09T13:20:42.837710", "environment_variables": {}, "exception": null, "input_path": "lightning_examples/basic-gan/gan.ipynb", "output_path": ".notebooks/lightning_examples/basic-gan.ipynb", "parameters": {}, "start_time": "2021-09-09T13:20:17.810471", "version": "2.3.3"}, "widgets": {"application/vnd.jupyter.widget-state+json": {"state": {"0f79481079664977ab8b20e9a5e1a2df": {"model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "FloatProgressModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_574f810fd7df44e48a5a6446177d5496", "max": 215.0, "min": 0.0, "orientation": "horizontal", "style": "IPY_MODEL_c0ac37a29c364a18be33dbab437ddacb", "value": 215.0}}, "267507daf8b9404e924bf1dfdea8d03c": {"model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": ""}}, "574f810fd7df44e48a5a6446177d5496": {"model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": "2", "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "62f59cd6e2024994bf924a3234631810": {"model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "7e103219c81a4fe2881b4b2ead09fdf6": {"model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_62f59cd6e2024994bf924a3234631810", "placeholder": "\u200b", "style": "IPY_MODEL_fc1a7faf1b504a5791c0c496961f190f", "value": "Epoch 4: 100%"}}, "8ad238fc0f774fe19e253b46e5e2653f": {"model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_b195643141c643c19878a26d98156a78", "placeholder": "\u200b", "style": "IPY_MODEL_267507daf8b9404e924bf1dfdea8d03c", "value": " 215/215 [00:03&lt;00:00, 56.12it/s, loss=2.8, v_num=0]"}}, "b195643141c643c19878a26d98156a78": {"model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null}}, "c0ac37a29c364a18be33dbab437ddacb": {"model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ProgressStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": ""}}, "c3567fea3abc4ae7a076388428252fce": {"model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {"_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": "inline-flex", "flex": null, "flex_flow": "row wrap", "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": "100%"}}, "de9ba680bbcc4700acf95102f4837035": {"model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HBoxModel", "state": {"_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": ["IPY_MODEL_7e103219c81a4fe2881b4b2ead09fdf6", "IPY_MODEL_0f79481079664977ab8b20e9a5e1a2df", "IPY_MODEL_8ad238fc0f774fe19e253b46e5e2653f"], "layout": "IPY_MODEL_c3567fea3abc4ae7a076388428252fce"}}, "fc1a7faf1b504a5791c0c496961f190f": {"model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": {"_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": ""}}}, "version_major": 2, "version_minor": 0}}}, "nbformat": 4, "nbformat_minor": 5}