{
"cells": [
{
"cell_type": "markdown",
"id": "13165aa1-fe26-481f-bb08-3d1fac826041",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": "73ec4c5e-654b-4690-8e78-4741d28639c3",
"diskcache": false,
"headerColor": "inherit",
"id": "b85b379c-83f2-4c6c-996c-ded984bab2c8",
"isComponent": false,
"name": "",
"parents": []
},
"tags": []
},
"source": [
"# Sequential Data Classification\n",
"Adapted from : https://github.com/bentrevett/pytorch-sentiment-analysis/blob/master/2_lstm.ipynb\n",
"- Link Component Color Annotations\n",
" - Yellow : data load / preprocessing\n",
" - Violet : model train / predict"
]
},
{
"cell_type": "markdown",
"id": "ace54a3c-e4ad-4b0b-9d9a-697742de73b7",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "inherit",
"id": "b57118ae-bfa2-46fe-8b9d-fee2d726c371",
"isComponent": false,
"name": "",
"parents": []
}
},
"source": [
"### Required Python Packages\n",
"- `tqdm`\n",
"- `torch`\n",
"- `torchtext`\n",
"- `datasets`\n",
"- `matplotlib`\n",
"\n",
"Run the following cell to install the packages."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bd51f254-866d-444a-abb9-9de45249c3c0",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "inherit",
"id": "c83a6d5a-1d50-441e-8dbd-e69bb82b6bde",
"isComponent": false,
"name": "",
"parents": []
}
},
"outputs": [],
"source": [
"#\n",
"# Required Packages\n",
"# Run this cell to install required packages.\n",
"#\n",
"%pip install \"datasets>=2.2\" \"matplotlib>=2.0\" \"torch>=1.9\" \"torchtext>=0.12\" \"tqdm>=4.64\" "
]
},
{
"cell_type": "markdown",
"id": "9f57ecf9-db3e-4ec7-8c83-89a07b760fdb",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": "bf338eaf-cf47-4680-bc99-9cf3bd0fa5fd",
"diskcache": false,
"headerColor": "inherit",
"id": "a5334a1c-ddda-4f4b-8f5b-6f40dc035d3d",
"isComponent": false,
"name": "",
"parents": []
}
},
"source": [
"### 0. Global Parameters\n",
"- global paprameter of link pipeline\n",
" - seed : torch seed\n",
" - max_length : max sequence length\n",
" - test_size : validayion ratio\n",
" - min_freq : minimum frequency of token in vocabulary\n",
" - embedding_dim : embedding dimension size of embedding layer \n",
" - hidden_dim : hidden size of RNN layer\n",
" - lr : train learning rate\n",
" - batch_size : train batch size\n",
" - n_epochs : train epoch"
]
},
{
"cell_type": "markdown",
"id": "f0d86820-9565-4f47-90a0-da2e0b982cc2",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": "a16d8c78-8820-4f89-87c5-dfbdd31e7189",
"diskcache": false,
"headerColor": "inherit",
"id": "f0b3d714-4564-405a-8034-6ce10eda9622",
"isComponent": false,
"name": "",
"parents": []
}
},
"source": ["### 1. Load package,data"]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b672f09d-fcc2-4331-bb83-3e4483673e87",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#FAFF00",
"id": "8d792aa6-cac6-4ba6-a4a4-1a5566cfbb81",
"isComponent": true,
"name": "Import packages",
"parents": []
},
"tags": []
},
"outputs": [],
"source": [
"import functools\n",
"import sys\n",
"\n",
"import datasets\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import torch\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
"import torchtext\n",
"import tqdm\n",
"from datasets import Dataset, DatasetDict\n",
"\n",
"_ = torch.manual_seed(seed)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2685f1a6-8e78-4479-aef7-b5bf36b5b2d0",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#FAFF00",
"id": "e6449370-f87c-470a-813c-6686f1988e13",
"isComponent": true,
"name": "Load data",
"parents": [
{
"id": "8d792aa6-cac6-4ba6-a4a4-1a5566cfbb81",
"name": "Import packages"
}
]
},
"tags": []
},
"outputs": [],
"source": [
"train_data, test_data = datasets.load_dataset(\"imdb\", split=[\"train\", \"test\"])"
]
},