{ "cells": [ { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 7570, "status": "ok", "timestamp": 1747699553373, "user": { "displayName": "Jean Raymond Mbad DIOUF", "userId": "08391883886321496449" }, "user_tz": 0 }, "id": "b7LOksR9P8_L", "outputId": "034022df-1d9e-489a-b27b-41e27fdae26a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: transformers in /usr/local/lib/python3.11/dist-packages (4.51.3)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from transformers) (3.18.0)\n", "Requirement already satisfied: huggingface-hub<1.0,>=0.30.0 in /usr/local/lib/python3.11/dist-packages (from transformers) (0.31.2)\n", "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.11/dist-packages (from transformers) (2.0.2)\n", "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from transformers) (24.2)\n", "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.11/dist-packages (from transformers) (6.0.2)\n", "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.11/dist-packages (from transformers) (2024.11.6)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.11/dist-packages (from transformers) (2.32.3)\n", "Requirement already satisfied: tokenizers<0.22,>=0.21 in /usr/local/lib/python3.11/dist-packages (from transformers) (0.21.1)\n", "Requirement already satisfied: safetensors>=0.4.3 in /usr/local/lib/python3.11/dist-packages (from transformers) (0.5.3)\n", "Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.11/dist-packages (from transformers) (4.67.1)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub<1.0,>=0.30.0->transformers) (2025.3.2)\n", "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub<1.0,>=0.30.0->transformers) (4.13.2)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests->transformers) (3.4.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests->transformers) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests->transformers) (2.4.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests->transformers) (2025.4.26)\n", "Requirement already satisfied: wandb in /usr/local/lib/python3.11/dist-packages (0.19.11)\n", "Requirement already satisfied: click!=8.0.0,>=7.1 in /usr/local/lib/python3.11/dist-packages (from wandb) (8.2.0)\n", "Requirement already satisfied: docker-pycreds>=0.4.0 in /usr/local/lib/python3.11/dist-packages (from wandb) (0.4.0)\n", "Requirement already satisfied: gitpython!=3.1.29,>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from wandb) (3.1.44)\n", "Requirement already satisfied: platformdirs in /usr/local/lib/python3.11/dist-packages (from wandb) (4.3.8)\n", "Requirement already satisfied: protobuf!=4.21.0,!=5.28.0,<7,>=3.19.0 in /usr/local/lib/python3.11/dist-packages (from wandb) (5.29.4)\n", "Requirement already satisfied: psutil>=5.0.0 in /usr/local/lib/python3.11/dist-packages (from wandb) (5.9.5)\n", "Requirement already satisfied: pydantic<3 in /usr/local/lib/python3.11/dist-packages (from wandb) (2.11.4)\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python3.11/dist-packages (from wandb) (6.0.2)\n", "Requirement already satisfied: requests<3,>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from wandb) (2.32.3)\n", "Requirement already satisfied: sentry-sdk>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from wandb) (2.28.0)\n", "Requirement already satisfied: setproctitle in /usr/local/lib/python3.11/dist-packages (from wandb) (1.3.6)\n", "Requirement already satisfied: setuptools in /usr/local/lib/python3.11/dist-packages (from wandb) (75.2.0)\n", "Requirement already satisfied: typing-extensions<5,>=4.4 in /usr/local/lib/python3.11/dist-packages (from wandb) (4.13.2)\n", "Requirement already satisfied: six>=1.4.0 in /usr/local/lib/python3.11/dist-packages (from docker-pycreds>=0.4.0->wandb) (1.17.0)\n", "Requirement already satisfied: gitdb<5,>=4.0.1 in /usr/local/lib/python3.11/dist-packages (from gitpython!=3.1.29,>=1.0.0->wandb) (4.0.12)\n", "Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.11/dist-packages (from pydantic<3->wandb) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.33.2 in /usr/local/lib/python3.11/dist-packages (from pydantic<3->wandb) (2.33.2)\n", "Requirement already satisfied: typing-inspection>=0.4.0 in /usr/local/lib/python3.11/dist-packages (from pydantic<3->wandb) (0.4.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.0.0->wandb) (3.4.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.0.0->wandb) (3.10)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.0.0->wandb) (2.4.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.0.0->wandb) (2025.4.26)\n", "Requirement already satisfied: smmap<6,>=3.0.1 in /usr/local/lib/python3.11/dist-packages (from gitdb<5,>=4.0.1->gitpython!=3.1.29,>=1.0.0->wandb) (5.0.2)\n" ] } ], "source": [ "!pip install transformers\n", "!pip install wandb" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 1811, "status": "ok", "timestamp": 1747699555186, "user": { "displayName": "Jean Raymond Mbad DIOUF", "userId": "08391883886321496449" }, "user_tz": 0 }, "id": "n7D7EIw3QVro", "outputId": "d936696a-79ea-4545-87af-29c0f67d25ed" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" ] } ], "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "executionInfo": { "elapsed": 2, "status": "ok", "timestamp": 1747699555191, "user": { "displayName": "Jean Raymond Mbad DIOUF", "userId": "08391883886321496449" }, "user_tz": 0 }, "id": "Ts9IzpeDQ_W4" }, "outputs": [], "source": [ "from transformers import AutoTokenizer, BertModel\n", "import torch\n", "import torch.nn as nn\n", "\n", "import torch.optim as optim\n", "\n", "import re\n", "from torch.utils.data import Dataset, DataLoader, Subset\n", "\n", "import pandas as pd\n", "import numpy as np\n", "\n", "import wandb\n", "\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 2, "status": "ok", "timestamp": 1747699555208, "user": { "displayName": "Jean Raymond Mbad DIOUF", "userId": "08391883886321496449" }, "user_tz": 0 }, "id": "0SPhes3ia-wr" }, "outputs": [], "source": [ "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n", "NUM_EPOCHS = 5\n", "BATCH_SIZE = 16\n", "SAVED_MODEL_PATH = \"custom_bert_model.torch\"\n", "SAVED_TARGET_CAT_PATH = \"bbc-news-categories.torch\"\n", "DS_PATH = \"bbc-news-data.csv\"" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "executionInfo": { "elapsed": 10, "status": "ok", "timestamp": 1747699555220, "user": { "displayName": "Jean Raymond Mbad DIOUF", "userId": "08391883886321496449" }, "user_tz": 0 }, "id": "YDzq-T4SRXsx" }, "outputs": [], "source": [ "from typing import DefaultDict\n", "class CustomBertDataset(Dataset):\n", " def __init__(self, file_path,model_path=\"google-bert/bert-base-uncased\",saved_target_cats_path=SAVED_TARGET_CAT_PATH ):\n", " self.model_path = model_path\n", " self.tokenizer = AutoTokenizer.from_pretrained(self.model_path)\n", " self.lines = open(file_path).readlines()\n", " self.lines = np.array([[re.split(r'\\t+', line.replace(\"\\n\",\"\"))[3], re.split(r'\\t+', line.replace(\"\\n\",\"\"))[0]] for i, line in enumerate(self.lines) if line != \"\\n\" and i != 0])\n", " self.corpus = np.array(self.lines[:,0])\n", " self.elem_cats = self.lines[:,1]\n", " self.unique_cats = sorted(list(set(self.elem_cats)))\n", " self.num_class = len(self.unique_cats)\n", " self.cats_dict = {cat:i for i, cat in enumerate(self.unique_cats)}\n", " self.targets = np.array([self.cats_dict[cat] for cat in self.elem_cats])\n", "\n", " torch.save(self.unique_cats, saved_target_cats_path)\n", "\n", " entry_dict = DefaultDict(list)\n", " for i in range(len(self.corpus)):\n", " entry_dict[self.targets[i]].append(self.corpus[i])\n", "\n", " self.final_corpus = []\n", " self.final_targets = []\n", " n=0\n", " while n < len(self.corpus):\n", " for key in entry_dict.keys():\n", " if len(entry_dict[key]) > 0:\n", " self.final_corpus.append(entry_dict[key].pop(0))\n", " self.final_targets.append(key)\n", " n+=1\n", "\n", " self.corpus = np.array(self.final_corpus)\n", " self.targets = np.array(self.final_targets)\n", "\n", "\n", " self.max_len = 0\n", " for sent in self.corpus:\n", " input_ids = self.tokenizer.encode(sent, add_special_tokens=True)\n", " self.max_len = max(self.max_len, len(input_ids))\n", "\n", " self.max_len = min(self.max_len, 512)\n", " print(f\"Max length : {self.max_len}\")\n", "\n", " def __len__(self):\n", " return len(self.corpus)\n", "\n", " def __getitem__(self, idx):\n", " text = self.corpus[idx]\n", " target = self.targets[idx]\n", " encoded_input = self.tokenizer.encode_plus(text, max_length=self.max_len, padding=\"max_length\", truncation=True, return_tensors='pt')\n", " return encoded_input['input_ids'].squeeze(0), encoded_input['attention_mask'].squeeze(0), torch.tensor(target, dtype=torch.long)\n", " #return np.array(encoded_input), torch.tensor(target, dtype=torch.long)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "executionInfo": { "elapsed": 3, "status": "ok", "timestamp": 1747699555225, "user": { "displayName": "Jean Raymond Mbad DIOUF", "userId": "08391883886321496449" }, "user_tz": 0 }, "id": "ywy6bRQSVVxp" }, "outputs": [], "source": [ "class CustomBertModel(nn.Module):\n", " def __init__(self, num_class, model_path=\"google-bert/bert-base-uncased\"):\n", " super(CustomBertModel, self ).__init__()\n", " self.model_path = model_path\n", " self.num_class = num_class\n", "\n", " self.bert = BertModel.from_pretrained(self.model_path)\n", " # Freeze of the parameters of this layer for the training process\n", " for param in self.bert.parameters():\n", " param.requires_grad = False\n", " self.proj_lin = nn.Linear(self.bert.config.hidden_size, self.num_class)\n", "\n", " def forward(self, input_ids, attention_mask):\n", " x = self.bert(input_ids=input_ids, attention_mask=attention_mask)\n", "\n", " x = x.last_hidden_state[:,0,:]\n", " x = self.proj_lin(x)\n", " return x\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "executionInfo": { "elapsed": 5, "status": "ok", "timestamp": 1747699555240, "user": { "displayName": "Jean Raymond Mbad DIOUF", "userId": "08391883886321496449" }, "user_tz": 0 }, "id": "NpAxLJbLW2A7" }, "outputs": [], "source": [ "def train_step(model, train_dataloader, loss_fn, optimizer):\n", "\n", " num_iterations = len(train_dataloader)\n", "\n", " for i in range(NUM_EPOCHS):\n", " print(f\"Training Epoch n° {i}\")\n", " model.train()\n", "\n", " for j, batch in enumerate(train_dataloader):\n", "\n", " input = batch[:][0]\n", " attention = batch[:][1]\n", " target = batch[:][2]\n", "\n", "\n", " output = model(input.to(device), attention.to(device))\n", "\n", "\n", " loss = loss_fn(output, target.to(device))\n", "\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " run.log({\"Training loss\": loss})\n", "\n", " print(f\"Epoch {i+1} | step {j+1} / {num_iterations} | loss : {loss}\")\n", "\n", "\n", " #Save model\n", " torch.save(model.state_dict(), SAVED_MODEL_PATH)\n", " print(f\"Model saved at {SAVED_MODEL_PATH}\")" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "executionInfo": { "elapsed": 43, "status": "ok", "timestamp": 1747699555284, "user": { "displayName": "Jean Raymond Mbad DIOUF", "userId": "08391883886321496449" }, "user_tz": 0 }, "id": "HqyXLPc9LoQW" }, "outputs": [], "source": [ "def eval_step(test_dataloader, loss_fn, num_class, saved_model_path=SAVED_MODEL_PATH,saved_target_cats_path=SAVED_TARGET_CAT_PATH):\n", "\n", " y_pred = []\n", " y_true = []\n", "\n", " num_iterations = len(test_dataloader)\n", " # Load the saved model\n", " saved_model = CustomBertModel(num_class)\n", " saved_model.load_state_dict(torch.load(saved_model_path, weights_only=False)) # Explicitly set weights_only to False\n", " saved_model = saved_model.to(device)\n", " saved_model.eval() # Set the model to evaluation mode\n", " print(f\"Model loaded from path :{saved_model_path}\")\n", "\n", " with torch.no_grad():\n", " for j, batch in enumerate(test_dataloader):\n", "\n", "\n", " input = batch[:][0]\n", " attention = batch[:][1]\n", " target = batch[:][2]\n", "\n", "\n", " output = saved_model(input.to(device), attention.to(device))\n", "\n", " loss = loss_fn(output, target.to(device))\n", "\n", " run.log({\"Eval loss\": loss})\n", " print(f\"Eval loss : {loss}\")\n", " y_pred.extend(output.cpu().numpy().argmax(axis=1))\n", " y_true.extend(target.cpu().numpy())\n", "\n", " class_labels = torch.load(saved_target_cats_path, weights_only=False)\n", "\n", " true_labels = [class_labels[i] for i in y_true]\n", " pred_labels = [class_labels[i] for i in y_pred]\n", "\n", " print(f\"Accuracy : {accuracy_score(true_labels, pred_labels)}\")\n", "\n", " cm = confusion_matrix(true_labels, pred_labels, labels=class_labels)\n", " df_cm = pd.DataFrame(cm, index=class_labels,columns=class_labels)\n", " sns.heatmap(df_cm, annot=True, fmt='d')\n", " plt.title(\"Confusion Matrix for BBC News Dataset\")\n", " plt.xlabel(\"Predicted Label\")\n", " plt.ylabel(\"True Label\")\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "executionInfo": { "elapsed": 336464, "status": "ok", "timestamp": 1747699891751, "user": { "displayName": "Jean Raymond Mbad DIOUF", "userId": "08391883886321496449" }, "user_tz": 0 }, "id": "UiPGUv9PbcrV", "outputId": "b464a9e2-3673-493a-a486-bd3ecc2ef455" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[34m\u001b[1mwandb\u001b[0m: \u001b[33mWARNING\u001b[0m Calling wandb.login() after wandb.init() has no effect.\n" ] }, { "data": { "text/html": [ "Finishing previous runs because reinit is set to 'default'." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

Run history:


Eval loss▃▇▄▄▇▂▅▃▃▁▁▃█▅▃▇▄▄▃▃█▄▇▅▃▂▅▂▃▃▁▁▃▃█▃▃▇▄▃
Training loss█▇▇█▅▅▃▄▄▃▃▃▄▃▃▂▃▂▂▄▂▂▂▂▂▂▃▂▁▂▂▁▁▂▂▁▁▁▁▁

Run summary:


Eval loss0.16072
Training loss0.28344

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ " View run sage-brook-41 at: https://wandb.ai/jrmd-institut-pasteur-de-dakar/DIT-Bert-bbc-news-project/runs/fjaymng5
View project at: https://wandb.ai/jrmd-institut-pasteur-de-dakar/DIT-Bert-bbc-news-project
Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Find logs at: ./wandb/run-20250519_235709-fjaymng5/logs" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Tracking run with wandb version 0.19.11" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Run data is saved locally in /content/wandb/run-20250520_000555-1urcal1c" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Syncing run dashing-eon-42 to Weights & Biases (docs)
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ " View project at https://wandb.ai/jrmd-institut-pasteur-de-dakar/DIT-Bert-bbc-news-project" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ " View run at https://wandb.ai/jrmd-institut-pasteur-de-dakar/DIT-Bert-bbc-news-project/runs/1urcal1c" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Token indices sequence length is longer than the specified maximum sequence length for this model (566 > 512). Running this sequence through the model will result in indexing errors\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Max length : 512\n", "Size of bert dataset : 2225\n", "Training Epoch n° 0\n", "Epoch 1 | step 1 / 112 | loss : 1.6449851989746094\n", "Epoch 1 | step 2 / 112 | loss : 1.5735151767730713\n", "Epoch 1 | step 3 / 112 | loss : 1.5819109678268433\n", "Epoch 1 | step 4 / 112 | loss : 1.4859557151794434\n", "Epoch 1 | step 5 / 112 | loss : 1.6446529626846313\n", "Epoch 1 | step 6 / 112 | loss : 1.4534302949905396\n", "Epoch 1 | step 7 / 112 | loss : 1.5190932750701904\n", "Epoch 1 | step 8 / 112 | loss : 1.5285285711288452\n", "Epoch 1 | step 9 / 112 | loss : 1.3839517831802368\n", "Epoch 1 | step 10 / 112 | loss : 1.5054442882537842\n", "Epoch 1 | step 11 / 112 | loss : 1.4973751306533813\n", "Epoch 1 | step 12 / 112 | loss : 1.4498941898345947\n", "Epoch 1 | step 13 / 112 | loss : 1.5649957656860352\n", "Epoch 1 | step 14 / 112 | loss : 1.4345060586929321\n", "Epoch 1 | step 15 / 112 | loss : 1.3845256567001343\n", "Epoch 1 | step 16 / 112 | loss : 1.3110606670379639\n", "Epoch 1 | step 17 / 112 | loss : 1.3159502744674683\n", "Epoch 1 | step 18 / 112 | loss : 1.3809462785720825\n", "Epoch 1 | step 19 / 112 | loss : 1.2936859130859375\n", "Epoch 1 | step 20 / 112 | loss : 1.2471643686294556\n", "Epoch 1 | step 21 / 112 | loss : 1.4038350582122803\n", "Epoch 1 | step 22 / 112 | loss : 1.2764545679092407\n", "Epoch 1 | step 23 / 112 | loss : 1.2227381467819214\n", "Epoch 1 | step 24 / 112 | loss : 1.2743518352508545\n", "Epoch 1 | step 25 / 112 | loss : 1.1789177656173706\n", "Epoch 1 | step 26 / 112 | loss : 1.3047996759414673\n", "Epoch 1 | step 27 / 112 | loss : 1.1611056327819824\n", "Epoch 1 | step 28 / 112 | loss : 1.215532660484314\n", "Epoch 1 | step 29 / 112 | loss : 1.2096422910690308\n", "Epoch 1 | step 30 / 112 | loss : 1.3383196592330933\n", "Epoch 1 | step 31 / 112 | loss : 1.1611387729644775\n", "Epoch 1 | step 32 / 112 | loss : 1.1737264394760132\n", "Epoch 1 | step 33 / 112 | loss : 1.1405683755874634\n", "Epoch 1 | step 34 / 112 | loss : 1.169860601425171\n", "Epoch 1 | step 35 / 112 | loss : 1.1808637380599976\n", "Epoch 1 | step 36 / 112 | loss : 1.1376376152038574\n", "Epoch 1 | step 37 / 112 | loss : 1.0853132009506226\n", "Epoch 1 | step 38 / 112 | loss : 1.0882256031036377\n", "Epoch 1 | step 39 / 112 | loss : 1.060747504234314\n", "Epoch 1 | step 40 / 112 | loss : 1.0839447975158691\n", "Epoch 1 | step 41 / 112 | loss : 1.0228607654571533\n", "Epoch 1 | step 42 / 112 | loss : 1.1010297536849976\n", "Epoch 1 | step 43 / 112 | loss : 1.1372710466384888\n", "Epoch 1 | step 44 / 112 | loss : 0.9872986078262329\n", "Epoch 1 | step 45 / 112 | loss : 1.066749930381775\n", "Epoch 1 | step 46 / 112 | loss : 1.0978634357452393\n", "Epoch 1 | step 47 / 112 | loss : 0.9937945604324341\n", "Epoch 1 | step 48 / 112 | loss : 0.9198281764984131\n", "Epoch 1 | step 49 / 112 | loss : 0.9627342224121094\n", "Epoch 1 | step 50 / 112 | loss : 0.9984812140464783\n", "Epoch 1 | step 51 / 112 | loss : 1.0673019886016846\n", "Epoch 1 | step 52 / 112 | loss : 1.0020875930786133\n", "Epoch 1 | step 53 / 112 | loss : 0.8835160136222839\n", "Epoch 1 | step 54 / 112 | loss : 1.0687658786773682\n", "Epoch 1 | step 55 / 112 | loss : 1.0039080381393433\n", "Epoch 1 | step 56 / 112 | loss : 0.8187106847763062\n", "Epoch 1 | step 57 / 112 | loss : 0.9346863031387329\n", "Epoch 1 | step 58 / 112 | loss : 0.9040808081626892\n", "Epoch 1 | step 59 / 112 | loss : 0.9555490016937256\n", "Epoch 1 | step 60 / 112 | loss : 0.8728064894676208\n", "Epoch 1 | step 61 / 112 | loss : 0.8068769574165344\n", "Epoch 1 | step 62 / 112 | loss : 0.8464764952659607\n", "Epoch 1 | step 63 / 112 | loss : 0.867031455039978\n", "Epoch 1 | step 64 / 112 | loss : 0.9923815131187439\n", "Epoch 1 | step 65 / 112 | loss : 1.050879716873169\n", "Epoch 1 | step 66 / 112 | loss : 0.9502765536308289\n", "Epoch 1 | step 67 / 112 | loss : 0.8933085799217224\n", "Epoch 1 | step 68 / 112 | loss : 0.7856079936027527\n", "Epoch 1 | step 69 / 112 | loss : 0.9567974805831909\n", "Epoch 1 | step 70 / 112 | loss : 0.8595913648605347\n", "Epoch 1 | step 71 / 112 | loss : 0.8076179027557373\n", "Epoch 1 | step 72 / 112 | loss : 0.8516682982444763\n", "Epoch 1 | step 73 / 112 | loss : 0.8385011553764343\n", "Epoch 1 | step 74 / 112 | loss : 0.8522767424583435\n", "Epoch 1 | step 75 / 112 | loss : 0.8406270146369934\n", "Epoch 1 | step 76 / 112 | loss : 0.7209128737449646\n", "Epoch 1 | step 77 / 112 | loss : 0.8616713285446167\n", "Epoch 1 | step 78 / 112 | loss : 0.7906273603439331\n", "Epoch 1 | step 79 / 112 | loss : 1.006382703781128\n", "Epoch 1 | step 80 / 112 | loss : 0.8454435467720032\n", "Epoch 1 | step 81 / 112 | loss : 0.8521848320960999\n", "Epoch 1 | step 82 / 112 | loss : 0.7069440484046936\n", "Epoch 1 | step 83 / 112 | loss : 0.7213470935821533\n", "Epoch 1 | step 84 / 112 | loss : 0.7608999013900757\n", "Epoch 1 | step 85 / 112 | loss : 0.7293148040771484\n", "Epoch 1 | step 86 / 112 | loss : 0.7289860844612122\n", "Epoch 1 | step 87 / 112 | loss : 0.7505897879600525\n", "Epoch 1 | step 88 / 112 | loss : 0.7578941583633423\n", "Epoch 1 | step 89 / 112 | loss : 0.6905528903007507\n", "Epoch 1 | step 90 / 112 | loss : 0.6994093656539917\n", "Epoch 1 | step 91 / 112 | loss : 0.7090915441513062\n", "Epoch 1 | step 92 / 112 | loss : 0.6950725317001343\n", "Epoch 1 | step 93 / 112 | loss : 0.8533985614776611\n", "Epoch 1 | step 94 / 112 | loss : 0.6638290882110596\n", "Epoch 1 | step 95 / 112 | loss : 0.7912619709968567\n", "Epoch 1 | step 96 / 112 | loss : 0.7420678734779358\n", "Epoch 1 | step 97 / 112 | loss : 0.7349004745483398\n", "Epoch 1 | step 98 / 112 | loss : 0.6638696789741516\n", "Epoch 1 | step 99 / 112 | loss : 0.7386273145675659\n", "Epoch 1 | step 100 / 112 | loss : 0.6596609354019165\n", "Epoch 1 | step 101 / 112 | loss : 0.7080281376838684\n", "Epoch 1 | step 102 / 112 | loss : 0.6867501139640808\n", "Epoch 1 | step 103 / 112 | loss : 0.6887272000312805\n", "Epoch 1 | step 104 / 112 | loss : 0.7112089991569519\n", "Epoch 1 | step 105 / 112 | loss : 0.79549241065979\n", "Epoch 1 | step 106 / 112 | loss : 0.7787314057350159\n", "Epoch 1 | step 107 / 112 | loss : 0.9223846793174744\n", "Epoch 1 | step 108 / 112 | loss : 0.6000009179115295\n", "Epoch 1 | step 109 / 112 | loss : 0.7660931348800659\n", "Epoch 1 | step 110 / 112 | loss : 0.681592583656311\n", "Epoch 1 | step 111 / 112 | loss : 0.6092537641525269\n", "Epoch 1 | step 112 / 112 | loss : 0.6020276546478271\n", "Training Epoch n° 1\n", "Epoch 2 | step 1 / 112 | loss : 0.6664475798606873\n", "Epoch 2 | step 2 / 112 | loss : 0.7061063647270203\n", "Epoch 2 | step 3 / 112 | loss : 0.6351500749588013\n", "Epoch 2 | step 4 / 112 | loss : 0.6020068526268005\n", "Epoch 2 | step 5 / 112 | loss : 0.6823722720146179\n", "Epoch 2 | step 6 / 112 | loss : 0.8572452664375305\n", "Epoch 2 | step 7 / 112 | loss : 0.5605658292770386\n", "Epoch 2 | step 8 / 112 | loss : 0.5726930499076843\n", "Epoch 2 | step 9 / 112 | loss : 0.6097754240036011\n", "Epoch 2 | step 10 / 112 | loss : 0.6185545325279236\n", "Epoch 2 | step 11 / 112 | loss : 0.6742196083068848\n", "Epoch 2 | step 12 / 112 | loss : 0.450560599565506\n", "Epoch 2 | step 13 / 112 | loss : 0.56700199842453\n", "Epoch 2 | step 14 / 112 | loss : 0.6402989625930786\n", "Epoch 2 | step 15 / 112 | loss : 0.7852456569671631\n", "Epoch 2 | step 16 / 112 | loss : 0.5367439389228821\n", "Epoch 2 | step 17 / 112 | loss : 0.7729073762893677\n", "Epoch 2 | step 18 / 112 | loss : 0.47686177492141724\n", "Epoch 2 | step 19 / 112 | loss : 0.50215083360672\n", "Epoch 2 | step 20 / 112 | loss : 0.37820589542388916\n", "Epoch 2 | step 21 / 112 | loss : 0.55330890417099\n", "Epoch 2 | step 22 / 112 | loss : 0.6441726684570312\n", "Epoch 2 | step 23 / 112 | loss : 0.5453617572784424\n", "Epoch 2 | step 24 / 112 | loss : 0.5188350677490234\n", "Epoch 2 | step 25 / 112 | loss : 0.6442378759384155\n", "Epoch 2 | step 26 / 112 | loss : 0.5872617363929749\n", "Epoch 2 | step 27 / 112 | loss : 0.6439935564994812\n", "Epoch 2 | step 28 / 112 | loss : 0.6959007978439331\n", "Epoch 2 | step 29 / 112 | loss : 0.5452607274055481\n", "Epoch 2 | step 30 / 112 | loss : 0.5007641315460205\n", "Epoch 2 | step 31 / 112 | loss : 0.6404386162757874\n", "Epoch 2 | step 32 / 112 | loss : 0.5978506803512573\n", "Epoch 2 | step 33 / 112 | loss : 0.6358098387718201\n", "Epoch 2 | step 34 / 112 | loss : 0.5420663356781006\n", "Epoch 2 | step 35 / 112 | loss : 0.5249043107032776\n", "Epoch 2 | step 36 / 112 | loss : 0.5152560472488403\n", "Epoch 2 | step 37 / 112 | loss : 0.6633625626564026\n", "Epoch 2 | step 38 / 112 | loss : 0.5730984210968018\n", "Epoch 2 | step 39 / 112 | loss : 0.610923707485199\n", "Epoch 2 | step 40 / 112 | loss : 0.4955630600452423\n", "Epoch 2 | step 41 / 112 | loss : 0.5958508849143982\n", "Epoch 2 | step 42 / 112 | loss : 0.4965077340602875\n", "Epoch 2 | step 43 / 112 | loss : 0.52577143907547\n", "Epoch 2 | step 44 / 112 | loss : 0.4841373860836029\n", "Epoch 2 | step 45 / 112 | loss : 0.5638991594314575\n", "Epoch 2 | step 46 / 112 | loss : 0.5097030401229858\n", "Epoch 2 | step 47 / 112 | loss : 0.4711139500141144\n", "Epoch 2 | step 48 / 112 | loss : 0.42045193910598755\n", "Epoch 2 | step 49 / 112 | loss : 0.3896557688713074\n", "Epoch 2 | step 50 / 112 | loss : 0.42988264560699463\n", "Epoch 2 | step 51 / 112 | loss : 0.6216431260108948\n", "Epoch 2 | step 52 / 112 | loss : 0.5219427943229675\n", "Epoch 2 | step 53 / 112 | loss : 0.44753777980804443\n", "Epoch 2 | step 54 / 112 | loss : 0.8057795763015747\n", "Epoch 2 | step 55 / 112 | loss : 0.4060775637626648\n", "Epoch 2 | step 56 / 112 | loss : 0.4511549472808838\n", "Epoch 2 | step 57 / 112 | loss : 0.5234940648078918\n", "Epoch 2 | step 58 / 112 | loss : 0.6378427147865295\n", "Epoch 2 | step 59 / 112 | loss : 0.6079502105712891\n", "Epoch 2 | step 60 / 112 | loss : 0.5094837546348572\n", "Epoch 2 | step 61 / 112 | loss : 0.5236918926239014\n", "Epoch 2 | step 62 / 112 | loss : 0.6056767702102661\n", "Epoch 2 | step 63 / 112 | loss : 0.5835849046707153\n", "Epoch 2 | step 64 / 112 | loss : 0.5527480244636536\n", "Epoch 2 | step 65 / 112 | loss : 0.4549638032913208\n", "Epoch 2 | step 66 / 112 | loss : 0.6238197088241577\n", "Epoch 2 | step 67 / 112 | loss : 0.5353032946586609\n", "Epoch 2 | step 68 / 112 | loss : 0.4193733036518097\n", "Epoch 2 | step 69 / 112 | loss : 0.47686970233917236\n", "Epoch 2 | step 70 / 112 | loss : 0.43922683596611023\n", "Epoch 2 | step 71 / 112 | loss : 0.29393869638442993\n", "Epoch 2 | step 72 / 112 | loss : 0.535508930683136\n", "Epoch 2 | step 73 / 112 | loss : 0.30004221200942993\n", "Epoch 2 | step 74 / 112 | loss : 0.5596675276756287\n", "Epoch 2 | step 75 / 112 | loss : 0.48598241806030273\n", "Epoch 2 | step 76 / 112 | loss : 0.431226909160614\n", "Epoch 2 | step 77 / 112 | loss : 0.3829185962677002\n", "Epoch 2 | step 78 / 112 | loss : 0.5002977848052979\n", "Epoch 2 | step 79 / 112 | loss : 0.36608487367630005\n", "Epoch 2 | step 80 / 112 | loss : 0.4796326756477356\n", "Epoch 2 | step 81 / 112 | loss : 0.4282706379890442\n", "Epoch 2 | step 82 / 112 | loss : 0.3001636862754822\n", "Epoch 2 | step 83 / 112 | loss : 0.5259007811546326\n", "Epoch 2 | step 84 / 112 | loss : 0.45866915583610535\n", "Epoch 2 | step 85 / 112 | loss : 0.49682244658470154\n", "Epoch 2 | step 86 / 112 | loss : 0.3243476152420044\n", "Epoch 2 | step 87 / 112 | loss : 0.46553534269332886\n", "Epoch 2 | step 88 / 112 | loss : 0.39260077476501465\n", "Epoch 2 | step 89 / 112 | loss : 0.4877064526081085\n", "Epoch 2 | step 90 / 112 | loss : 0.6578794121742249\n", "Epoch 2 | step 91 / 112 | loss : 0.32116931676864624\n", "Epoch 2 | step 92 / 112 | loss : 0.4585707485675812\n", "Epoch 2 | step 93 / 112 | loss : 0.3584655821323395\n", "Epoch 2 | step 94 / 112 | loss : 0.48839136958122253\n", "Epoch 2 | step 95 / 112 | loss : 0.40068963170051575\n", "Epoch 2 | step 96 / 112 | loss : 0.4273289442062378\n", "Epoch 2 | step 97 / 112 | loss : 0.37150153517723083\n", "Epoch 2 | step 98 / 112 | loss : 0.4906887710094452\n", "Epoch 2 | step 99 / 112 | loss : 0.4805225431919098\n", "Epoch 2 | step 100 / 112 | loss : 0.46179333329200745\n", "Epoch 2 | step 101 / 112 | loss : 0.5205014944076538\n", "Epoch 2 | step 102 / 112 | loss : 0.37552499771118164\n", "Epoch 2 | step 103 / 112 | loss : 0.33725854754447937\n", "Epoch 2 | step 104 / 112 | loss : 0.37195855379104614\n", "Epoch 2 | step 105 / 112 | loss : 0.2911706566810608\n", "Epoch 2 | step 106 / 112 | loss : 0.599461019039154\n", "Epoch 2 | step 107 / 112 | loss : 0.5034452676773071\n", "Epoch 2 | step 108 / 112 | loss : 0.46495378017425537\n", "Epoch 2 | step 109 / 112 | loss : 0.5648533701896667\n", "Epoch 2 | step 110 / 112 | loss : 0.6078592538833618\n", "Epoch 2 | step 111 / 112 | loss : 0.3769969642162323\n", "Epoch 2 | step 112 / 112 | loss : 0.6771263480186462\n", "Training Epoch n° 2\n", "Epoch 3 | step 1 / 112 | loss : 0.46606069803237915\n", "Epoch 3 | step 2 / 112 | loss : 0.3961446285247803\n", "Epoch 3 | step 3 / 112 | loss : 0.4997716546058655\n", "Epoch 3 | step 4 / 112 | loss : 0.41677647829055786\n", "Epoch 3 | step 5 / 112 | loss : 0.4032507836818695\n", "Epoch 3 | step 6 / 112 | loss : 0.3802904486656189\n", "Epoch 3 | step 7 / 112 | loss : 0.26720139384269714\n", "Epoch 3 | step 8 / 112 | loss : 0.4026317298412323\n", "Epoch 3 | step 9 / 112 | loss : 0.42472100257873535\n", "Epoch 3 | step 10 / 112 | loss : 0.33086487650871277\n", "Epoch 3 | step 11 / 112 | loss : 0.27724185585975647\n", "Epoch 3 | step 12 / 112 | loss : 0.41063621640205383\n", "Epoch 3 | step 13 / 112 | loss : 0.5106946229934692\n", "Epoch 3 | step 14 / 112 | loss : 0.488381564617157\n", "Epoch 3 | step 15 / 112 | loss : 0.3746764361858368\n", "Epoch 3 | step 16 / 112 | loss : 0.2513352930545807\n", "Epoch 3 | step 17 / 112 | loss : 0.4093296229839325\n", "Epoch 3 | step 18 / 112 | loss : 0.5590977668762207\n", "Epoch 3 | step 19 / 112 | loss : 0.503607988357544\n", "Epoch 3 | step 20 / 112 | loss : 0.31662434339523315\n", "Epoch 3 | step 21 / 112 | loss : 0.4347114562988281\n", "Epoch 3 | step 22 / 112 | loss : 0.3806309401988983\n", "Epoch 3 | step 23 / 112 | loss : 0.4695856273174286\n", "Epoch 3 | step 24 / 112 | loss : 0.41973817348480225\n", "Epoch 3 | step 25 / 112 | loss : 0.3424251079559326\n", "Epoch 3 | step 26 / 112 | loss : 0.4688178598880768\n", "Epoch 3 | step 27 / 112 | loss : 0.3248043358325958\n", "Epoch 3 | step 28 / 112 | loss : 0.41065436601638794\n", "Epoch 3 | step 29 / 112 | loss : 0.3274550139904022\n", "Epoch 3 | step 30 / 112 | loss : 0.34524211287498474\n", "Epoch 3 | step 31 / 112 | loss : 0.5388203859329224\n", "Epoch 3 | step 32 / 112 | loss : 0.4521324336528778\n", "Epoch 3 | step 33 / 112 | loss : 0.3879278898239136\n", "Epoch 3 | step 34 / 112 | loss : 0.4439450800418854\n", "Epoch 3 | step 35 / 112 | loss : 0.5003780126571655\n", "Epoch 3 | step 36 / 112 | loss : 0.368632048368454\n", "Epoch 3 | step 37 / 112 | loss : 0.38722753524780273\n", "Epoch 3 | step 38 / 112 | loss : 0.37530437111854553\n", "Epoch 3 | step 39 / 112 | loss : 0.41568487882614136\n", "Epoch 3 | step 40 / 112 | loss : 0.4890340566635132\n", "Epoch 3 | step 41 / 112 | loss : 0.4288986921310425\n", "Epoch 3 | step 42 / 112 | loss : 0.46046072244644165\n", "Epoch 3 | step 43 / 112 | loss : 0.3572804927825928\n", "Epoch 3 | step 44 / 112 | loss : 0.4504362940788269\n", "Epoch 3 | step 45 / 112 | loss : 0.5452702045440674\n", "Epoch 3 | step 46 / 112 | loss : 0.38793063163757324\n", "Epoch 3 | step 47 / 112 | loss : 0.4314008057117462\n", "Epoch 3 | step 48 / 112 | loss : 0.45931029319763184\n", "Epoch 3 | step 49 / 112 | loss : 0.48035573959350586\n", "Epoch 3 | step 50 / 112 | loss : 0.35699066519737244\n", "Epoch 3 | step 51 / 112 | loss : 0.3581349551677704\n", "Epoch 3 | step 52 / 112 | loss : 0.27542734146118164\n", "Epoch 3 | step 53 / 112 | loss : 0.5035375356674194\n", "Epoch 3 | step 54 / 112 | loss : 0.3475764989852905\n", "Epoch 3 | step 55 / 112 | loss : 0.3403763771057129\n", "Epoch 3 | step 56 / 112 | loss : 0.6549525260925293\n", "Epoch 3 | step 57 / 112 | loss : 0.5241059064865112\n", "Epoch 3 | step 58 / 112 | loss : 0.3469715714454651\n", "Epoch 3 | step 59 / 112 | loss : 0.38115400075912476\n", "Epoch 3 | step 60 / 112 | loss : 0.33637115359306335\n", "Epoch 3 | step 61 / 112 | loss : 0.33792948722839355\n", "Epoch 3 | step 62 / 112 | loss : 0.38750559091567993\n", "Epoch 3 | step 63 / 112 | loss : 0.32663753628730774\n", "Epoch 3 | step 64 / 112 | loss : 0.37649011611938477\n", "Epoch 3 | step 65 / 112 | loss : 0.25545525550842285\n", "Epoch 3 | step 66 / 112 | loss : 0.3450116515159607\n", "Epoch 3 | step 67 / 112 | loss : 0.45104360580444336\n", "Epoch 3 | step 68 / 112 | loss : 0.2785310745239258\n", "Epoch 3 | step 69 / 112 | loss : 0.5005187392234802\n", "Epoch 3 | step 70 / 112 | loss : 0.32360365986824036\n", "Epoch 3 | step 71 / 112 | loss : 0.27123311161994934\n", "Epoch 3 | step 72 / 112 | loss : 0.4225658178329468\n", "Epoch 3 | step 73 / 112 | loss : 0.3392169177532196\n", "Epoch 3 | step 74 / 112 | loss : 0.2572425305843353\n", "Epoch 3 | step 75 / 112 | loss : 0.23124970495700836\n", "Epoch 3 | step 76 / 112 | loss : 0.2866441309452057\n", "Epoch 3 | step 77 / 112 | loss : 0.32604268193244934\n", "Epoch 3 | step 78 / 112 | loss : 0.4943631887435913\n", "Epoch 3 | step 79 / 112 | loss : 0.3575887382030487\n", "Epoch 3 | step 80 / 112 | loss : 0.4436038136482239\n", "Epoch 3 | step 81 / 112 | loss : 0.3049364984035492\n", "Epoch 3 | step 82 / 112 | loss : 0.3659009337425232\n", "Epoch 3 | step 83 / 112 | loss : 0.3781184256076813\n", "Epoch 3 | step 84 / 112 | loss : 0.2869783639907837\n", "Epoch 3 | step 85 / 112 | loss : 0.5379635691642761\n", "Epoch 3 | step 86 / 112 | loss : 0.44601091742515564\n", "Epoch 3 | step 87 / 112 | loss : 0.2844422459602356\n", "Epoch 3 | step 88 / 112 | loss : 0.33117610216140747\n", "Epoch 3 | step 89 / 112 | loss : 0.32112443447113037\n", "Epoch 3 | step 90 / 112 | loss : 0.34721025824546814\n", "Epoch 3 | step 91 / 112 | loss : 0.35625511407852173\n", "Epoch 3 | step 92 / 112 | loss : 0.5461972951889038\n", "Epoch 3 | step 93 / 112 | loss : 0.4072253108024597\n", "Epoch 3 | step 94 / 112 | loss : 0.4633195698261261\n", "Epoch 3 | step 95 / 112 | loss : 0.4142645001411438\n", "Epoch 3 | step 96 / 112 | loss : 0.36636099219322205\n", "Epoch 3 | step 97 / 112 | loss : 0.3130304515361786\n", "Epoch 3 | step 98 / 112 | loss : 0.26213017106056213\n", "Epoch 3 | step 99 / 112 | loss : 0.22536435723304749\n", "Epoch 3 | step 100 / 112 | loss : 0.41204214096069336\n", "Epoch 3 | step 101 / 112 | loss : 0.3672119677066803\n", "Epoch 3 | step 102 / 112 | loss : 0.3052479922771454\n", "Epoch 3 | step 103 / 112 | loss : 0.4093557298183441\n", "Epoch 3 | step 104 / 112 | loss : 0.3200427293777466\n", "Epoch 3 | step 105 / 112 | loss : 0.31834927201271057\n", "Epoch 3 | step 106 / 112 | loss : 0.38122227787971497\n", "Epoch 3 | step 107 / 112 | loss : 0.29291456937789917\n", "Epoch 3 | step 108 / 112 | loss : 0.26210737228393555\n", "Epoch 3 | step 109 / 112 | loss : 0.28398028016090393\n", "Epoch 3 | step 110 / 112 | loss : 0.48200470209121704\n", "Epoch 3 | step 111 / 112 | loss : 0.37919527292251587\n", "Epoch 3 | step 112 / 112 | loss : 0.15952055156230927\n", "Training Epoch n° 3\n", "Epoch 4 | step 1 / 112 | loss : 0.28892356157302856\n", "Epoch 4 | step 2 / 112 | loss : 0.2730136215686798\n", "Epoch 4 | step 3 / 112 | loss : 0.36460965871810913\n", "Epoch 4 | step 4 / 112 | loss : 0.29884782433509827\n", "Epoch 4 | step 5 / 112 | loss : 0.31480517983436584\n", "Epoch 4 | step 6 / 112 | loss : 0.36388155817985535\n", "Epoch 4 | step 7 / 112 | loss : 0.17589136958122253\n", "Epoch 4 | step 8 / 112 | loss : 0.22924789786338806\n", "Epoch 4 | step 9 / 112 | loss : 0.5425304174423218\n", "Epoch 4 | step 10 / 112 | loss : 0.6615728139877319\n", "Epoch 4 | step 11 / 112 | loss : 0.19515036046504974\n", "Epoch 4 | step 12 / 112 | loss : 0.26480111479759216\n", "Epoch 4 | step 13 / 112 | loss : 0.24219480156898499\n", "Epoch 4 | step 14 / 112 | loss : 0.4001271724700928\n", "Epoch 4 | step 15 / 112 | loss : 0.2424192726612091\n", "Epoch 4 | step 16 / 112 | loss : 0.35438984632492065\n", "Epoch 4 | step 17 / 112 | loss : 0.4748784601688385\n", "Epoch 4 | step 18 / 112 | loss : 0.4723770320415497\n", "Epoch 4 | step 19 / 112 | loss : 0.409087210893631\n", "Epoch 4 | step 20 / 112 | loss : 0.27233535051345825\n", "Epoch 4 | step 21 / 112 | loss : 0.2709008753299713\n", "Epoch 4 | step 22 / 112 | loss : 0.21895919740200043\n", "Epoch 4 | step 23 / 112 | loss : 0.3987066447734833\n", "Epoch 4 | step 24 / 112 | loss : 0.32117319107055664\n", "Epoch 4 | step 25 / 112 | loss : 0.32930096983909607\n", "Epoch 4 | step 26 / 112 | loss : 0.31138938665390015\n", "Epoch 4 | step 27 / 112 | loss : 0.298321008682251\n", "Epoch 4 | step 28 / 112 | loss : 0.3685915172100067\n", "Epoch 4 | step 29 / 112 | loss : 0.4804796278476715\n", "Epoch 4 | step 30 / 112 | loss : 0.24124515056610107\n", "Epoch 4 | step 31 / 112 | loss : 0.259674072265625\n", "Epoch 4 | step 32 / 112 | loss : 0.25811535120010376\n", "Epoch 4 | step 33 / 112 | loss : 0.27675551176071167\n", "Epoch 4 | step 34 / 112 | loss : 0.17240293323993683\n", "Epoch 4 | step 35 / 112 | loss : 0.45484867691993713\n", "Epoch 4 | step 36 / 112 | loss : 0.412439227104187\n", "Epoch 4 | step 37 / 112 | loss : 0.42769941687583923\n", "Epoch 4 | step 38 / 112 | loss : 0.41018539667129517\n", "Epoch 4 | step 39 / 112 | loss : 0.2776305675506592\n", "Epoch 4 | step 40 / 112 | loss : 0.3993198275566101\n", "Epoch 4 | step 41 / 112 | loss : 0.4101888835430145\n", "Epoch 4 | step 42 / 112 | loss : 0.551833987236023\n", "Epoch 4 | step 43 / 112 | loss : 0.27055662870407104\n", "Epoch 4 | step 44 / 112 | loss : 0.40020138025283813\n", "Epoch 4 | step 45 / 112 | loss : 0.31977689266204834\n", "Epoch 4 | step 46 / 112 | loss : 0.2984738051891327\n", "Epoch 4 | step 47 / 112 | loss : 0.3456212878227234\n", "Epoch 4 | step 48 / 112 | loss : 0.15511566400527954\n", "Epoch 4 | step 49 / 112 | loss : 0.6755157113075256\n", "Epoch 4 | step 50 / 112 | loss : 0.3672955334186554\n", "Epoch 4 | step 51 / 112 | loss : 0.25965118408203125\n", "Epoch 4 | step 52 / 112 | loss : 0.15638114511966705\n", "Epoch 4 | step 53 / 112 | loss : 0.26870933175086975\n", "Epoch 4 | step 54 / 112 | loss : 0.21026207506656647\n", "Epoch 4 | step 55 / 112 | loss : 0.3213985860347748\n", "Epoch 4 | step 56 / 112 | loss : 0.33769574761390686\n", "Epoch 4 | step 57 / 112 | loss : 0.42968520522117615\n", "Epoch 4 | step 58 / 112 | loss : 0.3266032040119171\n", "Epoch 4 | step 59 / 112 | loss : 0.22769048810005188\n", "Epoch 4 | step 60 / 112 | loss : 0.2480681985616684\n", "Epoch 4 | step 61 / 112 | loss : 0.3088376522064209\n", "Epoch 4 | step 62 / 112 | loss : 0.26043450832366943\n", "Epoch 4 | step 63 / 112 | loss : 0.3725488483905792\n", "Epoch 4 | step 64 / 112 | loss : 0.29772812128067017\n", "Epoch 4 | step 65 / 112 | loss : 0.43915075063705444\n", "Epoch 4 | step 66 / 112 | loss : 0.4950353503227234\n", "Epoch 4 | step 67 / 112 | loss : 0.23282912373542786\n", "Epoch 4 | step 68 / 112 | loss : 0.27812692523002625\n", "Epoch 4 | step 69 / 112 | loss : 0.25864917039871216\n", "Epoch 4 | step 70 / 112 | loss : 0.31145715713500977\n", "Epoch 4 | step 71 / 112 | loss : 0.38645023107528687\n", "Epoch 4 | step 72 / 112 | loss : 0.26248639822006226\n", "Epoch 4 | step 73 / 112 | loss : 0.340522825717926\n", "Epoch 4 | step 74 / 112 | loss : 0.6075162291526794\n", "Epoch 4 | step 75 / 112 | loss : 0.2856791913509369\n", "Epoch 4 | step 76 / 112 | loss : 0.4672953188419342\n", "Epoch 4 | step 77 / 112 | loss : 0.2364802062511444\n", "Epoch 4 | step 78 / 112 | loss : 0.239596888422966\n", "Epoch 4 | step 79 / 112 | loss : 0.40412646532058716\n", "Epoch 4 | step 80 / 112 | loss : 0.5411423444747925\n", "Epoch 4 | step 81 / 112 | loss : 0.29234737157821655\n", "Epoch 4 | step 82 / 112 | loss : 0.18243855237960815\n", "Epoch 4 | step 83 / 112 | loss : 0.34876322746276855\n", "Epoch 4 | step 84 / 112 | loss : 0.30811670422554016\n", "Epoch 4 | step 85 / 112 | loss : 0.2608708143234253\n", "Epoch 4 | step 86 / 112 | loss : 0.2500651776790619\n", "Epoch 4 | step 87 / 112 | loss : 0.2920064628124237\n", "Epoch 4 | step 88 / 112 | loss : 0.4636370837688446\n", "Epoch 4 | step 89 / 112 | loss : 0.29347532987594604\n", "Epoch 4 | step 90 / 112 | loss : 0.29619815945625305\n", "Epoch 4 | step 91 / 112 | loss : 0.323386013507843\n", "Epoch 4 | step 92 / 112 | loss : 0.1746542900800705\n", "Epoch 4 | step 93 / 112 | loss : 0.2856774926185608\n", "Epoch 4 | step 94 / 112 | loss : 0.22287239134311676\n", "Epoch 4 | step 95 / 112 | loss : 0.2665632367134094\n", "Epoch 4 | step 96 / 112 | loss : 0.27514609694480896\n", "Epoch 4 | step 97 / 112 | loss : 0.20226508378982544\n", "Epoch 4 | step 98 / 112 | loss : 0.3325212299823761\n", "Epoch 4 | step 99 / 112 | loss : 0.2247518002986908\n", "Epoch 4 | step 100 / 112 | loss : 0.19903799891471863\n", "Epoch 4 | step 101 / 112 | loss : 0.3901631832122803\n", "Epoch 4 | step 102 / 112 | loss : 0.2159334123134613\n", "Epoch 4 | step 103 / 112 | loss : 0.16511085629463196\n", "Epoch 4 | step 104 / 112 | loss : 0.22336040437221527\n", "Epoch 4 | step 105 / 112 | loss : 0.1846281886100769\n", "Epoch 4 | step 106 / 112 | loss : 0.28501296043395996\n", "Epoch 4 | step 107 / 112 | loss : 0.12498989701271057\n", "Epoch 4 | step 108 / 112 | loss : 0.3019748628139496\n", "Epoch 4 | step 109 / 112 | loss : 0.19399666786193848\n", "Epoch 4 | step 110 / 112 | loss : 0.2605453431606293\n", "Epoch 4 | step 111 / 112 | loss : 0.2787364423274994\n", "Epoch 4 | step 112 / 112 | loss : 0.4041137397289276\n", "Training Epoch n° 4\n", "Epoch 5 | step 1 / 112 | loss : 0.5011679530143738\n", "Epoch 5 | step 2 / 112 | loss : 0.19903279840946198\n", "Epoch 5 | step 3 / 112 | loss : 0.2403055876493454\n", "Epoch 5 | step 4 / 112 | loss : 0.3220921456813812\n", "Epoch 5 | step 5 / 112 | loss : 0.3000803589820862\n", "Epoch 5 | step 6 / 112 | loss : 0.3042733371257782\n", "Epoch 5 | step 7 / 112 | loss : 0.11226660013198853\n", "Epoch 5 | step 8 / 112 | loss : 0.32690978050231934\n", "Epoch 5 | step 9 / 112 | loss : 0.2559134066104889\n", "Epoch 5 | step 10 / 112 | loss : 0.2734014093875885\n", "Epoch 5 | step 11 / 112 | loss : 0.1958414912223816\n", "Epoch 5 | step 12 / 112 | loss : 0.2610269784927368\n", "Epoch 5 | step 13 / 112 | loss : 0.31161361932754517\n", "Epoch 5 | step 14 / 112 | loss : 0.1236853301525116\n", "Epoch 5 | step 15 / 112 | loss : 0.2264564484357834\n", "Epoch 5 | step 16 / 112 | loss : 0.19304315745830536\n", "Epoch 5 | step 17 / 112 | loss : 0.19945038855075836\n", "Epoch 5 | step 18 / 112 | loss : 0.41540610790252686\n", "Epoch 5 | step 19 / 112 | loss : 0.45798051357269287\n", "Epoch 5 | step 20 / 112 | loss : 0.23522454500198364\n", "Epoch 5 | step 21 / 112 | loss : 0.27430403232574463\n", "Epoch 5 | step 22 / 112 | loss : 0.22547312080860138\n", "Epoch 5 | step 23 / 112 | loss : 0.17104709148406982\n", "Epoch 5 | step 24 / 112 | loss : 0.12399943917989731\n", "Epoch 5 | step 25 / 112 | loss : 0.30042973160743713\n", "Epoch 5 | step 26 / 112 | loss : 0.22424501180648804\n", "Epoch 5 | step 27 / 112 | loss : 0.2135702520608902\n", "Epoch 5 | step 28 / 112 | loss : 0.24257726967334747\n", "Epoch 5 | step 29 / 112 | loss : 0.2946033477783203\n", "Epoch 5 | step 30 / 112 | loss : 0.2443745881319046\n", "Epoch 5 | step 31 / 112 | loss : 0.3638736605644226\n", "Epoch 5 | step 32 / 112 | loss : 0.24397367238998413\n", "Epoch 5 | step 33 / 112 | loss : 0.2324908971786499\n", "Epoch 5 | step 34 / 112 | loss : 0.2622489035129547\n", "Epoch 5 | step 35 / 112 | loss : 0.3235417604446411\n", "Epoch 5 | step 36 / 112 | loss : 0.18366049230098724\n", "Epoch 5 | step 37 / 112 | loss : 0.22317689657211304\n", "Epoch 5 | step 38 / 112 | loss : 0.34013915061950684\n", "Epoch 5 | step 39 / 112 | loss : 0.14992675185203552\n", "Epoch 5 | step 40 / 112 | loss : 0.23207412660121918\n", "Epoch 5 | step 41 / 112 | loss : 0.2200399935245514\n", "Epoch 5 | step 42 / 112 | loss : 0.3794693350791931\n", "Epoch 5 | step 43 / 112 | loss : 0.4022085964679718\n", "Epoch 5 | step 44 / 112 | loss : 0.44101449847221375\n", "Epoch 5 | step 45 / 112 | loss : 0.39607125520706177\n", "Epoch 5 | step 46 / 112 | loss : 0.23637951910495758\n", "Epoch 5 | step 47 / 112 | loss : 0.1994527280330658\n", "Epoch 5 | step 48 / 112 | loss : 0.2824612855911255\n", "Epoch 5 | step 49 / 112 | loss : 0.2638837695121765\n", "Epoch 5 | step 50 / 112 | loss : 0.1721542328596115\n", "Epoch 5 | step 51 / 112 | loss : 0.214934840798378\n", "Epoch 5 | step 52 / 112 | loss : 0.2581406235694885\n", "Epoch 5 | step 53 / 112 | loss : 0.4919726252555847\n", "Epoch 5 | step 54 / 112 | loss : 0.18771567940711975\n", "Epoch 5 | step 55 / 112 | loss : 0.17933514714241028\n", "Epoch 5 | step 56 / 112 | loss : 0.34122633934020996\n", "Epoch 5 | step 57 / 112 | loss : 0.1985575407743454\n", "Epoch 5 | step 58 / 112 | loss : 0.18442055583000183\n", "Epoch 5 | step 59 / 112 | loss : 0.19010449945926666\n", "Epoch 5 | step 60 / 112 | loss : 0.26816266775131226\n", "Epoch 5 | step 61 / 112 | loss : 0.26343733072280884\n", "Epoch 5 | step 62 / 112 | loss : 0.1505548059940338\n", "Epoch 5 | step 63 / 112 | loss : 0.22617211937904358\n", "Epoch 5 | step 64 / 112 | loss : 0.34998008608818054\n", "Epoch 5 | step 65 / 112 | loss : 0.5144566297531128\n", "Epoch 5 | step 66 / 112 | loss : 0.32738274335861206\n", "Epoch 5 | step 67 / 112 | loss : 0.28638023138046265\n", "Epoch 5 | step 68 / 112 | loss : 0.23572753369808197\n", "Epoch 5 | step 69 / 112 | loss : 0.29071301221847534\n", "Epoch 5 | step 70 / 112 | loss : 0.14969751238822937\n", "Epoch 5 | step 71 / 112 | loss : 0.49677222967147827\n", "Epoch 5 | step 72 / 112 | loss : 0.1881270557641983\n", "Epoch 5 | step 73 / 112 | loss : 0.24129386246204376\n", "Epoch 5 | step 74 / 112 | loss : 0.2204923927783966\n", "Epoch 5 | step 75 / 112 | loss : 0.23678341507911682\n", "Epoch 5 | step 76 / 112 | loss : 0.29640263319015503\n", "Epoch 5 | step 77 / 112 | loss : 0.24517828226089478\n", "Epoch 5 | step 78 / 112 | loss : 0.31662517786026\n", "Epoch 5 | step 79 / 112 | loss : 0.22451210021972656\n", "Epoch 5 | step 80 / 112 | loss : 0.25891128182411194\n", "Epoch 5 | step 81 / 112 | loss : 0.17897871136665344\n", "Epoch 5 | step 82 / 112 | loss : 0.24162225425243378\n", "Epoch 5 | step 83 / 112 | loss : 0.3940525949001312\n", "Epoch 5 | step 84 / 112 | loss : 0.3753306567668915\n", "Epoch 5 | step 85 / 112 | loss : 0.3214426636695862\n", "Epoch 5 | step 86 / 112 | loss : 0.4710805416107178\n", "Epoch 5 | step 87 / 112 | loss : 0.21841081976890564\n", "Epoch 5 | step 88 / 112 | loss : 0.13427437841892242\n", "Epoch 5 | step 89 / 112 | loss : 0.171980619430542\n", "Epoch 5 | step 90 / 112 | loss : 0.176282599568367\n", "Epoch 5 | step 91 / 112 | loss : 0.4428151249885559\n", "Epoch 5 | step 92 / 112 | loss : 0.3229476511478424\n", "Epoch 5 | step 93 / 112 | loss : 0.25473278760910034\n", "Epoch 5 | step 94 / 112 | loss : 0.2613429129123688\n", "Epoch 5 | step 95 / 112 | loss : 0.40870019793510437\n", "Epoch 5 | step 96 / 112 | loss : 0.37132763862609863\n", "Epoch 5 | step 97 / 112 | loss : 0.1607457995414734\n", "Epoch 5 | step 98 / 112 | loss : 0.24902255833148956\n", "Epoch 5 | step 99 / 112 | loss : 0.28354811668395996\n", "Epoch 5 | step 100 / 112 | loss : 0.3061903417110443\n", "Epoch 5 | step 101 / 112 | loss : 0.25210458040237427\n", "Epoch 5 | step 102 / 112 | loss : 0.4018750488758087\n", "Epoch 5 | step 103 / 112 | loss : 0.26662057638168335\n", "Epoch 5 | step 104 / 112 | loss : 0.258944571018219\n", "Epoch 5 | step 105 / 112 | loss : 0.36430320143699646\n", "Epoch 5 | step 106 / 112 | loss : 0.11709750443696976\n", "Epoch 5 | step 107 / 112 | loss : 0.25966304540634155\n", "Epoch 5 | step 108 / 112 | loss : 0.1297980099916458\n", "Epoch 5 | step 109 / 112 | loss : 0.2898765206336975\n", "Epoch 5 | step 110 / 112 | loss : 0.30874258279800415\n", "Epoch 5 | step 111 / 112 | loss : 0.5583710670471191\n", "Epoch 5 | step 112 / 112 | loss : 0.15290147066116333\n", "Model saved at /content/drive/MyDrive/DIT/Cours/M2/06.DS-DeepLearning2/TP/BERT/custom_bert_model.torch\n", "Model loaded from path :/content/drive/MyDrive/DIT/Cours/M2/06.DS-DeepLearning2/TP/BERT/custom_bert_model.torch\n", "Eval loss : 0.13661052286624908\n", "Eval loss : 0.30117863416671753\n", "Eval loss : 0.2816396951675415\n", "Eval loss : 0.17155668139457703\n", "Eval loss : 0.2045932114124298\n", "Eval loss : 0.2528477609157562\n", "Eval loss : 0.17257143557071686\n", "Eval loss : 0.14517918229103088\n", "Eval loss : 0.2526240944862366\n", "Eval loss : 0.12449759989976883\n", "Eval loss : 0.20393577218055725\n", "Eval loss : 0.1050066351890564\n", "Eval loss : 0.15484142303466797\n", "Eval loss : 0.1451314091682434\n", "Eval loss : 0.08569525182247162\n", "Eval loss : 0.09916065633296967\n", "Eval loss : 0.14173972606658936\n", "Eval loss : 0.18522481620311737\n", "Eval loss : 0.22558113932609558\n", "Eval loss : 0.4257800877094269\n", "Eval loss : 0.25676727294921875\n", "Eval loss : 0.30065563321113586\n", "Eval loss : 0.18769963085651398\n", "Eval loss : 0.19229087233543396\n", "Eval loss : 0.36015549302101135\n", "Eval loss : 0.2508164942264557\n", "Eval loss : 0.2726633548736572\n", "Eval loss : 0.21292199194431305\n", "Accuracy : 0.9752808988764045\n" ] }, { "data": { "image/png": "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tG3bFiYmJti6dSs2bdqEunXr5ruXbykUCixevBguLi6Qy+UoXbo0rKysEBUVlW/Mz/t88cUXRZrE8P3338PCwgIRERFYtmwZrK2tC/3ef3v48CFcXFyUyehbb7vN/v15KagL9H1Kly4Nb29veHt7o127dvj666+xevVqnD9/HqtXr85X38vLC97e3mjZsiX8/PwQGhoKExMTjB49GkDRvw+Foa2tjW+++QYRERHvXP8wOjoaN2/ehJWVlcpWsWJFAG/GFb49loeHB86cOQPgTRLXuHFjNGrUCHl5ebh48SJu3bqFpKQklSQuODgYycnJqFixIqpXr46JEyciKipKLdeXlpamkvRmZGRgxowZcHBwUPncJicnF/pze/PmTXTp0gVmZmYwNTWFlZWVcgLL22M4OzsjICAAq1evRunSpeHj44Mff/xR5RzR0dEQBAEuLi757u3t27eV95WIY+JIkkxNTWFvb48bN24U6X2FnWmnra1dYPm7WiQKc45/D242MDDA6dOnceLECRw4cACHDh3C1q1b0bx5cxw5cuSdMRTVx1zLW3K5HF27dsX69evx4MEDzJo16511582bh+nTp2PQoEGYPXs2LCwsoKWlhXHjxhW6xRFQbdUojGvXril/uV2/fl2lFe1TK2qsBWnRogUA4PTp08rk7F2MjY1Rv3597N27F69fvy729+FD+vXrpxwb17lz53z7FQoFqlevjkWLFhX4fgcHB+W/GzVqhLlz5yIzMxNnzpzBtGnTYG5ujmrVquHMmTPKMY//TOK8vLxw//597N27F0eOHMHq1auxePFirFy5EkOGDCn2deXk5ODevXuoVq2asmz06NFYu3Ytxo0bBw8PD+UC3r179y7U5zY5ORlNmjSBqakpgoODUb58eejr6yM8PByTJ09WOcbChQvh5+envK4xY8YgJCQEFy9eRJkyZaBQKJQTPAr6/nLcG73FJI4kq3379vjll19w4cIFeHh4vLeuo6MjFAoFoqOjla0pAPDs2TMkJycrZ5qqQ6lSpVRmcr7179Yb4M1MwBYtWqBFixZYtGgR5s2bh2nTpuHEiRPw9vYu8DoA4O7du/n23blzB6VLl4aRkdHHX0QB+vbtizVr1kBLSwu9e/d+Z70dO3agWbNm+PXXX1XKk5OTVZbJUOfSFa9fv8bAgQPh6uqKhg0bYsGCBejSpYty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z6LEDoE0VHpOltgh0PtoeEsckzgiIiKSJg1fYoTdqURERERFcPr0aXTo0AH29vaQyWTYs2ePcl9OTg4mT56M6tWrw8jICPb29hgwYACePn2qcoykpCT069cPpqamMDc3x+DBg5GWllakOJjEERERkSQJCkEtW1G9fv0abm5u+PHHH/PtS09PR3h4OKZPn47w8HDs2rULd+/eRceOHVXq9evXDzdv3sTRo0exf/9+nD59GsOGDStSHDJB0PD5uVRounpfiB2CpHlzTFyxcUwckfTkZj/55OdIXzlWLccxHLG02O+VyWTYvXs3Onfu/M46ly9fRr169fDw4UOULVsWt2/fhqurKy5fvow6deoAAA4dOoS2bdvir7/+gr29faHOzZY4IiIi0mhZWVlITU1V2bKy1DepJSUlBTKZDObm5gCACxcuwNzcXJnAAYC3tze0tLQQFhZW6OMyiSMiIiJpEhRq2UJCQmBmZqayhYSEqCXEzMxMTJ48GX369IGpqSkAICEhAdbW1ir1dHR0YGFhgYSEhEIfm7NTiYiISJqKMZ6tIFOnTkVAQIBKmVwu/+jj5uTkoGfPnhAEAStWrPjo4/0bkzgiIiKSJjWtEyeXy9WStP3T2wTu4cOHOH78uLIVDgBsbW2RmJioUj83NxdJSUmwtbUt9DnYnUpERESkRm8TuOjoaBw7dgyWlpYq+z08PJCcnIyrV68qy44fPw6FQoH69esX+jxsiSMiIiJpEumJDWlpaYiJiVG+jo2NRUREBCwsLGBnZ4fu3bsjPDwc+/fvR15ennKcm4WFBfT09FClShW0bt0aQ4cOxcqVK5GTkwN/f3/07t270DNTASZxREREJFUirZJ25coVNGvWTPn67Xg6X19fzJo1C/v27QMA1KxZU+V9J06cQNOmTQEAmzZtgr+/P1q0aAEtLS1069YNy5YtK1IcTOKIiIiIiqBp06Z43zK7hVmC18LCAps3b/6oOJjEERERkTSJ1J1aUjCJIyIiImlS0xIjUsXZqUREREQSxJY4IiIikiaB3alERERE0sPuVCIiIiKSGrbEERERkSQJnJ1KREREJEEa3p3KJI6IiIikScMnNnBMHBEREZEEsSWOiIiIpIndqUREREQSpOETG9idSkRERCRBbIkjIiIiaWJ3KhEREZEEcXYqEREREUkNW+KIiIhImtidSh/Lz88P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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "if __name__ == \"__main__\":\n", "\n", " wandb.login()\n", " run = wandb.init(project=\"DIT-Bert-bbc-news-project\")\n", " our_bert_dataset = CustomBertDataset(DS_PATH)\n", " print(f\"Size of bert dataset : {len(our_bert_dataset)}\")\n", " train_dataset = Subset(our_bert_dataset, range(int(len(our_bert_dataset)*0.8)))\n", " test_dataset = Subset(our_bert_dataset, range(int(len(our_bert_dataset)*0.8), len(our_bert_dataset)))\n", "\n", " train_dataloader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)\n", " test_dataloader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False)\n", "\n", " our_bert_model = CustomBertModel(our_bert_dataset.num_class)\n", " our_bert_model = our_bert_model.to(device)\n", "\n", " loss_fn = nn.CrossEntropyLoss()\n", " optimizer = optim.SGD(filter(lambda p: p.requires_grad, our_bert_model.parameters()), lr=0.01)\n", "\n", " train_step(our_bert_model, train_dataloader, loss_fn, optimizer)\n", "\n", " eval_step(test_dataloader, loss_fn, our_bert_dataset.num_class)\n" ] } ], "metadata": { "accelerator": "GPU", "colab": { "authorship_tag": "ABX9TyNfpxh5FPwSsaH3OKRm/oPL", "gpuType": "T4", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }