opinder2906 commited on
Commit
8c1cff0
·
verified ·
1 Parent(s): d8e0023

Update src/inference.py

Browse files
Files changed (1) hide show
  1. src/inference.py +18 -31
src/inference.py CHANGED
@@ -1,43 +1,30 @@
 
1
  import torch
2
  import torch.nn.functional as F
3
- import joblib
4
-
5
  from src.data_processing import clean_text
6
- from src.model_def import EmotionTransformer
7
 
8
- # 1. Load your saved artifacts:
9
- le = joblib.load("label_encoder.pkl")
10
- vocab = joblib.load("vocab.pkl") # saved vocab dict
 
11
 
12
- device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
13
-
14
- # 2. Recreate & load your model
15
- model = EmotionTransformer(
16
- vocab_size=len(vocab), embed_dim=64, num_heads=4,
17
- num_classes=len(le.classes_)
18
- )
19
- model.load_state_dict(
20
- torch.load("emotion_transformer_model.pth", map_location=device)
21
- )
22
  model.eval()
23
- MAX_LEN = 32
24
-
25
- # 3. Preprocess + predict
26
-
27
- def preprocess_input(text):
28
- # note: your pad_sequence logic from the notebook
29
- tokens = clean_text(text).split()
30
- encoded = [vocab.get(tok, vocab['<UNK>']) for tok in tokens]
31
- padded = encoded[:MAX_LEN] + [vocab['<PAD>']] * max(0, MAX_LEN - len(encoded))
32
- return torch.tensor([padded], dtype=torch.long).to(device)
33
 
 
34
 
35
  def predict(text):
36
- x = preprocess_input(text)
37
- # Bayesian-style dropout inference
 
 
 
 
38
  model.train()
39
  with torch.no_grad():
40
  probs = torch.stack([F.softmax(model(x), dim=1) for _ in range(5)])
41
- avg = probs.mean(dim=0)
42
- idx = avg.argmax(dim=1).item()
43
- return le.inverse_transform([idx])[0]
 
1
+ import joblib
2
  import torch
3
  import torch.nn.functional as F
 
 
4
  from src.data_processing import clean_text
5
+ from src.model_def import EmotionTransformer
6
 
7
+ # Load artifacts
8
+ vocab = joblib.load('vocab.pkl')
9
+ le = joblib.load('label_encoder.pkl')
10
+ DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
11
 
12
+ # Recreate model
13
+ model = EmotionTransformer(len(vocab), num_classes=len(le.classes_)).to(DEVICE)
14
+ model.load_state_dict(torch.load('emotion_transformer_model.pth', map_location=DEVICE))
 
 
 
 
 
 
 
15
  model.eval()
 
 
 
 
 
 
 
 
 
 
16
 
17
+ MAX_LEN = 32
18
 
19
  def predict(text):
20
+ toks = clean_text(text).split()
21
+ idxs = [vocab.get(tok,1) for tok in toks]
22
+ pad = (idxs + [0]*MAX_LEN)[:MAX_LEN]
23
+ x = torch.tensor([pad], dtype=torch.long).to(DEVICE)
24
+
25
+ # MC-dropout inference
26
  model.train()
27
  with torch.no_grad():
28
  probs = torch.stack([F.softmax(model(x), dim=1) for _ in range(5)])
29
+ avg = probs.mean(dim=0)
30
+ return le.inverse_transform([avg.argmax().item()])[0]