
{
"cell_type": "markdown",
"id": "b329be11-5e4d-4083-9eaa-3a170aceb753",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "inherit",
"id": "14b952e3-b3ad-429b-be52-9b1954883f27",
"isComponent": false,
"name": "",
"parents": []
},
"tags": []
},
"source": ["### 2. Prepare Data"]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6c4e6dfb-f6ae-4341-9e84-8f9885bed7f3",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#FAFF00",
"id": "c7543bc0-670a-49bd-a070-25c610f2c36f",
"isComponent": true,
"name": "Load tokenizer",
"parents": [
{
"id": "8d792aa6-cac6-4ba6-a4a4-1a5566cfbb81",
"name": "Import packages"
}
]
},
"tags": []
},
"outputs": [],
"source": [
"tokenizer = torchtext.data.utils.get_tokenizer(\"basic_english\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d53a51eb-8730-41cd-8e85-d084ffa3f070",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#FAFF00",
"id": "3568006d-7cb0-47e4-b56a-59c1d5ed5f9d",
"isComponent": true,
"name": "Tokenize data",
"parents": [
{
"id": "e6449370-f87c-470a-813c-6686f1988e13",
"name": "Load data"
},
{
"id": "c7543bc0-670a-49bd-a070-25c610f2c36f",
"name": "Load tokenizer"
}
]
},
"tags": []
},
"outputs": [],
"source": [
"def tokenize_data(example, tokenizer, max_length):\n",
" tokens = tokenizer(example[\"text\"])[:max_length]\n",
" length = len(tokens)\n",
" return {\"tokens\": tokens, \"length\": length}\n",
"\n",
"\n",
"train_data = train_data.map(tokenize_data, fn_kwargs={\"tokenizer\": tokenizer, \"max_length\": max_length})\n",
"test_data = test_data.map(tokenize_data, fn_kwargs={\"tokenizer\": tokenizer, \"max_length\": max_length})"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5f520507-a21c-4701-a8ed-47054ed3ad49",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#FAFF00",
"id": "2f143cce-7b1e-4d14-b3ad-93ba9afc436b",
"isComponent": true,
"name": "Sampling and split data",
"parents": [
{
"id": "3568006d-7cb0-47e4-b56a-59c1d5ed5f9d",
"name": "Tokenize data"
}
]
},
"tags": []
},
"outputs": [],
"source": [
"train_data_df = Dataset.to_pandas(train_data).sample(n=3000)\n",
"train_data = Dataset.from_pandas(train_data_df)\n",
"\n",
"test_data_df = Dataset.to_pandas(test_data).sample(n=2000)\n",
"test_data = Dataset.from_pandas(test_data_df)\n",
"\n",
"train_valid_data = train_data.train_test_split(test_size=test_size)\n",
"train_data = train_valid_data[\"train\"]\n",
"valid_data = train_valid_data[\"test\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "57d7f30e-c940-4c9c-b780-d567331a773a",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#FAFF00",
"id": "87489719-b806-424b-90b4-55bbfadd1102",
"isComponent": true,
"name": "Set vocab",
"parents": [
{
"id": "2f143cce-7b1e-4d14-b3ad-93ba9afc436b",
"name": "Sampling and split data"
}
]
},
"tags": []
},
"outputs": [],
"source": [
"special_tokens = [\"\", \"\"]\n",
"\n",
"vocab = torchtext.vocab.build_vocab_from_iterator(\n",
" train_data[\"tokens\"],\n",
" min_freq=min_freq,\n",
" specials=special_tokens,\n",
")\n",
"\n",
"unk_index = vocab[\"\"]\n",
"pad_index = vocab[\"\"]\n",
"\n",
"vocab.set_default_index(unk_index)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1694f0f3-b040-49d9-8948-ab400f94aadc",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#FAFF00",
"id": "77e482c4-435f-40e3-832f-7b8487dec28e",
"isComponent": true,
"name": "Preprocessing data",
"parents": [