{ "cells": [ { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [], "source": [ "from datasets.dataset_dict import DatasetDict\n", "from datasets import Dataset, concatenate_datasets\n", "import evaluate\n", "import os\n", "import json\n", "import pandas as pd\n", "import numpy as np\n", "\n", "from sklearn.model_selection import train_test_split \n" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "# from huggingface_hub import notebook_login\n", "# # # copy and paste this code in the terminal: huggingface-cli login \n", "# # # then paste this token: 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# It may not show up but still paste the toke in and press enter\n", "\n", "\n", "# notebook_login()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Import the dataset" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CULTURE...ACTIONOTHERCODEROTHERCODER
Passage NumberRegionSubRegionCultureDocTitleSectionAuthorPageYearOCM...OtherDescriptionLocal_termsOther_CommentsRun_NumberFinishedCoderOther_Comments.1DatasetInfo
01392AsiaSouth AsiaAndamansHygiene and medical practices among the Onge (...1. HabitationCipriani, Lidio4841961['171', '301', '727', '751', '765', '775', '777']...1Several customs are believed to connect with t...ibidanghe: made from decorated human jawbone ...General note of this spreadsheet - many of the...1TrueYMNaN1Dataset 1: ['750', '751', '752', '753'] Coun...
11393AsiaSouth AsiaAndamansHygiene and medical practices among the Onge (...3. FoodCipriani, Lidio4871961['136', '231', '271', '312', '415', '516', '751']...0No action is mentioned0NaN1TrueYMNaN1Dataset 2: ['784', '731', '732', '777', '791',...
21395AsiaSouth AsiaAndamansHygiene and medical practices among the Onge (...3. FoodCipriani, Lidio4901961['114', '137', '164', '262', '273', '751', '825']...0Certain foods, such as Pteropus (giant bat) an...Pteropus: a giant bat eaten by the Andaman Is...NaN1TrueYMNaN1Run 1: Spring 2023 Coding of Sickness dataset ...
\n", "

3 rows × 43 columns

\n", "
" ], "text/plain": [ " CULTURE \\\n", " Passage Number Region SubRegion Culture \n", "0 1392 Asia South Asia Andamans \n", "1 1393 Asia South Asia Andamans \n", "2 1395 Asia South Asia Andamans \n", "\n", " \\\n", " DocTitle Section \n", "0 Hygiene and medical practices among the Onge (... 1. Habitation \n", "1 Hygiene and medical practices among the Onge (... 3. Food \n", "2 Hygiene and medical practices among the Onge (... 3. Food \n", "\n", " \\\n", " Author Page Year \n", "0 Cipriani, Lidio 484 1961 \n", "1 Cipriani, Lidio 487 1961 \n", "2 Cipriani, Lidio 490 1961 \n", "\n", " ... ACTION \\\n", " OCM ... Other \n", "0 ['171', '301', '727', '751', '765', '775', '777'] ... 1 \n", "1 ['136', '231', '271', '312', '415', '516', '751'] ... 0 \n", "2 ['114', '137', '164', '262', '273', '751', '825'] ... 0 \n", "\n", " \\\n", " Description \n", "0 Several customs are believed to connect with t... \n", "1 No action is mentioned \n", "2 Certain foods, such as Pteropus (giant bat) an... \n", "\n", " \\\n", " Local_terms \n", "0 ibidanghe: made from decorated human jawbone ... \n", "1 0 \n", "2 Pteropus: a giant bat eaten by the Andaman Is... \n", "\n", " OTHER CODER \\\n", " Other_Comments Run_Number Finished \n", "0 General note of this spreadsheet - many of the... 1 True \n", "1 NaN 1 True \n", "2 NaN 1 True \n", "\n", " OTHER CODER \\\n", " Coder Other_Comments.1 Dataset \n", "0 YM NaN 1 \n", "1 YM NaN 1 \n", "2 YM NaN 1 \n", "\n", " \n", " Info \n", "0 Dataset 1: ['750', '751', '752', '753'] Coun... \n", "1 Dataset 2: ['784', '731', '732', '777', '791',... \n", "2 Run 1: Spring 2023 Coding of Sickness dataset ... \n", "\n", "[3 rows x 43 columns]" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "df_path = \"../../../eHRAF_Scraper-Analysis-and-Prep/Data/\"\n", "dataFolder = r\"(subjects-(contracts_OR_disabilities_OR_disasters_OR_friendships_OR_gift_giving_OR_infant_feeding_OR_lineages_OR_local_officials_OR_luck_and_chance_OR_magicians_and_diviners_OR_mortuary_specialists_OR_nuclear_family_OR_priesthood_OR_prophet/\"\n", "# dataFolder = r'subjects-(sickness)_FILTERS-culture_level_samples(PSF)'\n", "\n", "# Get model and centralized path if relevent\n", "model_name = \"HRAF_MultiLabel_SubClasses_Kfolds\"\n", "path = f\"\" #Path to centralized file locations (leave blank if centralized location is here)\n", "\n", "\n", "\n", "#load df (only load one of these commented out lines)\n", "# df = pd.read_excel(f\"{df_path}{dataFolder}/_Altogether_Dataset_RACoded.xlsx\", header=[0,1], index_col=0) # Fall 2023 sickness + non-sickness\n", "df = pd.read_excel(f\"{df_path}{dataFolder}/_Altogether_Dataset_RACoded_Combined.xlsx\", header=[0,1], index_col=0) # Spring 2023 - Spring 2024 sickness + nonsickness dataset\n", "df.head(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Preprocess" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Remove Duplicates" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There were multiple iterations of Research Assistants labeling the data.
\n", "We will just use run number 1 and 3 with preference to 3 when there are duplicates (as it is the most recent and robust)\n", "\n" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Run_Number Dataset\n", "1 1 1926\n", "2 1 51\n", "3 1 4844\n", " 2 4184\n", "Name: count, dtype: int64" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "### DELETE\n", "# Show run number and dataset\n", "df[\"CODER\"][[\"Run_Number\", \"Dataset\"]].value_counts(sort=False, dropna=False)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Duplicate Passages: 0\n" ] }, { "data": { "text/plain": [ "(CODER, Run_Number)\n", "3 9027\n", "1 1340\n", "Name: count, dtype: int64" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# useRuns = [1,3] #Only include these runs (NOTE THIS IS COMMENTED OUT IN ORDER TO NOT RUIN THE SUBLABEL DATASET BUT EVENTUALLY YOU SHOULD USE THIS CODE)\n", "# df = df.loc[df[(\"CODER\",\"Run_Number\")].isin(useRuns)]\n", "\n", "mask_NotDuplicate = ~(df.duplicated((\"CULTURE\",\"Passage\"), keep=False)) \n", "mask_Dataset2 = df[(\"CODER\",\"Run_Number\")]==3\n", "\n", "df = df[(mask_NotDuplicate) | (mask_Dataset2)]\n", "\n", "# Remove certain passages which should not be in training or inference (these are duplicates that had to be manually found by a human)\n", "values_to_remove = [3252, 33681, 6758, 10104]\n", "df = df[~df[('CULTURE','Passage Number')].isin(values_to_remove)]\n", "\n", "print(\"Duplicate Passages:\",sum((df.duplicated((\"CULTURE\",\"Passage\")))))\n", "df[(\"CODER\",\"Run_Number\")].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set up Dataset\n" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Columns excluded:\n", " {('CODER', 'Info'), ('CODER', 'Dataset'), ('CAUSE', 'Local_Terms'), ('CULTURE', 'OWC'), ('CULTURE', 'Region'), ('ACTION', 'No_Info'), ('CULTURE', 'OCM'), ('CULTURE', 'DocTitle'), ('CAUSE', 'Description'), ('CAUSE', 'Just_Happens'), ('CULTURE', 'Author'), ('ACTION', 'Local_terms'), ('CULTURE', 'SubRegion'), ('CULTURE', 'Page'), ('CODER', 'Coder'), ('OTHER', 'Other_Comments.1'), ('EVENT', 'Local_Terms'), ('CULTURE', 'Year'), ('CAUSE', 'No_Info'), ('ACTION', 'Other'), ('EVENT', 'Description'), ('CULTURE', 'Culture'), ('EVENT', 'No_Info'), ('CULTURE', 'Section'), ('CAUSE', 'Other'), ('CODER', 'Finished'), ('CODER', 'Run_Number'), ('ACTION', 'Description'), ('OTHER', 'Other_Comments')} \n", "\n", "Columns included:\n", "ID\n", "passage\n", "EVENT_Illness\n", "EVENT_Accident\n", "EVENT_Other\n", "CAUSE_Material_Physical\n", "CAUSE_Spirits_Gods\n", "CAUSE_Witchcraft_Sorcery\n", "CAUSE_Rule_Violation_Taboo\n", "ACTION_Physical_Material\n", "ACTION_Technical_Specialist\n", "ACTION_Divination\n", "ACTION_Shaman_Medium_Healer\n", "ACTION_Priest_High_Religion\n" ] } ], "source": [ "#Construct col list\n", "cols = list(df.columns)\n", "id_index = cols.index(('CULTURE', \"Passage Number\"))\n", "passage_index = cols.index(('CULTURE', \"Passage\"))\n", "event_index = cols.index(('EVENT', \"No_Info\"))\n", "cause_index = cols.index(('CAUSE', \"No_Info\"))\n", "action_index = cols.index(('ACTION', \"No_Info\"))\n", "# get a list of all the multi-indexed column names we want to evaluate\n", "# col_list = [cols[id_index]] + [cols[passage_index]] + cols[event_index:event_index+4] + cols[cause_index:cause_index+7] + cols[action_index:action_index+7] #to include all columns including No_info\n", "col_list = [cols[id_index]] + [cols[passage_index]] + cols[event_index+1:event_index+4] + cols[cause_index+1:cause_index+7] + cols[action_index+1:action_index+7] # to include al columns BUT No_info\n", "\n", "\n", "## Remove the following columns from the dataset. Based on the results of previous models ran and the bias of the categories, remove the following columns from the dataset\n", "remv_cols = [(\"CAUSE\",\"Just_Happens\"),(\"CAUSE\",\"Other\"),(\"ACTION\",\"Other\")]\n", "for remv in remv_cols:\n", " col_list.remove(remv)\n", "\n", "\n", "\n", "# get column names to ascribe to the new data frame\n", "colNames = [\"ID\",\"passage\"]\n", "for category, sub_cat in col_list:\n", " # skip passage and id which have already been added\n", " # print(category, sub_cat)\n", " if category == \"CULTURE\":\n", " continue\n", " if sub_cat == \"No_Info\":\n", " colNames += [category]#this to include main classes, we will hold off on that\n", " pass\n", " else:\n", " colNames += [f'{category}_{sub_cat}']\n", "\n", "print(\"Columns excluded:\\n\", set(cols)-set(col_list),\"\\n\")\n", "# for col in col_list\n", "print(\"Columns included:\")\n", "for col in colNames:\n", " print(col)\n", "# colNames\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create Huggingface Dataset and do splits" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatasetDict({\n", " train: Dataset({\n", " features: ['ID', 'passage', 'EVENT_Illness', 'EVENT_Accident', 'EVENT_Other', 'CAUSE_Material_Physical', 'CAUSE_Spirits_Gods', 'CAUSE_Witchcraft_Sorcery', 'CAUSE_Rule_Violation_Taboo', 'ACTION_Physical_Material', 'ACTION_Technical_Specialist', 'ACTION_Divination', 'ACTION_Shaman_Medium_Healer', 'ACTION_Priest_High_Religion'],\n", " num_rows: 8293\n", " })\n", " test: Dataset({\n", " features: ['ID', 'passage', 'EVENT_Illness', 'EVENT_Accident', 'EVENT_Other', 'CAUSE_Material_Physical', 'CAUSE_Spirits_Gods', 'CAUSE_Witchcraft_Sorcery', 'CAUSE_Rule_Violation_Taboo', 'ACTION_Physical_Material', 'ACTION_Technical_Specialist', 'ACTION_Divination', 'ACTION_Shaman_Medium_Healer', 'ACTION_Priest_High_Religion'],\n", " num_rows: 2074\n", " })\n", "})" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# subdivide into just passage and outcome\n", "df_small = pd.DataFrame()\n", "df_small[colNames] = df[col_list]\n", "# Flip the lable of \"no_info\"\n", "# df_small[[\"EVENT\",\"CAUSE\",\"ACTION\"]] = df_small[[\"EVENT\",\"CAUSE\",\"ACTION\"]].replace({0:1, 1:0})\n", "\n", "\n", "# create train and validation/test sets\n", "train_val, test = train_test_split(df_small, test_size=0.2, random_state=10)\n", "\n", "\n", "# Create an NLP friendly dataset\n", "Hraf = DatasetDict(\n", " {'train':Dataset.from_dict(train_val.to_dict(orient= 'list')),\n", " 'test':Dataset.from_dict(test.to_dict(orient= 'list'))})\n", "Hraf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Show class bias" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "BIAS FOR ANSWERING 'PRESENT'\n", "Passage Count: 10367\n", " Raw Adj.\n", "____________________________________________________________\n", "\n", "EVENT: 0.63\n", "\tIllness: 0.41 0.64\n", "\tAccident: 0.07 0.1\n", "\tOther: 0.26 0.41\n", "\n", "CAUSE: 0.47\n", "\tJust_Happens: 0.02 0.05\n", "\tMaterial_Physical: 0.17 0.37\n", "\tSpirits_Gods: 0.19 0.4\n", "\tWitchcraft_Sorcery: 0.06 0.14\n", "\tRule_Violation_Taboo: 0.1 0.22\n", "\tOther: 0.05 0.11\n", "\n", "ACTION: 0.48\n", "\tPhysical_Material: 0.32 0.68\n", "\tTechnical_Specialist: 0.07 0.14\n", "\tDivination: 0.02 0.05\n", "\tShaman_Medium_Healer: 0.08 0.16\n", "\tPriest_High_Religion: 0.03 0.07\n", "\tOther: 0.07 0.15\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/r8/j6vx966d5rj6srtb4x895kvr0000gp/T/ipykernel_51139/3439163906.py:22: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", " df_biases = pd.concat([df_biases, pd.DataFrame({\"Class\":[col[0]],\"Raw_Bias\":[proportion]})])\n", "/var/folders/r8/j6vx966d5rj6srtb4x895kvr0000gp/T/ipykernel_51139/3439163906.py:28: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", " df_biases = pd.concat([df_biases, pd.DataFrame({\"Class\":[col[1]],\"Raw_Bias\":[proportion], \"Adj__Bias\":[adj_proportion]})])\n" ] } ], "source": [ "multiCol = list(df.columns)\n", "valuecountCol = []\n", "for col in multiCol:\n", " if col[0] in [\"CULTURE\", \"OTHER\", \"CODER\"] or col[1] in [\"Description\", \"Local_terms\", \"Local_Terms\"]:\n", " continue\n", " else:\n", " valuecountCol.append(col)\n", " \n", "# set up dataframe for easy saving\n", "df_biases = pd.DataFrame(columns=[\"Class\",\"Raw_Bias\",\"Adj__Bias\"])\n", "\n", "# Get proportions and show table. 'raw' is just number of present divided by total while 'adj' is within main category proportion present divided by total main class present\n", "print(\"BIAS FOR ANSWERING \\'PRESENT\\'\")\n", "print(\"Passage Count: \", len(df))\n", "print(f\"{' '*39}Raw{' '*10}Adj.\") \n", "print(f\"{'_'*60}\")\n", "for col in valuecountCol:\n", " if col[1] == \"No_Info\":\n", " proportion = 1-np.mean(df[col])\n", " mainCat_proportion = proportion\n", " proportion = round(proportion,2)\n", " df_biases = pd.concat([df_biases, pd.DataFrame({\"Class\":[col[0]],\"Raw_Bias\":[proportion]})])\n", " print(f\"\\n{col[0]}:{(38-len(col[0]))*' '}{proportion}\")\n", " else:\n", " proportion = np.mean(df[col])\n", " adj_proportion = round(proportion / mainCat_proportion,2) # get adjusted proportion within category\n", " proportion = round(proportion,2)\n", " df_biases = pd.concat([df_biases, pd.DataFrame({\"Class\":[col[1]],\"Raw_Bias\":[proportion], \"Adj__Bias\":[adj_proportion]})])\n", " print(f\"\\t{col[1]}:{(30-len(col[1]))*' '}{proportion}{' '*(12-len(str(proportion)))}{adj_proportion}\")\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Make sure the train, validation, and test sets are as biased as our total input data (we want each to match more or less with the total)
" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " TOTAL train test\n", "____________________________________________________________\n", "EVENT_Illness: 40.58 40.55 40.69 \n", "EVENT_Accident: 6.56 6.48 6.89 \n", "EVENT_Other: 26.04 26.19 25.46 \n", "CAUSE_Material_Physical: 17.04 17.05 17.02 \n", "CAUSE_Spirits_Gods: 18.72 18.45 19.82 \n", "CAUSE_Witchcraft_Sorcery: 6.33 6.38 6.12 \n", "CAUSE_Rule_Violation_Taboo: 10.19 10.01 10.9 \n", "ACTION_Physical_Material: 32.21 32.26 32.02 \n", "ACTION_Technical_Specialist: 6.9 7.05 6.27 \n", "ACTION_Divination: 2.22 2.18 2.36 \n", "ACTION_Shaman_Medium_Healer: 7.72 7.72 7.71 \n", "ACTION_Priest_High_Religion: 3.44 3.57 2.94 \n" ] } ], "source": [ "# extract the total proportion\n", "def totalProportion(df, col, present=1):\n", " value_counts = df[col].value_counts()\n", " percentage = round(value_counts[present]/len(df)*100,2)\n", " return percentage\n", "\n", "# extracts percentages per datafaframe\n", "def colProportion(Hraf, col):\n", " percentage_list = []\n", " for dataframe in Hraf.keys():\n", " percentage_list += [round(sum(Hraf[dataframe][col]) / (len(Hraf[dataframe]))*100,2)]\n", " return percentage_list\n", "\n", "\n", "\n", "# print bias per label\n", "dataframe_keys= Hraf.keys()\n", "labels = [label for label in Hraf['train'].features.keys() if label not in ['ID', 'passage']]\n", "header = \" TOTAL\"\n", "for key in dataframe_keys:\n", " header += f\" {key}\"\n", "print(header)\n", "print('_'*(len(header)+4))\n", "for col in labels:\n", " totalPercentage = totalProportion(df_small, col)\n", " percentage_list = colProportion(Hraf, col)\n", " spacing = 10\n", " percentage_str = f\"{totalPercentage}{' '* (spacing-len(str(totalPercentage)))}\"\n", " for index, key in enumerate(dataframe_keys):\n", " percentage_str += f\"{(len(key)-5)*' '}{percentage_list[index]}{' '* (spacing-len(str(percentage_list[index])))}\"\n", " print(f\"{col}:{' ' * (30- len(col))} {percentage_str}\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Preprocess" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Create labels for training and preprocessing" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{0: 'EVENT_Illness',\n", " 1: 'EVENT_Accident',\n", " 2: 'EVENT_Other',\n", " 3: 'CAUSE_Material_Physical',\n", " 4: 'CAUSE_Spirits_Gods',\n", " 5: 'CAUSE_Witchcraft_Sorcery',\n", " 6: 'CAUSE_Rule_Violation_Taboo',\n", " 7: 'ACTION_Physical_Material',\n", " 8: 'ACTION_Technical_Specialist',\n", " 9: 'ACTION_Divination',\n", " 10: 'ACTION_Shaman_Medium_Healer',\n", " 11: 'ACTION_Priest_High_Religion'}" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "labels = [label for label in Hraf['train'].features.keys() if label not in ['ID', 'passage']]\n", "id2label = {idx:label for idx, label in enumerate(labels)}\n", "label2id = {label:idx for idx, label in enumerate(labels)}\n", "id2label" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "load a DistilBERT tokenizer to preprocess the text field:
" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Create a preprocessing function to tokenize text and truncate sequences to be no longer than DistilBERT’s maximum input length:
\n", "Guidelines were followed from NielsRogge found here " ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [], "source": [ "from transformers import AutoTokenizer\n", "import numpy as np\n", "\n", "\n", "tokenizer = AutoTokenizer.from_pretrained('distilbert-base-uncased')\n", "\n", "def preprocess_data(examples):\n", " # take a batch of texts\n", " text = examples[\"passage\"]\n", " # encode them\n", " encoding = tokenizer(text, max_length=512, truncation=True) #max length for BERT is 512\n", " # add labels\n", " labels_batch = {k: examples[k] for k in examples.keys() if k in labels}\n", " # create numpy array of shape (batch_size, num_labels)\n", " labels_matrix = np.zeros((len(text), len(labels)))\n", " # fill numpy array\n", " for idx, label in enumerate(labels):\n", " labels_matrix[:, idx] = labels_batch[label]\n", "\n", " encoding[\"labels\"] = labels_matrix.tolist()\n", "\n", " return encoding" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "To apply the preprocessing function over the entire dataset, use 🤗 Datasets map function. You can speed up map by setting batched=True to process multiple elements of the dataset at once:" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7a8c7ac9531b4321aa70c9a45eb53ac0", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Map: 0%| | 0/8293 [00:00 DataCollatorWithPadding. It’s more efficient to dynamically pad the sentences to the longest length in a batch during collation, instead of padding the whole dataset to the maximum length." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create Splits" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Stratification using multilabels is a difficult process as the number of unique bins of stratification increases exponentially by the number of labels (see more info and potential ways to conduct multilabel sttratification sampling HERE ). We will currently disregard focusing on stratification of all the labels/classifications and just use a single label for stratification. Currently, this is still giving decent splits that do not deviate far from the true proportion or between n_splits. Still, one should check the proportional deviation of each label to make sure" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
EVENT_IllnessEVENT_AccidentEVENT_OtherCAUSE_Material_PhysicalCAUSE_Spirits_GodsCAUSE_Witchcraft_SorceryCAUSE_Rule_Violation_TabooACTION_Physical_MaterialACTION_Technical_SpecialistACTION_DivinationACTION_Shaman_Medium_HealerACTION_Priest_High_Religion
Fold 10.410.070.260.170.190.070.10.330.070.020.080.04
Fold 20.410.060.260.170.180.060.10.320.070.020.080.04
Fold 30.400.070.260.170.180.060.10.320.070.020.080.04
Fold 40.400.060.260.170.190.070.10.320.070.020.080.04
Fold 50.410.060.260.170.180.060.10.330.070.020.080.04
\n", "
" ], "text/plain": [ " EVENT_Illness EVENT_Accident EVENT_Other CAUSE_Material_Physical \\\n", "Fold 1 0.41 0.07 0.26 0.17 \n", "Fold 2 0.41 0.06 0.26 0.17 \n", "Fold 3 0.40 0.07 0.26 0.17 \n", "Fold 4 0.40 0.06 0.26 0.17 \n", "Fold 5 0.41 0.06 0.26 0.17 \n", "\n", " CAUSE_Spirits_Gods CAUSE_Witchcraft_Sorcery \\\n", "Fold 1 0.19 0.07 \n", "Fold 2 0.18 0.06 \n", "Fold 3 0.18 0.06 \n", "Fold 4 0.19 0.07 \n", "Fold 5 0.18 0.06 \n", "\n", " CAUSE_Rule_Violation_Taboo ACTION_Physical_Material \\\n", "Fold 1 0.1 0.33 \n", "Fold 2 0.1 0.32 \n", "Fold 3 0.1 0.32 \n", "Fold 4 0.1 0.32 \n", "Fold 5 0.1 0.33 \n", "\n", " ACTION_Technical_Specialist ACTION_Divination \\\n", "Fold 1 0.07 0.02 \n", "Fold 2 0.07 0.02 \n", "Fold 3 0.07 0.02 \n", "Fold 4 0.07 0.02 \n", "Fold 5 0.07 0.02 \n", "\n", " ACTION_Shaman_Medium_Healer ACTION_Priest_High_Religion \n", "Fold 1 0.08 0.04 \n", "Fold 2 0.08 0.04 \n", "Fold 3 0.08 0.04 \n", "Fold 4 0.08 0.04 \n", "Fold 5 0.08 0.04 " ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Splitting\n", "from sklearn.model_selection import StratifiedKFold\n", "fold_n =5\n", "\n", "# folds = StratifiedKFold(n_splits=5)\n", "folds = StratifiedKFold(n_splits=fold_n, shuffle= True, random_state=10)\n", "cols = Hraf['train'].column_names\n", "splits = folds.split(np.zeros(Hraf['train'].num_rows), Hraf['train'][cols[-1]])\n", "# preconstruct dataframe to show\n", "fold_str = [\"Fold \"+str(x) for x in range(1,fold_n+1)]\n", "df_foldPerc = pd.DataFrame(data=np.zeros((fold_n,len(labels))),columns=labels, index=fold_str)\n", "\n", "train_list = []\n", "val_list = []\n", "\n", "for fold, (train_idxs, val_idxs) in enumerate(splits, start=1):\n", " train_list += [train_idxs]\n", " val_list += [val_idxs]\n", " train_hub = Hraf['train'][train_idxs]\n", "\n", " df_foldPerc.iloc[fold-1] = [np.round(np.mean(train_hub[col]),2) for col in cols[2:]]\n", " \n", "df_foldPerc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Save Paritioned Datasets" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8293 Rows for 'train' succesfully saved to /Users/ericchantland/Library/CloudStorage/Dropbox/MEM-DEV-LAB-Current/2023-eHRAF-Misf/HRAF-Misf-NaturalLanguageProcessing/HRAF_NLP/HRAF_MultiLabel_SubClasses_Kfolds/Datasets/train_dataset.json\n", "2074 Rows for 'test' succesfully saved to /Users/ericchantland/Library/CloudStorage/Dropbox/MEM-DEV-LAB-Current/2023-eHRAF-Misf/HRAF-Misf-NaturalLanguageProcessing/HRAF_NLP/HRAF_MultiLabel_SubClasses_Kfolds/Datasets/test_dataset.json\n" ] } ], "source": [ "# # Save datasets for later inference (SKIP IF YOU DO NOT WANT TO OVERWRITE DATASET FILES)\n", "\n", "# def make_dir(path):\n", "# import os\n", "# # Check whether the specified path exists or not\n", "# isExist = os.path.exists(path)\n", "# if not isExist:\n", "# # Create a new directory because it does not exist\n", "# os.makedirs(path)\n", "\n", "# # make folder if it does not exist yet\n", "# path_datasets = os.getcwd() + '/Datasets'\n", "# make_dir(path_datasets)\n", "# # save to Json\n", "# for key in Hraf.keys():\n", "# Hraf_dict = Hraf[key].to_dict()\n", "# file_path = f\"{path_datasets}/{key}_dataset.json\"\n", "# with open(file_path, \"w\") as outfile:\n", "# json.dump(Hraf_dict, outfile)\n", "# print(len(Hraf_dict['ID']), f\"Rows for \\'{key}\\' succesfully saved to {file_path}\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluate" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Obtain F1 score for evaluation" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics import f1_score, roc_auc_score, accuracy_score\n", "from transformers import EvalPrediction, TrainerCallback\n", "import torch\n", "\n", "# Get Metric performance\n", "# source: https://jesusleal.io/2021/04/21/Longformer-multilabel-classification/\n", "def multi_label_metrics(predictions, labels, threshold=0.5):\n", " # first, apply sigmoid on predictions which are of shape (batch_size, num_labels)\n", " sigmoid = torch.nn.Sigmoid()\n", " probs = sigmoid(torch.Tensor(predictions))\n", " # next, use threshold to turn them into integer predictions\n", " y_pred = np.zeros(probs.shape)\n", " y_pred[np.where(probs >= threshold)] = 1\n", " # finally, compute metrics\n", " y_true = labels\n", " f1_micro_average = f1_score(y_true=y_true, y_pred=y_pred, average='micro')\n", " roc_auc = roc_auc_score(y_true, y_pred, average = 'micro')\n", " accuracy = accuracy_score(y_true, y_pred)\n", " # return as dictionary\n", " metrics = {'f1': f1_micro_average,\n", " 'roc_auc': roc_auc,\n", " 'accuracy': accuracy}\n", " return metrics\n", "\n", "# Compute evaluation\n", "def compute_metrics(p: EvalPrediction):\n", " preds = p.predictions[0] if isinstance(p.predictions, \n", " tuple) else p.predictions\n", " result = multi_label_metrics(\n", " predictions=preds, \n", " labels=p.label_ids)\n", " return result\n", "\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Train\n", "Before you start training your model, create a map of the expected ids to their labels with id2label and label2id:" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Some weights of DistilBertForSequenceClassification were not initialized from the model checkpoint at distilbert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight', 'pre_classifier.bias', 'pre_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" ] } ], "source": [ "from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer, DistilBertForSequenceClassification, RobertaModel\n", "\n", "model = AutoModelForSequenceClassification.from_pretrained(\n", " \"distilbert-base-uncased\", \n", " problem_type='multi_label_classification',\n", " num_labels = len(labels), \n", " id2label=id2label, \n", " label2id=label2id\n", ")\n", "\n", "# # Roberta \n", "# model = RobertaModel.from_pretrained(\n", "# 'roberta-base', \n", "# problem_type='multi_label_classification',\n", "# num_labels = len(labels), \n", "# id2label=id2label, \n", "# label2id=label2id\n", "# )\n", "\n", "from transformers import DataCollatorWithPadding\n", "# Set up data collator\n", "data_collator = DataCollatorWithPadding(tokenizer=tokenizer)\n", "\n", "# Get initial state (this is for later kfolds loops which appear to have data leakage)\n", "initial_model_state = {name: param.data.clone() for name, param in model.named_parameters()}" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SequenceClassifierOutput(loss=tensor(0.6991, grad_fn=), logits=tensor([[ 0.1000, 0.0548, 0.0565, -0.0445, 0.0618, 0.0056, 0.0233, 0.0152,\n", " 0.0493, -0.0147, -0.0196, 0.0831]], grad_fn=), hidden_states=None, attentions=None)" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#forward pass (NOT IMPLEMENTED YET, JUST A TEST)\n", "outputs = model(input_ids=tokenized_Hraf['train']['input_ids'][0].unsqueeze(0), labels=tokenized_Hraf['train'][0]['labels'].unsqueeze(0))\n", "outputs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Training" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "# Save evaluation dataframe\n", "def eval_save(eval_df, directory=\"\", overwrite_training=True):\n", " # Augment Evaluation File \n", " from datetime import date\n", "\n", " file_path = f\"{directory}/Evaluation.xlsx\"\n", "\n", " today = date.today()\n", " date_tm = today.strftime(\"%y/%m/%d\")\n", "\n", " #reorganize columns\n", " cols = list(eval_df.columns.values) \n", " remove_list = [\"fold\", \"epoch\",\"weight_decay\", \"learning_rate\"]\n", " for removal in remove_list:\n", " cols.remove(removal)\n", " cols = remove_list+cols\n", " eval_df = eval_df[cols]\n", "\n", "\n", " trainingStatus = 'Initial Training' if overwrite_training == True else 'Continue Training'\n", "\n", " info_df = pd.DataFrame({\"Date\":len(eval_df)*[date_tm],\"Train_status\":len(eval_df)*[trainingStatus]})\n", " eval_df = eval_df.reset_index(drop=True)\n", " eval_df = pd.concat([info_df, eval_df], axis=1)\n", "\n", "\n", " # import evaluation if it exists\n", " if os.path.exists(file_path):\n", " old_eval = pd.read_excel(file_path, sheet_name=\"Sheet1\", index_col=0)\n", " eval_df = pd.concat([old_eval, eval_df])\n", "\n", " eval_df.to_excel(file_path)\n", "\n", "# combine the history output the model gives into a more digestable list format within a dictionary for val and train\n", "def epochDictCreator(history_list:list) -> dict:\n", " epochHistory = dict() \n", "\n", " #get train and Val and put them in a dictionary\n", " for train_or_val in [\"train\",\"val\"]:\n", " if train_or_val== 'val':\n", " epochHistory_list = [x for x in history_list if (x.get(\"eval_loss\", 'a') !='a')] # get only validation epochs (will have eval_loss)\n", " elif train_or_val == 'train':\n", " epochHistory_list = [x for x in history_list if (x.get(\"loss\", 'a') !='a')] # get only training epochs (will have loss and typically the epoch will be a non-integer)\n", " else:\n", " raise Exception(\"Must enter train or val\")\n", " # Create dictionary of values for val or train\n", " epochHistory_dict = dict()\n", " count=0\n", " for epoch in epochHistory_list:\n", " if count == 0:\n", " epochHistory_dict = {key:[val] for key, val in epoch.items()}\n", " else:\n", " for key, val in epoch.items():\n", " try:\n", " epochHistory_dict[key].append(val)\n", " except:\n", " print(\"train or Val:\",train_or_val,\"Count:\", count)\n", " count +=1\n", " epochHistory[train_or_val] = epochHistory_dict\n", " return epochHistory\n", "\n", "# save epoch dicts to a file (append if already exists)\n", "def epochDictSave(directory, History_list:list):\n", " import json\n", " import os\n", " directory = f\"{directory}/HistoryLog.json\"\n", " if os.path.exists(directory):\n", " with open(directory, 'r') as openfile:\n", " oldHistory = json.load(openfile)\n", " History_list = oldHistory+History_list\n", " \n", " with open(directory, \"w\") as outfile:\n", " json.dump(History_list, outfile, indent=4)\n", " # outfile.write(json_object)\n", "\n", "# Create Parameter JSON file\n", "def saveParam(output_dir, param_dict:dict):\n", " import json\n", " import os\n", " # Check if param file already exists, if so, warn the user.\n", " if os.path.exists(f\"{output_dir}/Model_Params.json\"):\n", " print('\\033[91m'+ \"WARNING model parameter file overwritten\" + '\\033[0m')\n", " with open(f\"{output_dir}/Model_Params.json\", \"r\") as openfile:\n", " oldParam = json.load(openfile)\n", " flag = 0\n", " for key, val in param_dict.items():\n", " try:\n", " if oldParam[key] != val:\n", " flag = 1\n", " print(f\"{key}: {oldParam[key]} != {val}\")\n", " except:\n", " print(f\"{key} not found in old file\")\n", " if flag == 0:\n", " print(\"All parameters match\")\n", " # save file\n", " with open(f\"{output_dir}/Model_Params.json\", \"w\") as outfile:\n", " json.dump(param_dict, outfile)\n", "# create descending folders, give list of folders from parent to lowest child\n", "def createFolders(paths:list):\n", " current_path = \"\"\n", " for path in paths:\n", " if len(path) == 0 or path == '/': # Skip blank paths (here to work with both google colab and vscode local notebooks)\n", " continue\n", " current_path += f\"{path}/\"\n", " os.mkdir(current_path) if not os.path.exists(current_path) else None" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [], "source": [ "from transformers import AdamW, get_linear_schedule_with_warmup\n", "\n", "optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5, weight_decay=0.01) # L2 Regularization\n", "scheduler = get_linear_schedule_with_warmup(\n", " optimizer, num_warmup_steps=100, num_training_steps=1000\n", ")" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train: 6634 validation: 1659\n", "train: 6634 validation: 1659\n", "train: 6634 validation: 1659\n", "train: 6635 validation: 1658\n", "train: 6635 validation: 1658\n" ] } ], "source": [ "for fold, (train_idxs, val_idxs) in enumerate(zip(train_list, val_list), start=1): # K-fold loop\n", " train_ds = tokenized_Hraf[\"train\"].select(train_idxs)\n", " val_ds = tokenized_Hraf[\"train\"].select(val_idxs)\n", " print(\"train:\", len(train_ds),\" validation:\", len(val_ds))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Kfolds" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------Fold 1/5--------\n", "\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4ea025dbaa3e4b978e543c0f4220c67a", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/4150 [00:00 91\u001b[0m train_result \u001b[38;5;241m=\u001b[39m \u001b[43mtrainer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresume_from_checkpoint\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mresume_bool\u001b[49m\u001b[43m)\u001b[49m \n\u001b[0;32m 92\u001b[0m \u001b[38;5;66;03m# except:\u001b[39;00m\n\u001b[0;32m 93\u001b[0m \u001b[38;5;66;03m# print('\\033[91m'+ f\"A crash occurred, restarting fold from checkpoint\"+ '\\033[0m')\u001b[39;00m\n\u001b[0;32m 94\u001b[0m \u001b[38;5;66;03m# train_result = trainer.train(resume_from_checkpoint=True) #This is the same thing above but often restarting can make all the difference so let's try it\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 103\u001b[0m \n\u001b[0;32m 104\u001b[0m \u001b[38;5;66;03m# Evaluate on validation set for this fold\u001b[39;00m\n\u001b[0;32m 105\u001b[0m eval_dict \u001b[38;5;241m=\u001b[39m trainer\u001b[38;5;241m.\u001b[39mevaluate(val_ds)\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\trainer.py:1859\u001b[0m, in \u001b[0;36mTrainer.train\u001b[1;34m(self, resume_from_checkpoint, trial, ignore_keys_for_eval, **kwargs)\u001b[0m\n\u001b[0;32m 1857\u001b[0m hf_hub_utils\u001b[38;5;241m.\u001b[39menable_progress_bars()\n\u001b[0;32m 1858\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1859\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43minner_training_loop\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1860\u001b[0m \u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1861\u001b[0m \u001b[43m \u001b[49m\u001b[43mresume_from_checkpoint\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mresume_from_checkpoint\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1862\u001b[0m \u001b[43m \u001b[49m\u001b[43mtrial\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtrial\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1863\u001b[0m \u001b[43m \u001b[49m\u001b[43mignore_keys_for_eval\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mignore_keys_for_eval\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1864\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\trainer.py:2203\u001b[0m, in \u001b[0;36mTrainer._inner_training_loop\u001b[1;34m(self, batch_size, args, resume_from_checkpoint, trial, ignore_keys_for_eval)\u001b[0m\n\u001b[0;32m 2200\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcontrol \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcallback_handler\u001b[38;5;241m.\u001b[39mon_step_begin(args, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcontrol)\n\u001b[0;32m 2202\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maccelerator\u001b[38;5;241m.\u001b[39maccumulate(model):\n\u001b[1;32m-> 2203\u001b[0m tr_loss_step \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtraining_step\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 2205\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[0;32m 2206\u001b[0m args\u001b[38;5;241m.\u001b[39mlogging_nan_inf_filter\n\u001b[0;32m 2207\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_torch_xla_available()\n\u001b[0;32m 2208\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m (torch\u001b[38;5;241m.\u001b[39misnan(tr_loss_step) \u001b[38;5;129;01mor\u001b[39;00m torch\u001b[38;5;241m.\u001b[39misinf(tr_loss_step))\n\u001b[0;32m 2209\u001b[0m ):\n\u001b[0;32m 2210\u001b[0m \u001b[38;5;66;03m# if loss is nan or inf simply add the average of previous logged losses\u001b[39;00m\n\u001b[0;32m 2211\u001b[0m tr_loss \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m tr_loss \u001b[38;5;241m/\u001b[39m (\u001b[38;5;241m1\u001b[39m \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate\u001b[38;5;241m.\u001b[39mglobal_step \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_globalstep_last_logged)\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\trainer.py:3138\u001b[0m, in \u001b[0;36mTrainer.training_step\u001b[1;34m(self, model, inputs)\u001b[0m\n\u001b[0;32m 3135\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m loss_mb\u001b[38;5;241m.\u001b[39mreduce_mean()\u001b[38;5;241m.\u001b[39mdetach()\u001b[38;5;241m.\u001b[39mto(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs\u001b[38;5;241m.\u001b[39mdevice)\n\u001b[0;32m 3137\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcompute_loss_context_manager():\n\u001b[1;32m-> 3138\u001b[0m loss \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute_loss\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3140\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs\u001b[38;5;241m.\u001b[39mn_gpu \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m 3141\u001b[0m loss \u001b[38;5;241m=\u001b[39m loss\u001b[38;5;241m.\u001b[39mmean() \u001b[38;5;66;03m# mean() to average on multi-gpu parallel training\u001b[39;00m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\trainer.py:3161\u001b[0m, in \u001b[0;36mTrainer.compute_loss\u001b[1;34m(self, model, inputs, return_outputs)\u001b[0m\n\u001b[0;32m 3159\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 3160\u001b[0m labels \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m-> 3161\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43minputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3162\u001b[0m \u001b[38;5;66;03m# Save past state if it exists\u001b[39;00m\n\u001b[0;32m 3163\u001b[0m \u001b[38;5;66;03m# TODO: this needs to be fixed and made cleaner later.\u001b[39;00m\n\u001b[0;32m 3164\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs\u001b[38;5;241m.\u001b[39mpast_index \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m:\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1532\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1530\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1531\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1532\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1541\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1536\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1537\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1538\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1539\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1540\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1541\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1543\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1544\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\models\\distilbert\\modeling_distilbert.py:994\u001b[0m, in \u001b[0;36mDistilBertForSequenceClassification.forward\u001b[1;34m(self, input_ids, attention_mask, head_mask, inputs_embeds, labels, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[0;32m 986\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 987\u001b[0m \u001b[38;5;124;03mlabels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):\u001b[39;00m\n\u001b[0;32m 988\u001b[0m \u001b[38;5;124;03m Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,\u001b[39;00m\n\u001b[0;32m 989\u001b[0m \u001b[38;5;124;03m config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If\u001b[39;00m\n\u001b[0;32m 990\u001b[0m \u001b[38;5;124;03m `config.num_labels > 1` a classification loss is computed (Cross-Entropy).\u001b[39;00m\n\u001b[0;32m 991\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 992\u001b[0m return_dict \u001b[38;5;241m=\u001b[39m return_dict \u001b[38;5;28;01mif\u001b[39;00m return_dict \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39muse_return_dict\n\u001b[1;32m--> 994\u001b[0m distilbert_output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdistilbert\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 995\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_ids\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minput_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 996\u001b[0m \u001b[43m \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 997\u001b[0m \u001b[43m \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 998\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs_embeds\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs_embeds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 999\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1000\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1001\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreturn_dict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1002\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1003\u001b[0m hidden_state \u001b[38;5;241m=\u001b[39m distilbert_output[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;66;03m# (bs, seq_len, dim)\u001b[39;00m\n\u001b[0;32m 1004\u001b[0m pooled_output \u001b[38;5;241m=\u001b[39m hidden_state[:, \u001b[38;5;241m0\u001b[39m] \u001b[38;5;66;03m# (bs, dim)\u001b[39;00m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1532\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1530\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1531\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1532\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1541\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1536\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1537\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1538\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1539\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1540\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1541\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1543\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1544\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\models\\distilbert\\modeling_distilbert.py:814\u001b[0m, in \u001b[0;36mDistilBertModel.forward\u001b[1;34m(self, input_ids, attention_mask, head_mask, inputs_embeds, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[0;32m 811\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attention_mask \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 812\u001b[0m attention_mask \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mones(input_shape, device\u001b[38;5;241m=\u001b[39mdevice) \u001b[38;5;66;03m# (bs, seq_length)\u001b[39;00m\n\u001b[1;32m--> 814\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransformer\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 815\u001b[0m \u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43membeddings\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 816\u001b[0m \u001b[43m \u001b[49m\u001b[43mattn_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 817\u001b[0m \u001b[43m \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 818\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 819\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 820\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreturn_dict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 821\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1532\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1530\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1531\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1532\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1541\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1536\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1537\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1538\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1539\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1540\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1541\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1543\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1544\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\models\\distilbert\\modeling_distilbert.py:575\u001b[0m, in \u001b[0;36mTransformer.forward\u001b[1;34m(self, x, attn_mask, head_mask, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[0;32m 567\u001b[0m layer_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_gradient_checkpointing_func(\n\u001b[0;32m 568\u001b[0m layer_module\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__call__\u001b[39m,\n\u001b[0;32m 569\u001b[0m hidden_state,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 572\u001b[0m output_attentions,\n\u001b[0;32m 573\u001b[0m )\n\u001b[0;32m 574\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 575\u001b[0m layer_outputs \u001b[38;5;241m=\u001b[39m \u001b[43mlayer_module\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 576\u001b[0m \u001b[43m \u001b[49m\u001b[43mhidden_state\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 577\u001b[0m \u001b[43m \u001b[49m\u001b[43mattn_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 578\u001b[0m \u001b[43m \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[43m[\u001b[49m\u001b[43mi\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 579\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 580\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 582\u001b[0m hidden_state \u001b[38;5;241m=\u001b[39m layer_outputs[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m]\n\u001b[0;32m 584\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m output_attentions:\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1532\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1530\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1531\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1532\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1541\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1536\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1537\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1538\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1539\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1540\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1541\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1543\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1544\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\models\\distilbert\\modeling_distilbert.py:501\u001b[0m, in \u001b[0;36mTransformerBlock.forward\u001b[1;34m(self, x, attn_mask, head_mask, output_attentions)\u001b[0m\n\u001b[0;32m 491\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 492\u001b[0m \u001b[38;5;124;03mParameters:\u001b[39;00m\n\u001b[0;32m 493\u001b[0m \u001b[38;5;124;03m x: torch.tensor(bs, seq_length, dim)\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 498\u001b[0m \u001b[38;5;124;03m torch.tensor(bs, seq_length, dim) The output of the transformer block contextualization.\u001b[39;00m\n\u001b[0;32m 499\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 500\u001b[0m \u001b[38;5;66;03m# Self-Attention\u001b[39;00m\n\u001b[1;32m--> 501\u001b[0m sa_output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattention\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 502\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 503\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 504\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 505\u001b[0m \u001b[43m \u001b[49m\u001b[43mmask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattn_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 506\u001b[0m \u001b[43m \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 507\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 508\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 509\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m output_attentions:\n\u001b[0;32m 510\u001b[0m sa_output, sa_weights \u001b[38;5;241m=\u001b[39m sa_output \u001b[38;5;66;03m# (bs, seq_length, dim), (bs, n_heads, seq_length, seq_length)\u001b[39;00m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1532\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1530\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 1531\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 1532\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\torch\\nn\\modules\\module.py:1541\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1536\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[0;32m 1537\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[0;32m 1538\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[0;32m 1539\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[0;32m 1540\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[1;32m-> 1541\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1543\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1544\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\models\\distilbert\\modeling_distilbert.py:245\u001b[0m, in \u001b[0;36mMultiHeadSelfAttention.forward\u001b[1;34m(self, query, key, value, mask, head_mask, output_attentions)\u001b[0m\n\u001b[0;32m 242\u001b[0m weights \u001b[38;5;241m=\u001b[39m weights \u001b[38;5;241m*\u001b[39m head_mask\n\u001b[0;32m 244\u001b[0m context \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mmatmul(weights, v) \u001b[38;5;66;03m# (bs, n_heads, q_length, dim_per_head)\u001b[39;00m\n\u001b[1;32m--> 245\u001b[0m context \u001b[38;5;241m=\u001b[39m \u001b[43munshape\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcontext\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# (bs, q_length, dim)\u001b[39;00m\n\u001b[0;32m 246\u001b[0m context \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mout_lin(context) \u001b[38;5;66;03m# (bs, q_length, dim)\u001b[39;00m\n\u001b[0;32m 248\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m output_attentions:\n", "File \u001b[1;32md:\\Python\\anaconda3\\envs\\NLP\\Lib\\site-packages\\transformers\\models\\distilbert\\modeling_distilbert.py:224\u001b[0m, in \u001b[0;36mMultiHeadSelfAttention.forward..unshape\u001b[1;34m(x)\u001b[0m\n\u001b[0;32m 222\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21munshape\u001b[39m(x: torch\u001b[38;5;241m.\u001b[39mTensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m torch\u001b[38;5;241m.\u001b[39mTensor:\n\u001b[0;32m 223\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"group heads\"\"\"\u001b[39;00m\n\u001b[1;32m--> 224\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtranspose\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcontiguous\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mview(bs, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_heads \u001b[38;5;241m*\u001b[39m dim_per_head)\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "\n", "# Kfolds trainer\n", "#CHANGE for inputs\n", "weight_decay = .01\n", "learning_rate= .00002\n", "dropout_list = ['DataCol']\n", "batch_size = 8 # should be multiples of 8\n", "epochs = 10\n", "\n", "\n", "model_folder = \"Model_000_TEST_DELETE\" #this is where the output folders will be created and where a centralized model is made.\n", "maxFolds = 1 # Set to 1 if you do not want to use kfolds, otherwise, set to any other fold number, including ones which you might want to stop early.\n", "\n", "\n", "\n", "# model_path = f\"{path}/{model_folder}\"\n", "model_path = f\"{model_folder}\"\n", "eval_df = pd.DataFrame()\n", "\n", "# # Train the model\n", "for fold, (train_idxs, val_idxs) in enumerate(zip(train_list, val_list), start=1): # K-fold loop\n", "\n", "\n", " # skip folds if desired\n", " if fold > maxFolds:\n", " continue\n", " output_folder = f\"Hierarchy_test_fold_{fold}/\"\n", " output_dir = f\"{model_path}/{output_folder}\"\n", " resume_bool = False\n", "\n", " #Skip folds already completed\n", " if os.path.exists(f\"{output_dir}\"):\n", " if os.path.exists(f\"{output_dir}/finished.txt\"):\n", " print('\\033[93m'+ f\"Skipping {output_dir} as it is indicated as finished\" + '\\033[0m')\n", " continue\n", " else:\n", " print('\\033[93m'+ f\"Starting from last checkpoint {output_dir}\"+ '\\033[0m')\n", " resume_bool = True # resume from the last checkpoint if there is an output folder but it is not finished.\n", "\n", " # Create Parameter JSON file\n", " param_dict = {\n", " \"learning_rate\":learning_rate,\n", " \"weight_decay\":weight_decay,\n", " \"batch_size\":batch_size,\n", " \"epochs\":epochs,\n", " \"Fold\":fold,\n", " \"model_name\": model_folder,\n", " }\n", " createFolders(paths=[path, model_folder, output_folder])\n", " saveParam(output_dir=output_dir, param_dict=param_dict)\n", "\n", "\n", "\n", " print(f\"------Fold {fold}/{len(train_list)}--------\\n\")\n", "\n", " #reinitialize the model (since it appears to be dataleaking over loops)\n", " model.load_state_dict(initial_model_state)\n", " for name, param in model.named_parameters():\n", " try:\n", " assert (np.array(initial_model_state[name]) == np.array(param.data)).all(), \"Parameters differ from original model\"\n", " except:\n", " print(name, \"Differs from initial model\")\n", " model.load_state_dict(initial_model_state)\n", "\n", " train_ds = tokenized_Hraf[\"train\"].select(train_idxs)\n", " val_ds = tokenized_Hraf[\"train\"].select(val_idxs)\n", "\n", "\n", " training_args = TrainingArguments(\n", " output_dir=output_dir,\n", " learning_rate=learning_rate,\n", " per_device_train_batch_size=batch_size, # should be multiples of 8\n", " per_device_eval_batch_size=batch_size, # should be multiples of 8\n", " num_train_epochs=epochs,\n", " weight_decay=weight_decay,\n", " evaluation_strategy=\"epoch\",\n", " save_strategy=\"epoch\",\n", " metric_for_best_model='f1',\n", " push_to_hub=False,\n", " save_total_limit=3, #Save only three checkpoints\n", " load_best_model_at_end = True, # retain the best model regardless of if it is beyond the save limit\n", " logging_dir=f\"{output_dir}/logs\",\n", " logging_steps=100,\n", " use_cpu=False, # set True or False depending on if you want ot use the GPU, which is faster but has been unreliable on Macs\n", " )\n", "\n", "\n", " trainer = Trainer(\n", " model=model,\n", " args=training_args,\n", " train_dataset=train_ds,\n", " eval_dataset=val_ds,\n", " tokenizer=tokenizer,\n", " data_collator=data_collator,\n", " optimizers=(optimizer, scheduler),\n", " # callbacks=[best_checkpoint_callback], \n", " compute_metrics=compute_metrics,\n", " \n", " )\n", " try:\n", " train_result = trainer.train(resume_from_checkpoint = resume_bool) \n", " except Exception as e:\n", " print(f\"An unexpected error occurred: {e}\")\n", " print('\\033[91m'+ f\"A crash occurred, restarting fold from checkpoint\"+ '\\033[0m')\n", " train_result = trainer.train(resume_from_checkpoint=True) #This is the same thing above but often restarting can make all the difference so let's try it\n", " finally:\n", " #save logging\n", " epochDictSave(directory=output_dir, History_list=trainer.state.log_history)\n", " \n", "\n", "\n", "\n", " # Evaluate and then concatinate results to a dataframe\n", "\n", " # Evaluate on validation set for this fold\n", " eval_dict = trainer.evaluate(val_ds)\n", " fold_f1 = eval_dict['eval_f1']\n", " # fold_f1s.append(fold_f1)\n", " print(f\"Fold {fold} F1: {fold_f1}\")\n", "\n", " eval_df_line = pd.DataFrame([eval_dict])\n", " eval_df_line[\"model_name\"] = output_dir\n", " eval_df_line[\"fold\"] = fold\n", " eval_df_line[\"weight_decay\"] = weight_decay\n", " eval_df_line[\"learning_rate\"] = learning_rate\n", " eval_df_line[\"fold_f1\"] = fold_f1\n", " eval_df_line[\"train_count\"] = len(train_ds)\n", " eval_df_line[\"val_count\"] = len(val_ds)\n", " eval_df_line[\"total_count\"] = eval_df_line[\"val_count\"] + eval_df_line[\"train_count\"]\n", " #Save evaluation File\n", " eval_save(eval_df=eval_df_line, directory=f\"{model_folder}\")\n", "\n", " # Have a centralized eval_df For manual investiagtion when loops are done\n", " eval_df = pd.concat([eval_df, eval_df_line])\n", "\n", " # # Get best model and then finish\n", " # best_checkpoint = best_checkpoint_callback.best_checkpoint\n", " # print(\"Best Checkpoint:\", best_checkpoint)\n", " \n", " # Save Best model\n", " trainer.save_model()\n", " f = open(f\"{output_dir}/finished.txt\", \"w\")\n", " f.write(f\"Best Model: {trainer.state.best_model_checkpoint}\")\n", " f.close()\n", "\n", " print(\"Best Model Checkpoint\", trainer.state.best_model_checkpoint)\n", "\n", " \n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a3366b84e0ca4c838d6587ff74b8f20a", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/190 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
EpochTraining LossValidation LossF1Roc AucAccuracy
010.39230.3838720.0000000.500000.300965
120.35370.3505150.0000000.500000.300965
230.33690.3368320.2231680.561790.258944
\n", "" ], "text/plain": [ " Epoch Training Loss Validation Loss F1 Roc Auc Accuracy\n", "0 1 0.3923 0.383872 0.000000 0.50000 0.300965\n", "1 2 0.3537 0.350515 0.000000 0.50000 0.300965\n", "2 3 0.3369 0.336832 0.223168 0.56179 0.258944" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "#Load File\n", "codiedTable_path = \"HRAF_Model_MultiLabel_SubClasses/Copied_colab_table.xlsx\"\n", "df_colab = pd.read_excel(codiedTable_path)\n", "df_colab.head(3)\n", "#Rename column headers" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "#initialize epoch History\n", "epochHistory = {\"train\":dict(), \"val\":dict()}\n", "epochHistory['train'] = {'epoch':list(df_colab['Epoch']), 'loss':list(df_colab['Training Loss'])}\n", "epochHistory['val'] = {'epoch':list(df_colab['Epoch']), 'eval_loss':list(df_colab['Validation Loss']), 'eval_f1':list(df_colab['F1']), 'eval_accuracy':list(df_colab['Accuracy'])}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Graph Plots" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import json\n", "import matplotlib.pyplot as plt\n", "import os\n", "import re" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Single Model Investgation\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Get History" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'json' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[2], line 12\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m#Load history from file\u001b[39;00m\n\u001b[1;32m 11\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(history_path\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/HistoryLog.json\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 12\u001b[0m history_list \u001b[38;5;241m=\u001b[39m \u001b[43mjson\u001b[49m\u001b[38;5;241m.\u001b[39mload(f)\n\u001b[1;32m 13\u001b[0m f\u001b[38;5;241m.\u001b[39mclose()\n\u001b[1;32m 14\u001b[0m epochHistory\u001b[38;5;241m=\u001b[39m epochDictCreator(history_list)\n", "\u001b[0;31mNameError\u001b[0m: name 'json' is not defined" ] } ], "source": [ "# Optional, Reinitialize pathways shown above (copied and pasted, you must CHANGE if they do not match)\n", "model_name = \"HRAF_MultiLabel_SubClasses_Kfolds\"\n", "path = f\"\" #Path to centralized file locations\n", "model_folder = \"Model_3_LearningRates\" #this is where the output folders will be created and where a centralized model is made.\n", "model_path = f\"{model_folder}\"\n", "outputFolder= \"Learning_Rate_2e-05_fold_1\"\n", "\n", "\n", "history_path = f\"{model_path}/{outputFolder}\"\n", "#Load history from file\n", "f = open(history_path+\"/HistoryLog.json\")\n", "history_list = json.load(f)\n", "f.close()\n", "epochHistory= epochDictCreator(history_list)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Load from loaded trainer" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# #initialize epochHistory from loaded trainer\n", "# history_list = trainer.state.log_history\n", "# epochHistory = epochDictCreator(history_list)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Graph" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'epochHistory' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[1], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Graph Training Loss\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m train_loss \u001b[38;5;241m=\u001b[39m \u001b[43mepochHistory\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrain\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mloss\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 3\u001b[0m train_epoch \u001b[38;5;241m=\u001b[39m epochHistory[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrain\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mepoch\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 4\u001b[0m val_loss \u001b[38;5;241m=\u001b[39m epochHistory[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mval\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124meval_loss\u001b[39m\u001b[38;5;124m'\u001b[39m]\n", "\u001b[0;31mNameError\u001b[0m: name 'epochHistory' is not defined" ] } ], "source": [ "# Graph Training Loss\n", "train_loss = epochHistory['train']['loss']\n", "train_epoch = epochHistory['train']['epoch']\n", "val_loss = epochHistory['val']['eval_loss']\n", "val_epoch = epochHistory['val']['epoch']\n", "\n", "\n", "\n", "# \"ro\" is for \"red dot\"\n", "plt.plot(train_epoch, train_loss, 'ro', label='Training loss')\n", "# b is for \"solid blue line\"\n", "plt.plot(val_epoch, val_loss, 'b', label='Validation loss')\n", "plt.title('Training and validation loss')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Loss')\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "image/png": "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HuPHj0dKSgp+//13neP79++PChUqaH9u2bIlAODvv/8u9Frr1q2DjY0Nevfurd03cOBA7NixA//88492388//wwvLy+MGzcu1zk0rTU///wzVCoVZsyYke8xRfHWW2/l2pfzdU9LS8P9+/fx4osvAoD2dVer1diyZQu6deuWZ+uVJqZ+/frByclJp/Zq165duH//Pl5//fUix01kKZggEZVSmiJsTbH2rVu3cPDgQQwYMAC2trYA5IfhV199hcDAQDg6OsLLywuVKlXC6dOnkZSUZNT1bty4ARsbG223kUadOnVyHfv06VNMnz4dVatW1bnuo0ePjL5uzusHBgZqEz4NTZfcjRs3dPZXq1ZN52dNspQzwcnPqlWr0Lx5czx48ABXrlzBlStX0LhxY2RkZGDDhg3a465evYo6derAzi7/aoarV6/Cz88PFStWLPS6xqhevXqufQ8fPsSECRPg7e0NZ2dnVKpUSXuc5nW/d+8ekpOT8cILLxR4fg8PD3Tr1k1nMMDq1atRpUoVtGvXzoR3QqQM1iARlVJNmzZF3bp1sXbtWkyZMgVr166FEEJn9Nrs2bMxbdo0DB06FB999BEqVqwIGxsbTJw40azz+owbNw7Lli3DxIkTERoaCnd3d6hUKgwYMKDE5hPSJIn6xP/qdfJz+fJlbTF3YGBgrsdXr16NkSNHFj/AHPJrScrKysr3OTlbizT69euHw4cP491330VQUBDKly8PtVqNTp06Fel1Dw8Px4YNG3D48GE0aNAAv/76K0aPHp0rSSWyRkyQiEqxQYMGYdq0aTh9+jTWrFmDwMBANGvWTPv4xo0b0bZtWyxdulTneY8ePYKXl5dR1/L394darda2mmhcunQp17EbN25EREQEvvjiC+2+tLQ0PHr0SOc4Y7qY/P39cfr0aajVap0P6IsXL2ofN4XVq1fD3t4eK1euzJVk/fHHH5g/fz7i4uJQrVo11KxZE0ePHkVmZma+hd81a9bErl278PDhw3xbkTStW/qvj36rWEH++ecfREVFYdasWZg+fbp2/+XLl3WOq1SpEtzc3HD27NlCz9mpUydUqlQJq1evRkhICJ48eYI33njD4JiILBnTfKJSTNNaNH36dMTGxuaa+8jW1jZXi8mGDRtw+/Zto6/VuXNnAMD8+fN19s+bNy/XsXld95tvvsnVIuLi4gIgd2KQ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Wsp7W9hnTdOmTWFvb6/zPl26dAlxcXH5vk9F+V0vSuBURo0aNUq4u7uL/fv3i/j4eO3XkydPtMe88cYb4r333tP+PGvWLLFr1y5x9epVceLECTFgwADh5OQkzp07p8QtGOztt98W+/fvF9euXROHDh0SYWFhwsvLSyQmJgohct/noUOHhJ2dnfj888/FhQsXxIwZM4S9vb04c+aMUrdgtKysLFGtWjUxefLkXI9Z8/v6+PFjcfLkSXHy5EkBQHz55Zfi5MmT2pFbn3zyifDw8BC//PKLOH36tOjRo4eoXr26ePr0qfYc7dq1E998843253Xr1glHR0exfPlycf78eTFy5Ejh4eEhEhISSvz+ciroXjMyMkT37t3Fc889J2JjY3V+h9PT07Xn0L/Xwn4XlFTQ/T5+/Fi88847Ijo6Wly7dk3s2bNHNGnSRAQGBoq0tDTtOUrDe6uRlJQkypUrJxYvXpznOazlvTXks+att94S1apVE3v37hV//vmnCA0NFaGhoTrnqVOnjti0aZP2Z0N+14uDCVIZBiDPr2XLlmmPad26tYiIiND+PHHiRFGtWjXh4OAgvL29xSuvvCJiYmJKPngj9e/fX/j6+goHBwdRpUoV0b9/f3HlyhXt4/r3KYQQP/30k6hdu7ZwcHAQ9evXF7/99lsJR108u3btEgDEpUuXcj1mze/rvn378vx3q7kftVotpk2bJry9vYWjo6No3759rtfA399fzJgxQ2ffN998o30NmjdvLo4cOVJCd5S/gu712rVr+f4O79u3T3sO/Xst7HdBSQXd75MnT8TLL78sKlWqJOzt7YW/v78YMWJErkSnNLy3Gt99951wdnYWjx49yvMc1vLeGvJZ8/TpUzF69GhRoUIFUa5cOdGrVy8RHx+f6zw5n2PI73pxqP53USIiIiL6H9YgEREREelhgkRERESkhwkSERERkR4mSERERER6mCARERER6WGCRERERKSHCRIRERGRHiZIRERFpFKpsGXLFqXDICIzYIJERFZp8ODBUKlUub46deqkdGhEVArYKR0AEVFRderUCcuWLdPZ5+joqFA0RFSasAWJiKyWo6MjfHx8dL4qVKgAQHZ/LV68GJ07d4azszNq1KiBjRs36jz/zJkzaNeuHZydneHp6YmRI0ciJSVF55gffvgB9evXh6OjI3x9fTF27Fidx+/fv49evXqhXLlyCAwMxK+//qp97J9//sGgQYNQqVIlODs7IzAwMFdCR0SWiQkSEZVa06ZNQ+/evXHq1CkMGjQIAwYMwIULFwAAqamp6NixIypUqIDjx49jw4YN2LNnj04CtHjxYowZMwYjR47EmTNn8Ouvv6JWrVo615g1axb69euH06dP45VXXsGgQYPw8OFD7fXPnz+PHTt24MKFC1i8eDG8vLxK7gUgoqIz2bK3REQlKCIiQtja2goXFxedr48//lgIIVf+fuutt3SeExISIkaNGiWEEGLJkiWiQoUKIiUlRfv4b7/9JmxsbLQrxPv5+YmpU6fmGwMA8cEHH2h/TklJEQDEjh07hBBCdOvWTQwZMsQ0N0xEJYo1SERktdq2bYvFixfr7KtYsaJ2OzQ0VOex0NBQxMbGAgAuXLiARo0awcXFRfv4Sy+9BLVajUuXLkGlUuHOnTto3759gTE0bNhQu+3i4gI3NzckJiYCAEaNGoXevXsjJiYGL7/8Mnr27IkWLVoU6V6JqGQxQSIiq+Xi4pKry8tUnJ2dDTrO3t5e52eVSgW1Wg0A6Ny5M27cuIHt27dj9+7daN++PcaMGYPPP//c5PESkWmxBomISq0jR47k+rlevXoAgHr16uHUqVNITU3VPn7o0CHY2NigTp06cHV1RUBAAKKioooVQ6VKlRAREYFVq1Zh3rx5WLJkSbHOR0Qlgy1IRGS10tPTkZCQoLPPzs5OWwi9YcMGBAcH41//+hdWr16NY8eOYenSpQCAQYMGYcaMGYiIiMDMmTNx7949jBs3Dm+88Qa8vb0BADNnzsRbb72FypUro3Pnznj8+DEOHTqEcePGGRTf9OnT0bRpU9SvXx/p6enYtm2bNkEjIsvGBImIrNbOnTvh6+urs69OnTq4ePEiADnCbN26dRg9ejR8fX2xdu1aPP/88wCAcuXKYdeuXZgwYQKaNWuGcuXKoXfv3vjyyy+154qIiEBaWhq++uorvPPOO/Dy8kKfPn0Mjs/BwQHvv/8+rl+/DmdnZ7Rs2RLr1q0zwZ0TkbmphBBC6SCIiExNpVJh8+bN6Nmzp9KhEJEVYg0SERERkR4mSERERER6WINERKUSqweIqDjYgkRERESkhwkSERERkR4mSERERER6mCARERER6WGCRERERKSHCRIRERGRHiZIRERERHqYIBERERHpYYJEREREpOf/AcHsM1q1MvPMAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# train_loss = epochHistory['train']['loss']\n", "# train_epoch = epochHistory['train']['epoch']\n", "val_acc = epochHistory['val']['eval_accuracy']\n", "val_epoch = epochHistory['val']['epoch']\n", "\n", "\n", "# b is for \"solid blue line\"\n", "plt.plot(val_epoch, val_acc, 'b', label='Validation accuracy')\n", "plt.title('Validation Accuracy')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Accuracy')\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABH0ElEQVR4nO3dd3wVVf7/8fdNII1AKIEUDCQEpC1FKdngKqhZAStfUQOiBERZpaib9beIhaK7RhdULCzoSlHpuIKrsLAQAVmIghRBQVSkCgk1hWASyJ3fH7O5cEmHJHPL6/l4zOPeO3fuzGcYLvfNmTNzbIZhGAIAAPAQPlYXAAAAUJUINwAAwKMQbgAAgEch3AAAAI9CuAEAAB6FcAMAADwK4QYAAHgUwg0AAPAohBsAAOBRCDcAqtT+/ftls9k0e/Zsx7wJEybIZrNV6PM2m00TJkyo0pp69eqlXr16Vek6Abguwg3gxe68804FBQUpJyen1GUGDRokPz8/nTx5sgYrq7xdu3ZpwoQJ2r9/v9WlOKxdu1Y2m63EacCAAY7lNm3apBEjRqhLly6qXbt2hYMggJLVsroAANYZNGiQPv30Uy1ZskSDBw8u9v7Zs2f1ySefqE+fPmrUqNFlb+e5557T008/fSWllmvXrl2aOHGievXqpejoaKf3/vOf/1Trtsvz+OOPq1u3bk7zLq5x+fLleu+999SxY0e1aNFCP/zwQw1XCHgWwg3gxe68807VrVtX8+bNKzHcfPLJJ8rNzdWgQYOuaDu1atVSrVrW/XPj5+dn2bYl6frrr9c999xT6vuPPfaYxowZo8DAQI0aNYpwA1whTksBXiwwMFB33323UlNTdezYsWLvz5s3T3Xr1tWdd96pU6dO6amnnlKHDh0UHBysevXqqW/fvvrmm2/K3U5JfW7y8/P1xz/+UY0bN3Zs4/Dhw8U+e+DAAY0YMUKtW7dWYGCgGjVqpHvvvdfp9NPs2bN17733SpJuvPFGx6mftWvXSiq5z82xY8c0bNgwhYWFKSAgQJ06ddL777/vtExR/6HJkyfr3XffVWxsrPz9/dWtWzdt3ry53P2uqLCwMAUGBlbZ+gBvR8sN4OUGDRqk999/X4sWLdKoUaMc80+dOqWVK1dq4MCBCgwM1HfffaelS5fq3nvvVUxMjDIyMvTOO++oZ8+e2rVrlyIjIyu13Ycfflhz5szR/fffrx49eujzzz/XbbfdVmy5zZs3a+PGjRowYICuuuoq7d+/X9OmTVOvXr20a9cuBQUF6YYbbtDjjz+uN998U88884zatm0rSY7HS/3666/q1auXfvrpJ40aNUoxMTFavHixhgwZoszMTD3xxBNOy8+bN085OTn6wx/+IJvNpr/97W+6++679fPPP6t27drl7mtOTo5OnDjhNK9hw4by8eH/l0C1MAB4tfPnzxsRERFGfHy80/zp06cbkoyVK1cahmEYeXl5RmFhodMy+/btM/z9/Y0XXnjBaZ4kY9asWY5548ePNy7+52b79u2GJGPEiBFO67v//vsNScb48eMd886ePVus5rS0NEOS8cEHHzjmLV682JBkrFmzptjyPXv2NHr27Ol4PWXKFEOSMWfOHMe8goICIz4+3ggODjays7Od9qVRo0bGqVOnHMt+8sknhiTj008/Lbati61Zs8aQVOK0b9++Ej8zcuRIg3+agSvDfxsAL+fr66sBAwYoLS3N6VTPvHnzFBYWpptvvlmS5O/v72hpKCws1MmTJxUcHKzWrVtr69atldrm8uXLJZkdbS/25JNPFlv24tM1586d08mTJ9WyZUvVr1+/0tu9ePvh4eEaOHCgY17t2rX1+OOP68yZM1q3bp3T8omJiWrQoIHj9fXXXy9J+vnnnyu0vXHjxmnVqlVOU3h4+GXVDqB8hBsAjg7D8+bNkyQdPnxY69ev14ABA+Tr6ytJstvtev3119WqVSv5+/srNDRUjRs31o4dO5SVlVWp7R04cEA+Pj6KjY11mt+6detiy/76668aN26coqKinLabmZlZ6e1evP1WrVoVOy1UdBrrwIEDTvObNWvm9Loo6Jw+fbpC2+vQoYMSEhKcpoCAgMuqHUD5CDcA1KVLF7Vp00bz58+XJM2fP1+GYThdJfXSSy8pOTlZN9xwg+bMmaOVK1dq1apVat++vex2e7XVNnr0aP31r3/Vfffdp0WLFuk///mPVq1apUaNGlXrdi9WFPAuZRhGjWwfQOXQoRiAJLP15vnnn9eOHTs0b948tWrVyuneLB999JFuvPFGzZgxw+lzmZmZCg0NrdS2mjdvLrvdrr179zq11uzZs6fYsh999JGSkpL06quvOubl5eUpMzPTabnK3PiuefPm2rFjh+x2u1Przffff+94H4D7ouUGgKQL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G6Q2bcxA4+cnRUZKwcFSp07SkCHSG29IX3whZWdXb61wDbTclMMwpLNnrdl2UJBUkQtyatWqpcGDB2v27Nl69tlnHVfxLF68WIWFhRo4cKDOnDmjLl26aMyYMapXr56WLVumBx98ULGxserevXu527Db7br77rsVFhamr776SllZWSWetqlbt65mz56tyMhI7dy5U4888ojq1q2rP//5z0pMTNS3336rFStWaPXq1ZJUYojIzc1V7969FR8fr82bN+vYsWN6+OGHNWrUKKcAt2bNGkVERGjNmjX66aeflJiYqM6dO+uRRx4p/w8NgBO7XVq7VpoxwwwP+fkV/6yPj1S/vhksGjQoPpU232aTjh1znjIyis87ftxsjams8+elHTvM6f33L8yPjZWuvVa65poL0/+GM3QLdruUk2MGy8xM8/Hi55c+ljTPMKS6dc0AWLeu83Q582q5WJpwsXJcz9mz5gG0wpkzUp06FVv2oYce0qRJk7Ru3Tr16tVLknlKqn///goJCVFISIieeuopx/KjR4/WypUrtWjRogqFm9WrV+v777/XypUrFRkZKUl66aWXivWTee655xzPo6Oj9dRTT2nBggX685//rMDAQAUHB6tWrVplnoaaN2+e8vLy9MEHH6jO//4A3n77bd1xxx165ZVXHIOqNmjQQG+//bZ8fX3Vpk0b3XbbbUpNTS0z3GRlZSn4ogMaHBys9PT0cvcf8FS//CLNni3NnCn9/POF+R06mC0idrvZanL6tHTq1IXnRVNenrnMqVPmVJ1CQqQmTSo2NWhg7tu2bc7ToUPS3r3mtHjxhXVHRFwIOkXBJzq6Yv/BvFxFf25FAe7ix5MnSw8r2dlV01qWl2duryoEBDgHnmuvlWbNqpp1Xw7CjYdo06aNevTooZkzZ6pXr1766aeftH79er3wwguSzBvNvfTSS1q0aJF++eUXFRQUKD8/v8I3LNy9e7eioqIcwUaS4uPjiy23cOFCvfnmm9q7d6/OnDmj8+fPlzvAWUnb6tSpkyPYSNJ1110nu92uPXv2OMJN+/bt5evr61gmIiJCO3fuLHPddevW1datWx2vGfgS3ujcOWnZMum996R//9v8kZXMH6X775eGDZO6dq3YD3teXunBp6xQdPq0+QNd0bDSpEnl+880a2ZOd911Yd6JE9L27dLWrRcCzw8/SEePmtPy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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# train_loss = epochHistory['train']['loss']\n", "# train_epoch = epochHistory['train']['epoch']\n", "val_f1 = epochHistory['val']['eval_f1']\n", "val_epoch = epochHistory['val']['epoch']\n", "\n", "\n", "\n", "# b is for \"solid blue line\"\n", "plt.plot(val_epoch, val_f1, 'b', label='Validation F1')\n", "plt.title('Validation F1')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('F1')\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "epochHistory['val'].keys()\n", "import re\n", "\n", "val_f1 = epochHistory['val']['eval_f1']\n", "val_epoch = epochHistory['val']['epoch']\n", "plt.plot(val_epoch, val_f1, 'b', linewidth=3, label='Overall Validation F1')\n", "\n", "for key, value in epochHistory['val'].items():\n", " if not key.endswith('metrics'):\n", " continue\n", " title = re.findall(r'eval_(.*)_',key)[0]\n", " #get values into a single dict\n", " concatenated_dict = {}\n", " for dictionary in epochHistory['val'][key]:\n", " for key, value in dictionary.items():\n", " if key not in concatenated_dict:\n", " concatenated_dict[key] = []\n", " concatenated_dict[key].append(value)\n", " valCategories_f1 = concatenated_dict['f1']\n", " plt.plot(val_epoch, valCategories_f1, label=f'{title} F1')\n", "\n", "\n", "plt.title('Validation F1 by Categories')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('F1')\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Multiple Model Investigation" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "# Optional, Reinitialize pathways shown above (copied and pasted, you must CHANGE if they do not match)\n", "model_name = \"HRAF_MultiLabel_SubClasses_Kfolds\"\n", "path = f\"\" #Path to centralized file locations\n", "model_folder = \"Model_4_WeightByLearning\" #this is where the output folders will be created and where a centralized model is made.\n", "model_path = f\"{path}{model_folder}\"\n", "\n", "\n", "\n", "# Get list of models through common directory\n", "files_dir = [\n", " f for f in os.listdir(model_path) if os.path.isdir(os.path.join(model_path, f))\n", "]\n", "\n", "### OPTIONAL CHANGE\n", "# Redo the text for the file names to better fit graphs (feel free to comment out)\n", "def lowNum(text):\n", " startText = 'Learning_Rate_'\n", " regx = fr'{startText}([a-zA-Z0-9\\.\\-]+)'\n", " num = re.findall(regx,text)[0]\n", " return float(num)\n", "files_dir.sort(reverse=True, key=lowNum)\n", "\n", "\n", "\n", "epochHistory_dict = {}\n", "for file in files_dir:\n", "\n", " history_path = f\"{model_path}/{file}\"\n", " f = open(history_path+\"/HistoryLog.json\")\n", " history_list = json.load(f)\n", " f.close()\n", " epochHistory= epochDictCreator(history_list)\n", " epochHistory_dict[file] = epochHistory\n", " \n" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "image/png": "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R48e5dlnnyUsLMzseEVOZ5AEyLucd9CgQXzxxResWrWK8PBwsyMVqzZt2rBjx44Cz/Xt25c6deowbNgwnJycTEpWfFq1alVoaYf9+/dTvXp1kxIVrwsXLmC1Fvyd0cnJCYfDYVIic4WHhxMcHMyKFSto0qQJACkpKaxfv57+/fubG66Y/F6ODhw4wMqVKwkICDA7UrHq1atXofmY7du3p1evXvTt29ekVMVHBUmAvI/V5s+fz1dffYWXl1f+HAMfHx/c3d1NTlf0vLy8Cs238vDwICAgoNzMwxo6dCi33HILr7zyCt27d2fDhg28/fbbvP3222ZHKxadO3dmwoQJVKtWjfr167NlyxamTp3K448/bna0IpOWlsbBgwfz/3z48GG2bt2Kv78/1apVY8iQIbz88svUqlWL8PBwRo0aRWhoKF26dDEv9HX0V8cfEhJCt27d2Lx5M0uWLMFut+d/X/T398dms5kV+7q60t+Bi0uhi4sLwcHB1K5du7ijFj+zL6OTkgG45OP99983O5ppyttl/oZhGF9//bXRoEEDw9XV1ahTp47x9ttvmx2p2KSkpBiDBw82qlWrZri5uRk1atQwRowYYWRlZZkdrcisXLnykv/u+/TpYxhG3qX+o0aNMoKCggxXV1ejTZs2xr59+8wNfR391fEfPnz4st8XV65caXb06+ZKfwcuVp4u87cYRhleJlZERETkGmiStoiIiMhFVJBERERELqKCJCIiInIRFSQRERGRi6ggiYiIiFxEBUlERETkIipIIiIiIhdRQRIRuUYWi4Uvv/zS7BgiUgRUkESkVHrsscewWCyFHh06dDA7moiUAboXm4iUWh06dOD9998v8Jyrq6tJaUSkLNEZJBEptVxdXQkODi7w8PPzA/I+/po1axYdO3bE3d2dGjVq8NlnnxV4/Y4dO7jrrrtwd3cnICCAJ554grS0tAJj3nvvPerXr4+rqyshISEMHDiwwPaEhAQeeOABKlSoQK1atVi8eHH+tvPnzxMVFUXFihVxd3enVq1ahQqdiJRMKkgiUmaNGjWKrl27sm3bNqKionj44YfZs2cPAOnp6bRv3x4/Pz82btzIokWLWL58eYECNGvWLJ5++mmeeOIJduzYweLFi7nhhhsKvMe4cePo3r0727dv55577iEqKorExMT899+9ezffffcde/bsYdasWQQGBhbfF0BErp3Zd8sVEbkWffr0MZycnAwPD48CjwkTJhiGYRiA8dRTTxV4TWRkpNG/f3/DMAzj7bffNvz8/Iy0tLT87d98841htVqNuLg4wzAMIzQ01BgxYsRlMwDGyJEj8/+clpZmAMZ3331nGIZhdO7c2ejbt+/1OWARKVaagyQipdadd97JrFmzCjzn7++f//8tW7YssK1ly5Zs3boVgD179tC4cWM8PDzyt7dq1QqHw8G+ffuwWCycOnWKNm3a/GWGRo0a5f+/h4cH3t7enDlzBoD+/fvTtWtXNm/eTLt27ejSpQu33HLLNR2riBQvFSQRKbU8PDwKfeR1vbi7u1/VOBcXlwJ/tlgsOBwOADp27MjRo0f59ttvWbZsGW3atOHpp5/m1Vdfve55ReT60hwkESmz1q1bV+jPdevWBaBu3bps27aN9PT0/O1r167FarVSu3ZtvLy8CAsLY8WKFf8oQ8WKFenTpw/z5s1j2rRpvP322/9ofyJSPHQGSURKraysLOLi4go85+zsnD8RetGiRURERNC6dWs+/vhjNmzYwLvvvgtAVFQUY8aMoU+fPowdO5azZ88yaNAgevXqRVBQEABjx47lqaeeolKlSnTs2JHU1FTWrl3LoEGDrirf6NGjadasGfXr1ycrK4slS5bkFzQRKdlUkESk1Fq6dCkhISEFnqtduzZ79+4F8q4wW7BgAQMGDCAkJIRPPvmEevXqAVChQgW+//57Bg8eTPPmzalQoQJdu3Zl6tSp+fvq06cPmZmZvP766zz33HMEBgbSrVu3q85ns9kYPnw4R44cwd3dnVtvvZUFCxZchyMXkaJmMQzDMDuEiMj1ZrFY+OKLL+jSpYvZUUSkFNIcJBEREZGLqCCJiIiIXERzkESkTNLsARH5J3QGSUREROQiKkgiIiIiF1FBEhEREbmICpKIiIjIRVSQRERERC6igiQiIiJyERUkERERkYuoIImIiIhcRAVJRERE5CL/Dx5tEo0dv73/AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Show Validation error rate\n", "for key, epochHistory in epochHistory_dict.items():\n", " val_loss = epochHistory['val']['eval_loss']\n", " val_epoch = epochHistory['val']['epoch']\n", " plt.plot(val_epoch, val_loss, label=key)\n", "plt.title('Training and validation loss')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Loss')\n", "plt.legend()\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "image/png": "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fvzxR65cuVLqa913330AfPrppxbb586dW2jfoq772WefYTAYLLY5OTkBFApGRenXrx+xsbGsWrXKvC0vL4/PPvsMZ2dnunfvXpLbEEJUYVIDJIQokbp169K5c2fWrl0LUCgA3X///bzzzjuMHDmSzp07c/z4cZYvX069evVKfa2wsDAef/xxvvjiC9LS0ujcuTNbt27l/Pnzhfa9//77+e6773Bzc6NJkybs2bOHLVu2FJqZOiwsDI1Gw4cffkhaWhparZZ77rkHb2/vQud85plnWLBgASNGjODgwYOEhISwevVqdu3axdy5c3FxcSn1PZVFZGQk3333HQAHDhwA4L333gNMtVFPPfVUpZZHiJpAApAQosSGDh3K7t27ad++PQ0aNLB47vXXXyczM5MVK1awatUqWrduzfr16297iYtFixbh5eXF8uXL+eWXX7jnnntYv349QUFBFvvNmzcPjUbD8uXLycnJoUuXLmzZsoU+ffpY7Ofr60t4eDgzZ85k1KhRGAwGtm/fXmQAcnBwYMeOHUyZMoWlS5eSnp5OaGgoixcvZsSIEbd1P2Vx6dIl3nzzTYttBV93795dApAQt0GlSC89IYQQQtxhpA+QEEIIIe44EoCEEEIIcceRACSEEEKIO44EICGEEELccSQACSGEEOKOIwFICCGEEHccmQeoCEajkZiYGFxcXEo1fb4QQgghrEdRFK5du4a/v3+hxYz/SwJQEWJiYgpNtiaEEEKI6iE6OprAwMCb7iMBqAgF09xHR0fj6upq5dIIIYQQoiTS09MJCgoq0XI1EoCKUNDs5erqKgFICCGEqGZK0n1FOkELIYQQ4o4jAUgIIYQQdxwJQEIIIYS440gAEkIIIcQdRwKQEEIIIe44EoCEEEIIcceRACSEEEKIO44EICGEEELccSQACSGEEOKOIwFICCGEEHccCUBCCCGEuONIABJCCCHEHUcWQxVCCHFnyc2A3Gtgo81/2INaY+1S3TGMipGYjBjsbeyp7VDbauWQACSEEOLOcC0O/v4EDi6GvBzL51QaUxAyhyItaG4ISEVuszN91NhZfl3ktoJj87fZu4Gzr+nzGirXkEtEWgSX0i9xKfUSF9MucintEhHpEeQacpnQegKjm4+2WvkkAAkhhKjZMuJh1zzY/w3kZZu2qdSgGK/voxhAn2l6VCYnb3D1B9eA/I8F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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Show F1 score improvements\n", "for key, epochHistory in epochHistory_dict.items():\n", " val_f1 = epochHistory['val']['eval_f1']\n", " val_epoch = epochHistory['val']['epoch']\n", " plt.plot(val_epoch, val_f1, label=key)\n", "plt.title('Validation F1')\n", "plt.xlabel('Epochs')\n", "plt.ylabel('F1')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "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.12.3" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }