SummaryProject / src /script.py
EveSa's picture
Initial Commit
ad78747
raw
history blame
No virus
2.96 kB
"""
DONE :
- Separer la partie vectoriser du Classifeur
- Ajouter un LSTM au Classifieur
- entrainer le Classifieur
TO DO :
- Améliorer les résultats du modèle
"""
import logging
import random
from typing import Sequence
import torch
import dataloader
from model import Decoder, Encoder, EncoderDecoderModel
from train import train_network
# logging INFO, WARNING, ERROR, CRITICAL, DEBUG
logging.basicConfig(level=logging.INFO)
logging.disable(level=10)
import os
os.environ[
"CUBLAS_WORKSPACE_CONFIG"
] = ":16:8" # pour que ça marche en deterministe sur mon pc boulot
# variable environnement dans git bash export CUBLAS_WORKSPACE_CONFIG=:16:8
# from datasets import load_dataset
### OPEN DATASET###
# dataset = load_dataset("newsroom", data_dir=DATA_PATH, data_files="data/train.jsonl")
data1 = dataloader.Data("data/train_extract.jsonl")
data2 = dataloader.Data("data/dev_extract.jsonl")
train_dataset = data1.make_dataset()
dev_dataset = data2.make_dataset()
words = data1.get_words()
vectoriser = dataloader.Vectoriser(words)
word_counts = vectoriser.word_count
def predict(model, tokens: Sequence[str]) -> Sequence[str]:
"""Predict the POS for a tokenized sequence"""
words_idx = vectoriser.encode(tokens).to(device)
# Pas de calcul de gradient ici : c'est juste pour les prédictions
with torch.no_grad():
# equivalent to model(input) when called out of class
out = model(words_idx).to(device)
out_predictions = out.to(device)
return vectoriser.decode(out_predictions)
if __name__ == "__main__":
### NEURAL NETWORK ###
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print("Device check. You are using:", device)
### RÉSEAU ENTRAÎNÉ ###
# Pour s'assurer que les résultats seront les mêmes à chaque run du notebook
torch.use_deterministic_algorithms(True)
torch.manual_seed(0)
random.seed(0)
# On peut également entraîner encoder séparemment
encoder = Encoder(len(vectoriser.idx_to_token) + 1, 256, 512, 0.5, device)
decoder = Decoder(len(vectoriser.idx_to_token) + 1, 256, 512, 0.5, device)
# S'ils sont entraînés, on peut les sauvegarder
torch.save(encoder.state_dict(), "model/encoder.pt")
torch.save(encoder.state_dict(), "model/encoder.pt")
trained_classifier = EncoderDecoderModel(encoder, decoder, device).to(device)
print(next(trained_classifier.parameters()).device)
# print(train_dataset.is_cuda)
train_network(
trained_classifier,
[vectoriser.vectorize(row) for index, row in train_dataset.iterrows()],
[vectoriser.vectorize(row) for index, row in dev_dataset.iterrows()],
5,
)
torch.save(trained_classifier.state_dict(), "model/model.pt")
print(f'test text : {dev_dataset.iloc[6]["summary"]}')
print(
f'test prediction : {predict(trained_classifier, dev_dataset.iloc[6]["text"])}'
)