abhaynb92 commited on
Commit
9be3d96
·
verified ·
1 Parent(s): f3ca18e
Files changed (6) hide show
  1. .gitattributes +35 -35
  2. README.md +102 -14
  3. app.py +44 -0
  4. best_deberta_base.bin +3 -0
  5. model.py +19 -0
  6. requirements.txt +3 -0
.gitattributes CHANGED
@@ -1,35 +1,35 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,14 +1,102 @@
1
- ---
2
- title: 22f1000829 T32025
3
- emoji: 🏆
4
- colorFrom: yellow
5
- colorTo: green
6
- sdk: gradio
7
- sdk_version: 6.0.1
8
- app_file: app.py
9
- pinned: false
10
- license: apache-2.0
11
- short_description: Multi-label emotion detection from text
12
- ---
13
-
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Emotion Classifier – T3 2025 Project
3
+ emoji: 🎭
4
+ colorFrom: yellow
5
+ colorTo: green
6
+ sdk: gradio
7
+ sdk_version: 6.0.1
8
+ app_file: app.py
9
+ pinned: false
10
+ license: apache-2.0
11
+ short_description: Multi-label emotion detection from text
12
+ ---
13
+
14
+ # Emotion Classifier DeBERTa-v3-base
15
+
16
+ This Space hosts a **multi-label emotion classification model** developed as part of the **T3-2025 Deep Learning & GenAI Project** at IIT Madras.
17
+
18
+ The model predicts **five emotions** from English text:
19
+ - **Anger**
20
+ - **Fear**
21
+ - **Joy**
22
+ - **Sadness**
23
+ - **Surprise**
24
+
25
+ [![HuggingFace Space](https://img.shields.io/badge/Hosted%20on-HuggingFace-blue)](https://huggingface.co/spaces/abhaynb92/22f1000829-t32025)
26
+
27
+ ---
28
+
29
+ ## 🔧 Model Overview
30
+
31
+ This project fine-tunes the transformer model
32
+ **`microsoft/deberta-v3-base`**
33
+ for multi-label emotion classification.
34
+
35
+ ### Key Features:
36
+ - Multi-label classification
37
+ - Independent sigmoid outputs
38
+ - **BCEWithLogitsLoss**
39
+ - Independent threshold tuning
40
+ - Stratified train-validation split
41
+ - Tokenization with DeBERTa tokenizer
42
+ - Inference served via Gradio
43
+
44
+ ---
45
+
46
+ ## 📊 Training Summary
47
+
48
+ - **Dataset size:** ~6800 labeled samples
49
+ - **Average text length:** ~15 tokens
50
+ - **Model:** DeBERTa-v3-base
51
+ - **Epochs:** 5
52
+ - **Optimizer:** AdamW
53
+ - **Loss Function:** BCEWithLogitsLoss
54
+ - **Metric:** Macro F1-score
55
+ - **Best Val Macro F1:** **0.83+**
56
+ - Kaggle test performance further improved after threshold smoothing
57
+
58
+ This model contributed to the **Kaggle Performance (KP)** component worth **30 marks** in the DL & GenAI course.
59
+
60
+ ---
61
+
62
+ ## 🚀 Deployment Details
63
+
64
+ This HuggingFace Space runs on:
65
+
66
+ - **CPU Basic** (free)
67
+ - **Gradio** as UI
68
+ - **PyTorch** for inference
69
+ - Direct loading of `best_deberta_base.bin` weights
70
+
71
+ The Gradio app takes text input and returns a dictionary of emotion probabilities.
72
+
73
+ Example:
74
+
75
+ Input:
76
+ "I can’t believe this happened!"
77
+
78
+ Output:
79
+ {
80
+ "anger": 0.14,
81
+ "fear": 0.31,
82
+ "joy": 0.05,
83
+ "sadness": 0.09,
84
+ "surprise": 0.82
85
+ }
86
+
87
+
88
+ ---
89
+
90
+ ## 🗂️ Project Structure
91
+
92
+ app.py # Gradio UI + inference logic
93
+ model.py # PyTorch model architecture
94
+ best_deberta_base.bin # Fine-tuned model weights
95
+ requirements.txt # Python dependencies
96
+ README.md # This documentation
97
+
98
+ app.py # Gradio UI + inference logic
99
+ model.py # PyTorch model architecture
100
+ best_deberta_base.bin # Fine-tuned model weights
101
+ requirements.txt # Python dependencies
102
+ README.md # This documentation
app.py ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import gradio as gr
3
+ from transformers import AutoTokenizer
4
+ from model import EmotionClassifier
5
+
6
+ MODEL_NAME = "microsoft/deberta-v3-base"
7
+ LABELS = ["anger", "fear", "joy", "sadness", "surprise"]
8
+
9
+ # Load tokenizer
10
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
11
+
12
+ # Load model
13
+ model = EmotionClassifier(MODEL_NAME)
14
+ model.load_state_dict(torch.load("best_deberta_base.bin", map_location="cpu"))
15
+ model.eval()
16
+
17
+ def predict_emotions(text):
18
+ inputs = tokenizer(
19
+ text,
20
+ return_tensors="pt",
21
+ truncation=True,
22
+ padding=True,
23
+ max_length=256
24
+ )
25
+
26
+ with torch.no_grad():
27
+ logits = model(
28
+ inputs["input_ids"],
29
+ inputs["attention_mask"]
30
+ )
31
+ probs = torch.sigmoid(logits).squeeze().tolist()
32
+
33
+ # Return label: probability
34
+ return {label: float(prob) for label, prob in zip(LABELS, probs)}
35
+
36
+ iface = gr.Interface(
37
+ fn=predict_emotions,
38
+ inputs=gr.Textbox(lines=3, label="Enter text"),
39
+ outputs=gr.Label(label="Emotion Probabilities"),
40
+ title="Emotion Classifier (DeBERTa-v3-base)",
41
+ description="Predicts emotions: anger, fear, joy, sadness, surprise."
42
+ )
43
+
44
+ iface.launch()
best_deberta_base.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7771265ce676543f5160034f3baaee5e4a44de872e9a744bcc9ebf07a6a9530d
3
+ size 735429146
model.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ from transformers import AutoModel
4
+
5
+ class EmotionClassifier(nn.Module):
6
+ def __init__(self, model_name, num_labels=5):
7
+ super().__init__()
8
+ self.transformer = AutoModel.from_pretrained(model_name)
9
+ hidden_size = self.transformer.config.hidden_size
10
+ self.classifier = nn.Linear(hidden_size, num_labels)
11
+
12
+ def forward(self, input_ids, attention_mask):
13
+ outputs = self.transformer(
14
+ input_ids=input_ids,
15
+ attention_mask=attention_mask
16
+ )
17
+ cls_embeddings = outputs.last_hidden_state[:, 0, :]
18
+ logits = self.classifier(cls_embeddings)
19
+ return logits
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ torch
2
+ transformers==4.36.2
3
+ gradio