Spaces:
Runtime error
Runtime error
| from transformers import GPT2LMHeadModel, TrainingArguments, Trainer, DataCollatorForLanguageModeling, GPT2Tokenizer | |
| import gradio as gr | |
| # Create a list of 30 emoji math problems with their solutions. | |
| # Format: "Q: [emoji math equation]\nA: [solution]" | |
| data = [ | |
| "Q: π + π + π = 12\nA: 4", | |
| "Q: π² + π² = 12\nA: 6", | |
| "Q: π + π + π + π = 20\nA: 5", | |
| "Q: π + π + π + π + π = 15\nA: 3", | |
| "Q: π + π = 8\nA: 4", | |
| "Q: π + π + π = 18\nA: 6", | |
| "Q: π© + π© + π© + π© = 20\nA: 5", | |
| "Q: π + π + π = 9\nA: 3", | |
| "Q: π + π = 14\nA: 7", | |
| "Q: π + π + π = 15\nA: 5", | |
| "Q: πͺ + πͺ + πͺ + πͺ = 16\nA: 4", | |
| "Q: π + π + π = 15\nA: 5", | |
| "Q: π§ + π§ = 10\nA: 5", | |
| "Q: π₯ + π₯ + π₯ = 12\nA: 4", | |
| "Q: π + π = 10\nA: 5", | |
| "Q: π + π + π = 15\nA: 5", | |
| "Q: π + π = 14\nA: 7", | |
| "Q: π + π + π + π = 20\nA: 5", | |
| "Q: π₯ + π₯ = 16\nA: 8", | |
| "Q: π + π + π = 9\nA: 3", | |
| "Q: π + π + π + π = 20\nA: 5", | |
| "Q: π + π = 10\nA: 5", | |
| "Q: π + π + π = 12\nA: 4", | |
| "Q: π + π = 10\nA: 5", | |
| "Q: π₯ + π₯ + π₯ = 15\nA: 5", | |
| "Q: π + π = 8\nA: 4", | |
| "Q: π + π + π + π = 16\nA: 4", | |
| "Q: π₯ + π₯ = 10\nA: 5", | |
| "Q: π½ + π½ + π½ = 9\nA: 3", | |
| "Q: π₯ + π₯ + π₯ + π₯ = 20\nA: 5" | |
| ] | |
| # For training with Hugging Face's datasets, we create a dictionary. | |
| from datasets import Dataset | |
| dataset = Dataset.from_dict({"text": data}) | |
| tokenizer = GPT2Tokenizer.from_pretrained("gpt2") | |
| tokenizer.pad_token = tokenizer.eos_token | |
| def tokenize_function(example): | |
| return tokenizer(example["text"], truncation=True, max_length=128, padding="max_length") | |
| tokenized_dataset = dataset.map(tokenize_function, batched=True) | |
| tokenized_dataset.set_format(type="torch", columns=["input_ids", "attention_mask"]) | |
| # Load GPT-2 model | |
| model = GPT2LMHeadModel.from_pretrained("gpt2") | |
| model.config.pad_token_id = tokenizer.eos_token_id | |
| # Create a data collator for language modeling that will handle padding dynamically | |
| data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False) | |
| # Define training arguments | |
| training_args = TrainingArguments( | |
| output_dir="./emoji_math_model", | |
| overwrite_output_dir=True, | |
| num_train_epochs=8, | |
| per_device_train_batch_size=4, | |
| save_steps=50, | |
| save_total_limit=2, | |
| logging_steps=10, | |
| learning_rate=1e-5 | |
| ) | |
| # Initialize the Trainer | |
| trainer = Trainer( | |
| model=model, | |
| args=training_args, | |
| train_dataset=tokenized_dataset, | |
| data_collator=data_collator, | |
| ) | |
| # Start training | |
| trainer.train() | |
| import logging | |
| logging.getLogger("transformers").setLevel(logging.ERROR) # Suppress transformer warnings | |
| import re | |
| def generate_single_answer(prompt, max_new_tokens=10): | |
| inputs = tokenizer(prompt, return_tensors="pt") | |
| input_ids = inputs["input_ids"].to(model.device) | |
| attention_mask = inputs["attention_mask"].to(model.device) | |
| output = model.generate( | |
| input_ids, | |
| attention_mask=attention_mask, | |
| max_new_tokens=max_new_tokens, | |
| num_return_sequences=1, | |
| eos_token_id=tokenizer.eos_token_id, | |
| pad_token_id=tokenizer.eos_token_id, | |
| do_sample=False, | |
| repetition_penalty=2.0 | |
| ) | |
| generated_text = tokenizer.decode(output[0], skip_special_tokens=True) | |
| if prompt in generated_text: | |
| generated_text = generated_text.split(prompt, 1)[1] | |
| match = re.search(r'\b(\d+)\b', generated_text) | |
| if match: | |
| answer = match.group(1) | |
| else: | |
| answer = generated_text.strip() | |
| return answer | |
| # Gradio UI | |
| def gradio_interface(prompt): | |
| return generate_single_answer(prompt) | |
| iface = gr.Interface(fn=gradio_interface, inputs="text", outputs="text", title="Emoji Math Solver", description="Enter an emoji math problem to get the answer.") | |
| iface.launch() | |