POSNEGPRETRAINED / train.py
chaosbringerc's picture
Create train.py
cfb39d3 verified
Raw
History Blame Contribute Delete
3.41 kB
### 3. train.py
```python
#!/usr/bin/env python3
"""
Training script for POSNEG dataset sentiment classification
"""
import torch
from torch.utils.data import DataLoader
from transformers import (
AutoTokenizer,
AutoModelForSequenceClassification,
TrainingArguments,
Trainer,
)
from datasets import load_dataset
import numpy as np
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
class POSNEGDataset(torch.utils.data.Dataset):
def __init__(self, texts, labels, tokenizer, max_length=512):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
self.max_length = max_length
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
text = str(self.texts[idx])
label = self.labels[idx]
encoding = self.tokenizer(
text,
truncation=True,
padding='max_length',
max_length=self.max_length,
return_tensors='pt'
)
return {
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'labels': torch.tensor(label, dtype=torch.long)
}
def compute_metrics(eval_pred):
predictions, labels = eval_pred
predictions = np.argmax(predictions, axis=1)
precision, recall, f1, _ = precision_recall_fscore_support(labels, predictions, average='weighted')
acc = accuracy_score(labels, predictions)
return {
'accuracy': acc,
'f1': f1,
'precision': precision,
'recall': recall
}
def main():
# Load POSNEG dataset
print("Loading POSNEG dataset...")
dataset = load_dataset("chaosbringerc/POSNEG") # Your dataset
# Initialize tokenizer and model
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(
model_name,
num_labels=2,
id2label={0: "NEGATIVE", 1: "POSITIVE"},
label2id={"NEGATIVE": 0, "POSITIVE": 1}
)
# Prepare datasets
train_dataset = POSNEGDataset(
texts=dataset['train']['text'],
labels=dataset['train']['label'],
tokenizer=tokenizer
)
eval_dataset = POSNEGDataset(
texts=dataset['validation']['text'],
labels=dataset['validation']['label'],
tokenizer=tokenizer
)
# Training arguments
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
logging_steps=10,
evaluation_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
)
# Initialize trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
compute_metrics=compute_metrics,
)
# Train the model
print("Starting training...")
trainer.train()
# Save the model
print("Saving model...")
trainer.save_model()
tokenizer.save_pretrained('./results')
print("Training completed!")
if __name__ == "__main__":
main()