Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from joblib import load | |
| import unicodedata | |
| import torch | |
| import torch.nn as nn | |
| # Load Encoder and Model | |
| Encoder = load("Country_Encoder") | |
| all_classes = Encoder.classes_ | |
| st.title("Name Classification Based on Last Name") | |
| # Define RNN Model | |
| class SimpleRNN(nn.Module): | |
| def __init__(self, input_size, hidden_size, output_size, num_layers): | |
| super(SimpleRNN, self).__init__() | |
| self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True) | |
| self.dropout = nn.Dropout(0.3) | |
| self.fc = nn.Linear(hidden_size, output_size) | |
| def forward(self, x): | |
| out, _ = self.rnn(x) | |
| out = self.dropout(out[:, -1, :]) # Take last time step output | |
| out = self.fc(out) | |
| return out | |
| # Load Model Weights | |
| model1 = SimpleRNN(1, 256, len(all_classes), 1) # input_size should be 1 for ASCII values | |
| model1.load_state_dict(torch.load("rnn_model.pth", map_location=torch.device('cpu'))) | |
| model1.eval() | |
| # Text Input for Name | |
| name = st.text_input("Enter Last Name") | |
| # Convert Unicode to ASCII | |
| def unicode_to_ascii(s): | |
| s = s.casefold() | |
| return ''.join( | |
| c for c in unicodedata.normalize('NFD', s) | |
| if unicodedata.category(c) != 'Mn' | |
| ) | |
| if st.button("Submit"): | |
| name = unicode_to_ascii(name) | |
| name_ascii = [ord(letter) for letter in name] | |
| # Padding or Truncation to 20 characters | |
| name_ascii = name_ascii[:20] + [0] * (20 - len(name_ascii)) | |
| # Convert to Tensor (reshape for RNN input) | |
| X = torch.tensor(name_ascii, dtype=torch.float32).view(1, 20, 1) # Shape: (batch, sequence, input) | |
| with torch.no_grad(): | |
| pred = model1(X) | |
| # Get Predicted Class | |
| idx = torch.argmax(pred).item() | |
| class_ = all_classes[idx] | |
| st.success(f"Predicted Class: {class_}") |