{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "BL8OGgI9CmQy"
},
"source": [
"# Práctica 8\n",
"\n",
"Ahora es tu turno de trabajar con modelos de lenguaje y self-supervised learning.\n",
"\n",
"## Ejercicio obligatorio (5 puntos)\n",
"\n",
"El ejercicio que tenéis que realizar obligatoriamente consiste en usar el dataset de clasificación de texto que empleaste en la práctica anterior para construir un modelo siguiendo las instrucciones proporcionadas en el notebook de instrucciones. Además debes comparar los resultados obtenidos con los que lograste en la práctica anterior. \n",
"\n",
"## Ejercicio opcional 1 (0.5 puntos)\n",
"\n",
"Crea un nuevo espacio en HuggingFace con el nuevo modelo que has creado.\n",
"\n",
"## Ejercicio opcional 2 (4.5 puntos)\n",
"\n",
"El ejercicio opcional está centrado en investigar cómo utilizar self-supervised learning para clasificación de imágenes. Para ello crea un nuevo notebook donde reproduzcas los resultados de la parte obligatoria de la Práctica 1. A continuación realiza los siguientes ejercicios:\n",
"- Entrena el modelo desde cero (mira qué hace el parámetro `pretrained` del método `cnn_learner`. \n",
"- Usando la librería [Self Supervised Learning Fastai Extension](https://github.com/KeremTurgutlu/self_supervised) entrena tres modelos de self-supervised usando los algoritmos SimCLR, BYOL, y SwAV disponibles en dicha librería.\n",
"- A partir de los modelos de self-supervised entrenados en el paso anterior, crea nuevos modelos de clasificación. \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tijRfybvCmQ2"
},
"source": [
"Al finalizar, recuerda guardar los cambios en GitHub utilizando la opción Archivo -> Guardar una copia en GitHub.\n"
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "N3DDTYS45C9h"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "5ZDQ6rKcC2kq"
},
"source": [
"## Librerías\n",
"\n",
"Comenzamos actualizando la librería FastAI y descargando la librería datasets de HuggingFace. Al finalizar la instalación deberás reiniciar el kernel (menú Entorno de ejecución -> Reiniciar Entorno de ejecución)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "y_vFVAFzC2kq",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "8063282b-ccae-44b3-9357-9a88f23a2727"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m468.7/468.7 kB\u001b[0m \u001b[31m7.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.5/110.5 kB\u001b[0m \u001b[31m5.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m24.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.2/224.2 kB\u001b[0m \u001b[31m10.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m212.2/212.2 kB\u001b[0m \u001b[31m10.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m132.9/132.9 kB\u001b[0m \u001b[31m1.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m158.8/158.8 kB\u001b[0m \u001b[31m10.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m269.3/269.3 kB\u001b[0m \u001b[31m11.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.2/114.2 kB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25h"
]
}
],
"source": [
"!pip install fastai -Uqq\n",
"!pip install datasets -Uqq"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JAo2DOLlC2kr"
},
"source": [
"Cargamos a continuación las librerías que necesitaremos en esta práctica que son la parte de procesado de lenguaje natural de la librería fastAI, la librería pandas, y la funcionalidad para cargar datasets de HuggingFace."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "-5sb8kBaC2ks"
},
"outputs": [],
"source": [
"import pandas as pd\n",
"from fastai.text.all import *\n",
"from datasets import load_dataset"
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "p1aBx-Sk62AB"
},
"execution_count": 2,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Dataset\n",
"\n",
"Para este ejemplo vamos a usar el dataset [clinc_oos](https://huggingface.co/datasets/clinc_oos), un dataset para detectar 150 clases de intención en 10 dominios, el conjunto de datos contiene una etiqueta para la intención \"fuera del ámbito\".( Label Id | Label name | |--- |--- | | 0 | restaurant_reviews | | 1 | nutrition_info | | 2 | account_blocked | | 3 | oil_change_how | | 4 | time | | 5 | weather | | 6 | redeem_rewards | | 7 | interest_rate | | 8 | gas_type | | 9 | accept_reservations | | 10 | smart_home | | 11 | user_name | | 12 | report_lost_card | | 13 | repeat | | 14 | whisper_mode | | 15 | what_are_your_hobbies | | 16 | order | | 17 | jump_start | | 18 | schedule_meeting | | 19 | meeting_schedule | | 20 | freeze_account | | 21 | what_song | | 22 | meaning_of_life | | 23 | restaurant_reservation | | 24 | traffic | | 25 | make_call | | 26 | text | | 27 | bill_balance ..)\n",
"Descarga el dataset usando el siguiente comando. "
],
"metadata": {
"id": "V3SGfSUaEHv0"
}
},
{
"cell_type": "code",
"source": [
"clinc_oos_dataset = load_dataset(\"clinc_oos\",'small')"
],
"metadata": {
"id": "ephhRD5rDnCd",
"outputId": "999b8928-7ceb-4f17-bd1c-f94d92193fd4",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 244,
"referenced_widgets": [
"acea7c14a43a4d98ac3fa7d55bcf6ee6",
"2da90ab6b0f54d49bd1c97944d7aa83e",
"bc81e5b43dac454a9b043edcbe8bdd22",
"a8520126760f425cb07c030d6ea2c273",
"dc6a959e6b694c5cbc8a539272f29ad7",
"b52ea6a60f84468d982c195927cbb7ef",
"11e54992e4fd4d40bae190ab927514b7",
"50b6f98995b940c0881aef1870ade8ab",
"ffdd49432e9744f7bd5c23bff0244b54",
"ba2477e9ee9f48c8be6f2f74f8bc2cd3",
"0b28d318f69844d88afd25bd867d827e",
"a03bc89197ea4573b0f6784ca5b4e80b",
"1b0a75b3b78b468aa8e75f3074d58dfb",
"603fffb705344e41bbf2cb31fc1e5bfc",
"e74351f03d53422789bbdbbfeb764efa",
"c65151b08bec4cf48d0e0d6ee1250f59",
"78fabf12226a4f9cab33f1885b963534",
"e34d7ab3f4834d17ae863d288445d9be",
"ff14ace405e4409589bc3531a789dda1",
"08c58056296849fdbab23840a9196979",
"84ff998cb0f8461daa8deaf55dc17db5",
"63cd9ad6473b43f0856596c29c6a0cf3",
"a4f85e3bf0eb45c4857f6173b1adebcd",
"8edf734aa6d64f5f89906b464d512650",
"94dba14a5bc342bb8711f6843b6d7ed1",
"fc6d1aa44bd94a3ab9ca40c6a66c8ffb",
"a15bf77b783d4833b9c71ad2b2d9a9a4",
"76f7f82fe6134040a90c7413538aafe5",
"30d05e576f3747e08d932ea00fed01be",
"ffda192e0bc24c40aa272eea8011e1a1",
"89692d1d3c914672a458832e51be6d2d",
"1ebc784efa24427b8af27c9fdda2686b",
"f7d8ef7ca553491c9fba3ab382af530c",
"fd342b9fb4a84009b32ab4c7bcb377a4",
"daf05dc94f98455684bc96752c216e9c",
"575724ca3bb24bc79d64ed65544bc043",
"2f8aa3e45a55423d83606705f5010348",
"7e55727bedd94e849a125e4406f6a980",
"f595b20d8db44b9998732a1cc713a1e7",
"00d5b27795f448d485da956dbd8a73d4",
"3d5308aafb4744508c3390d59f8c6992",
"cbcbf6c645a14f61b625154537e9e528",
"0bc1a29b59384aec931b7d0c611c5ec2",
"8ff6ad225eba4c1b9baf01aa9db1a7d3",
"18935a837f49426dac45432e83a5913c",
"c6a107ffcc754e82921ad75bc6643898",
"2e382b16620c4bb09534050dae7a9d6e",
"997bd650baad41819aa3a713fa4341f3",
"29e85d0ef3754c7f8366469cd530cacb",
"5bee187efff34f8eab2c434eb21211ea",
"275b01de8e6444a69420369d2a96b76d",
"71ab8921857b496791db2a2286fab6ba",
"225e43ff721745c5b01dd7fe5dfe7e4d",
"a6900524efc04d8d8019c415196d4a46",
"a682df09134f4c74aef12a2e294e2cae",
"b329b0dc353247f58bf8c38b24c4e051",
"2ac54f2315934367ae8bd34aba136f21",
"579357f9baec40f2915d8f3021fc20eb",
"4e1c1bd8b4d74978bff0cfa348a1bff0",
"68bae7a3d76f4e68afe3e6fac15ccfb4",
"720d5c006f2f46d982be76cb50eb8f17",
"d2a91625d68f43479aa16f24b386af74",
"19601448d0704949aaa8459fae71b878",
"cdbef121730444b8abd227f4dbd42d3c",
"c24578c84bae4ab5ac0145c742f0747d",
"843ad42380cb40b989659ac691e67d65",
"f2d9294ee6f44814a8e8d9a87cf08c64",
"532efa9cd0d8459eac8b03bba83aad51",
"f6d159342ce047df904907d04cceb9ec",
"035514d9dad34ea6b645018dad177693",
"09394797973941e68705559ddcd9b802",
"571f0233507544148b23a0dcf251daa3",
"8fcd79171edb43b28b3291c06440b5cb",
"cf801abb3ce94c9b8bf91b4d1efa39db",
"116121b6f33b4883884fa748e515d969",
"a2320a4c9d0e492c93cc9b06e758e0d5",
"10e14d896714494da3d8d37dd8ed9282",
"c8aca95b4c1d4734a86f912b7ea43c6e",
"55a5af05b8234f938ff6104af90f2460",
"f66bcff001e04b199a1bbc9d92f42367",
"ff9eb64ef78b4722b373285f8bce32ed",
"70aad33e2cd043c08a94c8b8a93a3342",
"892450aebc2b4611aec22ffb88a8cba9",
"1e6314ba4f4a445b9b68928c6debb77c",
"ef7d3624b5fe44eea8d40f6b6a02898b",
"e652c021449c485484fb899b17acd0ef",
"0661f3b9e7bc408f82030c5b7c164fcb",
"ab50e73bf5404380baba92cf1aa40976"
]
}
},
"execution_count": 3,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"Downloading builder script: 0%| | 0.00/8.57k [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "acea7c14a43a4d98ac3fa7d55bcf6ee6"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Downloading metadata: 0%| | 0.00/14.4k [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "a03bc89197ea4573b0f6784ca5b4e80b"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Downloading readme: 0%| | 0.00/23.4k [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "a4f85e3bf0eb45c4857f6173b1adebcd"
}
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Downloading and preparing dataset clinc_oos/small to /root/.cache/huggingface/datasets/clinc_oos/small/1.0.0/abcc41d382f8137f039adc747af44714941e8196e845dfbdd8ae7a7e020e6ba1...\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Downloading data: 0%| | 0.00/217k [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "fd342b9fb4a84009b32ab4c7bcb377a4"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating train split: 0%| | 0/7600 [00:00, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "18935a837f49426dac45432e83a5913c"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating validation split: 0%| | 0/3100 [00:00, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "b329b0dc353247f58bf8c38b24c4e051"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating test split: 0%| | 0/5500 [00:00, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "f2d9294ee6f44814a8e8d9a87cf08c64"
}
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Dataset clinc_oos downloaded and prepared to /root/.cache/huggingface/datasets/clinc_oos/small/1.0.0/abcc41d382f8137f039adc747af44714941e8196e845dfbdd8ae7a7e020e6ba1. Subsequent calls will reuse this data.\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
" 0%| | 0/3 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "c8aca95b4c1d4734a86f912b7ea43c6e"
}
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"clinc_oos_dataset"
],
"metadata": {
"id": "Du4cdYWVI0J7",
"outputId": "cbe0b060-b88a-474e-efc6-d2a5de555f2b",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"DatasetDict({\n",
" train: Dataset({\n",
" features: ['text', 'intent'],\n",
" num_rows: 7600\n",
" })\n",
" validation: Dataset({\n",
" features: ['text', 'intent'],\n",
" num_rows: 3100\n",
" })\n",
" test: Dataset({\n",
" features: ['text', 'intent'],\n",
" num_rows: 5500\n",
" })\n",
"})"
]
},
"metadata": {},
"execution_count": 4
}
]
},
{
"cell_type": "markdown",
"source": [
"Podemos ver que el dataset es una estructura DatasetDict que puede verse como un diccionario. El diccionario tiene tres claves que son train, validation y test que indican respectivamente los conjuntos de entrenamiento, validación y test (estas claves pueden variar dependiendo del dataset). Cada uno de estos subconjuntos es un Dataset que puede verse como una lista. Podemos ver por ejemplo la primera frase del conjunto de entrenamiento del siguiente modo."
],
"metadata": {
"id": "ZVJsMgNUJe4T"
}
},
{
"cell_type": "markdown",
"metadata": {
"id": "0XB8Dl8jjwbN"
},
"source": [
"## Carga de datos\n",
"\n",
"Cargamos a continuación el dataset en distintos dataframes de pandas (el formato que puede leer la librería de FastAI)."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"id": "mePgxpeLjwbO"
},
"outputs": [],
"source": [
"train_df = clinc_oos_dataset[\"train\"].to_pandas()\n",
"valid_df = clinc_oos_dataset[\"validation\"].to_pandas()\n",
"test_df = clinc_oos_dataset[\"test\"].to_pandas()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FN-QG9CljwbO"
},
"source": [
"Podemos ver el contenido del dataset usando el siguiente comando."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 424
},
"id": "veoRjZOWjwbP",
"outputId": "e790ac73-5a62-461e-cfe4-3bebe7b1b25f"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" text \\\n",
"0 can you walk me through setting up direct deposits to my bank of internet savings account \n",
"1 i want to switch to direct deposit \n",
"2 set up direct deposit for me \n",
"3 how do i go about setting up direct deposit \n",
"4 i need to get my paycheck direct deposited to my chase account \n",
"... ... \n",
"7595 what percentage of species display cold blooded traits \n",
"7596 what does it mean to be an alpha male \n",
"7597 what animals have alpha males \n",
"7598 why do males want to be alpha \n",
"7599 what's the average battery life of an android phone \n",
"\n",
" intent \n",
"0 108 \n",
"1 108 \n",
"2 108 \n",
"3 108 \n",
"4 108 \n",
"... ... \n",
"7595 42 \n",
"7596 42 \n",
"7597 42 \n",
"7598 42 \n",
"7599 42 \n",
"\n",
"[7600 rows x 2 columns]"
],
"text/html": [
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
text
\n",
"
intent
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
can you walk me through setting up direct deposits to my bank of internet savings account
\n",
"
108
\n",
"
\n",
"
\n",
"
1
\n",
"
i want to switch to direct deposit
\n",
"
108
\n",
"
\n",
"
\n",
"
2
\n",
"
set up direct deposit for me
\n",
"
108
\n",
"
\n",
"
\n",
"
3
\n",
"
how do i go about setting up direct deposit
\n",
"
108
\n",
"
\n",
"
\n",
"
4
\n",
"
i need to get my paycheck direct deposited to my chase account
\n",
"
108
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
7595
\n",
"
what percentage of species display cold blooded traits
\n",
"
42
\n",
"
\n",
"
\n",
"
7596
\n",
"
what does it mean to be an alpha male
\n",
"
42
\n",
"
\n",
"
\n",
"
7597
\n",
"
what animals have alpha males
\n",
"
42
\n",
"
\n",
"
\n",
"
7598
\n",
"
why do males want to be alpha
\n",
"
42
\n",
"
\n",
"
\n",
"
7599
\n",
"
what's the average battery life of an android phone
\n",
"
42
\n",
"
\n",
" \n",
"
\n",
"
7600 rows × 2 columns
\n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
"
\n",
"
\n",
" "
]
},
"metadata": {},
"execution_count": 10
}
],
"source": [
"train_df"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sLJE_AtyjwbP"
},
"source": [
"Del dataset nos interesan dos campos: `text` (que contiene el poema) y `intent` ."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ivLo2dIHjwbP",
"outputId": "f5120ac6-b4ff-4535-92f9-b3a8b4557ebe"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 can you walk me through setting up direct deposits to my bank of internet savings account\n",
"1 i want to switch to direct deposit\n",
"2 set up direct deposit for me\n",
"3 how do i go about setting up direct deposit\n",
"4 i need to get my paycheck direct deposited to my chase account\n",
" ... \n",
"7595 what percentage of species display cold blooded traits\n",
"7596 what does it mean to be an alpha male\n",
"7597 what animals have alpha males\n",
"7598 why do males want to be alpha\n",
"7599 what's the average battery life of an android phone\n",
"Name: text, Length: 7600, dtype: object"
]
},
"metadata": {},
"execution_count": 11
}
],
"source": [
"train_df['text']"
]
},
{
"cell_type": "markdown",
"source": [
"## Dataset\n",
"\n",
"Para este ejemplo vamos a usar el dataset [clinc_oos](https://huggingface.co/datasets/clinc_oos), un dataset para detectar 150 clases de intención en 10 dominios, el conjunto de datos contiene una etiqueta para la intención \"fuera del ámbito\".( Label Id | Label name | |--- |--- | | 0 | restaurant_reviews | | 1 | nutrition_info | | 2 | account_blocked | | 3 | oil_change_how | | 4 | time | | 5 | weather | | 6 | redeem_rewards | | 7 | interest_rate | | 8 | gas_type | | 9 | accept_reservations | | 10 | smart_home | | 11 | user_name | | 12 | report_lost_card | | 13 | repeat | | 14 | whisper_mode | | 15 | what_are_your_hobbies | | 16 | order | | 17 | jump_start | | 18 | schedule_meeting | | 19 | meeting_schedule | | 20 | freeze_account | | 21 | what_song | | 22 | meaning_of_life | | 23 | restaurant_reservation | | 24 | traffic | | 25 | make_call | | 26 | text | | 27 | bill_balance ..)\n",
"Descarga el dataset usando el siguiente comando. "
],
"metadata": {
"id": "W-giW-0s7Hsp"
}
},
{
"cell_type": "code",
"source": [
"clinc_oos_dataset = load_dataset(\"clinc_oos\",'small')"
],
"metadata": {
"outputId": "2a45d8bc-cb19-476c-82f8-f866cd035942",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 148,
"referenced_widgets": [
"d2b46b2844f3474899145a75ffb4c571",
"b10eccc8dc2c429abdb627a62d6863e7",
"765efc5a4bce4307bd4540d8c1f56a0e",
"02d90990072842078d64e09f72176f8f",
"a1884aac1bd9483ab57f0b928c63832b",
"1be048cecdb14c2799b0ece8c6c9c9e4",
"3d3ff51a288540fc8cba1d6b4b831a14",
"bb970639d5144a3f92ac875377642655",
"6e7e5d794a8c40ecbda3cd7ad568f153",
"29f81fe476cd47089f5617bc7276d65c",
"8fc2e123da594603987eb98660b87d94",
"10d5cd30a0e54c5ba7b6df6b8ef580a0",
"b80735bbbcfa4b589a77d4eb34b23d04",
"4ccaa9c7811a4cb6829eedc1bca8ab34",
"1fe255143a2547719eabda362cc73069",
"1d37657c44d24109975288f069e35383",
"89ea37b2f176438c94b7273d18999424",
"a72de9da781c40d194194af2b03ce2fa",
"2939a6c917544effb6d30290e02750c2",
"b4e7b22a14ab4de39a6be5b9ac87a859",
"81514c49084c4699acf2a19f176905fe",
"a7f35632035245c7a808facbcde1faeb",
"c0ad3dcde07c46dc9026973722d53b97",
"e6dd5c7de93f45bcb5f8966d7df979a2",
"2e78b25a5d5d4674b1d1f61708a7f8bb",
"b97a5dca9f6141b08b81ff1a58d68919",
"45957dbb65994da793d90e4632a7e0d9",
"d15ffa6b1da143e8baf62041b23662cc",
"817890f3aef0421a83b33b3531c8ac1b",
"9e49685857a045fbbcc7378a5fdbaa50",
"018fe2a8ea194860934fe72fd989b067",
"98162db40afa4484a4321d58fd9d2848",
"71cba57f6c4c4e53b2c390ed3fa0bcbc",
"1cedd010d23c4709ad213689552198de",
"f60a867c6dd445e39103a549f176bb10",
"6e2e2c2a86014b85af276d407cd32ed6",
"c21f1c59e8c04770b2952383125dec27",
"d5875aca8911496b9b96367b6a8e8852",
"146d51dcd77f41518c064c23941569c3",
"670ffe1337604111be17198d8b087155",
"7fd60f1fbc0042198decd1113f697fad",
"14d341830ed042219b6bd40b748a994c",
"88871391967848f18068333f6a8a6530",
"309e721a2df84da39090d74931655bc2",
"cd54965515904b2dacb44113735df90d",
"ffcf7b7524be47ec9f50726299d22d9e",
"b3637041f9ab41fdb0bc409c33c8f921",
"8682ad4b47de444b968ba2e1992ddb65",
"d9a8ed1d734f49ffaf5e59138272abfd",
"afe03557c5df47afb4c3483ca18f3de2",
"d883e3b74b8343c78642b355e51b590c",
"41a3d446c21b40c28f5ad0328ef75adc",
"bc73d68234e54b83a053797d64ba24fd",
"e95a9bed6ee24ab4916528200a033764",
"ec7c526f8e3f43a094eb2d3bf87fe0df"
]
},
"id": "p7psPv0w7Hsr"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Downloading and preparing dataset clinc_oos/small to /root/.cache/huggingface/datasets/clinc_oos/small/1.0.0/abcc41d382f8137f039adc747af44714941e8196e845dfbdd8ae7a7e020e6ba1...\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Downloading data: 0%| | 0.00/217k [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "d2b46b2844f3474899145a75ffb4c571"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating train split: 0%| | 0/7600 [00:00, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "10d5cd30a0e54c5ba7b6df6b8ef580a0"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating validation split: 0%| | 0/3100 [00:00, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "c0ad3dcde07c46dc9026973722d53b97"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating test split: 0%| | 0/5500 [00:00, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "1cedd010d23c4709ad213689552198de"
}
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Dataset clinc_oos downloaded and prepared to /root/.cache/huggingface/datasets/clinc_oos/small/1.0.0/abcc41d382f8137f039adc747af44714941e8196e845dfbdd8ae7a7e020e6ba1. Subsequent calls will reuse this data.\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
" 0%| | 0/3 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "cd54965515904b2dacb44113735df90d"
}
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"clinc_oos_dataset"
],
"metadata": {
"outputId": "5f63daec-d372-4acc-aad8-d660d528ff3c",
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "vO3Al_D27Hst"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"DatasetDict({\n",
" train: Dataset({\n",
" features: ['text', 'intent'],\n",
" num_rows: 7600\n",
" })\n",
" validation: Dataset({\n",
" features: ['text', 'intent'],\n",
" num_rows: 3100\n",
" })\n",
" test: Dataset({\n",
" features: ['text', 'intent'],\n",
" num_rows: 5500\n",
" })\n",
"})"
]
},
"metadata": {},
"execution_count": 5
}
]
},
{
"cell_type": "markdown",
"source": [
"Podemos ver que el dataset es una estructura DatasetDict que puede verse como un diccionario. El diccionario tiene tres claves que son train, validation y test que indican respectivamente los conjuntos de entrenamiento, validación y test (estas claves pueden variar dependiendo del dataset). Cada uno de estos subconjuntos es un Dataset que puede verse como una lista. Podemos ver por ejemplo la primera frase del conjunto de entrenamiento del siguiente modo."
],
"metadata": {
"id": "K_S0SmHQ7Hsu"
}
},
{
"cell_type": "markdown",
"metadata": {
"id": "-Q9BiqO-7Hs1"
},
"source": [
"## Carga de datos\n",
"\n",
"Cargamos a continuación el dataset en distintos dataframes de pandas (el formato que puede leer la librería de FastAI)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "U-rv9q8V7Hs2"
},
"outputs": [],
"source": [
"train_df = clinc_oos_dataset[\"train\"].to_pandas()\n",
"valid_df = clinc_oos_dataset[\"validation\"].to_pandas()\n",
"test_df = clinc_oos_dataset[\"test\"].to_pandas()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v5b9b13Y7Hs3"
},
"source": [
"Podemos ver el contenido del dataset usando el siguiente comando."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HG8ruoAv7Hs4"
},
"source": [
"Del dataset nos interesan dos campos: `text` (que contiene el poema) y `intent` ."
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "XMxR9DgE7XV4"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Dataset\n",
"\n",
"Para este ejemplo vamos a usar el dataset [clinc_oos](https://huggingface.co/datasets/clinc_oos), un dataset para detectar 150 clases de intención en 10 dominios, el conjunto de datos contiene una etiqueta para la intención \"fuera del ámbito\".( Label Id | Label name | |--- |--- | | 0 | restaurant_reviews | | 1 | nutrition_info | | 2 | account_blocked | | 3 | oil_change_how | | 4 | time | | 5 | weather | | 6 | redeem_rewards | | 7 | interest_rate | | 8 | gas_type | | 9 | accept_reservations | | 10 | smart_home | | 11 | user_name | | 12 | report_lost_card | | 13 | repeat | | 14 | whisper_mode | | 15 | what_are_your_hobbies | | 16 | order | | 17 | jump_start | | 18 | schedule_meeting | | 19 | meeting_schedule | | 20 | freeze_account | | 21 | what_song | | 22 | meaning_of_life | | 23 | restaurant_reservation | | 24 | traffic | | 25 | make_call | | 26 | text | | 27 | bill_balance ..)\n",
"Descarga el dataset usando el siguiente comando. "
],
"metadata": {
"id": "mhgyRRLq7Xjs"
}
},
{
"cell_type": "code",
"source": [
"clinc_oos_dataset = load_dataset(\"clinc_oos\",'small')"
],
"metadata": {
"outputId": "2a45d8bc-cb19-476c-82f8-f866cd035942",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 148,
"referenced_widgets": [
"d2b46b2844f3474899145a75ffb4c571",
"b10eccc8dc2c429abdb627a62d6863e7",
"765efc5a4bce4307bd4540d8c1f56a0e",
"02d90990072842078d64e09f72176f8f",
"a1884aac1bd9483ab57f0b928c63832b",
"1be048cecdb14c2799b0ece8c6c9c9e4",
"3d3ff51a288540fc8cba1d6b4b831a14",
"bb970639d5144a3f92ac875377642655",
"6e7e5d794a8c40ecbda3cd7ad568f153",
"29f81fe476cd47089f5617bc7276d65c",
"8fc2e123da594603987eb98660b87d94",
"10d5cd30a0e54c5ba7b6df6b8ef580a0",
"b80735bbbcfa4b589a77d4eb34b23d04",
"4ccaa9c7811a4cb6829eedc1bca8ab34",
"1fe255143a2547719eabda362cc73069",
"1d37657c44d24109975288f069e35383",
"89ea37b2f176438c94b7273d18999424",
"a72de9da781c40d194194af2b03ce2fa",
"2939a6c917544effb6d30290e02750c2",
"b4e7b22a14ab4de39a6be5b9ac87a859",
"81514c49084c4699acf2a19f176905fe",
"a7f35632035245c7a808facbcde1faeb",
"c0ad3dcde07c46dc9026973722d53b97",
"e6dd5c7de93f45bcb5f8966d7df979a2",
"2e78b25a5d5d4674b1d1f61708a7f8bb",
"b97a5dca9f6141b08b81ff1a58d68919",
"45957dbb65994da793d90e4632a7e0d9",
"d15ffa6b1da143e8baf62041b23662cc",
"817890f3aef0421a83b33b3531c8ac1b",
"9e49685857a045fbbcc7378a5fdbaa50",
"018fe2a8ea194860934fe72fd989b067",
"98162db40afa4484a4321d58fd9d2848",
"71cba57f6c4c4e53b2c390ed3fa0bcbc",
"1cedd010d23c4709ad213689552198de",
"f60a867c6dd445e39103a549f176bb10",
"6e2e2c2a86014b85af276d407cd32ed6",
"c21f1c59e8c04770b2952383125dec27",
"d5875aca8911496b9b96367b6a8e8852",
"146d51dcd77f41518c064c23941569c3",
"670ffe1337604111be17198d8b087155",
"7fd60f1fbc0042198decd1113f697fad",
"14d341830ed042219b6bd40b748a994c",
"88871391967848f18068333f6a8a6530",
"309e721a2df84da39090d74931655bc2",
"cd54965515904b2dacb44113735df90d",
"ffcf7b7524be47ec9f50726299d22d9e",
"b3637041f9ab41fdb0bc409c33c8f921",
"8682ad4b47de444b968ba2e1992ddb65",
"d9a8ed1d734f49ffaf5e59138272abfd",
"afe03557c5df47afb4c3483ca18f3de2",
"d883e3b74b8343c78642b355e51b590c",
"41a3d446c21b40c28f5ad0328ef75adc",
"bc73d68234e54b83a053797d64ba24fd",
"e95a9bed6ee24ab4916528200a033764",
"ec7c526f8e3f43a094eb2d3bf87fe0df"
]
},
"id": "9v9oMoJX7Xjs"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Downloading and preparing dataset clinc_oos/small to /root/.cache/huggingface/datasets/clinc_oos/small/1.0.0/abcc41d382f8137f039adc747af44714941e8196e845dfbdd8ae7a7e020e6ba1...\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Downloading data: 0%| | 0.00/217k [00:00, ?B/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "d2b46b2844f3474899145a75ffb4c571"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating train split: 0%| | 0/7600 [00:00, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "10d5cd30a0e54c5ba7b6df6b8ef580a0"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating validation split: 0%| | 0/3100 [00:00, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "c0ad3dcde07c46dc9026973722d53b97"
}
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"Generating test split: 0%| | 0/5500 [00:00, ? examples/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "1cedd010d23c4709ad213689552198de"
}
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Dataset clinc_oos downloaded and prepared to /root/.cache/huggingface/datasets/clinc_oos/small/1.0.0/abcc41d382f8137f039adc747af44714941e8196e845dfbdd8ae7a7e020e6ba1. Subsequent calls will reuse this data.\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
" 0%| | 0/3 [00:00, ?it/s]"
],
"application/vnd.jupyter.widget-view+json": {
"version_major": 2,
"version_minor": 0,
"model_id": "cd54965515904b2dacb44113735df90d"
}
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"clinc_oos_dataset"
],
"metadata": {
"outputId": "5f63daec-d372-4acc-aad8-d660d528ff3c",
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Nd71pRe97Xjt"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"DatasetDict({\n",
" train: Dataset({\n",
" features: ['text', 'intent'],\n",
" num_rows: 7600\n",
" })\n",
" validation: Dataset({\n",
" features: ['text', 'intent'],\n",
" num_rows: 3100\n",
" })\n",
" test: Dataset({\n",
" features: ['text', 'intent'],\n",
" num_rows: 5500\n",
" })\n",
"})"
]
},
"metadata": {},
"execution_count": 5
}
]
},
{
"cell_type": "markdown",
"source": [
"Podemos ver que el dataset es una estructura DatasetDict que puede verse como un diccionario. El diccionario tiene tres claves que son train, validation y test que indican respectivamente los conjuntos de entrenamiento, validación y test (estas claves pueden variar dependiendo del dataset). Cada uno de estos subconjuntos es un Dataset que puede verse como una lista. Podemos ver por ejemplo la primera frase del conjunto de entrenamiento del siguiente modo."
],
"metadata": {
"id": "iys3O7jz7Xjt"
}
},
{
"cell_type": "markdown",
"metadata": {
"id": "e2OkF7097Xju"
},
"source": [
"## Carga de datos\n",
"\n",
"Cargamos a continuación el dataset en distintos dataframes de pandas (el formato que puede leer la librería de FastAI)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Sv7ZtBqs7Xju"
},
"outputs": [],
"source": [
"train_df = clinc_oos_dataset[\"train\"].to_pandas()\n",
"valid_df = clinc_oos_dataset[\"validation\"].to_pandas()\n",
"test_df = clinc_oos_dataset[\"test\"].to_pandas()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "go0-ENcw7Xju"
},
"source": [
"Podemos ver el contenido del dataset usando el siguiente comando."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Y1KMKZgN7Xjv"
},
"source": [
"Del dataset nos interesan dos campos: `text` (que contiene el poema) y `intent` ."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uw3h-1zPC2kw"
},
"source": [
"## Modelo de lenguaje\n",
"\n",
"El proceso a seguir para hacer fine-tuning sobre el modelo de lenguaje de FastAI es análogo al visto en prácticas anteriores. Comenzamos creando un `DataBlock` a partir de nuestro dataframe. "
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"id": "AW74KDBJC2kw"
},
"outputs": [],
"source": [
"db_lm = DataBlock(\n",
" blocks=TextBlock.from_df('text', is_lm=True,max_vocab=100000), # Indicamos que vamos a trabajar con un modelo de lenguaje\n",
" get_items=ColReader('text'), # Indicamos donde estará el texto dentro del dataframe\n",
" splitter=RandomSplitter(0.1) # Partimos el dataset en entrenamiento y validación\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "leP76qI4C2kw"
},
"source": [
"Creamos ahora nuestro `dataloader` (esto puede llevar varios segundos)."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"id": "e_Uzg_gRC2kx"
},
"outputs": [],
"source": [
"dls_lm = db_lm.dataloaders(train_valid_df, bs=128, seq_len=80)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ESmIQ-pkC2kx"
},
"source": [
"Podemos ahora mostrar un batch de este `dataloader`. Como podemos apreciar, la entrada del modelo es una frase, y la salida es dicha frase desplazada una posición a la derecha."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"id": "WLkzmtyYC2kx",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 216
},
"outputId": "d778b76f-edb1-4058-aab6-3b1d1e5274c2"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"
\n",
" \n",
"
\n",
"
\n",
"
text
\n",
"
text_
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
xxbos xxunk when is my flight going to land xxbos do i have meetings with anyone today xxbos how soon does my visa card expire xxbos set a new timer for ten xxunk xxbos what can i get for 10 usd in cad xxbos when was the last date that i was paid xxbos can you help me find someone to look at my car 's engine because the light is on xxbos tell the restaurant to cancel my reservation
\n",
"
xxunk when is my flight going to land xxbos do i have meetings with anyone today xxbos how soon does my visa card expire xxbos set a new timer for ten xxunk xxbos what can i get for 10 usd in cad xxbos when was the last date that i was paid xxbos can you help me find someone to look at my car 's engine because the light is on xxbos tell the restaurant to cancel my reservation xxbos
\n",
"
\n",
"
\n",
"
1
\n",
"
beef and xxunk xxbos what can i do if i lost my luggage xxbos can you get me a recipe for mashed potatoes xxbos share the nutrition info for pizza with me xxbos can my 401k rollover or not xxbos what is the lowest amount i can pay for my cable bill xxbos are there a lot of calories in muffins xxbos cancel that xxbos how long until my oil needs to be changed xxbos what month does my card
\n",
"
and xxunk xxbos what can i do if i lost my luggage xxbos can you get me a recipe for mashed potatoes xxbos share the nutrition info for pizza with me xxbos can my 401k rollover or not xxbos what is the lowest amount i can pay for my cable bill xxbos are there a lot of calories in muffins xxbos cancel that xxbos how long until my oil needs to be changed xxbos what month does my card stop
\n",
" "
]
},
"metadata": {}
}
],
"source": [
"learn = language_model_learner(\n",
" dls_lm, # El dataloader que usamos\n",
" AWD_LSTM, # La arquitectura que es la misma usada en la práctica anterior\n",
" drop_mult=0.3, # Aplicamos dropout para evitar el sobreajuste\n",
" metrics=[accuracy, Perplexity()] # Como métricas usamos la accuracy y la perplexity.\n",
").to_fp16()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GZeI2zGAC2ky"
},
"source": [
"Y por último entrenamos el modelo. "
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"id": "wRXPjZB9C2ky",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 566
},
"outputId": "17be9a39-4039-4989-d74d-74bdb28a8ab9"
},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.9/dist-packages/torch/amp/autocast_mode.py:204: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
" warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
"/usr/local/lib/python3.9/dist-packages/torch/cuda/amp/grad_scaler.py:120: UserWarning: torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\n",
" warnings.warn(\"torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\")\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"
\n",
" \n",
"
\n",
"
epoch
\n",
"
train_loss
\n",
"
valid_loss
\n",
"
accuracy
\n",
"
perplexity
\n",
"
time
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
5.696906
\n",
"
4.259863
\n",
"
0.198017
\n",
"
70.800308
\n",
"
04:09
\n",
"
\n",
" \n",
"
"
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.9/dist-packages/torch/amp/autocast_mode.py:204: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
" warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
"/usr/local/lib/python3.9/dist-packages/torch/cuda/amp/grad_scaler.py:120: UserWarning: torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\n",
" warnings.warn(\"torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\")\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"
\n",
" \n",
"
\n",
"
epoch
\n",
"
train_loss
\n",
"
valid_loss
\n",
"
accuracy
\n",
"
perplexity
\n",
"
time
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
3.862475
\n",
"
3.561986
\n",
"
0.299479
\n",
"
35.233109
\n",
"
04:13
\n",
"
\n",
"
\n",
"
1
\n",
"
3.606975
\n",
"
3.192473
\n",
"
0.342748
\n",
"
24.348566
\n",
"
04:14
\n",
"
\n",
"
\n",
"
2
\n",
"
3.388048
\n",
"
2.945242
\n",
"
0.369992
\n",
"
19.015263
\n",
"
04:16
\n",
"
\n",
"
\n",
"
3
\n",
"
3.182660
\n",
"
2.770793
\n",
"
0.400341
\n",
"
15.971290
\n",
"
04:20
\n",
"
\n",
"
\n",
"
4
\n",
"
3.000447
\n",
"
2.687873
\n",
"
0.407853
\n",
"
14.700380
\n",
"
04:18
\n",
"
\n",
"
\n",
"
5
\n",
"
2.841043
\n",
"
2.651250
\n",
"
0.414864
\n",
"
14.171744
\n",
"
04:02
\n",
"
\n",
"
\n",
"
6
\n",
"
2.706536
\n",
"
2.625234
\n",
"
0.423878
\n",
"
13.807803
\n",
"
04:02
\n",
"
\n",
"
\n",
"
7
\n",
"
2.591934
\n",
"
2.609441
\n",
"
0.425581
\n",
"
13.591455
\n",
"
04:03
\n",
"
\n",
"
\n",
"
8
\n",
"
2.498425
\n",
"
2.608087
\n",
"
0.427284
\n",
"
13.573062
\n",
"
04:03
\n",
"
\n",
"
\n",
"
9
\n",
"
2.420030
\n",
"
2.607645
\n",
"
0.427784
\n",
"
13.567060
\n",
"
04:02
\n",
"
\n",
" \n",
"
"
]
},
"metadata": {}
}
],
"source": [
"learn.fine_tune(10,base_lr=2e-2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Pt2h96oNC2ky"
},
"source": [
"Una vez entrenado el modelo guardamos el `encoder` que usaremos luego para nuestro modelo de clasificación (esto es análogo a lo que vimos para los modelos de clasificación de imágenes)."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"id": "KHT9LdeBC2ky"
},
"outputs": [],
"source": [
"learn.save_encoder('finetuned')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MuF9fJQeC2ky"
},
"source": [
"## Entrenando un modelo de clasificación\n",
"\n",
"Pasamos ahora a crear nuestro modelo de clasificación de texto. El proceso será el mismo que el que vimos en la práctica anterior con la diferencia de que antes de empezar a entrenar el modelo cargaremos el `encoder` guardado en el paso anterior.\n",
"\n",
"Comenzamos definiendo un `DataBlock` que se creará a partir de nuestro dataframe `df`. "
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"id": "GWQt6jF0C2ky"
},
"outputs": [],
"source": [
"sentiment_clas = DataBlock(\n",
" blocks=(TextBlock.from_df('text', vocab=dls_lm.vocab), # La entrada del modelo es texto usando el mismo \n",
" # vocabulario que en el modelo de lenguaje \n",
" CategoryBlock), #, y la salida una clase \n",
" get_x=ColReader('text'), # Indicamos donde estará el texto dentro del dataframe\n",
" get_y=ColReader('intent'), # Indicamos cómo extraer la clase del dataframe\n",
" splitter=ColSplitter('set') # Partimos el dataset en entrenamiento y validación\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "A_yKEURkC2kz"
},
"source": [
"Ahora definimos nuestro dataloader a partir del DataBlock que acabamos de crear. "
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"id": "9ORL1uwgC2kz",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"outputId": "a3222cb5-d572-497d-d4ab-c8b4b937b1b1"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": []
},
"metadata": {}
}
],
"source": [
"dls = sentiment_clas.dataloaders(train_valid_df, bs=64)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Hy2jPfJjC2kz"
},
"source": [
"Podemos mostrar un batch de nuestro dataloader. "
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"id": "GB8nwXKbC2kz",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 112
},
"outputId": "59e115b9-68b5-4960-de61-8462cc3411df"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"
\n",
" \n",
"
\n",
"
\n",
"
text
\n",
"
category
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
xxbos can you tell me what to do as i am in the airport and have been for some time and there is still no xxunk of my xxunk
\n",
"
113
\n",
"
\n",
"
\n",
"
1
\n",
"
xxbos i xxunk like a rental car in denver xxunk between january 1st and january 3rd and i xxunk like a ford if possible
\n",
"
40
\n",
"
\n",
" \n",
"
"
]
},
"metadata": {}
}
],
"source": [
"dls.show_batch(max_n=2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WARPAlm5C2kz"
},
"source": [
"Pasamos ahora a crear nuestro `learner` usando el método `text_classifier_learner` al que pasamos como arquitectura de red la arquitectura [AWD_LSTM](https://arxiv.org/abs/1708.02182), además aplicamos dropout a nuestro modelo. "
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"id": "07dPozDGC2kz"
},
"outputs": [],
"source": [
"callbacks = [ShowGraphCallback(),\n",
" SaveModelCallback()]\n",
"\n",
"learnClass = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5, metrics=accuracy,cbs=callbacks).to_fp16()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "UE76n_MkC2kz"
},
"source": [
"Cargamos a continuación el `encoder` del modelo de lenguaje. "
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"id": "mUHHd338C2k0"
},
"outputs": [],
"source": [
"learnClass = learnClass.load_encoder('finetuned')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lWPtCffDC2k0"
},
"source": [
"Ahora podemos utilizar toda la funcionalidad que ya vimos para clasificación de imágenes. Por ejemplo, podemos buscar un learning rate adecuado para entrenar nuestro modelo. "
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"id": "mF9qM3rgC2k0",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 541
},
"outputId": "31592431-2195-41cd-c129-f18a0f097263"
},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.9/dist-packages/torch/amp/autocast_mode.py:204: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
" warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
"/usr/local/lib/python3.9/dist-packages/torch/cuda/amp/grad_scaler.py:120: UserWarning: torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\n",
" warnings.warn(\"torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\")\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": []
},
"metadata": {}
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"SuggestedLRs(valley=0.004365158267319202)"
]
},
"metadata": {},
"execution_count": 30
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"
"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAG1CAYAAAAFuNXgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABSv0lEQVR4nO3dd3TV9f3H8ecdGWSTPQgJYYSNbFlVFEGxiFhHIwVXXaUVbbFIUQEHWAfa1rpwoP6gqGgRC6KiogyRJQgyw0qAkBBCNln33t8fIRcjEALc5Hvvzetxzj303vu9974/N5S8/EyTw+FwICIiIuIlzEYXICIiIuJKCjciIiLiVRRuRERExKso3IiIiIhXUbgRERERr6JwIyIiIl5F4UZERES8isKNiIiIeBWr0QU0NrvdzqFDhwgODsZkMhldjoiIiNSDw+GgqKiI+Ph4zOa6+2aaXLg5dOgQiYmJRpchIiIi5yEzM5MWLVrUeU2TCzfBwcFA9ZcTEhJicDUiIiJSH4WFhSQmJjp/j9elyYWbmqGokJAQhRsREREPU58pJZpQLCIiIl5F4UZERES8SpMblqovm81GZWWl0WV4LR8fHywWi9FliIiIF1K4+QWHw8Hhw4fJz883uhSvFxYWRmxsrJbki4iISync/EJNsImOjiYgIEC/eBuAw+GgtLSUnJwcAOLi4gyuSEREvInCzc/YbDZnsImIiDC6HK/WrFkzAHJycoiOjtYQlYiIuIwmFP9MzRybgIAAgytpGmq+Z81tEhERV1K4OQ0NRTUOfc8iItIQFG5ERETEqyjciIiIiFdRuGkodhvsXQ6b51f/abcZXVGdkpOTeeGFF5z3TSYTCxYsMKweERGR86XVUg1h60JYMhEKD518LCQervw7dLzGuLpERESaAPXcuNrWhfD+2NrBBqAwq/rxrQuNqUtERKSBbcg4xu9e/57HPtlqaB0KN65kt1X32OA4zZMnHlvykMuHqF577TXi4+Ox2+21Hh85ciS33347u3fvZuTIkcTExBAUFETv3r1ZunTpOX1GZmYmN954I2FhYYSHhzNy5Ej27dsHwLfffouPjw+HDx+u9Zr777+fQYMGXVDbRETEc+QUlrEiPZdNB/INrUPhxpX2rzq1x6YWBxQerL7OhW644QaOHj3K119/7XwsLy+PJUuWMHr0aIqLixk+fDhffvklP/zwA1deeSUjRowgIyOjXu9fWVnJsGHDCA4OZvny5axcuZKgoCCuvPJKKioq+NWvfkVKSgrvvvturdfMmTOH22+/3aVtFRER91VeVf0f2f4+xsYLhRtXKs527XX11Lx5c6666irmzp3rfGz+/PlERkYyePBgunXrxt13303nzp1p27Ytjz/+OK1bt2bhwvoNkb333nvY7XZef/11unTpQocOHXjrrbfIyMhg2bJlANxxxx289dZbztd88sknlJWVceONN7q0rSIi4r7KKqtHJvytxu46b2i4mTp1KiaTqdatffv2db7mhRdeIDU1lWbNmpGYmMgDDzxAWVlZI1V8FkExrr3uHIwePZoPP/yQ8vJyAObMmcNvf/tbzGYzxcXFTJgwgQ4dOhAWFkZQUBDbtm2rd8/Npk2bSE9PJzg4mKCgIIKCgggPD6esrIzdu3cDcOutt5Kens7q1asBmD17NjfeeCOBgYEub6uIiLinssqanhtjw43hq6U6depUa/6H1XrmkubOnctDDz3Em2++Sf/+/dm5cye33norJpOJmTNnNka5dUvqX70qqjCL08+7MVU/n9Tf5R89YsQIHA4HixYtonfv3ixfvpznn38egAkTJvDFF1/w7LPP0qZNG5o1a8b1119PRUVFvd67uLiYnj17MmfOnFOei4qKAiA6OpoRI0bw1ltv0apVKz799FNnr46IiDQN5VXVPTd+VmMHhgwPN1arldjY2Hpdu2rVKgYMGMDNN98MVO/NkpaWxvfff9+QJdaf2VK93Pv9sYCJ2gHnxFEDVz5VfZ2L+fv7c9111zFnzhzS09NJTU2lR48eAKxcuZJbb72VUaNGAdVhpWYycH306NGD9957j+joaEJCQs543e9//3vS0tJo0aIFrVu3ZsCAARfUJhER8Sw1PTd+BvfcGD7nZteuXcTHx5OSksLo0aPrHCrp378/69evZ82aNQDs2bOHxYsXM3z48DO+pry8nMLCwlq3BtXxGrjxHQiJq/14SHz14w24z83o0aNZtGgRb775JqNHj3Y+3rZtWz766CM2btzIpk2buPnmm09ZWXW2942MjGTkyJEsX76cvXv3smzZMu677z4OHDjgvG7YsGGEhITwxBNPcNttt7m0bSIi4v6cc24MnlBsaM9N3759mT17NqmpqWRlZTFt2jQGDRrEli1bCA4OPuX6m2++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AgICKCkpoXPnzqxbt46IiAijS2tQWVlZZGdnc9FFF3H48GF69uzJzp07m8S/a8uWLaOoqIi3336b+fPnG11Og6iqqqJjx458/fXXhIaG0rNnT1atWuW2f6/Vc2OwhQsXcvnllzeJfwB++uknfHx8GDRoEADh4eFNItg0Zbt27WL79u1cddVVRpfSaCwWCwEBAQCUl5fjcDhoCv8NGRcXx0UXXQRAbGwskZGR5OXlGVtUI7n00ksJDg42uowGtWbNGjp16kRCQgJBQUFcddVVfP7550aXdUYKN6fx7bffMmLECOLj4zGZTKcdMvr3v/9NcnIy/v7+9O3blzVr1pzXZ73//vvcdNNNF1ixazR0u3ft2kVQUBAjRoygR48eTJ8+3YXVn7/G+HmbTCYuueQSevfuzZw5c1xU+YVpjHZPmDCBGTNmuKhi12iMdufn59OtWzdatGjBgw8+SGRkpIuqP3+N+e/a+vXrsdlsJCYmXmDVF64x2+3OLvR7OHToEAkJCc77CQkJHDx4sDFKPy8KN6dRUlJCt27d+Pe//33a59977z3+/Oc/M2XKFDZs2EC3bt0YNmwYOTk5zmtqxtt/eTt06JDzmsLCQlatWsXw4cMbvE310dDtrqqqYvny5bz00kt89913fPHFF3zxxReN1bwzaoyf94oVK1i/fj0LFy5k+vTp/Pjjj43Stro0dLs//vhj2rVrR7t27RqrSfXSGD/vsLAwNm3axN69e5k7dy7Z2dmN0ra6NNa/a3l5eYwdO5bXXnutwdtUH43Vbnfniu/BozikToDjv//9b63H+vTp4xg3bpzzvs1mc8THxztmzJhxTu/9zjvvOEaPHu2KMl2uIdq9atUqx9ChQ533n376acfTTz/tknpdpSF/3jUmTJjgeOutty6gStdriHY/9NBDjhYtWjiSkpIcERERjpCQEMe0adNcWfYFa4yf97333uv44IMPLqRMl2uodpeVlTkGDRrkeOedd1xVqks15M/766+/dvzmN79xRZkN7ny+h5UrVzquvfZa5/Pjx493zJkzp1HqPR/quTlHFRUVrF+/niFDhjgfM5vNDBkyhO++++6c3sudhqTOxhXt7t27Nzk5ORw7dgy73c63335Lhw4dGqpkl3BFu0tKSigqKgKqJ5B/9dVXdOrUqUHqdRVXtHvGjBlkZmayb98+nn32We68804effTRhirZJVzR7uzsbOfPu6CggG+//ZbU1NQGqddVXNFuh8PBrbfeymWXXcaYMWMaqlSXcuW/556sPt9Dnz592LJlCwcPHqS4uJhPP/2UYcOGGVXyWWk25znKzc3FZrMRExNT6/GYmBi2b99e7/cpKChgzZo1fPjhh64usUG4ot1Wq5Xp06fzq1/9CofDwdChQ/n1r3/dEOW6jCvanZ2dzahRo4DqlTR33nknvXv3dnmtruSqv+eexhXt3r9/P3fddZdzIvGf/vQnunTp0hDluowr2r1y5Uree+89unbt6pzP8e6777p1213193zIkCFs2rSJkpISWrRowQcffEC/fv1cXW6Dqc/3YLVaee655xg8eDB2u52//vWvbrtSChRuDBMaGuoW4/CN7aqrrmpSK2cAUlJS2LRpk9FlGOrWW281uoRG06dPHzZu3Gh0GY1u4MCB2O12o8swxNKlS40uoVFcc801XHPNNUaXUS8aljpHkZGRWCyWU4JJdnY2sbGxBlXV8NRutRvUbm+ldjetdv+SN34PCjfnyNfXl549e/Lll186H7Pb7Xz55Zce1Q15rtRutVvtVru9TVNt9y954/egYanTKC4uJj093Xl/7969bNy4kfDwcFq2bMmf//xnbrnlFnr16kWfPn144YUXKCkp4bbbbjOw6gundldTu9VutVvt9vR2/1KT+x6MXazlnr7++msHcMrtlltucV7zr3/9y9GyZUuHr6+vo0+fPo7Vq1cbV7CLqN1qt9pdTe1Wu71NU/sedLaUiIiIeBXNuRERERGvonAjIiIiXkXhRkRERLyKwo2IiIh4FYUbERER8SoKNyIiIuJVFG5ERETEqyjciIiIiFdRuBERj5KcnMwLL7xgdBki4sYUbkTkFLfeeivXXnut0WWc1tq1a7nrrrsa/HOSk5MxmUyYTCYCAgLo0qULr7/++jm/j8lkYsGCBa4vUETOSOFGRNxCZWVlva6LiooiICCggaup9thjj5GVlcWWLVv43e9+x5133smnn37aKJ8tIudP4UZEztmWLVu46qqrCAoKIiYmhjFjxpCbm+t8fsmSJQwcOJCwsDAiIiL49a9/ze7du53P79u3D5PJxHvvvccll1yCv78/c+bMcfYYPfvss8TFxREREcG4ceNqBZ9fDkuZTCZef/11Ro0aRUBAAG3btmXhwoW16l24cCFt27bF39+fwYMH8/bbb2MymcjPz6+zncHBwcTGxpKSksLEiRMJDw/niy++cD6/du1arrjiCiIjIwkNDeWSSy5hw4YNtWoFGDVqFCaTyXkf4OOPP6ZHjx74+/uTkpLCtGnTqKqqqs/XLyJnoXAjIuckPz+fyy67jO7du7Nu3TqWLFlCdnY2N954o/OakpIS/vznP7Nu3Tq+/PJLzGYzo0aNwm6313qvhx56iPHjx7Nt2zaGDRsGwNdff83u3bv5+uuvefvtt5k9ezazZ8+us6Zp06Zx44038uOPPzJ8+HBGjx5NXl4eAHv37uX666/n2muvZdOmTdx9991Mnjz5nNpst9v58MMPOXbsGL6+vs7Hi4qKuOWWW1ixYgWrV6+mbdu2DB8+nKKiIqA6/AC89dZbZGVlOe8vX76csWPHMn78eLZu3cqrr77K7NmzefLJJ8+pLhE5A6OPJRcR93PLLbc4Ro4cedrnHn/8ccfQoUNrPZaZmekAHDt27Djta44cOeIAHJs3b3Y4HA7H3r17HYDjhRdeOOVzk5KSHFVVVc7HbrjhBsdNN93kvJ+UlOR4/vnnnfcBx8MPP+y8X1xc7AAcn376qcPhcDgmTpzo6Ny5c63PmTx5sgNwHDt27PRfwInP8fX1dQQGBjqsVqsDcISHhzt27dp1xtfYbDZHcHCw45NPPqlV33//+99a111++eWO6dOn13rs3XffdcTFxZ3xvUWk/tRzIyLnZNOmTXz99dcEBQU5b+3btwdwDj3t2rWLtLQ0UlJSCAkJcQ7HZGRk1HqvXr16nfL+nTp1wmKxOO/HxcWRk5NTZ01du3Z1/u/AwEBCQkKcr9mxYwe9e/eudX2fPn3q1dYHH3yQjRs38tVXX9G3b1+ef/552rRp43w+OzubO++8k7Zt2xIaGkpISAjFxcWntPOXNm3axGOPPVbrO7zzzjvJysqitLS0XrWJyJlZjS5ARDxLcXExI0aM4O9///spz8XFxQEwYsQIkpKSmDVrFvHx8djtdjp37kxFRUWt6wMDA095Dx8fn1r3TSbTKcNZrnhNfURGRtKmTRvatGnDBx98QJcuXejVqxcdO3YE4JZbbuHo0aP84x//ICkpCT8/P/r163dKO3+puLiYadOmcd11153ynL+//wXXLdLUKdyIyDnp0aMHH374IcnJyVitp/4TcvToUXbs2MGsWbMYNGgQACtWrGjsMp1SU1NZvHhxrcdq5r6ci8TERG666SYmTZrExx9/DMDKlSt56aWXGD58OACZmZm1JlZDdfCy2Wy1HuvRowc7duyo1QskIq6jYSkROa2CggI2btxY65aZmcm4cePIy8sjLS2NtWvXsnv3bj777DNuu+02bDYbzZs3JyIigtdee4309HS++uor/vznPxvWjrvvvpvt27czceJEdu7cyfvvv++coGwymc7pvcaPH88nn3zCunXrAGjbti3vvvsu27Zt4/vvv2f06NE0a9as1muSk5P58ssvOXz4MMeOHQPg0Ucf5Z133mHatGn89NNPbNu2jXnz5vHwww9feINFROFGRE5v2bJldO/evdZt2rRpxMfHs3LlSmw2G0OHDqVLly7cf//9hIWFYTabMZvNzJs3j/Xr19O5c2ceeOABnnnmGcPa0apVK+bPn89HH31E165defnll52rpfz8/M7pvTp27MjQoUN59NFHAXjjjTc4duwYPXr0YMyYMdx3331ER0fXes1zzz3HF198QWJiIt27dwdg2LBh/O9//+Pzzz+nd+/eXHzxxTz//PMkJSW5oMUiYnI4HA6jixARaUxPPvkkr7zyCpmZmUaXIiINQHNuRMTrvfTSS/Tu3ZuIiAhWrlzJM888wx//+EejyxKRBqJwIyJeb9euXTzxxBPk5eXRsmVL/vKXvzBp0iSjyxKRBqJhKREREfEqmlAsIiIiXkXhRkRERLyKwo2IiIh4FYUbERER8SoKNyIiIuJVFG5ERETEqyjciIiIiFdRuBERERGvonAjIiIiXuX/AfgTQhadWCG8AAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
],
"source": [
"learnClass.lr_find()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mRUbbfWYC2k0"
},
"source": [
"Y a continuación aplicar fine tuning. "
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"id": "wqN1ap8uC2k0",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"outputId": "a5e241da-de4c-4773-dfa3-229c7f2be2d5"
},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.9/dist-packages/torch/amp/autocast_mode.py:204: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
" warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
"/usr/local/lib/python3.9/dist-packages/torch/cuda/amp/grad_scaler.py:120: UserWarning: torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\n",
" warnings.warn(\"torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\")\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"
\n",
" \n",
"
\n",
"
epoch
\n",
"
train_loss
\n",
"
valid_loss
\n",
"
accuracy
\n",
"
time
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
2.663182
\n",
"
1.729634
\n",
"
0.542903
\n",
"
01:56
\n",
"
\n",
" \n",
"
"
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Better model found at epoch 0 with valid_loss value: 1.7296338081359863.\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"
"
],
"image/png": "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REREvYD33ImIiCSG4U5ERCQxDHciIiKJYbgTERFJDMOdiIhIYhjuREREEsNwJyIikhiGOxERkcQw3ImIiCSG4U5ERCQxDHciIiKJYbgTERFJDMOdiIhIYhjuREREEsNwJyIikhiGOxERkcQw3ImIiCSG4U5ERCQxDHciIiKJYbgTERFJDMOdiIhIYhjuREREEsNwJyIikhiGOxERkcQw3ImIiCSG4U5ERCQxDHciIiKJYbgTERFJDMOdiIhIYhjuREREEsNwJyIikhiGOxERkcQw3ImIiCSG4U5ERCQxDHciIiKJYbgTERFJDMOdiIhIYhjuREREEsNwJyIikhiGOxERkcQw3ImIiCSG4U5ERCQxDHciIiKJYbgTERFJDMOdiIhIYhjuREREEsNwJyIikhiGOxERkcQw3ImIiCSmR+H+5ptvIjIyEi4uLhg7diyOHj3a23URERFRD3U73Ddt2oSVK1fi2WefxYkTJzBixAjMmjULlZWVtqiPiIiIukkmhBDdecPYsWORkpKCN954AwBgsVig1WqxbNkyPPHEE1e0NxqNMBqN1p8bGhoQHh6OkpISeHl53WD5REREA4der4dWq0V9fT3UavU12zl150NNJhOOHz+OJ5980rpNLpdjxowZOHz48FXfk5aWhlWrVl2xXavVdufQRERE9J3GxsbeC/fq6mqYzWYEBgZ22h4YGIgLFy5c9T1PPvkkVq5caf25vr4eERERKC4uvm5h1Nn3f63xikf3se96jn3Xc+y7nmPfXZsQAo2NjQgJCbluu26Fe0+oVCqoVKortqvVav5P6wEvLy/2Ww+x73qOfddz7LueY99dXVdOjLs1oM7Pzw8KhQKXL1/utP3y5csICgrqXnVERERkE90Kd6VSidGjR2PPnj3WbRaLBXv27MH48eN7vTgiIiLqvm5fll+5ciUWL16M5ORkjBkzBq+88gqamppw//33d+n9KpUKzz777FUv1dO1sd96jn3Xc+y7nmPf9Rz77sZ1+1E4AHjjjTewZs0a6HQ6jBw5Eq+99hrGjh1ri/qIiIiom3oU7kRERNR3cW55IiIiiWG4ExERSQzDnYiISGIY7kRERBJj13DnUrE/LS0tDSkpKfD09ERAQADuuOMOXLx4sVOb1tZWLF26FL6+vvDw8MDPfvazKyYWGuheeuklyGQyrFixwrqN/XZtZWVl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\n"
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.9/dist-packages/torch/amp/autocast_mode.py:204: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
" warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
"/usr/local/lib/python3.9/dist-packages/torch/cuda/amp/grad_scaler.py:120: UserWarning: torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\n",
" warnings.warn(\"torch.cuda.amp.GradScaler is enabled, but CUDA is not available. Disabling.\")\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"\n",
"\n"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"text/html": [
"