Kumarkishalaya's picture
updated the changes (#2)
532ae69 verified
raw
history blame
No virus
7.53 kB
import gradio as gr
import pandas as pd
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import load_model
from huggingface_hub import hf_hub_download
import numpy as np
import tensorflow as tf
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch
# Paths to the uploaded models
repo_id = "himanishprak23/lstm_rnn"
lstm_filename = "model_lstm_4.keras"
rnn_filename = "model_rnn_1.keras"
lstm_model_path = hf_hub_download(repo_id=repo_id, filename=lstm_filename)
rnn_model_path = hf_hub_download(repo_id=repo_id, filename=rnn_filename)
data_text_path = "/Users/himanishprakash/NLP-Application/code/data_preprocess/df_commentary.csv"
# Load the LSTM model
lstm_model = load_model(lstm_model_path)
# Load the RNN model
rnn_model = load_model(rnn_model_path)
# Load the data for tokenizer fitting
data_text = pd.read_csv(data_text_path)
# Check the embedding layer's input dimension for LSTM
embedding_layer = lstm_model.layers[0]
vocab_size = embedding_layer.input_dim
# Initialize and fit the tokenizer with limited vocabulary size
tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(data_text['Modified_Commentary'])
# Define the maximum sequence length (adjust based on your model training)
max_sequence_length = 153
# Define the text generation function for LSTM
def generate_with_lstm(commentary_text, num_words):
# Tokenize the input text
input_sequence = tokenizer.texts_to_sequences([commentary_text])
input_sequence = pad_sequences(input_sequence, maxlen=max_sequence_length)
# Convert to tensor
input_tensor = tf.convert_to_tensor(input_sequence)
# Generate the next words
generated_sequence = []
for _ in range(num_words):
# Get model predictions
output = lstm_model.predict(input_tensor)
# Get the index of the most probable next word
next_word_index = np.argmax(output[0], axis=-1)
# Add the predicted word to the sequence
generated_sequence.append(next_word_index)
# Append the predicted word to the input sequence
input_sequence = np.append(input_sequence[0][1:], next_word_index).reshape(1, -1)
input_tensor = tf.convert_to_tensor(input_sequence)
# Convert indices back to words
reverse_word_index = {value: key for key, value in tokenizer.word_index.items() if value < vocab_size}
generated_words = [reverse_word_index.get(i, '') for i in generated_sequence]
# Combine the input text with the generated words
generated_text = commentary_text + ' ' + ' '.join(generated_words)
return generated_text
# Define the text generation function for RNN
def generate_with_rnn(commentary_text, num_words):
# Tokenize the input text
input_sequence = tokenizer.texts_to_sequences([commentary_text])
input_sequence = pad_sequences(input_sequence, maxlen=max_sequence_length)
# Convert to tensor
input_tensor = tf.convert_to_tensor(input_sequence)
# Generate the next words
generated_sequence = []
for _ in range(num_words):
# Get model predictions
output = rnn_model.predict(input_tensor)
# Get the index of the most probable next word
next_word_index = np.argmax(output[0], axis=-1)
# Add the predicted word to the sequence
generated_sequence.append(next_word_index)
# Append the predicted word to the input sequence
input_sequence = np.append(input_sequence[0][1:], next_word_index).reshape(1, -1)
input_tensor = tf.convert_to_tensor(input_sequence)
# Convert indices back to words
reverse_word_index = {value: key for key, value in tokenizer.word_index.items() if value < vocab_size}
generated_words = [reverse_word_index.get(i, '') for i in generated_sequence]
# Combine the input text with the generated words
generated_text = commentary_text + ' ' + ' '.join(generated_words)
return generated_text
# Load GPT-2 models and tokenizers
trained_tokenizer = GPT2Tokenizer.from_pretrained("Kumarkishalaya/GPT-2-next-word-prediction")
trained_model = GPT2LMHeadModel.from_pretrained("Kumarkishalaya/GPT-2-next-word-prediction")
untrained_tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
untrained_model = GPT2LMHeadModel.from_pretrained("gpt2")
device = "cuda" if torch.cuda.is_available() else "cpu"
trained_model.to(device)
untrained_model.to(device)
# Set pad_token to eos_token
trained_tokenizer.pad_token = trained_tokenizer.eos_token
untrained_tokenizer.pad_token = untrained_tokenizer.eos_token
# Define the text generation function for GPT-2
def generate_with_gpt2(commentary_text, max_length, temperature):
# Generate text using the finetuned model
inputs = trained_tokenizer(commentary_text, return_tensors="pt", padding=True)
input_ids = inputs.input_ids.to(device)
attention_mask = inputs.attention_mask.to(device)
trained_output = trained_model.generate(
input_ids,
max_length=max_length,
num_beams=5,
do_sample=True,
temperature=temperature,
attention_mask=attention_mask,
pad_token_id=trained_tokenizer.eos_token_id
)
trained_text = trained_tokenizer.decode(trained_output[0], skip_special_tokens=True)
# Generate text using the base model
inputs = untrained_tokenizer(commentary_text, return_tensors="pt", padding=True)
input_ids = inputs.input_ids.to(device)
attention_mask = inputs.attention_mask.to(device)
untrained_output = untrained_model.generate(
input_ids,
max_length=max_length,
num_beams=5,
do_sample=True,
temperature=temperature,
attention_mask=attention_mask,
pad_token_id=untrained_tokenizer.eos_token_id
)
untrained_text = untrained_tokenizer.decode(untrained_output[0], skip_special_tokens=True)
return trained_text, untrained_text
# Define the combined function for Gradio interface
def generate_with_all_models(commentary_text, num_words, max_length, temperature):
lstm_output = generate_with_lstm(commentary_text, num_words)
rnn_output = generate_with_rnn(commentary_text, num_words)
gpt2_finetuned_output, gpt2_base_output = generate_with_gpt2(commentary_text, max_length, temperature)
return lstm_output, rnn_output, gpt2_finetuned_output, gpt2_base_output
# Create the Gradio interface
commentrymodel = gr.Interface(
fn=generate_with_all_models,
inputs=[
gr.Textbox(lines=2, placeholder="Enter commentary text here...", label="Prompt"),
gr.Slider(minimum=1, maximum=50, step=1, value=10, label="Number of words to predict (LSTM/RNN)"),
gr.Slider(minimum=10, maximum=100, value=50, step=1, label="Max Length (GPT-2)"),
gr.Slider(minimum=0.01, maximum=1.99, value=0.7, label="Temperature (GPT-2)")
],
outputs=[
gr.Textbox(label="LSTM Model Output"),
gr.Textbox(label="RNN Model Output"),
gr.Textbox(label="GPT-2 Finetuned Model Output"),
gr.Textbox(label="GPT-2 Base Model Output")
],
title="Text Generation with LSTM, RNN, and GPT-2 Models",
description="Start writing a cricket commentary and the models will continue it. Compare outputs from LSTM, RNN, and GPT-2 (finetuned and base) models."
)
# Launch the app
if __name__ == "__main__":
commentrymodel.launch()