IntentoProyecto / proyecto.py
RodrigoGariv's picture
Create proyecto.py
3428531 verified
# --- PASO 0: Instalación de Librerías ---
# Descomenta y ejecuta esta celda si no tienes las librerías instaladas
# !pip install transformers datasets accelerate -U
# !pip install sentencepiece # Necesario para algunos tokenizers como el de mT5
import datasets
from datasets import Dataset
from transformers import (
AutoTokenizer,
AutoModelForSeq2SeqLM,
Seq2SeqTrainingArguments,
Seq2SeqTrainer,
DataCollatorForSeq2Seq
)
# --- PASO 1: Preparar el Dataset (¡¡¡REEMPLAZAR CON TU DATASET REAL!!!) ---
# Este es un EJEMPLO MUY PEQUEÑO. Necesitas un dataset GRANDE y REAL.
# Tu dataset debería tener miles de ejemplos.
raw_data = {
"train": [
{"input_text": "El medico me receto analgesicos.", "target_text": "El médico me recetó analgésicos."},
{"input_text": "La cancion tiene una melodia pegadiza.", "target_text": "La canción tiene una melodía pegadiza."},
{"input_text": "La accion legal continuo.", "target_text": "La acción legal continuó."},
{"input_text": "Manana habra reunion.", "target_text": "Mañana habrá reunión."},
# ... Agrega MUCHOS MÁS ejemplos aquí ...
],
"validation": [
{"input_text": "La informacion es util.", "target_text": "La información es útil."},
{"input_text": "El analisis fue complejo.", "target_text": "El análisis fue complejo."},
# ... Agrega ejemplos de validación ...
]
}
# Convertir el diccionario a un objeto Dataset de Hugging Face
raw_datasets = datasets.DatasetDict({
"train": Dataset.from_dict(raw_data["train"]),
"validation": Dataset.from_dict(raw_data["validation"])
})
print("Dataset de ejemplo cargado:")
print(raw_datasets)
# --- PASO 2: Cargar Tokenizer y Modelo ---
# Elegimos un modelo Seq2Seq preentrenado. mT5-small es relativamente ligero.
# Para mejores resultados, considera modelos más grandes o específicos para español si están disponibles.
model_checkpoint = "google/mt5-small"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint, legacy=False) # legacy=False recomendado para T5
model = AutoModelForSeq2SeqLM.from_pretrained(model_checkpoint)
# --- PASO 3: Preprocesar el Dataset ---
max_input_length = 128
max_target_length = 128
def preprocess_function(examples):
# Asegurarse que los textos son strings
inputs = [str(ex) for ex in examples["input_text"]]
targets = [str(ex) for ex in examples["target_text"]]
# Tokenizar entradas
model_inputs = tokenizer(inputs, max_length=max_input_length, truncation=True, padding="max_length")
# Tokenizar salidas (targets) como etiquetas
# Usamos el tokenizer en modo "target" para preparar las labels correctamente para el decoder
with tokenizer.as_target_tokenizer():
labels = tokenizer(targets, max_length=max_target_length, truncation=True, padding="max_length")
# Los IDs de padding en las etiquetas deben ser ignorados en la función de pérdida
# Reemplazamos los pad_token_id por -100
labels["input_ids"] = [
[(l if l != tokenizer.pad_token_id else -100) for l in label] for label in labels["input_ids"]
]
model_inputs["labels"] = labels["input_ids"]
return model_inputs
# Aplicar la función de preprocesamiento a todo el dataset
tokenized_datasets = raw_datasets.map(preprocess_function, batched=True)
print("\nDataset tokenizado:")
print(tokenized_datasets)
# --- PASO 4: Configurar el Entrenamiento ---
# Directorio donde se guardarán los resultados y checkpoints
output_dir = "./results-accent-corrector"
# Argumentos de entrenamiento
training_args = Seq2SeqTrainingArguments(
output_dir=output_dir,
evaluation_strategy="epoch", # Evaluar después de cada época
learning_rate=2e-5, # Tasa de aprendizaje
per_device_train_batch_size=8, # Tamaño de lote por GPU/CPU para entrenamiento (ajusta según tu memoria)
per_device_eval_batch_size=8, # Tamaño de lote por GPU/CPU para evaluación
weight_decay=0.01, # Decaimiento de peso
save_total_limit=3, # Guardar solo los últimos 3 checkpoints
num_train_epochs=3, # Número de épocas (ajusta según tu dataset y convergencia)
predict_with_generate=True, # Necesario para generar texto durante la evaluación Seq2Seq
fp16=False, # Cambiar a True si tienes GPU compatible y quieres acelerar (requiere 'accelerate')
logging_steps=10, # Frecuencia de logging
# report_to="tensorboard", # Opcional: para visualizar en TensorBoard
# push_to_hub=False, # Cambiar a True para subir tu modelo al Hub de Hugging Face (necesitas login)
)
# Data Collator: prepara los lotes de datos para el modelo Seq2Seq
data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=model)
# Crear el objeto Trainer
trainer = Seq2SeqTrainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
tokenizer=tokenizer,
data_collator=data_collator,
# compute_metrics=compute_metrics, # Opcional: define una función para métricas más avanzadas
)
# --- PASO 5: Entrenar el Modelo ---
print("\nIniciando entrenamiento...")
trainer.train()
print("Entrenamiento completado.")
# --- PASO 6: Guardar el Modelo Final y Tokenizer ---
final_model_path = f"{output_dir}/final_model"
trainer.save_model(final_model_path)
tokenizer.save_pretrained(final_model_path)
print(f"Modelo final y tokenizer guardados en: {final_model_path}")
# --- PASO 7: Probar el Modelo Entrenado (Inferencia) ---
from transformers import pipeline
print("\nProbando el modelo afinado...")
# Cargar el pipeline con el modelo afinado localmente
# Si el entrenamiento fue corto o con pocos datos, el resultado puede no ser bueno.
corrector_pipe = pipeline("text2text-generation", model=final_model_path, tokenizer=final_model_path)
# Frases de ejemplo sin acentos
test_sentences = [
"Que dia es manana?",
"La musica clasica me relaja.",
"El exito requiere dedicacion.",
"accion" # El ejemplo original del usuario
]
for sentence in test_sentences:
result = corrector_pipe(sentence, max_length=50) # Ajusta max_length si es necesario
corrected_text = result[0]['generated_text']
print(f"Entrada: {sentence}")
print(f"Salida: {corrected_text}")
print("---")
print("\n¡Proceso terminado!")