Skip to content

Instantly share code, notes, and snippets.

@ariG23498
Created April 18, 2024 07:51
Show Gist options
  • Save ariG23498/73c1d4c27d75268fd9973930dc80a2ad to your computer and use it in GitHub Desktop.
Save ariG23498/73c1d4c27d75268fd9973930dc80a2ad to your computer and use it in GitHub Desktop.
autoregressive-diffusion-gru.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/ariG23498/73c1d4c27d75268fd9973930dc80a2ad/autoregressive-diffusion-gru.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "02vydzVb6VWO"
},
"source": [
"This notebook is heavily inspired from: https://huggingface.co/blog/annotated-diffusion"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-CFKktKV2qqo"
},
"source": [
"## Setup and Imports"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "BmiGcVlQ64dD",
"outputId": "6e9edf89-62e7-4533-8fb9-96dd0f6558a2"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m510.5/510.5 kB\u001b[0m \u001b[31m3.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m6.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.1/194.1 kB\u001b[0m \u001b[31m11.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.8/134.8 kB\u001b[0m \u001b[31m8.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25h"
]
}
],
"source": [
"!pip install --upgrade -qq datasets"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "hzUHzDmy2kOy"
},
"outputs": [],
"source": [
"import random\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"\n",
"from datasets import load_dataset\n",
"\n",
"import torch\n",
"from torch import nn\n",
"from torch.nn import functional as F\n",
"from torch.utils.data import DataLoader\n",
"\n",
"from torchvision import transforms"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rlNouEPu7ART"
},
"source": [
"## Configurations"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "3HNObPXp7Bff",
"outputId": "d6bc5730-1833-488c-9964-140476d5b092"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"device='cuda'\n"
]
}
],
"source": [
"B = 1024\n",
"H = W = 28\n",
"C = 1\n",
"T = 20\n",
"\n",
"hidden_dim = 128\n",
"epochs = 10\n",
"lr = 1e-4\n",
"\n",
"device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
"print(f\"{device=}\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JGEzhe8s7B1p"
},
"source": [
"## Dataset and Loaders"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 145,
"referenced_widgets": [
"aabc8f376da24c189f7e254f0e10463f",
"b0ade1942f494b65b7c0e4766da73d6e",
"84001a8771e84ae4ae8490e109c10d12",
"5a7b1a406d3b4304bd09275f2f1cea0d",
"81f27436ace945cebc703f20c907af7c",
"194358c3c5624917809abc4c96a88258",
"586da1075f2e466fb7e2c0889797525a",
"f2fc2b4f120d4e6d91c20d86e9a7200e",
"7afa5f2062754840b1768aa5c16c6b1b",
"d0e8a5f96fe64169b8f57cafec5a3712",
"6f72f0a7f8354fb093a7cf5b0b26bc40",
"13335f706b33407aad4fc17dc775c442",
"d2074f1151724105bea216cbcbdf2b1a",
"475a7b917d5f4498a8994f70a698778a",
"1b1285ff9f1b4e47be202a49ef298b7f",
"7dd69b0868d84ceca97e7cd9ced274ef",
"1c7901dd4dad459392c76ddef53826fb",
"4a7bcaecfa214392996cdc625d035407",
"f0dd4a8852544be1a5419783d933d3c2",
"0866e4ffae86463b9ed5119625bde4f5",
"4aa286bebafa4899b74863e320d3cf64",
"f00a7f09029944169ecd25447f857f04",
"da168da36c3d4c23893fa8075cf11147",
"9b3e2e698ff74613a18eea9bb5ddd86b",
"871aafcc0b5440f8a7ca2a9b547e317c",
"ee51dc1bece8423e8d9cbe23dafe6b3c",
"67386296cc604ddabacaa6e3c98813b9",
"3394bbd34bfb4026873b36b0f7681290",
"73fa173613294ec4ad18a8f4b2f3f82e",
"f6b863493fb04233a83ca107ece30b55",
"a2dd7b3497a143b582ff876a45c42e0c",
"e3b70cabe29743658054c86fc830003b",
"709d4a0bad844d7d9e512d08dffc954e",
"c6674878ba944e77b376a6f69f09e469",
"ec4ae507bb4c4c8288cbf3c165204bb8",
"2c47342b29fc493db35eaed7d2c41738",
"9a804266219c4171845f56faac9b0ed6",
"caf7a1f51a2745ac8b71588c6a7b027f",
"b03b06120b5141fda54a3536bcc495da",
"baa5227cc3204deda66619ad1e96f466",
"78a82c4f84414ad48c1f94fae6cb94e5",
"701a70a97018426d998cb607d8ac0a17",
"40f38886d99947eb9f3d02e0335cf82a",
"8f2663f99d0c4c1fa5898830f9e2c13a"
]
},
"id": "PdIqVYuj6axU",
"outputId": "634b9086-555c-473b-a2e1-ceceb44992dd"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"Downloading data: 0%| | 0.00/30.9M [00:00<?, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "aabc8f376da24c189f7e254f0e10463f"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Downloading data: 0%| | 0.00/5.18M [00:00<?, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "13335f706b33407aad4fc17dc775c442"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating train split: 0%| | 0/60000 [00:00<?, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "da168da36c3d4c23893fa8075cf11147"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating test split: 0%| | 0/10000 [00:00<?, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "c6674878ba944e77b376a6f69f09e469"
}
},
"metadata": {}
}
],
"source": [
"# load dataset from the hub\n",
"dataset = load_dataset(\"fashion_mnist\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "SbnfSuvR6eel"
},
"outputs": [],
"source": [
"# define image transformations\n",
"transform = transforms.Compose([\n",
" transforms.RandomHorizontalFlip(),\n",
" transforms.ToTensor(),\n",
" transforms.Lambda(lambda x: (x * 2) - 1)\n",
"])\n",
"\n",
"# define function\n",
"def transforms(examples):\n",
" examples[\"pixel_values\"] = [transform(image.convert(\"L\")) for image in examples[\"image\"]]\n",
" del examples[\"image\"]\n",
" return examples\n",
"\n",
"transformed_dataset = (\n",
" dataset\n",
" .with_transform(transforms)\n",
" .remove_columns(\"label\")\n",
")\n",
"\n",
"# create dataloader\n",
"dataloader = DataLoader(\n",
" transformed_dataset[\"train\"],\n",
" batch_size=B,\n",
" shuffle=True\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GneDUV5J74KJ",
"outputId": "13a628f5-7988-4cce-f145-e92ff2bfd47c"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"dict_keys(['pixel_values'])\n",
"torch.Size([1024, 1, 28, 28])\n"
]
}
],
"source": [
"# Get a batch of data and check the shape\n",
"batch = next(iter(dataloader))\n",
"print(batch.keys())\n",
"print(batch[\"pixel_values\"].shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ggg6okjO8NFS"
},
"source": [
"## Forward Diffusion Process"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"id": "9_7ipOKVIbFn"
},
"outputs": [],
"source": [
"# Define a linear schedule\n",
"def linear_beta_schedule(T):\n",
" beta_start = 0.0001\n",
" beta_end = 0.02\n",
" return torch.linspace(beta_start, beta_end, T)\n",
"\n",
"# define beta schedule\n",
"betas = linear_beta_schedule(T=T)\n",
"\n",
"# define alphas = 1 - beta\n",
"alphas = 1.0 - betas\n",
"alphas_cumprod = torch.cumprod(alphas, axis=0)\n",
"sqrt_alphas_cumprod = torch.sqrt(alphas_cumprod)\n",
"sqrt_one_minus_alphas_cumprod = torch.sqrt(1. - alphas_cumprod)\n",
"\n",
"def extract(a, t, x_shape):\n",
" batch_size = t.shape[0]\n",
" out = a.gather(dim=-1, index=t.cpu())\n",
" return out.reshape(\n",
" batch_size, T, *((1,) * (len(x_shape) - 2))\n",
" ).to(t.device)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"id": "pmHZGKa8Lhbz"
},
"outputs": [],
"source": [
"# forward diffusion\n",
"def q_sample(x_start, t, sqrt_alphas_cumprod, sqrt_one_minus_alphas_cumprod, noise=None):\n",
" if noise is None:\n",
" noise = torch.randn_like(x_start)\n",
"\n",
" sqrt_alphas_cumprod_t = extract(\n",
" sqrt_alphas_cumprod,\n",
" t,\n",
" x_start.shape\n",
" )\n",
" sqrt_one_minus_alphas_cumprod_t = extract(\n",
" sqrt_one_minus_alphas_cumprod,\n",
" t,\n",
" x_start.shape\n",
" )\n",
"\n",
" return sqrt_alphas_cumprod_t * x_start + sqrt_one_minus_alphas_cumprod_t * noise"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"id": "uWgxpZPj8sY6"
},
"outputs": [],
"source": [
"# create a batch of noise images\n",
"t = torch.arange(0, T).flip((-1,)).repeat(B, 1)\n",
"input_images = q_sample(\n",
" x_start=batch[\"pixel_values\"].unsqueeze(1), # (B, 1, C, H, W)\n",
" t=t, # (B, timesteps)\n",
" sqrt_alphas_cumprod=sqrt_alphas_cumprod.repeat(B, 1),\n",
" sqrt_one_minus_alphas_cumprod=sqrt_one_minus_alphas_cumprod.repeat(B, 1),\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "aQ0H8DVxEJqF"
},
"source": [
"### Viz the forward process"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 122
},
"id": "I-hoBcj3DNSf",
"outputId": "dd05fa4f-0eca-4619-a7ba-137f4c40d8a4"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 5 Axes>"
],
"image/png": "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\n"
},
"metadata": {}
}
],
"source": [
"idx = random.randint(0, B-1)\n",
"for i in range(1, 6):\n",
" plt.subplot(1, 5, i)\n",
" plt.imshow(input_images[idx, (T//5 * i)-1].permute(1, 2, 0), cmap=\"gray\")\n",
" plt.axis(\"off\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-CeUWnzpEoqb"
},
"source": [
"## Define the RNN goodies"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"id": "z81MMxklEqhO"
},
"outputs": [],
"source": [
"class ImageEncoder(nn.Module):\n",
" def __init__(self, in_channels=1, out_channels=128):\n",
" super().__init__()\n",
" self.conv1 = nn.Conv2d(in_channels, 32, kernel_size=3, stride=2, padding=1)\n",
" self.bn1 = nn.BatchNorm2d(32)\n",
" self.relu1 = nn.ReLU()\n",
"\n",
" self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1)\n",
" self.bn2 = nn.BatchNorm2d(64)\n",
" self.relu2 = nn.ReLU()\n",
"\n",
" self.conv3 = nn.Conv2d(64, out_channels, kernel_size=3, stride=2, padding=1)\n",
" self.bn3 = nn.BatchNorm2d(out_channels)\n",
" self.relu3 = nn.ReLU()\n",
"\n",
" # Global Average Pooling to reduce spatial dimensions to 1x1\n",
" self.gap = nn.AdaptiveAvgPool2d((1, 1))\n",
"\n",
" def forward(self, x):\n",
" x = self.conv1(x)\n",
" x = self.bn1(x)\n",
" x = self.relu1(x)\n",
"\n",
" x = self.conv2(x)\n",
" x = self.bn2(x)\n",
" x = self.relu2(x)\n",
"\n",
" x = self.conv3(x)\n",
" x = self.bn3(x)\n",
" x = self.relu3(x)\n",
"\n",
" x = self.gap(x)\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"id": "gzQ35KxeE2Cz"
},
"outputs": [],
"source": [
"class ImageDecoder(nn.Module):\n",
" def __init__(self, in_channels=128, out_channels=1, initial_height=H, initial_width=W):\n",
" super(ImageDecoder, self).__init__()\n",
" self.conv_transpose1 = nn.ConvTranspose2d(in_channels, 64, kernel_size=3, stride=2, padding=1, output_padding=1)\n",
" self.bn1 = nn.BatchNorm2d(64)\n",
" self.relu1 = nn.ReLU()\n",
"\n",
" self.conv_transpose2 = nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, output_padding=1)\n",
" self.bn2 = nn.BatchNorm2d(32)\n",
" self.relu2 = nn.ReLU()\n",
"\n",
" self.conv_transpose3 = nn.ConvTranspose2d(32, out_channels, kernel_size=3, stride=2, padding=1, output_padding=1)\n",
" self.bn3 = nn.BatchNorm2d(out_channels)\n",
" self.relu3 = nn.ReLU()\n",
"\n",
" # Additional layer to ensure correct output dimensions\n",
" # This layer is only needed if the initial size cannot be exactly achieved through the strides and paddings chosen\n",
" self.final_resize = nn.AdaptiveAvgPool2d((initial_height, initial_width))\n",
"\n",
" def forward(self, x):\n",
" x = self.conv_transpose1(x)\n",
" x = self.bn1(x)\n",
" x = self.relu1(x)\n",
"\n",
" x = self.conv_transpose2(x)\n",
" x = self.bn2(x)\n",
" x = self.relu2(x)\n",
"\n",
" x = self.conv_transpose3(x)\n",
" x = self.bn3(x)\n",
" x = self.relu3(x)\n",
"\n",
" x = self.final_resize(x) # Ensure the output has the same HxW dimensions as the original input\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"id": "chqbXzZaE5Ok"
},
"outputs": [],
"source": [
"class CustomRecurrence(nn.Module):\n",
" def __init__(\n",
" self,\n",
" in_channels=1,\n",
" initial_height=H,\n",
" initial_width=W,\n",
" hidden_dim=hidden_dim,\n",
" num_layers=2,\n",
" training=False\n",
" ):\n",
" super().__init__()\n",
" self.hidden_dim = hidden_dim\n",
" self.image_encoder = ImageEncoder(in_channels=in_channels)\n",
" self.rnn = nn.GRU(\n",
" input_size=hidden_dim,\n",
" hidden_size=hidden_dim,\n",
" num_layers=num_layers,\n",
" batch_first=True\n",
" )\n",
" self.image_decoder = ImageDecoder(\n",
" in_channels=hidden_dim,\n",
" out_channels=in_channels,\n",
" initial_height=initial_height,\n",
" initial_width=initial_width\n",
" )\n",
" self.training=training\n",
"\n",
" def forward(self, x, hidden_states=None):\n",
" batch_size, timesteps, channels, height, width = x.shape\n",
" x = x.reshape(batch_size * timesteps, channels, height, width) # (b*t, c, h, w)\n",
"\n",
" # Encode the image\n",
" latent_vectors = self.image_encoder(x) # (b*t, hidden_dim, 1, 1)\n",
" latent_vectors = latent_vectors.reshape(batch_size, timesteps, -1) # (b, t, hidden_dim)\n",
"\n",
" # Use RNNs to formulate the reverse diffusion process\n",
" if self.training:\n",
" rnn_outputs, _ = self.rnn(latent_vectors) # (b, t, hidden_dim)\n",
" else:\n",
" rnn_outputs, hidden_states = self.rnn(latent_vectors, hidden_states) # (b, t, hidden_dim)\n",
"\n",
" # Decode the images\n",
" rnn_outputs = rnn_outputs.reshape(batch_size * timesteps, self.hidden_dim, 1, 1) # (b*t, hidden_dim, 1, 1)\n",
" reconstructed_x = self.image_decoder(rnn_outputs)\n",
" reconstructed_x = reconstructed_x.reshape(batch_size, timesteps, channels, height, width)\n",
"\n",
" if self.training:\n",
" return reconstructed_x\n",
" else:\n",
" return reconstructed_x, hidden_states"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KD_os31TMhEN"
},
"source": [
"## Training Loop"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"id": "TYo28dSj49K_"
},
"outputs": [],
"source": [
"model = CustomRecurrence(training=True)\n",
"model.to(device)\n",
"\n",
"optimizer = torch.optim.Adam(\n",
" model.parameters(),\n",
" lr=lr,\n",
")\n",
"\n",
"loss_fn = nn.MSELoss()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ImaLvHwjMiDf",
"outputId": "daa51f31-9bdd-45c4-b6f3-57c2eb54a6fc"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch:0\n",
"\tLoss:1.45117\n",
"Epoch:1\n",
"\tLoss:0.71674\n",
"Epoch:2\n",
"\tLoss:0.68546\n",
"Epoch:3\n",
"\tLoss:0.66598\n",
"Epoch:4\n",
"\tLoss:0.66175\n",
"Epoch:5\n",
"\tLoss:0.65562\n",
"Epoch:6\n",
"\tLoss:0.65633\n",
"Epoch:7\n",
"\tLoss:0.65157\n",
"Epoch:8\n",
"\tLoss:0.65766\n",
"Epoch:9\n",
"\tLoss:0.65651\n"
]
}
],
"source": [
"for epoch in range(epochs):\n",
" print(f\"Epoch:{epoch}\")\n",
" for step, batch in enumerate(dataloader):\n",
" optimizer.zero_grad()\n",
"\n",
" batch = batch[\"pixel_values\"].to(device)\n",
" batch_size = batch.shape[0]\n",
"\n",
"\n",
" t = torch.arange(0, T).flip((-1,)).repeat(batch_size, 1).to(device)\n",
" input_images = q_sample(\n",
" x_start=batch.unsqueeze(1), # (B, 1, C, H, W)\n",
" t=t, # (B, t)\n",
" sqrt_alphas_cumprod=sqrt_alphas_cumprod.repeat(batch_size, 1),\n",
" sqrt_one_minus_alphas_cumprod=sqrt_one_minus_alphas_cumprod.repeat(batch_size, 1),\n",
" )\n",
"\n",
" # remember to offset by 1 -- we are learning an autoregressive model\n",
" reconstructed_images = model(input_images[:, :T-1, ...])\n",
" loss = loss_fn(reconstructed_images, input_images[:, 1:, ...])\n",
"\n",
" if step % 100 == 0:\n",
" print(f\"\\tLoss:{loss.item():0.5f}\")\n",
"\n",
" loss.backward()\n",
" optimizer.step()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PP6CFN4vMidh"
},
"source": [
"## Inference Loop"
]
},
{
"cell_type": "code",
"source": [
"def plot_images(image_list, rows=50, cols=10):\n",
" # Calculate dynamic figure size, assuming each image subplot is 1x1 inch size\n",
" figsize = (cols, rows) # You can adjust the scale factor here for smaller or larger images\n",
" fig, axes = plt.subplots(rows, cols, figsize=figsize)\n",
" for i, ax in enumerate(axes.flat):\n",
" if i < len(image_list):\n",
" ax.imshow(image_list[i][0, 0, 0], cmap='gray', aspect='auto')\n",
" ax.axis('off') # Turn off axis labels and ticks\n",
" else:\n",
" ax.axis('off') # Ensure empty subplots remain without axes\n",
"\n",
" plt.subplots_adjust(wspace=0.05, hspace=0.05) # Adjust spacing between images\n",
" plt.show()"
],
"metadata": {
"id": "cUWGc5paBq5z"
},
"execution_count": 19,
"outputs": []
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"id": "iNwii9gJ-Utu"
},
"outputs": [],
"source": [
"model.training=False\n",
"model = model.eval()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"id": "8NxLub4ZMjpH"
},
"outputs": [],
"source": [
"generated_outputs = []\n",
"with torch.no_grad():\n",
" current_input = torch.randn(\n",
" 1, 1, C, H, W\n",
" ).to(device)\n",
" hidden_state = torch.zeros(2, 1, hidden_dim).to(device) # num_layers, t, input_channels\n",
"\n",
" for _ in range(T):\n",
" # Forward pass\n",
" output, hidden_state = model(current_input, hidden_state)\n",
"\n",
" # Use output as next input\n",
" current_input = output\n",
"\n",
" generated_outputs.append(output.cpu().numpy())"
]
},
{
"cell_type": "code",
"source": [
"num_gen_images = len(generated_outputs)\n",
"num_rows = num_gen_images // 10\n",
"num_cols = num_gen_images // num_rows\n",
"plot_images(generated_outputs, rows=num_rows, cols=num_cols)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 191
},
"id": "nadW4XaaBDXk",
"outputId": "38df5f7f-01a9-4ced-937a-539576e35a5f"
},
"execution_count": 28,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x200 with 20 Axes>"
],
"image/png": "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\n"
},
"metadata": {}
}
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"gpuType": "T4",
"provenance": [],
"authorship_tag": "ABX9TyP/P4AFUVVMmS88DTTrynJo",
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"aabc8f376da24c189f7e254f0e10463f": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"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_b0ade1942f494b65b7c0e4766da73d6e",
"IPY_MODEL_84001a8771e84ae4ae8490e109c10d12",
"IPY_MODEL_5a7b1a406d3b4304bd09275f2f1cea0d"
],
"layout": "IPY_MODEL_81f27436ace945cebc703f20c907af7c"
}
},
"b0ade1942f494b65b7c0e4766da73d6e": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"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_194358c3c5624917809abc4c96a88258",
"placeholder": "​",
"style": "IPY_MODEL_586da1075f2e466fb7e2c0889797525a",
"value": "Downloading data: 100%"
}
},
"84001a8771e84ae4ae8490e109c10d12": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"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_f2fc2b4f120d4e6d91c20d86e9a7200e",
"max": 30931277,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_7afa5f2062754840b1768aa5c16c6b1b",
"value": 30931277
}
},
"5a7b1a406d3b4304bd09275f2f1cea0d": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"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_d0e8a5f96fe64169b8f57cafec5a3712",
"placeholder": "​",
"style": "IPY_MODEL_6f72f0a7f8354fb093a7cf5b0b26bc40",
"value": " 30.9M/30.9M [00:00&lt;00:00, 42.3MB/s]"
}
},
"81f27436ace945cebc703f20c907af7c": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"194358c3c5624917809abc4c96a88258": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"586da1075f2e466fb7e2c0889797525a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"f2fc2b4f120d4e6d91c20d86e9a7200e": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"7afa5f2062754840b1768aa5c16c6b1b": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"d0e8a5f96fe64169b8f57cafec5a3712": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"6f72f0a7f8354fb093a7cf5b0b26bc40": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"13335f706b33407aad4fc17dc775c442": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"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_d2074f1151724105bea216cbcbdf2b1a",
"IPY_MODEL_475a7b917d5f4498a8994f70a698778a",
"IPY_MODEL_1b1285ff9f1b4e47be202a49ef298b7f"
],
"layout": "IPY_MODEL_7dd69b0868d84ceca97e7cd9ced274ef"
}
},
"d2074f1151724105bea216cbcbdf2b1a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"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_1c7901dd4dad459392c76ddef53826fb",
"placeholder": "​",
"style": "IPY_MODEL_4a7bcaecfa214392996cdc625d035407",
"value": "Downloading data: 100%"
}
},
"475a7b917d5f4498a8994f70a698778a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"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_f0dd4a8852544be1a5419783d933d3c2",
"max": 5175617,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_0866e4ffae86463b9ed5119625bde4f5",
"value": 5175617
}
},
"1b1285ff9f1b4e47be202a49ef298b7f": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"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_4aa286bebafa4899b74863e320d3cf64",
"placeholder": "​",
"style": "IPY_MODEL_f00a7f09029944169ecd25447f857f04",
"value": " 5.18M/5.18M [00:00&lt;00:00, 36.4MB/s]"
}
},
"7dd69b0868d84ceca97e7cd9ced274ef": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"1c7901dd4dad459392c76ddef53826fb": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"4a7bcaecfa214392996cdc625d035407": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"f0dd4a8852544be1a5419783d933d3c2": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"0866e4ffae86463b9ed5119625bde4f5": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"4aa286bebafa4899b74863e320d3cf64": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"f00a7f09029944169ecd25447f857f04": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"da168da36c3d4c23893fa8075cf11147": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"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_9b3e2e698ff74613a18eea9bb5ddd86b",
"IPY_MODEL_871aafcc0b5440f8a7ca2a9b547e317c",
"IPY_MODEL_ee51dc1bece8423e8d9cbe23dafe6b3c"
],
"layout": "IPY_MODEL_67386296cc604ddabacaa6e3c98813b9"
}
},
"9b3e2e698ff74613a18eea9bb5ddd86b": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"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_3394bbd34bfb4026873b36b0f7681290",
"placeholder": "​",
"style": "IPY_MODEL_73fa173613294ec4ad18a8f4b2f3f82e",
"value": "Generating train split: 100%"
}
},
"871aafcc0b5440f8a7ca2a9b547e317c": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"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_f6b863493fb04233a83ca107ece30b55",
"max": 60000,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_a2dd7b3497a143b582ff876a45c42e0c",
"value": 60000
}
},
"ee51dc1bece8423e8d9cbe23dafe6b3c": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"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_e3b70cabe29743658054c86fc830003b",
"placeholder": "​",
"style": "IPY_MODEL_709d4a0bad844d7d9e512d08dffc954e",
"value": " 60000/60000 [00:00&lt;00:00, 161425.71 examples/s]"
}
},
"67386296cc604ddabacaa6e3c98813b9": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"3394bbd34bfb4026873b36b0f7681290": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"73fa173613294ec4ad18a8f4b2f3f82e": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"f6b863493fb04233a83ca107ece30b55": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"a2dd7b3497a143b582ff876a45c42e0c": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"e3b70cabe29743658054c86fc830003b": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"709d4a0bad844d7d9e512d08dffc954e": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"c6674878ba944e77b376a6f69f09e469": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"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_ec4ae507bb4c4c8288cbf3c165204bb8",
"IPY_MODEL_2c47342b29fc493db35eaed7d2c41738",
"IPY_MODEL_9a804266219c4171845f56faac9b0ed6"
],
"layout": "IPY_MODEL_caf7a1f51a2745ac8b71588c6a7b027f"
}
},
"ec4ae507bb4c4c8288cbf3c165204bb8": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"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_b03b06120b5141fda54a3536bcc495da",
"placeholder": "​",
"style": "IPY_MODEL_baa5227cc3204deda66619ad1e96f466",
"value": "Generating test split: 100%"
}
},
"2c47342b29fc493db35eaed7d2c41738": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"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_78a82c4f84414ad48c1f94fae6cb94e5",
"max": 10000,
"min": 0,
"orientation": "horizontal",
"style": "IPY_MODEL_701a70a97018426d998cb607d8ac0a17",
"value": 10000
}
},
"9a804266219c4171845f56faac9b0ed6": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"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_40f38886d99947eb9f3d02e0335cf82a",
"placeholder": "​",
"style": "IPY_MODEL_8f2663f99d0c4c1fa5898830f9e2c13a",
"value": " 10000/10000 [00:00&lt;00:00, 105401.47 examples/s]"
}
},
"caf7a1f51a2745ac8b71588c6a7b027f": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"b03b06120b5141fda54a3536bcc495da": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"baa5227cc3204deda66619ad1e96f466": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"78a82c4f84414ad48c1f94fae6cb94e5": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"701a70a97018426d998cb607d8ac0a17": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
},
"40f38886d99947eb9f3d02e0335cf82a": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"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
}
},
"8f2663f99d0c4c1fa5898830f9e2c13a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"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": ""
}
}
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment