sentiment-analysis/training/aclimdb-sentiment-training.ipynb: update
This commit is contained in:
parent
2327a88228
commit
e1fbb3687f
1 changed files with 62 additions and 20 deletions
|
|
@ -27,8 +27,8 @@
|
||||||
"import os\n",
|
"import os\n",
|
||||||
"import pandas as pd\n",
|
"import pandas as pd\n",
|
||||||
"\n",
|
"\n",
|
||||||
"imdb_train_dataset = \"aclimdb/train\"\n",
|
"imdb_train_dataset = 'aclimdb/train'\n",
|
||||||
"imdb_test_dataset = \"aclimdb/test\"\n",
|
"imdb_test_dataset = 'aclimdb/test'\n",
|
||||||
"\n",
|
"\n",
|
||||||
"train_reviews = []\n",
|
"train_reviews = []\n",
|
||||||
"train_scores = []\n",
|
"train_scores = []\n",
|
||||||
|
|
@ -118,7 +118,7 @@
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"print(f\"Length training set: {len(df_train)}\\nLength testing set: {len(df_test)}\")"
|
"print(f'Length training set: {len(df_train)}\\nLength testing set: {len(df_test)}')"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -136,31 +136,67 @@
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"import torch\n",
|
"import torch\n",
|
||||||
"from transformers import DistilBertTokenizerFast\n",
|
"from torch.utils.data import DataLoader, TensorDataset\n",
|
||||||
"from torch.utils.data import DataLoader\n",
|
"from transformers import (\n",
|
||||||
"from transformers import DistilBertForSequenceClassification\n",
|
" DistilBertTokenizerFast,\n",
|
||||||
|
" DistilBertForSequenceClassification\n",
|
||||||
|
")\n",
|
||||||
"\n",
|
"\n",
|
||||||
"model_name = \"distilbert-base-uncased\"\n",
|
"# Set device cuda\n",
|
||||||
|
"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
|
||||||
|
"print('Using:', device)\n",
|
||||||
|
"\n",
|
||||||
|
"# Define model\n",
|
||||||
|
"model_name = 'distilbert-base-uncased'\n",
|
||||||
"tokenizer = DistilBertTokenizerFast.from_pretrained(model_name)\n",
|
"tokenizer = DistilBertTokenizerFast.from_pretrained(model_name)\n",
|
||||||
"\n",
|
"\n",
|
||||||
"# Tokenize and encode the text data\n",
|
"# Tokenize and encode the text data\n",
|
||||||
"train_encodings = tokenizer(df_train['text'].tolist(), truncation=True, padding=True, return_tensors='pt')\n",
|
"train_encodings = tokenizer(\n",
|
||||||
"test_encodings = tokenizer(df_test['text'].tolist(), truncation=True, padding=True, return_tensors='pt')\n",
|
" df_train['text'].tolist(), \n",
|
||||||
|
" truncation=True, \n",
|
||||||
|
" padding=True, \n",
|
||||||
|
" return_tensors='pt'\n",
|
||||||
|
")\n",
|
||||||
"\n",
|
"\n",
|
||||||
"# Create data loaders\n",
|
"test_encodings = tokenizer(\n",
|
||||||
"train_dataset = torch.utils.data.TensorDataset(\n",
|
" df_test['text'].tolist(), \n",
|
||||||
|
" truncation=True, \n",
|
||||||
|
" padding=True, \n",
|
||||||
|
" return_tensors='pt'\n",
|
||||||
|
")\n",
|
||||||
|
"\n",
|
||||||
|
"# Create tensor dataset\n",
|
||||||
|
"train_dataset = TensorDataset(\n",
|
||||||
" train_encodings['input_ids'], \n",
|
" train_encodings['input_ids'], \n",
|
||||||
" train_encodings['attention_mask'], \n",
|
" train_encodings['attention_mask'], \n",
|
||||||
" torch.tensor(df_train['s'].values, dtype=torch.float32)\n",
|
" torch.tensor(df_train['s'].values, dtype=torch.float32)\n",
|
||||||
")\n",
|
")\n",
|
||||||
"train_dataloader = DataLoader(train_dataset, batch_size=25, shuffle=True)\n",
|
|
||||||
"\n",
|
"\n",
|
||||||
"test_dataset = torch.utils.data.TensorDataset(\n",
|
"test_dataset = TensorDataset(\n",
|
||||||
" test_encodings['input_ids'], \n",
|
" test_encodings['input_ids'], \n",
|
||||||
" test_encodings['attention_mask'], \n",
|
" test_encodings['attention_mask'], \n",
|
||||||
" torch.tensor(df_test['s'].values, dtype=torch.float32)\n",
|
" torch.tensor(df_test['s'].values, dtype=torch.float32)\n",
|
||||||
")\n",
|
")\n",
|
||||||
"test_dataloader = DataLoader(test_dataset, batch_size=25, shuffle=False)"
|
"\n",
|
||||||
|
"# Create data loaders\n",
|
||||||
|
"if device == 'cuda':\n",
|
||||||
|
" en_pin_memory = True\n",
|
||||||
|
"else:\n",
|
||||||
|
" en_pin_memory = False\n",
|
||||||
|
"\n",
|
||||||
|
"train_dataloader = DataLoader(\n",
|
||||||
|
" train_dataset, \n",
|
||||||
|
" batch_size=10, \n",
|
||||||
|
" shuffle=True,\n",
|
||||||
|
" pin_memory=en_pin_memory\n",
|
||||||
|
")\n",
|
||||||
|
"\n",
|
||||||
|
"test_dataloader = DataLoader(\n",
|
||||||
|
" test_dataset, \n",
|
||||||
|
" batch_size=10, \n",
|
||||||
|
" shuffle=False,\n",
|
||||||
|
" pin_memory=en_pin_memory\n",
|
||||||
|
")"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -177,7 +213,10 @@
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"model = DistilBertForSequenceClassification.from_pretrained(model_name, num_labels=1)"
|
"model = DistilBertForSequenceClassification.from_pretrained(\n",
|
||||||
|
" model_name, \n",
|
||||||
|
" num_labels=1\n",
|
||||||
|
").to(device)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -235,7 +274,7 @@
|
||||||
" for batch in train_dataloader:\n",
|
" for batch in train_dataloader:\n",
|
||||||
" global_step += 1\n",
|
" global_step += 1\n",
|
||||||
" num_batches += 1\n",
|
" num_batches += 1\n",
|
||||||
" input_ids, attention_mask, target_scores = batch\n",
|
" input_ids, attention_mask, target_scores = [x.to(device) for x in batch]\n",
|
||||||
"\n",
|
"\n",
|
||||||
" # Forward pass\n",
|
" # Forward pass\n",
|
||||||
" output = model(input_ids=input_ids, attention_mask=attention_mask)\n",
|
" output = model(input_ids=input_ids, attention_mask=attention_mask)\n",
|
||||||
|
|
@ -270,7 +309,7 @@
|
||||||
"\n",
|
"\n",
|
||||||
" for batch in test_dataloader:\n",
|
" for batch in test_dataloader:\n",
|
||||||
" with torch.no_grad():\n",
|
" with torch.no_grad():\n",
|
||||||
" input_ids, attention_mask, target_scores = batch\n",
|
" input_ids, attention_mask, target_scores = [x.to(device) for x in batch]\n",
|
||||||
"\n",
|
"\n",
|
||||||
" # Obtaining the scores\n",
|
" # Obtaining the scores\n",
|
||||||
" output = model(input_ids=input_ids, attention_mask=attention_mask)\n",
|
" output = model(input_ids=input_ids, attention_mask=attention_mask)\n",
|
||||||
|
|
@ -290,7 +329,7 @@
|
||||||
" print(f\"Epoch {epoch + 1}/{num_epochs}, Validation loss: {average_loss:.4f}\\n\")\n",
|
" print(f\"Epoch {epoch + 1}/{num_epochs}, Validation loss: {average_loss:.4f}\\n\")\n",
|
||||||
"\n",
|
"\n",
|
||||||
" # Saving the model\n",
|
" # Saving the model\n",
|
||||||
" torch.save(model, f'bert-aclimdb/{epoch + 1}.pth')\n",
|
" torch.save(model.state_dict(), f'bert-aclimdb/{epoch + 1}.pth')\n",
|
||||||
"\n",
|
"\n",
|
||||||
" # Early stopping check\n",
|
" # Early stopping check\n",
|
||||||
" if average_loss < best_validation_loss:\n",
|
" if average_loss < best_validation_loss:\n",
|
||||||
|
|
@ -300,6 +339,7 @@
|
||||||
" no_improvement_counter += 1\n",
|
" no_improvement_counter += 1\n",
|
||||||
"\n",
|
"\n",
|
||||||
" if no_improvement_counter >= early_stop_patience:\n",
|
" if no_improvement_counter >= early_stop_patience:\n",
|
||||||
|
" print('Early stopping triggered')\n",
|
||||||
" break\n",
|
" break\n",
|
||||||
"\n",
|
"\n",
|
||||||
"writer.close()"
|
"writer.close()"
|
||||||
|
|
@ -319,7 +359,9 @@
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"model = torch.load('bert-aclimdb/4.pth')"
|
"model = DistilBertForSequenceClassification.from_pretrained(model_name, num_labels=1)\n",
|
||||||
|
"model.load_state_dict(torch.load('...', map_location=device))\n",
|
||||||
|
"model.to(device)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -344,7 +386,7 @@
|
||||||
"\n",
|
"\n",
|
||||||
"for batch in test_dataloader:\n",
|
"for batch in test_dataloader:\n",
|
||||||
" with torch.no_grad():\n",
|
" with torch.no_grad():\n",
|
||||||
" input_ids, attention_mask, scores = batch\n",
|
" input_ids, attention_mask, scores = [x.to(device) for x in batch]\n",
|
||||||
"\n",
|
"\n",
|
||||||
" # Obtaining the scores\n",
|
" # Obtaining the scores\n",
|
||||||
" output = model(input_ids=input_ids, attention_mask=attention_mask)\n",
|
" output = model(input_ids=input_ids, attention_mask=attention_mask)\n",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue