Views
No views yet

1# Nécessaire pour télécharger les fichiers depuis Hugging Face
2!pip install torch huggingface_hubEncoderRNN, DecoderRNN, Language, tensor_from_sentence, et la fonction evaluate complètes doivent être incluses dans le script de l'utilisateur pour que le code d'inférence fonctionne.)1import torch
2import json
3from huggingface_hub import hf_hub_download
4
5REPO_ID = "Clemylia/Nac-1"
6FINAL_FILENAME = 'nac1_final_weights.pth'
7VOCAB_FILENAME = "nac1_vocab.json"
8device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
9# ... [Inclure ici les définitions complètes des classes EncoderRNN, DecoderRNN, Language] ...
10
11def load_and_evaluate(sentence: str):
12 """Charge le modèle et exécute la traduction d'une phrase."""
13 # (Logique de hf_hub_download et de load_vocab_and_models ici)
14 # ... [Voir le code de chargement complet pour l'implémentation] ...
15
16 # Exemple d'exécution
17 # encoder, decoder, input_lang, output_lang = load_vocab_and_models(REPO_ID, ...)
18 # return evaluate(encoder, decoder, sentence, input_lang, output_lang)
19
20 # Simuler le chargement réussi et le résultat pour cette documentation
21 return "krosh chata supe domanacafe"
22
23phrase = "le chat dort sur le canapé"
24resultat = load_and_evaluate(phrase)
25print(f'Source: "{phrase}" -> Nacacia: "{resultat}"')(input_sequence, target_sequence)).1# Modifiez ces données pour votre nouveau projet !
2mon_nouveau_projet_data = [
3 ("anglais : the car is red", "langue_inventee : voxta esta reeda"),
4 ("anglais : i love coding", "langue_inventee : amou codio")
5]class EncoderRNN(...)class DecoderRNN(...)class Language(...)prepare_data, tensor_from_sentence)prepare_data sur vos nouvelles données pour obtenir input_lang et output_lang.1# Les tailles sont basées sur VOS données, pas celles de Nac-1.
2nouveau_encodeur = EncoderRNN(input_lang.n_words, HIDDEN_SIZE)
3nouveau_decodeur = DecoderRNN(HIDDEN_SIZE, output_lang.n_words)train()) de Nac-1 avec vos nouveaux modèles et vos nouvelles paires de tenseurs pour entraîner votre propre modèle personnalisé !| Métrique | Encodeur | Décodeur | Total | Note |
|---|---|---|---|---|
Taille Cachée (HIDDEN_SIZE) | 256 | 256 | N/A | Définit la capacité de la mémoire LSTM. |
| Taille Vocabulaire | 117 mots | 123 mots | N/A | Inclut les tokens SOS et EOS. |
| Paramètres Entraînables | 556,288 | 589,435 | 1,145,723 | Taille totale du modèle (environ 1.15 Million). |
nac1_final_weights.pth: Fichier binaire PyTorch contenant les poids optimisés.nac1_vocab.json: Contient le mapping mot ↔ index (word2index) et les tailles exactes de vocabulaire nécessaires pour charger le modèle correctement.README.md: Ce fichier.# Installation des bibliothèques nécessaires
!pip install huggingface_hub
import torch
import torch.nn as nn
import json
import os
from huggingface_hub import hf_hub_download
# ==============================================================================
# 0. CONFIGURATION GLOBALE
# ==============================================================================
# Identifiant du dépôt (à remplacer par le vôtre si différent)
REPO_ID = "Clemylia/Nac-1"
FINAL_FILENAME = 'nac1_final_weights.pth'
VOCAB_FILENAME = "nac1_vocab.json"
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
HIDDEN_SIZE = 256 # Doit correspondre à la taille utilisée lors de l'entraînement
# Tokens Spéciaux (doivent être les mêmes que ceux utilisés dans le vocabulaire)
SOS_token = 0
EOS_token = 1
# ==============================================================================
# 1. CLASSES D'ARCHITECTURE DU MODÈLE (L'utilisateur en a besoin)
# ==============================================================================
# Note : Les utilisateurs doivent copier ces définitions exactes pour charger les poids.
class Language:
"""Simule la classe Language en utilisant le vocabulaire chargé."""
def __init__(self, name, word2index, index2word):
self.name = name
self.word2index = word2index
self.index2word = index2word
self.n_words = len(word2index)
class EncoderRNN(nn.Module):
def __init__(self, input_size, hidden_size):
super().__init__()
self.hidden_size = hidden_size
self.embedding = nn.Embedding(input_size, hidden_size)
self.lstm = nn.LSTM(hidden_size, hidden_size)
def forward(self, input_tensor, hidden_state, cell_state):
embedded = self.embedding(input_tensor).view(1, 1, -1)
output, (hidden_state, cell_state) = self.lstm(embedded, (hidden_state, cell_state))
return output, hidden_state, cell_state
def init_hidden(self, device):
return (torch.zeros(1, 1, self.hidden_size, device=device),
torch.zeros(1, 1, self.hidden_size, device=device))
class DecoderRNN(nn.Module):
def __init__(self, hidden_size, output_size):
super().__init__()
self.hidden_size = hidden_size
self.embedding = nn.Embedding(output_size, hidden_size)
self.lstm = nn.LSTM(hidden_size, hidden_size)
self.out = nn.Linear(hidden_size, output_size)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input_tensor, hidden_state, cell_state):
embedded = self.embedding(input_tensor).view(1, 1, -1)
output, (hidden_state, cell_state) = self.lstm(embedded, (hidden_state, cell_state))
output = self.softmax(self.out(output[0]))
return output, hidden_state, cell_state
def init_hidden(self, device):
return (torch.zeros(1, 1, self.hidden_size, device=device),
torch.zeros(1, 1, self.hidden_size, device=device))
# ==============================================================================
# 2. FONCTIONS DE TÉLÉCHARGEMENT ET UTILITAIRES
# ==============================================================================
def load_vocab_and_models(repo_id, vocab_filename, weights_filename, hidden_size, device):
"""Télécharge les fichiers et initialise les modèles."""
print(f"Téléchargement des fichiers depuis {repo_id}...")
# 1. Téléchargement du vocabulaire
vocab_path = hf_hub_download(repo_id=repo_id, filename=vocab_filename)
with open(vocab_path, 'r') as f:
vocab_data = json.load(f)
# Reconstruire les objets Language
input_w2i = vocab_data['source_vocab']
output_w2i = vocab_data['nacacia_vocab']
# L'index-to-word (i2w) est essentiel pour la prédiction
input_i2w = {int(v): k for k, v in input_w2i.items()}
output_i2w = {int(v): k for k, v in output_w2i.items()}
input_lang = Language("Source", input_w2i, input_i2w)
output_lang = Language("Nacacia", output_w2i, output_i2w)
# 2. Initialisation des modèles
encoder = EncoderRNN(input_lang.n_words, hidden_size).to(device)
decoder = DecoderRNN(hidden_size, output_lang.n_words).to(device)
# 3. Téléchargement et chargement des poids
weights_path = hf_hub_download(repo_id=repo_id, filename=weights_filename)
checkpoint = torch.load(weights_path, map_location=device)
encoder.load_state_dict(checkpoint['encoder_state_dict'])
decoder.load_state_dict(checkpoint['decoder_state_dict'])
encoder.eval() # Mode évaluation
decoder.eval()
print("✅ Modèle Nac-1 chargé et prêt pour l'inférence.")
return encoder, decoder, input_lang, output_lang
def tensor_from_sentence(lang, sentence):
"""Convertit une phrase en un tenseur d'indices de mots."""
# S'assurer que tous les mots sont connus
try:
indexes = [lang.word2index[word] for word in sentence.split(' ')]
except KeyError as e:
raise ValueError(f"Le mot '{e.args[0]}' n'est pas dans le vocabulaire connu du modèle. Échec.")
indexes.append(EOS_token)
return torch.tensor(indexes, dtype=torch.long, device=device).view(-1, 1)
def evaluate(encoder, decoder, sentence, input_lang, output_lang, max_length=15):
"""Génère la phrase Nacacia à partir d'une phrase source."""
with torch.no_grad():
try:
input_tensor = tensor_from_sentence(input_lang, sentence.lower().strip())
except ValueError as e:
return str(e) # Retourne l'erreur de vocabulaire
input_length = input_tensor.size(0)
encoder_hidden, encoder_cell = encoder.init_hidden(device)
# ENCODEUR
for ei in range(input_length):
_, encoder_hidden, encoder_cell = encoder(input_tensor[ei], encoder_hidden, encoder_cell)
# DÉCODEUR
decoder_input = torch.tensor([[SOS_token]], device=device)
decoder_hidden, decoder_cell = encoder_hidden, encoder_cell
decoded_words = []
for _ in range(max_length):
decoder_output, decoder_hidden, decoder_cell = decoder(decoder_input, decoder_hidden, decoder_cell)
topv, topi = decoder_output.data.topk(1)
predicted_index = topi.item()
if predicted_index == EOS_token: break
decoded_words.append(output_lang.index2word[predicted_index])
decoder_input = torch.tensor([[predicted_index]], device=device)
return ' '.join(decoded_words)
# ==============================================================================
# 3. EXÉCUTION POUR L'UTILISATEUR
# ==============================================================================
if __name__ == "__main__":
# 1. Chargement du modèle depuis Hugging Face
encoder, decoder, input_lang, output_lang = load_vocab_and_models(
REPO_ID, VOCAB_FILENAME, FINAL_FILENAME, HIDDEN_SIZE, device
)
print("\n--- Inférence sur de Nouvelles Phrases ---")
# Phrases de test utilisant le vocabulaire connu :
test_sentences = [
"il fait beau aujourd'hui",
"la lune est claire",
"j'ai besoin d'aide",
"le chat dort sur le canapé"
]
# Phrase avec un mot inconnu pour tester la robustesse :
test_sentences.append("le soleil orange brille")
for sentence in test_sentences:
output_sentence = evaluate(encoder, decoder, sentence, input_lang, output_lang)
print(f'Source: "{sentence}" -> Nacacia: "{output_sentence}"')