|
|
--- |
|
|
language: fr |
|
|
license: mit |
|
|
base_model: Clemylia/Limy-basique |
|
|
pipeline_tag: text-classification |
|
|
--- |
|
|
# 📚 Documentation Officielle du Modèle 💖 Limy-mini |
|
|
|
|
|
 |
|
|
|
|
|
Bienvenue dans la documentation de **Limy-mini** \! Cette version représente une étape majeure dans l'amélioration de la famille de modèles Limy, offrant une classification de texte plus **robuste** et **polyvalente** sur nos sujets favoris. |
|
|
|
|
|
----- |
|
|
|
|
|
## 🌟 Vue d'Ensemble du Modèle |
|
|
|
|
|
| Caractéristique | Détail ✨ | |
|
|
| :--- | :--- | |
|
|
| **Identifiant du Dépôt** | `Clemylia/Limy-mini` | |
|
|
| **Modèle de Base (Ancestral)** | `Clemylia/Limy-basique` (Original *from scratch*) | |
|
|
| **Tâche** | Classification de Texte (Text Classification) | |
|
|
| **Classes Détectées** | **0** : Animaux 🐾 (Questions sur la faune) <br> **1** : Capitales 🏙️ (Questions sur la géographie urbaine / les villes) | |
|
|
| **Langue** | Français (fr) 🇫🇷 | |
|
|
| **Licence** | MIT | |
|
|
|
|
|
----- |
|
|
|
|
|
## 🎯 Objectif du Fine-Tuning |
|
|
|
|
|
Le but de **Limy-mini** était de dépasser les limites de la version *basique* en enrichissant ses connaissances. |
|
|
|
|
|
| Objectif | Résultat Obtenu ✅ | |
|
|
| :--- | :--- | |
|
|
| **Robustesse** | Améliorer la capacité du modèle à gérer des phrases complexes, ambiguës ou plus longues. | |
|
|
| **Étendue des Phrases** | Passer d'un ensemble de données très restreint à un jeu d'entraînement de **92 exemples uniques** sur les deux classes. | |
|
|
| **Performance** | Réduire l'erreur de classification (la *loss*) pour une meilleure précision. | |
|
|
|
|
|
**Limy-mini** est désormais apte à détecter et classer un éventail de phrases beaucoup plus large grâce à l'ajout des **80 nouvelles données** de fine-tuning. |
|
|
|
|
|
----- |
|
|
|
|
|
## 🛠️ Comment Utiliser Limy-mini (PyTorch) |
|
|
|
|
|
Puisque Limy-mini est basé sur une architecture `SimpleClassifier` (LSTM/Embedding) personnalisée, son utilisation nécessite de redéfinir la classe et de télécharger les fichiers nécessaires depuis le Hugging Face Hub. |
|
|
|
|
|
### 1\. Définition de l'Architecture (Obligatoire) |
|
|
|
|
|
Tu dois inclure la définition de la classe `SimpleClassifier` et du *tokenizer* dans ton script Python : |
|
|
|
|
|
```python |
|
|
import torch |
|
|
import torch.nn as nn |
|
|
import json |
|
|
from huggingface_hub import hf_hub_download |
|
|
|
|
|
class SimpleClassifier(nn.Module): |
|
|
def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim): |
|
|
super().__init__() |
|
|
self.embedding = nn.Embedding(vocab_size, embedding_dim) |
|
|
self.lstm = nn.LSTM(embedding_dim, hidden_dim) # Pas de batch_first dans ce cas si l'input est (L, 1, H) |
|
|
self.fc = nn.Linear(hidden_dim, output_dim) |
|
|
|
|
|
def forward(self, text): |
|
|
embedded = self.embedding(text) |
|
|
# Adapté pour un batch size de 1, l'input est (Longueur de la phrase, Batch_size=1, Embedding_dim) |
|
|
_, (hidden, _) = self.lstm(embedded.view(len(text), 1, -1)) |
|
|
return self.fc(hidden.squeeze(0)) |
|
|
|
|
|
def simple_tokenizer(text): |
|
|
return text.lower().split() |
|
|
``` |
|
|
|
|
|
### 2\. Chargement du Modèle et Prédiction |
|
|
|
|
|
Tu peux ensuite charger le modèle et l'utiliser pour faire des prédictions. |
|
|
|
|
|
```python |
|
|
# 💖 Étape 2.1 : Configuration du dépôt |
|
|
REPO_ID = "Clemylia/Limy-mini" |
|
|
DEVICE = torch.device("cpu") # Utilisation du CPU (plus simple pour la démo) |
|
|
|
|
|
# 💖 Étape 2.2 : Téléchargement et chargement des fichiers |
|
|
config_path = hf_hub_download(REPO_ID, "config.json") |
|
|
vocab_path = hf_hub_download(REPO_ID, "vocab.json") |
|
|
model_path = hf_hub_download(REPO_ID, "pytorch_model.bin") |
|
|
|
|
|
with open(config_path, 'r') as f: |
|
|
config = json.load(f) |
|
|
with open(vocab_path, 'r') as f: |
|
|
word_to_idx = json.load(f) |
|
|
|
|
|
# 💖 Étape 2.3 : Initialisation et chargement des poids |
|
|
model = SimpleClassifier( |
|
|
vocab_size=config['vocab_size'], |
|
|
embedding_dim=config['embedding_dim'], |
|
|
hidden_dim=config['hidden_dim'], |
|
|
output_dim=config['output_dim'] |
|
|
).to(DEVICE) |
|
|
|
|
|
model.load_state_dict(torch.load(model_path, map_location=DEVICE)) |
|
|
model.eval() # Toujours mettre en mode évaluation pour la prédiction |
|
|
|
|
|
# 💖 Étape 2.4 : Fonction de Prédiction |
|
|
def predict_limy_mini(question): |
|
|
tokens = simple_tokenizer(question) |
|
|
# Remplacement des mots inconnus par l'indice 0 (UNK) |
|
|
token_indices = [word_to_idx.get(token, 0) for token in tokens] |
|
|
# Création du tenseur d'entrée (dtype=torch.long est important pour les indices) |
|
|
input_tensor = torch.tensor(token_indices, dtype=torch.long).to(DEVICE) |
|
|
|
|
|
with torch.no_grad(): |
|
|
output = model(input_tensor.view(-1, 1)) # Assure le format (Longueur, 1) |
|
|
|
|
|
prediction = torch.argmax(output, dim=1).item() |
|
|
|
|
|
# Affichage du résultat |
|
|
if prediction == 0: |
|
|
return f"Prediction : Animaux 🐾 (Classe 0)" |
|
|
elif prediction == 1: |
|
|
return f"Prediction : Capitales 🏙️ (Classe 1)" |
|
|
else: |
|
|
return f"Prediction : Inconnue" |
|
|
|
|
|
# 💖 Exemple d'utilisation |
|
|
result_animaux = predict_limy_mini("Combien de cœurs a une pieuvre ?") |
|
|
result_capitales = predict_limy_mini("Où se trouve la porte de Brandebourg ?") |
|
|
|
|
|
print(f"\nQuestion 1 : {result_animaux}") |
|
|
print(f"Question 2 : {result_capitales}") |
|
|
``` |
|
|
|
|
|
----- |
|
|
|
|
|
## ⚠️ Limitations et Remarques |
|
|
|
|
|
* **Vocabulaire Fixe** : Le modèle utilise le vocabulaire de **Limy-basique**. Si une phrase contient de nombreux mots qui n'étaient pas présents dans le jeu de données initial, ces mots seront remplacés par l'indice `0` (UNK - Inconnu), ce qui pourrait réduire la précision. |
|
|
* **Taille du Modèle** : Il s'agit d'un classifieur très léger (basé sur une architecture de type *Recurrent Neural Network* - RNN), idéal pour les démonstrations ou les appareils à faibles ressources, mais moins performant que les modèles de type *Transformer* (BERT, etc.). |