SignApp / src /sign_app /disfluency /training.py
SearingShot's picture
Deploy SignApp main app
bb5dd0a
Raw
History Blame Contribute Delete
4.23 kB
from datasets import load_dataset
from transformers import T5Tokenizer, T5ForConditionalGeneration, Seq2SeqTrainer, Seq2SeqTrainingArguments, DataCollatorForSeq2Seq
import mlflow
import evaluate
import nltk
nltk.download('punkt')
bleu = evaluate.load("bleu")
rouge = evaluate.load("rouge")
base_model = "t5-base" # You can choose a larger model like "t5-base" or "t5-large" if you have the resources
tokenizer = T5Tokenizer.from_pretrained(base_model)
transformer_model = T5ForConditionalGeneration.from_pretrained(base_model)
switchboard_dataset = load_dataset("amaai-lab/DisfluencySpeech")
def keep_only_text_columns(example):
return {
"input_text": example["transcript_a"],
"target_text": example["transcript_c"]
}
dataset = switchboard_dataset.map(
keep_only_text_columns,
remove_columns=switchboard_dataset["train"].column_names
)
def is_valid(example):
return (
example["input_text"] is not None
and example["target_text"] is not None
and example["input_text"].strip() != ""
and example["target_text"].strip() != ""
)
dataset = dataset.filter(is_valid)
encoding_max_length = 256
decoding_max_length = 256
def tokenize(sentences):
inputs = ["clean speech: " + text for text in sentences["input_text"]]
model_inputs = tokenizer(inputs, max_length=encoding_max_length, truncation=True, padding="max_length")
labels = tokenizer(
sentences["target_text"],
max_length=decoding_max_length,
truncation=True,
padding="max_length"
)
model_inputs["labels"] = labels["input_ids"]
return model_inputs
tokenized_dataset = dataset.map(
tokenize,batched=True,remove_columns=dataset["train"].column_names
)
data_collator = DataCollatorForSeq2Seq(tokenizer, model=transformer_model)
def compute_metrics(eval_pred):
predictions, labels = eval_pred
decoded_preds = tokenizer.batch_decode(predictions, skip_special_tokens=True)
labels = [[label if label != -100 else tokenizer.pad_token_id for label in l] for l in labels]
decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)
decoded_preds = [pred.strip() for pred in decoded_preds]
decoded_labels = [label.strip() for label in decoded_labels]
bleu_result = bleu.compute(predictions=decoded_preds, references=decoded_labels)
rouge_result = rouge.compute(predictions=decoded_preds, references=decoded_labels)
return {
"bleu": bleu_result["bleu"],
"rouge1": rouge_result["rouge1"],
"rouge2": rouge_result["rouge2"],
"rougeL": rouge_result["rougeL"]
}
training_args = Seq2SeqTrainingArguments(
output_dir="./speechCleaner_t5_model",
eval_strategy="epoch",
save_strategy="epoch",
learning_rate=3e-5,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
num_train_epochs=5,
weight_decay=0.01,
logging_steps=100,
save_total_limit=2,
fp16=True, # Set to True if you have a compatible GPU
report_to="mlflow",
predict_with_generate=True
)
trainer = Seq2SeqTrainer(
model=transformer_model,
args=training_args,
train_dataset=tokenized_dataset["train"],
eval_dataset=tokenized_dataset["validation"],
data_collator=data_collator,
compute_metrics=compute_metrics
)
mlflow.set_tracking_uri("file:./mlruns")
mlflow.set_experiment("speechCleaner_t5_model")
with mlflow.start_run():
trainer.train()
trainer.save_model("./SpeechCleaner_t5_model")
tokenizer.save_pretrained("./SpeechCleaner_t5_model")
# Test the trained model on some example sentences
def clean_text(text: str) -> str:
inputs = tokenizer("clean speech: " + text, return_tensors="pt", truncation=True).input_ids.to(transformer_model.device)
outputs = transformer_model.generate(inputs, max_length=decoding_max_length, num_beams=4, early_stopping=True)
cleaned_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return cleaned_text
print(clean_text("Yeah uh I I don't work but I used to work when I had two children"))
print(clean_text("I want to go to the store um to buy some groceries"))
print(clean_text("So uh the meeting is scheduled for uh next Monday at 10 am"))