amanah-chatbot / train_bert.py
DAM20's picture
Update train_bert.py
7d2b95a verified
Raw
History Blame Contribute Delete
3.11 kB
import json
import torch
import random
import numpy as np
from sklearn.model_selection import train_test_split
from transformers import (
AutoTokenizer,
AutoModelForSequenceClassification,
TrainingArguments,
Trainer
)
from collections import Counter
random.seed(42)
np.random.seed(42)
torch.manual_seed(42)
torch.cuda.manual_seed_all(42)
with open("intents_augmented.json", encoding="utf-8") as f:
data = json.load(f)
sentences = []
labels = []
label2id = {}
id2label = {}
for i, intent in enumerate(data["intents"]):
tag = intent["tag"]
label2id[tag] = i
id2label[i] = tag
for pattern in intent["patterns"]:
sentences.append(pattern)
labels.append(i)
counts = Counter(labels)
max_count = min(max(counts.values()), 300)
balanced_sentences = []
balanced_labels = []
for label in set(labels):
label_sentences = [s for s, l in zip(sentences, labels) if l == label]
if len(label_sentences) > max_count:
sampled = random.sample(label_sentences, max_count)
else:
sampled = label_sentences * (max_count // len(label_sentences)) + \
random.sample(label_sentences, max_count % len(label_sentences))
balanced_sentences.extend(sampled)
balanced_labels.extend([label] * max_count)
sentences, labels = balanced_sentences, balanced_labels
train_texts, val_texts, train_labels, val_labels = train_test_split(
sentences, labels, test_size=0.2, random_state=42
)
MODEL_NAME = "aubmindlab/bert-base-arabertv02"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
train_encodings = tokenizer(train_texts, truncation=True, padding=True, max_length=128)
val_encodings = tokenizer(val_texts, truncation=True, padding=True, max_length=128)
class IntentDataset(torch.utils.data.Dataset):
def __init__(self, encodings, labels):
self.encodings = encodings
self.labels = labels
def __len__(self):
return len(self.labels)
def __getitem__(self, idx):
item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
item["labels"] = torch.tensor(self.labels[idx])
return item
train_dataset = IntentDataset(train_encodings, train_labels)
val_dataset = IntentDataset(val_encodings, val_labels)
model = AutoModelForSequenceClassification.from_pretrained(
MODEL_NAME,
num_labels=len(label2id),
id2label=id2label,
label2id=label2id
)
training_args = TrainingArguments(
output_dir="./results",
learning_rate=5e-5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=4,
weight_decay=0.01,
save_strategy="epoch",
logging_dir="./logs",
save_total_limit=2,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset,
tokenizer=tokenizer
)
trainer.train()
model.save_pretrained("./intent_model")
tokenizer.save_pretrained("./intent_model")
print(" تم حفظ النموذج في مجلد intent_model")