
{
"id": "87489719-b806-424b-90b4-55bbfadd1102",
"name": "Set vocab"
}
]
},
"tags": []
},
"outputs": [],
"source": [
"def numericalize_data(example, vocab):\n",
" ids = [vocab[token] for token in example[\"tokens\"]]\n",
" return {\"ids\": ids}\n",
"\n",
"\n",
"train_data = train_data.map(numericalize_data, fn_kwargs={\"vocab\": vocab})\n",
"valid_data = valid_data.map(numericalize_data, fn_kwargs={\"vocab\": vocab})\n",
"test_data = test_data.map(numericalize_data, fn_kwargs={\"vocab\": vocab})\n",
"\n",
"train_data = train_data.with_format(type=\"torch\", columns=[\"ids\", \"label\", \"length\"])\n",
"valid_data = valid_data.with_format(type=\"torch\", columns=[\"ids\", \"label\", \"length\"])\n",
"test_data = test_data.with_format(type=\"torch\", columns=[\"ids\", \"label\", \"length\"])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3a3881e6-3d16-4995-b977-5e6900454070",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#FAFF00",
"id": "24f8e6d3-56bf-4f50-8561-2408cc91ce4d",
"isComponent": true,
"name": "Set dataloader",
"parents": [
{
"id": "77e482c4-435f-40e3-832f-7b8487dec28e",
"name": "Preprocessing data"
}
]
},
"tags": []
},
"outputs": [],
"source": [
"def collate(batch, pad_index):\n",
" batch_ids = [i[\"ids\"] for i in batch]\n",
" batch_ids = nn.utils.rnn.pad_sequence(batch_ids, padding_value=pad_index, batch_first=True)\n",
" batch_length = [i[\"length\"] for i in batch]\n",
" batch_length = torch.stack(batch_length)\n",
" batch_label = [i[\"label\"] for i in batch]\n",
" batch_label = torch.stack(batch_label)\n",
" batch = {\"ids\": batch_ids, \"length\": batch_length, \"label\": batch_label}\n",
" return batch\n",
"\n",
"\n",
"collate = functools.partial(collate, pad_index=pad_index)\n",
"\n",
"train_dataloader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, collate_fn=collate, shuffle=True)\n",
"\n",
"valid_dataloader = torch.utils.data.DataLoader(valid_data, batch_size=batch_size, collate_fn=collate)\n",
"test_dataloader = torch.utils.data.DataLoader(test_data, batch_size=batch_size, collate_fn=collate)"
]
},
{
"cell_type": "markdown",
"id": "279ad833-6a00-442a-b8a8-2b48cdb93cee",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "inherit",
"id": "3c3814f9-c014-4d53-86ce-d73f3a8cff5c",
"isComponent": false,
"name": "",
"parents": []
}
},
"source": ["### 3. Modeling"]
},
{
"cell_type": "code",
"execution_count": null,
"id": "840f8f40-e433-40c5-af35-67747d50fe0b",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#6C00FF",
"id": "c9662ed2-0038-442e-86b9-42a8df99ae79",
"isComponent": true,
"name": "Define model",
"parents": [
{
"id": "24f8e6d3-56bf-4f50-8561-2408cc91ce4d",
"name": "Set dataloader"
}
]
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": ["The model has 1,809,398 trainable parameters\n"]
}
],
"source": [
"class RNN(nn.Module):\n",
" def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim, pad_index):\n",
"\n",
" super().__init__()\n",
"\n",
" self.embedding = nn.Embedding(input_dim, embedding_dim)\n",
"\n",
" self.rnn = nn.RNN(embedding_dim, hidden_dim)\n",
"\n",
" self.fc = nn.Linear(hidden_dim, output_dim)\n",
"\n",
" def forward(self, ids, length):\n",
"\n",
" # text = [sent len, batch size]\n",
"\n",
" embedded = self.embedding(ids)\n",
"\n",
" # embedded = [sent len, batch size, emb dim]\n",
"\n",
" packed_embedded = nn.utils.rnn.pack_padded_sequence(embedded, length, batch_first=True, enforce_sorted=False)\n",
"\n",
" packed_output, hidden = self.rnn(packed_embedded)\n",
"\n",
" output, output_length = nn.utils.rnn.pad_packed_sequence(packed_output)\n",
"\n",
" # output = [sent len, batch size, hid dim]\n",
" # hidden = [1, batch size, hid dim]\n",
"\n",
" # assert torch.equal(output[-1,:,:], hidden.squeeze(0))\n",
"\n",
" return self.fc(hidden.squeeze(0))\n",
"\n",
"\n",
"vocab_size = len(vocab)\n",
"output_dim = 2\n",
"\n",
"model = RNN(vocab_size, embedding_dim, hidden_dim, output_dim, pad_index)\n",
"\n",
"\n",
"def count_parameters(model):\n",
" return sum(p.numel() for p in model.parameters() if p.requires_grad)\n",
"\n",
"\n",
"print(f\"The model has {count_parameters(model):,} trainable parameters\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5cdb0b6c-48f9-4b67-8d9e-90823628614f",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#6C00FF",
"id": "d4b1ae9a-a2cb-4ff1-a56b-61070b61e7b5",
"isComponent": true,
"name": "Initialize weights",
"parents": [