{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "694ywzJro_xb",
        "outputId": "fa8cf7b0-9040-43e2-9db9-926dc890622d"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Tue Jun 25 12:10:13 AM UTC 2024\n",
            "Python 3.10.12\n"
          ]
        }
      ],
      "source": [
        "!date\n",
        "!python --version"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# AutoModelForSequenceClassificationを用いたファインチューニング例\n",
        "このノートブックでは[Japanese Realistic Textual Entailment Corpus](https://github.com/megagonlabs/jrte-corpus)のpn.tsvをデータセットとし、BERT（\"tohoku-nlp/bert-base-japanese-v3\"）を用いてファインチューニングする例を示している。全体の流れは以下の通り。\n",
        "\n",
        "- 環境構築: fugashi, accelerateをインストール\n",
        "- モジュール読み込み\n",
        "- データ前処理: LLMにおける分類タスクでは教師ラベルを「0から始まる整数」として割り振る必要があるため、ラベルを設定し直した。\n",
        "- モデルの用意: tokenizerの動作確認を含む。\n",
        "- LLM用にデータを整形: tokenizerの出力と教師ラベルを合わせてDataset型に変換。\n",
        "- 学習\n",
        "- テストデータに対する詳細結果\n",
        "- 学習データに対する詳細結果"
      ],
      "metadata": {
        "id": "YQry16tI1iXY"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 注意\n",
        "### GPUを指定する\n",
        "LLMを用いた学習を行っている都合上、デフォルト（CPU）実行すると極めて時間がかかる。おそらく数時間要するだろう。今回はGPUを指定して実行することを強くお勧めする。\n",
        "\n",
        "GPUを指定するには以下の手順を取る。\n",
        "- 「ランタイム」から「ランタイムのタイプの変更」を選ぶ。\n",
        "- 「ハードウェア アクセラレータ」からGPUを選ぶ。\n",
        "  - T4 GPU を選ぶと良い。この中では低スペックだが十分早い。T4 GPUなら、10エポックの学習が約14分で終了する。\n",
        "\n",
        "### リソース使用制限\n",
        "Google Colabは無料で利用できるが、利用度合いに応じてリソースが制限されることがある。特にGPUは使えなくなることが多いため、不必要に何度も実行することは避けよう。\n",
        "\n",
        "詳細: [最適な Colab のプランを選択する](https://colab.research.google.com/signup/pricing?hl=ja)\n",
        "\n",
        "### 必要に応じてモデルや結果をファイル保存する\n",
        "このノートブックではノートブック内に出力しつつ、学習したモデルはセッション内に保存しているだけで終えている。このため後日「学習結果を利用したい」場合には改めて学習し直す必要がある。それが面倒に思う人はファイル保存するようにしよう。\n",
        "\n",
        "なお、正確には「ファイル」ではなく「複数のファイルを含むフォルダ」として保存されている。このフォルダ単位でダウンロードしたり、アップロードしてモデルを復元する必要があることに注意しよう。\n",
        "\n",
        "またモデルはとてもファイルサイズが大きく、実際にダウンロード＆アップロードするにはとても時間がかかる。そのためGoogleドライブにアクセス許可した上で自身のドライブ内に保存する方が楽だ。\n",
        "\n",
        "```Python\n",
        "# ノートブックからドライブへのアクセスを許可する\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')\n",
        "```"
      ],
      "metadata": {
        "id": "ddjbPBwC63Fi"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 環境構築"
      ],
      "metadata": {
        "id": "gmO5jzDI1zl0"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install fugashi[unidic-lite]\n",
        "!pip install accelerate -U"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WXcMonRRpPW2",
        "outputId": "c1048519-72d8-4cbd-f34d-7541c8e1da0d"
      },
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting fugashi[unidic-lite]\n",
            "  Downloading fugashi-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (600 kB)\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m600.9/600.9 kB\u001b[0m \u001b[31m9.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hCollecting unidic-lite (from fugashi[unidic-lite])\n",
            "  Downloading unidic-lite-1.0.8.tar.gz (47.4 MB)\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.4/47.4 MB\u001b[0m \u001b[31m10.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
            "Building wheels for collected packages: unidic-lite\n",
            "  Building wheel for unidic-lite (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
            "  Created wheel for unidic-lite: filename=unidic_lite-1.0.8-py3-none-any.whl size=47658818 sha256=93d9fb07131b7a11f3fd9f21e93759a181788374dd53f0d53f41d0e0bcba855b\n",
            "  Stored in directory: /root/.cache/pip/wheels/89/e8/68/f9ac36b8cc6c8b3c96888cd57434abed96595d444f42243853\n",
            "Successfully built unidic-lite\n",
            "Installing collected packages: unidic-lite, fugashi\n",
            "Successfully installed fugashi-1.3.2 unidic-lite-1.0.8\n",
            "Collecting accelerate\n",
            "  Downloading accelerate-0.31.0-py3-none-any.whl (309 kB)\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m309.4/309.4 kB\u001b[0m \u001b[31m5.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from accelerate) (1.25.2)\n",
            "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from accelerate) (24.1)\n",
            "Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from accelerate) (5.9.5)\n",
            "Requirement already satisfied: pyyaml in /usr/local/lib/python3.10/dist-packages (from accelerate) (6.0.1)\n",
            "Requirement already satisfied: torch>=1.10.0 in /usr/local/lib/python3.10/dist-packages (from accelerate) (2.3.0+cu121)\n",
            "Requirement already satisfied: huggingface-hub in /usr/local/lib/python3.10/dist-packages (from accelerate) (0.23.4)\n",
            "Requirement already satisfied: safetensors>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from accelerate) (0.4.3)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (3.15.3)\n",
            "Requirement already satisfied: typing-extensions>=4.8.0 in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (4.12.2)\n",
            "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (1.12.1)\n",
            "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (3.3)\n",
            "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (3.1.4)\n",
            "Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (2023.6.0)\n",
            "Collecting nvidia-cuda-nvrtc-cu12==12.1.105 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (23.7 MB)\n",
            "Collecting nvidia-cuda-runtime-cu12==12.1.105 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (823 kB)\n",
            "Collecting nvidia-cuda-cupti-cu12==12.1.105 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)\n",
            "Collecting nvidia-cudnn-cu12==8.9.2.26 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl (731.7 MB)\n",
            "Collecting nvidia-cublas-cu12==12.1.3.1 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl (410.6 MB)\n",
            "Collecting nvidia-cufft-cu12==11.0.2.54 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl (121.6 MB)\n",
            "Collecting nvidia-curand-cu12==10.3.2.106 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl (56.5 MB)\n",
            "Collecting nvidia-cusolver-cu12==11.4.5.107 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl (124.2 MB)\n",
            "Collecting nvidia-cusparse-cu12==12.1.0.106 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)\n",
            "Collecting nvidia-nccl-cu12==2.20.5 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl (176.2 MB)\n",
            "Collecting nvidia-nvtx-cu12==12.1.105 (from torch>=1.10.0->accelerate)\n",
            "  Using cached nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (99 kB)\n",
            "Requirement already satisfied: triton==2.3.0 in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (2.3.0)\n",
            "Collecting nvidia-nvjitlink-cu12 (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.10.0->accelerate)\n",
            "  Downloading nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl (21.3 MB)\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.3/21.3 MB\u001b[0m \u001b[31m53.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hRequirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface-hub->accelerate) (2.31.0)\n",
            "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub->accelerate) (4.66.4)\n",
            "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch>=1.10.0->accelerate) (2.1.5)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (3.3.2)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (3.7)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (2.0.7)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (2024.6.2)\n",
            "Requirement already satisfied: mpmath<1.4.0,>=1.1.0 in /usr/local/lib/python3.10/dist-packages (from sympy->torch>=1.10.0->accelerate) (1.3.0)\n",
            "Installing collected packages: nvidia-nvtx-cu12, nvidia-nvjitlink-cu12, nvidia-nccl-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, nvidia-cusparse-cu12, nvidia-cudnn-cu12, nvidia-cusolver-cu12, accelerate\n",
            "Successfully installed accelerate-0.31.0 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-8.9.2.26 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.20.5 nvidia-nvjitlink-cu12-12.5.40 nvidia-nvtx-cu12-12.1.105\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## モジュール読み込み、データ前処理"
      ],
      "metadata": {
        "id": "L-AQS9sy12nO"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "jOIVctCTo_xf",
        "outputId": "4f06871a-2f1d-453a-df07-3fd1fd85d5cb"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "train_texts[0]='(笑)'\n",
            "train_labels[0]=1\n",
            "sentiment\n",
            "2    3406\n",
            "1    1329\n",
            "0     818\n",
            "Name: count, dtype: int64\n"
          ]
        }
      ],
      "source": [
        "import torch\n",
        "import pandas as pd\n",
        "from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments\n",
        "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import accuracy_score, precision_recall_fscore_support\n",
        "import numpy as np\n",
        "\n",
        "# データの読み込み\n",
        "filename = \"pn.tsv\"\n",
        "columns = [\"id\", \"sentiment\", \"text\", \"judges-json\", \"usage\"]\n",
        "df = pd.read_csv(filename, sep=\"\\t\", names=columns)\n",
        "\n",
        "# ラベルの付け替え\n",
        "# AutoModelForSequenceClassificationではラベルは「0から始まる整数」である必要がある。\n",
        "# このため -1, 0, 1 => 0, 1, 2（ネガティブ0、ノーマル1、ポジティブ2）に付け替える。\n",
        "df['sentiment'] = df['sentiment'].map({-1: 0, 0: 1, 1: 2})\n",
        "\n",
        "# データセットの分割\n",
        "train_texts = df[df[\"usage\"] == \"train\"][\"text\"].tolist()\n",
        "train_labels = df[df[\"usage\"] == \"train\"][\"sentiment\"].tolist()\n",
        "dev_texts = df[df[\"usage\"] == \"dev\"][\"text\"].tolist()\n",
        "dev_labels = df[df[\"usage\"] == \"dev\"][\"sentiment\"].tolist()\n",
        "test_texts = df[df[\"usage\"] == \"test\"][\"text\"].tolist()\n",
        "test_labels = df[df[\"usage\"] == \"test\"][\"sentiment\"].tolist()\n",
        "\n",
        "# 動作確認\n",
        "print(f\"{train_texts[0]=}\")\n",
        "print(f\"{train_labels[0]=}\")\n",
        "print(df['sentiment'].value_counts())"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ETXKmVVYo_xg"
      },
      "source": [
        "## モデルの用意\n",
        "- ここでは \"tohoku-nlp/bert-base-japanese-v3\" を利用。\n",
        "- 長文だが、最初の出力「`Some weights of BertForSequenceClassification were not initialized from the model checkpoint at tohoku-nlp/bert-base-japanese-v3 and are newly initialized: ['classifier.bias', 'classifier.weight']   You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.`」は、このままでは利用できない（ので学習が必要だろう）ということを指摘している。この理由は、AutoModelForSequenceClassificationが「LLMの最後尾に新たな線形層（[torch.nn.Linear](https://pytorch.org/docs/stable/generated/torch.nn.Linear.html)）を追加しているためだ。この線形層はクラス数と同数のユニットを持つように設定されており（引数num_labelsで設定）、各ユニットに対するスコアを求めるようにモデルを拡張している。\n",
        "- このようなにモデルを拡張しているということは、拡張した部分（Linear層のパラメータ）については重みがまっさらな状態である。このままでは当然推定できない（でたらめになる）ため、「You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.」と注意を促している。\n",
        "- TrainingArgumentsで用いているパラメータ output_dir はチェックポイントを保存する場所を指定している。\n",
        "  - チェックポイントとは、別のパラメータ「save_strategy = \"epoch\"」として指定したタイミングのモデルのこと。今回はepochと指定しているため1エポック毎にモデルが保存されている。\n",
        "  - 必要に応じてこれらのチェックポイントからモデルを復元することも可能。モデル読み込み時にファイルを指定するだけで良い。このためファインチューニングしたモデルをファイル保存しておきたいならば、resultsフォルダ内のチェックポイントを保存しておくか、最終モデルである sentiment_model を保存しておくと良いだろう。\n",
        "  - ダウンロードするというよりは、Googleドライブへのアクセス許可を与え、自身のドライブ内に保存する方が良いだろう。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 352,
          "referenced_widgets": [
            "6653d0820b654ce2b97cdf16e08cc54a",
            "c0fb0b62a96e4ae9bc7aadbe2fb82ff7",
            "f1aefcf3257748cd97ddf1020fd6f715",
            "4c6968f2b79540c180f63448a79c7acb",
            "9beccc133ded46348b236501934abf91",
            "ccb9c8a9987f40d1b6f3845ba3dd3caf",
            "f02c062ca4f54c288588738ea6cacb27",
            "77942ecc2a8049e490d7b8a1c677877a",
            "d1b61e17650143b9ba60846c854d01fb",
            "fb9533704d1c4fecb4461d14063bb78f",
            "fd40d16a16884707a3b6c87b7f0e8f3c",
            "43f0772f5d604144ba5d93cfa0d8e0bd",
            "4e44663baddc4e3d8d42882c84e561a5",
            "de2a3c0e5a8e4a429abfcc84a39a8a9d",
            "82a8f8974acc4f60815922e563b5f9ca",
            "ab072f33d9e3402baaa75d88de8c53f3",
            "91767fe429e04d9aab73b5c6b5f98944",
            "c340ab0649bb4cd5a52496407f587224",
            "9ffee220fffb4785b615a7f318197a83",
            "6707e892aa4645ed86707a8af744bd65",
            "fa4868b0894e427b9048f02480c0518d",
            "2f415c75df1541dfad4479df03dda798",
            "07695fbe5c0d499980bf42a98faaf6c5",
            "13e69dbd81474aa5990d469aa1f43039",
            "bbbd2a9058c74d5f89c78d8138df9557",
            "a128d80f058b4f79893bf2017ef0f4d6",
            "acc3f66869c347ad85ecff59c9f49a15",
            "67ce159458b24cdfaa6c86ffa02a883c",
            "c91e009b30de4a2896688d3e4d166d5d",
            "04779582711a4b87a3433b43ef5c1288",
            "7424d573d1414be9b85a3fc3b7d0da36",
            "83d97e30c723401f86c999de2e94be95",
            "1617fa04bb2e4515b47f931cad9f2213",
            "941d6f15e145476283ce976513d98e76",
            "7af49fc156f54ba1b4bbc18b61eb0262",
            "874c52acc312476d9898ba35bdae2b1c",
            "13af9a299b1245e0ad80d2a1eb546aba",
            "4fdfce2eb975485fabe2ad7ed33cddd4",
            "1c21fbe9a06741ffa5ad6cdad569d4d5",
            "e5b8979642484d7cb1614cd03ced911c",
            "6578fa3c17b24fe7b5ec276ea34a6457",
            "05fab716206347e783d42395eda6b07a",
            "8348ce23ad6c42eebf43812adf2e56eb",
            "e4ffec6beb98461d88a14d4f59f191cb"
          ]
        },
        "id": "uzl27_c_o_xh",
        "outputId": "afd5e87b-e385-4297-8d33-ca44d3176fd8"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:89: UserWarning: \n",
            "The secret `HF_TOKEN` does not exist in your Colab secrets.\n",
            "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n",
            "You will be able to reuse this secret in all of your notebooks.\n",
            "Please note that authentication is recommended but still optional to access public models or datasets.\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "tokenizer_config.json:   0%|          | 0.00/251 [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "6653d0820b654ce2b97cdf16e08cc54a"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "vocab.txt:   0%|          | 0.00/231k [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "43f0772f5d604144ba5d93cfa0d8e0bd"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "config.json:   0%|          | 0.00/472 [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "07695fbe5c0d499980bf42a98faaf6c5"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "pytorch_model.bin:   0%|          | 0.00/447M [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "941d6f15e145476283ce976513d98e76"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at tohoku-nlp/bert-base-japanese-v3 and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
            "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "dict_keys(['input_ids', 'token_type_ids', 'attention_mask'])\n",
            "[2, 23, 4374, 24, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
            "[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
          ]
        }
      ],
      "source": [
        "# ハイパーパラメータ\n",
        "num_labels = 3   # クラス数\n",
        "max_length = 128 # 最長系列長（最大トークン数）\n",
        "num_train_epochs = 10 # 最大学習エポック数\n",
        "output_dir = './results' # チェックポイント等を保存するディレクトリ\n",
        "batch_size = 16  # バッチサイズ（一度に処理するサンプル数）\n",
        "logging_dir = './logs' # ログ出力用のディレクトリ（主にエラー確認用）\n",
        "\n",
        "# トークナイザーとモデルの準備\n",
        "model_name = \"tohoku-nlp/bert-base-japanese-v3\"\n",
        "tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
        "model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=num_labels)\n",
        "\n",
        "# データセットのトークナイズ\n",
        "train_encodings = tokenizer(train_texts, truncation=True, padding=True, max_length=max_length)\n",
        "dev_encodings = tokenizer(dev_texts, truncation=True, padding=True, max_length=max_length)\n",
        "test_encodings = tokenizer(test_texts, truncation=True, padding=True, max_length=max_length)\n",
        "\n",
        "# 動作確認\n",
        "# 'input_ids', 'token_type_ids', 'attention_mask'をキーとするリストとして保存されている。\n",
        "# ['input_ids'][0] は、0番目のみを出力指定。\n",
        "print(train_encodings.keys())\n",
        "print(train_encodings['input_ids'][0]) # サンプル0番目\n",
        "print(train_encodings['attention_mask'][0])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "id": "Sa_T0Xmro_xi",
        "outputId": "851b8383-41a4-4c40-d903-c0fecc29a971"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "'[CLS] ( 笑 ) [SEP]'"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            }
          },
          "metadata": {},
          "execution_count": 6
        }
      ],
      "source": [
        "# input_ids をデコードして確認\n",
        "tokenizer.decode([2, 23, 4374, 24, 3])"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## LLM用にデータを整形\n",
        "今回は分類タスクとして学習させたい。しかしtokenizerではテキストに対する前処理しか行われておらず、教師ラベルは別に用意している。これらを使いやすい形（Dataset型）にまとめ直している。"
      ],
      "metadata": {
        "id": "5Kkp8ndD2YgO"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "A6qMHL_so_xi",
        "outputId": "9f424678-29ad-4f1f-ee6e-be125bcda761"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "{'input_ids': tensor([   2,   23, 4374,   24,    3,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0]), 'token_type_ids': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), 'attention_mask': tensor([1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), 'labels': tensor(1)}\n"
          ]
        }
      ],
      "source": [
        "class SentimentDataset(torch.utils.data.Dataset):\n",
        "    '''サンプル毎に input_ids, token_type_ids, attention_mask, labels を設定。\n",
        "    '''\n",
        "    def __init__(self, encodings, labels):\n",
        "        self.encodings = encodings\n",
        "        self.labels = labels\n",
        "\n",
        "    def __getitem__(self, idx):\n",
        "        item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}\n",
        "        item['labels'] = torch.tensor(self.labels[idx])\n",
        "        return item\n",
        "\n",
        "    def __len__(self):\n",
        "        return len(self.labels)\n",
        "\n",
        "train_dataset = SentimentDataset(train_encodings, train_labels)\n",
        "dev_dataset = SentimentDataset(dev_encodings, dev_labels)\n",
        "test_dataset = SentimentDataset(test_encodings, test_labels)\n",
        "\n",
        "# 動作確認\n",
        "# サンプル毎に input_ids, token_type_ids, attention_mask, labels を用意した\n",
        "print(train_dataset[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 学習\n",
        "エポック毎に出力しているログは、学習データに対する損失(training loss)、検証データに対する損失(validation loss)、正解率(accuracy)、F1スコア(F1)、適合率(precision)、再現率(recall)。\n",
        "\n",
        "ログを確認すると、基本的には学習データに対する損失は減り続けている。しかし検証データに対する損失は途中から「逆に増えている」ことを確認できる。これが[過学習（過剰適合; over-fitting）](https://en.wikipedia.org/wiki/Overfitting#Machine_learning)だ。ここでは特別なことはせずに指定したエポック数の学習を続け、最終もでエルを用いた検証を行うこととした。"
      ],
      "metadata": {
        "id": "mQ_k7mli3E-P"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 544
        },
        "id": "c1Yyr28Do_xi",
        "outputId": "2fb0d0e2-d919-459f-d10e-8893815ca3d7"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/transformers/training_args.py:1474: FutureWarning: `evaluation_strategy` is deprecated and will be removed in version 4.46 of 🤗 Transformers. Use `eval_strategy` instead\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": [
              "\n",
              "    <div>\n",
              "      \n",
              "      <progress value='2430' max='2430' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
              "      [2430/2430 13:57, Epoch 10/10]\n",
              "    </div>\n",
              "    <table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              " <tr style=\"text-align: left;\">\n",
              "      <th>Epoch</th>\n",
              "      <th>Training Loss</th>\n",
              "      <th>Validation Loss</th>\n",
              "      <th>Accuracy</th>\n",
              "      <th>F1</th>\n",
              "      <th>Precision</th>\n",
              "      <th>Recall</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <td>1</td>\n",
              "      <td>0.423400</td>\n",
              "      <td>0.390626</td>\n",
              "      <td>0.853417</td>\n",
              "      <td>0.805778</td>\n",
              "      <td>0.821309</td>\n",
              "      <td>0.797058</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>2</td>\n",
              "      <td>0.302400</td>\n",
              "      <td>0.344628</td>\n",
              "      <td>0.865108</td>\n",
              "      <td>0.825983</td>\n",
              "      <td>0.837619</td>\n",
              "      <td>0.819292</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>3</td>\n",
              "      <td>0.173600</td>\n",
              "      <td>0.460407</td>\n",
              "      <td>0.876799</td>\n",
              "      <td>0.835589</td>\n",
              "      <td>0.841920</td>\n",
              "      <td>0.836759</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>4</td>\n",
              "      <td>0.225100</td>\n",
              "      <td>0.523901</td>\n",
              "      <td>0.873201</td>\n",
              "      <td>0.833102</td>\n",
              "      <td>0.834192</td>\n",
              "      <td>0.834772</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>5</td>\n",
              "      <td>0.084000</td>\n",
              "      <td>0.573181</td>\n",
              "      <td>0.879496</td>\n",
              "      <td>0.840015</td>\n",
              "      <td>0.842462</td>\n",
              "      <td>0.838103</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>6</td>\n",
              "      <td>0.006300</td>\n",
              "      <td>0.743830</td>\n",
              "      <td>0.859712</td>\n",
              "      <td>0.817780</td>\n",
              "      <td>0.816659</td>\n",
              "      <td>0.820234</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>7</td>\n",
              "      <td>0.028300</td>\n",
              "      <td>0.777815</td>\n",
              "      <td>0.884892</td>\n",
              "      <td>0.849863</td>\n",
              "      <td>0.851610</td>\n",
              "      <td>0.848161</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>8</td>\n",
              "      <td>0.013500</td>\n",
              "      <td>0.806769</td>\n",
              "      <td>0.890288</td>\n",
              "      <td>0.855647</td>\n",
              "      <td>0.862244</td>\n",
              "      <td>0.850295</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>9</td>\n",
              "      <td>0.000800</td>\n",
              "      <td>0.849699</td>\n",
              "      <td>0.886691</td>\n",
              "      <td>0.850617</td>\n",
              "      <td>0.854837</td>\n",
              "      <td>0.847571</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>10</td>\n",
              "      <td>0.001900</td>\n",
              "      <td>0.856102</td>\n",
              "      <td>0.884892</td>\n",
              "      <td>0.847907</td>\n",
              "      <td>0.854275</td>\n",
              "      <td>0.843427</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table><p>"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": [
              "\n",
              "    <div>\n",
              "      \n",
              "      <progress value='35' max='35' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
              "      [35/35 00:02]\n",
              "    </div>\n",
              "    "
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Test Accuracy: 0.8607594936708861\n",
            "Test F1 Score: 0.8308946761001555\n",
            "Test Precision: 0.8580621695594958\n",
            "Test Recall: 0.8097126694248997\n"
          ]
        }
      ],
      "source": [
        "# トレーニングの設定\n",
        "training_args = TrainingArguments(\n",
        "    output_dir=output_dir,\n",
        "    num_train_epochs=num_train_epochs,\n",
        "    per_device_train_batch_size=batch_size,\n",
        "    per_device_eval_batch_size=batch_size,\n",
        "    warmup_steps=500,\n",
        "    weight_decay=0.01,\n",
        "    logging_dir=logging_dir,\n",
        "    logging_steps=10,\n",
        "    evaluation_strategy=\"epoch\",\n",
        "    save_strategy=\"epoch\"\n",
        ")\n",
        "\n",
        "# 精度の計算\n",
        "def compute_metrics(p):\n",
        "    pred, labels = p\n",
        "    pred = np.argmax(pred, axis=1)\n",
        "    precision, recall, f1, _ = precision_recall_fscore_support(labels, pred, average='macro')\n",
        "    acc = accuracy_score(labels, pred)\n",
        "    return {\n",
        "        'accuracy': acc,\n",
        "        'f1': f1,\n",
        "        'precision': precision,\n",
        "        'recall': recall\n",
        "    }\n",
        "\n",
        "# トレーナーの設定\n",
        "trainer = Trainer(\n",
        "    model=model,\n",
        "    args=training_args,\n",
        "    train_dataset=train_dataset,\n",
        "    eval_dataset=dev_dataset,\n",
        "    compute_metrics=compute_metrics\n",
        ")\n",
        "\n",
        "# モデルのトレーニング\n",
        "trainer.train()\n",
        "\n",
        "# モデルの保存\n",
        "trainer.save_model(\"./sentiment_model\")\n",
        "\n",
        "# テストセットでの評価\n",
        "results = trainer.evaluate(eval_dataset=test_dataset)\n",
        "\n",
        "# 結果の表示\n",
        "print(f\"Test Accuracy: {results['eval_accuracy']}\")\n",
        "print(f\"Test F1 Score: {results['eval_f1']}\")\n",
        "print(f\"Test Precision: {results['eval_precision']}\")\n",
        "print(f\"Test Recall: {results['eval_recall']}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## テストデータに対する詳細結果"
      ],
      "metadata": {
        "id": "rvOyFqp_5fhs"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# テストデータに対する詳細結果\n",
        "from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay\n",
        "#import numpy as np\n",
        "\n",
        "predictions, labels, _ = trainer.predict(test_dataset)\n",
        "predicted_labels = np.argmax(predictions, axis=1)\n",
        "labels = ['negative', 'normal', 'positive']\n",
        "\n",
        "# 分類レポートの表示\n",
        "print(classification_report(test_labels, predicted_labels, target_names=labels))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 187
        },
        "id": "UGxJIbUKy1QY",
        "outputId": "377d20a9-ba0c-44aa-bc9e-76b190c7ff7e"
      },
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": []
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "    negative       0.93      0.81      0.86        78\n",
            "      normal       0.77      0.67      0.72       139\n",
            "    positive       0.88      0.95      0.91       336\n",
            "\n",
            "    accuracy                           0.86       553\n",
            "   macro avg       0.86      0.81      0.83       553\n",
            "weighted avg       0.86      0.86      0.86       553\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# 混同行列の表示\n",
        "conf_matrix = confusion_matrix(test_labels, predicted_labels)\n",
        "disp = ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=labels)\n",
        "disp.plot(cmap='Blues')\n",
        "disp.ax_.set_title('Confusion Matrix')"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 489
        },
        "id": "kDwMrlHszDFO",
        "outputId": "e1632b56-1963-41ab-e729-e8f26353f8f6"
      },
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Text(0.5, 1.0, 'Confusion Matrix')"
            ]
          },
          "metadata": {},
          "execution_count": 15
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 具体的な失敗例\n",
        "ラベルは「ネガティブ0、ノーマル1、ポジティブ2」に付け直していることに注意。"
      ],
      "metadata": {
        "id": "zA2OEeFy1KLz"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "### 学習データに対する誤り\n",
        "以下の通り1件しか誤りがない。学習データに対しては極めて的鉄な予測が可能なモデルになっているようだ。"
      ],
      "metadata": {
        "id": "9dwmMt0qCXHa"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# 学習データに対する予測誤り\n",
        "\n",
        "predictions, labels, _ = trainer.predict(train_dataset)\n",
        "predicted_labels = np.argmax(predictions, axis=1)\n",
        "\n",
        "# 誤った予測のサンプルを抽出\n",
        "incorrect_indices = [i for i, (true, pred) in enumerate(zip(train_labels, predicted_labels)) if true != pred]\n",
        "\n",
        "# 誤った予測のサンプルを出力\n",
        "for i in incorrect_indices:\n",
        "    print(f\"正解ラベル: {train_labels[i]}, 予測ラベル: {predicted_labels[i]}, テキスト: {train_texts[i]}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "id": "O0lpUg_q0Wo0",
        "outputId": "2926eae3-d455-4972-b81b-2af2addf8a99"
      },
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": []
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 気持ち悪くて食べられませんでした。\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### テストデータに対する誤り\n",
        "テストデータのサンプル数は学習データより少ないにも関わらず、失敗事例数は多い。"
      ],
      "metadata": {
        "id": "PTEkRb78CZgQ"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# テストデータに対する予測誤り\n",
        "\n",
        "predictions, labels, _ = trainer.predict(test_dataset)\n",
        "predicted_labels = np.argmax(predictions, axis=1)\n",
        "\n",
        "# 誤った予測のサンプルを抽出\n",
        "incorrect_indices = [i for i, (true, pred) in enumerate(zip(test_labels, predicted_labels)) if true != pred]\n",
        "\n",
        "# 誤った予測のサンプルを出力\n",
        "for i in incorrect_indices:\n",
        "    print(f\"正解ラベル: {test_labels[i]}, 予測ラベル: {predicted_labels[i]}, テキスト: {test_texts[i]}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "J_TGLzSh0oG-",
        "outputId": "2e34dc93-249f-4f97-99de-4d9ec369e5b6"
      },
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": []
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "正解ラベル: 1, 予測ラベル: 2, テキスト: お心遣いありがとうございました。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: と感じてしまいました。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 再訪です。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 二度目です。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: お疲れ様です。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: (^ω^\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 対応ありがとうございました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: コンビニも近かったです。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 長々と失礼しました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 寝るだけなので十分です。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: が感想です。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 朝食は食べませんでした。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 良かった所。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 安心してください。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 思わず笑ってしまいました。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 間違いないホテルです。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 迷わず予約しました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 足湯もありました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 料理は期待通りでした。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 結局入れなかった。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: また機会があれば...。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 朝食付きをお勧めします。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 立地はまずまず。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: そんなに気になりませんでした。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 立地は問題なしです。\n",
            "正解ラベル: 0, 予測ラベル: 2, テキスト: 食べたかったなぁ。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 天気は雨。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 安ければまた利用します。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: 気になった点としては...\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: はあったものの美味しく頂きました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 泊まる分には問題ありません。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: マンションのようなホテルでした。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 理解できません。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 餅っ!\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: とにかくすごい!\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: お風呂とトイレは別。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: がゴロゴロ。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 風呂は温泉です。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 一人旅で利用いたしました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: それ以外は◎。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 午後9時すぎから朝8時までなので1000円くらいだといいですね。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 朝食は、お粥とチーズオムレツをお願いし、サラダに、ヨーグルトとフルーツ三昧。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 市内在住なので、過去何度か宿泊しました。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 母と娘を招待し女3人で新年初温泉を満喫しました。\n",
            "正解ラベル: 2, 予測ラベル: 0, テキスト: あと、一番大事なのは、客用の冷蔵庫があり、細かいことを言わないのがメチャメチャいいです。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: そこがチョット残念な思いをしただけで他の食事、お風呂などは大変満足させていただきました。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 外国の方も宿泊されるからか夕食時も朝食時もBGMはジャズでしたが、せめてさわやかな朝はlovesongはやめたほうが、、と思いました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 料理もおいしかったし,お風呂の洗面付近の清潔感は素晴らしかったので,期待していかなければそれなりに満足できたのかもしれません。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: この金額でシャワーが赤青の蛇口じゃないところは初めてかも。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: 側にあるソファーの方が柔らかいほど...。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: チェックアウト12時のプランでしたが、10時までの料金をホテルで支払い、その後は精算機でとのことでした。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 4ヵ月の子どもと一緒の旅行だったので、部屋食にしたが、全体的に同じような味付けで、これ!\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: フロントの方たちの笑顔があれば、90点なのですが、85点の満足の宿でした。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 部屋は4人部屋で大変広く、7人で2次会が出来ました、アジアンリゾート風ですね・・良かったですその他テニスやパターゴルフ、散策、夏はプールなどがあり宿泊者が楽しめる配慮が随所にありますが、子供いわくゲーセンは信じられない位しょぼい(笑)\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 夜フルーツが無いのと、朝お粥が有れば年配の方は喜ぶと思います。\n",
            "正解ラベル: 0, 予測ラベル: 2, テキスト: フロントも全く同じで何コールしてもでない。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 朝食のメニューも変わっていて前からあった和食・洋食にエビチーズドリアセット・ロコモコ丼セットの4種類になっていました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 大浴場が利用できたのが、ここに決めたポイントです。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 他はパーフェクトです。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: ほとんど寝るだけだったので、特に不便はありませんでした。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 髭剃りやシャンプーハットをつけるくらいなら、バスタオルを備え付けてもらった方が嬉しかったです。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: この宿に泊まって一番感じる事は、御主人、女将さんの人柄です。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 120センチのセミダブルでしたので、夫とふたりでもこれならOKと思いました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: チッックインが遅くなることと雨が降っていたため夕食を済ませてからホテルに着きましたが、カレーのサービスを行っていました。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 18:00の予約で入って料理をとったところ保温トレーの中の料理はどれもぬるい程度の温度で、松茸茶碗蒸しは容器が冷たい程で驚きました。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 粉コーヒーでもいいのでいつでも飲めるようになってればなぁ。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: シングルルームを2部屋予約しましたが、当日部屋が空いてるとの事で大きな部屋に変更してくださいました。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 料理はみんなきれいに盛られ、おいしかったですが、なにか一つ地のもので、「ここでしか食べられない」とか「何か特化したもの」があったらさらに良かったと思います。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: お風呂場にタオルの設置があったらいいなと思うのと、朝食会場が宿泊者の人数の割に狭いのが少し惜しい気がしましたが、いいホテルに泊まって気持ちよく過ごせました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: ・冷蔵庫有り。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 朝食は長い列ができていたが、案外すぐに呼ばれた。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 海沿いの立地のためか日の出スポットらしく元旦に続々前回道路に人が集まってました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: あと、お宿横には酒屋さん!\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 温泉が深夜男女入替のため、チェックイン後とチェックアウト後に入浴すると両方楽しめます。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 温泉チケット付きのプランでしたので目の前の温泉にいきました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 他は完璧だと思う。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 夕食の際、誕生日の特別デザートを用意頂いたり、希望すればチャンチャンコを貸して頂くこともできるようでした。\n"
          ]
        }
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.9.6"
    },
    "colab": {
      "provenance": [],
      "toc_visible": true,
      "gpuType": "T4"
    },
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "6653d0820b654ce2b97cdf16e08cc54a": {
          "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_c0fb0b62a96e4ae9bc7aadbe2fb82ff7",
              "IPY_MODEL_f1aefcf3257748cd97ddf1020fd6f715",
              "IPY_MODEL_4c6968f2b79540c180f63448a79c7acb"
            ],
            "layout": "IPY_MODEL_9beccc133ded46348b236501934abf91"
          }
        },
        "c0fb0b62a96e4ae9bc7aadbe2fb82ff7": {
          "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_ccb9c8a9987f40d1b6f3845ba3dd3caf",
            "placeholder": "​",
            "style": "IPY_MODEL_f02c062ca4f54c288588738ea6cacb27",
            "value": "tokenizer_config.json: 100%"
          }
        },
        "f1aefcf3257748cd97ddf1020fd6f715": {
          "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_77942ecc2a8049e490d7b8a1c677877a",
            "max": 251,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_d1b61e17650143b9ba60846c854d01fb",
            "value": 251
          }
        },
        "4c6968f2b79540c180f63448a79c7acb": {
          "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_fb9533704d1c4fecb4461d14063bb78f",
            "placeholder": "​",
            "style": "IPY_MODEL_fd40d16a16884707a3b6c87b7f0e8f3c",
            "value": " 251/251 [00:00&lt;00:00, 5.00kB/s]"
          }
        },
        "9beccc133ded46348b236501934abf91": {
          "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
          }
        },
        "ccb9c8a9987f40d1b6f3845ba3dd3caf": {
          "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
          }
        },
        "f02c062ca4f54c288588738ea6cacb27": {
          "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": ""
          }
        },
        "77942ecc2a8049e490d7b8a1c677877a": {
          "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
          }
        },
        "d1b61e17650143b9ba60846c854d01fb": {
          "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": ""
          }
        },
        "fb9533704d1c4fecb4461d14063bb78f": {
          "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
          }
        },
        "fd40d16a16884707a3b6c87b7f0e8f3c": {
          "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": ""
          }
        },
        "43f0772f5d604144ba5d93cfa0d8e0bd": {
          "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_4e44663baddc4e3d8d42882c84e561a5",
              "IPY_MODEL_de2a3c0e5a8e4a429abfcc84a39a8a9d",
              "IPY_MODEL_82a8f8974acc4f60815922e563b5f9ca"
            ],
            "layout": "IPY_MODEL_ab072f33d9e3402baaa75d88de8c53f3"
          }
        },
        "4e44663baddc4e3d8d42882c84e561a5": {
          "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_91767fe429e04d9aab73b5c6b5f98944",
            "placeholder": "​",
            "style": "IPY_MODEL_c340ab0649bb4cd5a52496407f587224",
            "value": "vocab.txt: 100%"
          }
        },
        "de2a3c0e5a8e4a429abfcc84a39a8a9d": {
          "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_9ffee220fffb4785b615a7f318197a83",
            "max": 231026,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_6707e892aa4645ed86707a8af744bd65",
            "value": 231026
          }
        },
        "82a8f8974acc4f60815922e563b5f9ca": {
          "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_fa4868b0894e427b9048f02480c0518d",
            "placeholder": "​",
            "style": "IPY_MODEL_2f415c75df1541dfad4479df03dda798",
            "value": " 231k/231k [00:00&lt;00:00, 1.76MB/s]"
          }
        },
        "ab072f33d9e3402baaa75d88de8c53f3": {
          "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
          }
        },
        "91767fe429e04d9aab73b5c6b5f98944": {
          "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
          }
        },
        "c340ab0649bb4cd5a52496407f587224": {
          "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": ""
          }
        },
        "9ffee220fffb4785b615a7f318197a83": {
          "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
          }
        },
        "6707e892aa4645ed86707a8af744bd65": {
          "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": ""
          }
        },
        "fa4868b0894e427b9048f02480c0518d": {
          "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
          }
        },
        "2f415c75df1541dfad4479df03dda798": {
          "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": ""
          }
        },
        "07695fbe5c0d499980bf42a98faaf6c5": {
          "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_13e69dbd81474aa5990d469aa1f43039",
              "IPY_MODEL_bbbd2a9058c74d5f89c78d8138df9557",
              "IPY_MODEL_a128d80f058b4f79893bf2017ef0f4d6"
            ],
            "layout": "IPY_MODEL_acc3f66869c347ad85ecff59c9f49a15"
          }
        },
        "13e69dbd81474aa5990d469aa1f43039": {
          "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_67ce159458b24cdfaa6c86ffa02a883c",
            "placeholder": "​",
            "style": "IPY_MODEL_c91e009b30de4a2896688d3e4d166d5d",
            "value": "config.json: 100%"
          }
        },
        "bbbd2a9058c74d5f89c78d8138df9557": {
          "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_04779582711a4b87a3433b43ef5c1288",
            "max": 472,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_7424d573d1414be9b85a3fc3b7d0da36",
            "value": 472
          }
        },
        "a128d80f058b4f79893bf2017ef0f4d6": {
          "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_83d97e30c723401f86c999de2e94be95",
            "placeholder": "​",
            "style": "IPY_MODEL_1617fa04bb2e4515b47f931cad9f2213",
            "value": " 472/472 [00:00&lt;00:00, 22.6kB/s]"
          }
        },
        "acc3f66869c347ad85ecff59c9f49a15": {
          "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
          }
        },
        "67ce159458b24cdfaa6c86ffa02a883c": {
          "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
          }
        },
        "c91e009b30de4a2896688d3e4d166d5d": {
          "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": ""
          }
        },
        "04779582711a4b87a3433b43ef5c1288": {
          "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
          }
        },
        "7424d573d1414be9b85a3fc3b7d0da36": {
          "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": ""
          }
        },
        "83d97e30c723401f86c999de2e94be95": {
          "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
          }
        },
        "1617fa04bb2e4515b47f931cad9f2213": {
          "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": ""
          }
        },
        "941d6f15e145476283ce976513d98e76": {
          "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_7af49fc156f54ba1b4bbc18b61eb0262",
              "IPY_MODEL_874c52acc312476d9898ba35bdae2b1c",
              "IPY_MODEL_13af9a299b1245e0ad80d2a1eb546aba"
            ],
            "layout": "IPY_MODEL_4fdfce2eb975485fabe2ad7ed33cddd4"
          }
        },
        "7af49fc156f54ba1b4bbc18b61eb0262": {
          "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_1c21fbe9a06741ffa5ad6cdad569d4d5",
            "placeholder": "​",
            "style": "IPY_MODEL_e5b8979642484d7cb1614cd03ced911c",
            "value": "pytorch_model.bin: 100%"
          }
        },
        "874c52acc312476d9898ba35bdae2b1c": {
          "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_6578fa3c17b24fe7b5ec276ea34a6457",
            "max": 447406217,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_05fab716206347e783d42395eda6b07a",
            "value": 447406217
          }
        },
        "13af9a299b1245e0ad80d2a1eb546aba": {
          "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_8348ce23ad6c42eebf43812adf2e56eb",
            "placeholder": "​",
            "style": "IPY_MODEL_e4ffec6beb98461d88a14d4f59f191cb",
            "value": " 447M/447M [00:07&lt;00:00, 66.0MB/s]"
          }
        },
        "4fdfce2eb975485fabe2ad7ed33cddd4": {
          "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
          }
        },
        "1c21fbe9a06741ffa5ad6cdad569d4d5": {
          "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
          }
        },
        "e5b8979642484d7cb1614cd03ced911c": {
          "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": ""
          }
        },
        "6578fa3c17b24fe7b5ec276ea34a6457": {
          "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
          }
        },
        "05fab716206347e783d42395eda6b07a": {
          "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": ""
          }
        },
        "8348ce23ad6c42eebf43812adf2e56eb": {
          "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
          }
        },
        "e4ffec6beb98461d88a14d4f59f191cb": {
          "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
}