
{
"id": "c9662ed2-0038-442e-86b9-42a8df99ae79",
"name": "Define model"
}
]
},
"tags": []
},
"outputs": [],
"source": [
"def initialize_weights(m):\n",
" if isinstance(m, nn.Linear):\n",
" nn.init.xavier_normal_(m.weight)\n",
" nn.init.zeros_(m.bias)\n",
" elif isinstance(m, nn.LSTM):\n",
" for name, param in m.named_parameters():\n",
" if \"bias\" in name:\n",
" nn.init.zeros_(param)\n",
" elif \"weight\" in name:\n",
" nn.init.orthogonal_(param)\n",
"\n",
"\n",
"model.apply(initialize_weights)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e95f1ea6-3eef-443a-a606-ed31fd58d92f",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#6C00FF",
"id": "7ac2a4c4-5258-40b0-b942-9ed914507e23",
"isComponent": true,
"name": "Define training functions",
"parents": [
{
"id": "8d792aa6-cac6-4ba6-a4a4-1a5566cfbb81",
"name": "Import packages"
}
]
},
"tags": []
},
"outputs": [],
"source": [
"def train(dataloader, model, criterion, optimizer, device):\n",
"\n",
" model.train()\n",
" epoch_losses = []\n",
" epoch_accs = []\n",
"\n",
" for batch in tqdm.tqdm(dataloader, desc=\"training...\", file=sys.stdout):\n",
" ids = batch[\"ids\"].to(device)\n",
" length = batch[\"length\"]\n",
" label = batch[\"label\"].to(device)\n",
" prediction = model(ids, length)\n",
" loss = criterion(prediction, label)\n",
" accuracy = get_accuracy(prediction, label)\n",
" optimizer.zero_grad()\n",
" loss.backward()\n",
" optimizer.step()\n",
" epoch_losses.append(loss.item())\n",
" epoch_accs.append(accuracy.item())\n",
"\n",
" return epoch_losses, epoch_accs\n",
"\n",
"\n",
"def evaluate(dataloader, model, criterion, device):\n",
"\n",
" model.eval()\n",
" epoch_losses = []\n",
" epoch_accs = []\n",
"\n",
" with torch.no_grad():\n",
" for batch in tqdm.tqdm(dataloader, desc=\"evaluating...\", file=sys.stdout):\n",
" ids = batch[\"ids\"].to(device)\n",
" length = batch[\"length\"]\n",
" label = batch[\"label\"].to(device)\n",
" prediction = model(ids, length)\n",
" loss = criterion(prediction, label)\n",
" accuracy = get_accuracy(prediction, label)\n",
" epoch_losses.append(loss.item())\n",
" epoch_accs.append(accuracy.item())\n",
"\n",
" return epoch_losses, epoch_accs\n",
"\n",
"\n",
"def get_accuracy(prediction, label):\n",
" batch_size, _ = prediction.shape\n",
" predicted_classes = prediction.argmax(dim=-1)\n",
" correct_predictions = predicted_classes.eq(label).sum()\n",
" accuracy = correct_predictions / batch_size\n",
" return accuracy"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d888856d-f8d1-4c0f-9817-de4a81f38c48",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#6C00FF",
"id": "49b7e440-bc55-4a07-8e56-14ac7a5c3f9a",
"isComponent": true,
"name": "Train",
"parents": [
{
"id": "d4b1ae9a-a2cb-4ff1-a56b-61070b61e7b5",
"name": "Initialize weights"
},
{
"id": "7ac2a4c4-5258-40b0-b942-9ed914507e23",
"name": "Define training functions"
}
]
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"training...: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [01:58<00:00, 23.71s/it]\n",
"evaluating...: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:01<00:00, 1.60it/s]\n",
"epoch: 1\n",
"train_loss: 0.788, train_acc: 0.521\n",
"valid_loss: 0.749, valid_acc: 0.545\n",
"training...: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [01:55<00:00, 23.05s/it]\n",
"evaluating...: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:01<00:00, 1.60it/s]\n",
"epoch: 2\n",
"train_loss: 0.682, train_acc: 0.592\n",
"valid_loss: 0.736, valid_acc: 0.534\n",
"training...: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [01:55<00:00, 23.04s/it]\n",
"evaluating...: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:01<00:00, 1.59it/s]\n",
"epoch: 3\n",
"train_loss: 0.641, train_acc: 0.637\n",
"valid_loss: 0.708, valid_acc: 0.553\n",
"training...: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [01:55<00:00, 23.19s/it]\n",
"evaluating...: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:01<00:00, 1.48it/s]\n",
"epoch: 4\n",
"train_loss: 0.604, train_acc: 0.671\n",
"valid_loss: 0.707, valid_acc: 0.586\n",
"training...: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [01:55<00:00, 23.16s/it]\n",
"evaluating...: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:01<00:00, 1.59it/s]\n",
"epoch: 5\n",
"train_loss: 0.567, train_acc: 0.706\n",
"valid_loss: 0.717, valid_acc: 0.576\n"
]
}
],
"source": [
"optimizer = optim.Adam(model.parameters(), lr=lr)\n",
"criterion = nn.CrossEntropyLoss()\n",
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
"model = model.to(device)\n",
"\n",
"best_valid_loss = float(\"inf\")\n",
"\n",
"train_losses = []\n",
"train_accs = []\n",
"valid_losses = []\n",
"valid_accs = []\n",
"\n",
"for epoch in range(n_epochs):\n",
"\n",
" train_loss, train_acc = train(train_dataloader, model, criterion, optimizer, device)\n",
" valid_loss, valid_acc = evaluate(valid_dataloader, model, criterion, device)\n",
"\n",
" train_losses.extend(train_loss)\n",
" train_accs.extend(train_acc)\n",
" valid_losses.extend(valid_loss)\n",
" valid_accs.extend(valid_acc)\n",
"\n",
" epoch_train_loss = np.mean(train_loss)\n",
" epoch_train_acc = np.mean(train_acc)\n",
" epoch_valid_loss = np.mean(valid_loss)\n",
" epoch_valid_acc = np.mean(valid_acc)\n",
"\n",
" if epoch_valid_loss < best_valid_loss:\n",
" best_valid_loss = epoch_valid_loss\n",
" torch.save(model.state_dict(), \"rnn.pt\")\n",
"\n",
" print(f\"epoch: {epoch+1}\")\n",
" print(f\"train_loss: {epoch_train_loss:.3f}, train_acc: {epoch_train_acc:.3f}\")\n",
" print(f\"valid_loss: {epoch_valid_loss:.3f}, valid_acc: {epoch_valid_acc:.3f}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5dd7cecb-ed99-46eb-8c08-dcc8a9e92f0e",
"metadata": {
"canvas": {
"comments": [],
"componentType": "CodeCell",
"copiedOriginId": null,
"diskcache": false,
"headerColor": "#6C00FF",
"id": "6459e1c5-6660-4663-9d00-d39212d4670a",
"isComponent": true,
"name": "Plot loss and accuracy",
"parents": [
{
"id": "49b7e440-bc55-4a07-8e56-14ac7a5c3f9a",
"name": "Train"
}
]
},
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": ["