Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -18,7 +18,7 @@ workout_label_map = {
|
|
| 18 |
3: "HIIT"
|
| 19 |
}
|
| 20 |
|
| 21 |
-
|
| 22 |
0: "Energized",
|
| 23 |
1: "Tired",
|
| 24 |
2: "Stressed",
|
|
@@ -32,7 +32,7 @@ soreness_label_map = {
|
|
| 32 |
}
|
| 33 |
|
| 34 |
class MultiHeadBERT(nn.Module):
|
| 35 |
-
def __init__(self, num_workout_types,
|
| 36 |
super(MultiHeadBERT, self).__init__()
|
| 37 |
|
| 38 |
# Shared BERT backbone
|
|
@@ -41,7 +41,7 @@ class MultiHeadBERT(nn.Module):
|
|
| 41 |
|
| 42 |
# Task-specific classification heads
|
| 43 |
self.workout_head = nn.Linear(hidden_size, num_workout_types)
|
| 44 |
-
self.
|
| 45 |
self.soreness_head = nn.Linear(hidden_size, num_soreness_levels)
|
| 46 |
|
| 47 |
self.dropout = nn.Dropout(0.3)
|
|
@@ -58,21 +58,21 @@ class MultiHeadBERT(nn.Module):
|
|
| 58 |
|
| 59 |
# Each head produces its own logits
|
| 60 |
workout_logits = self.workout_head(cls_output)
|
| 61 |
-
|
| 62 |
soreness_logits = self.soreness_head(cls_output)
|
| 63 |
|
| 64 |
-
return workout_logits,
|
| 65 |
|
| 66 |
class PredictRequest(BaseModel):
|
| 67 |
user_input: str
|
| 68 |
|
| 69 |
class PredictResponse(BaseModel):
|
| 70 |
-
workout:
|
| 71 |
-
workout_conf:
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
soreness:
|
| 75 |
-
soreness_conf:
|
| 76 |
|
| 77 |
@app.get("/")
|
| 78 |
def greet_json():
|
|
@@ -82,8 +82,8 @@ def greet_json():
|
|
| 82 |
def predict(request: PredictRequest):
|
| 83 |
|
| 84 |
model = MultiHeadBERT(
|
| 85 |
-
num_workout_types=
|
| 86 |
-
|
| 87 |
num_soreness_levels=3
|
| 88 |
)
|
| 89 |
|
|
@@ -104,34 +104,34 @@ def predict(request: PredictRequest):
|
|
| 104 |
return_tensors='pt'
|
| 105 |
)
|
| 106 |
|
| 107 |
-
input_ids
|
| 108 |
attention_mask = encoding['attention_mask'].to(device)
|
| 109 |
|
| 110 |
with torch.no_grad():
|
| 111 |
-
workout_logits,
|
| 112 |
|
| 113 |
# Convert logits to probabilities
|
| 114 |
workout_probs = torch.softmax(workout_logits, dim=1)
|
| 115 |
-
|
| 116 |
soreness_probs = torch.softmax(soreness_logits, dim=1)
|
| 117 |
|
| 118 |
# Get predicted class and confidence percentage for each head
|
| 119 |
-
workout_conf,
|
| 120 |
-
|
| 121 |
soreness_conf, soreness_pred = soreness_probs.max(dim=1)
|
| 122 |
|
| 123 |
# Map predictions to labels
|
| 124 |
-
predicted_workout
|
| 125 |
-
|
| 126 |
predicted_soreness = soreness_label_map[soreness_logits.argmax().item()]
|
| 127 |
|
| 128 |
|
| 129 |
return PredictResponse(
|
| 130 |
-
workout
|
| 131 |
-
workout_conf
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
soreness
|
| 135 |
-
soreness_conf
|
| 136 |
)
|
| 137 |
|
|
|
|
| 18 |
3: "HIIT"
|
| 19 |
}
|
| 20 |
|
| 21 |
+
mood_label_map = {
|
| 22 |
0: "Energized",
|
| 23 |
1: "Tired",
|
| 24 |
2: "Stressed",
|
|
|
|
| 32 |
}
|
| 33 |
|
| 34 |
class MultiHeadBERT(nn.Module):
|
| 35 |
+
def __init__(self, num_workout_types, num_moods, num_soreness_levels):
|
| 36 |
super(MultiHeadBERT, self).__init__()
|
| 37 |
|
| 38 |
# Shared BERT backbone
|
|
|
|
| 41 |
|
| 42 |
# Task-specific classification heads
|
| 43 |
self.workout_head = nn.Linear(hidden_size, num_workout_types)
|
| 44 |
+
self.mood_head = nn.Linear(hidden_size, num_moods)
|
| 45 |
self.soreness_head = nn.Linear(hidden_size, num_soreness_levels)
|
| 46 |
|
| 47 |
self.dropout = nn.Dropout(0.3)
|
|
|
|
| 58 |
|
| 59 |
# Each head produces its own logits
|
| 60 |
workout_logits = self.workout_head(cls_output)
|
| 61 |
+
mood_logits = self.mood_head(cls_output)
|
| 62 |
soreness_logits = self.soreness_head(cls_output)
|
| 63 |
|
| 64 |
+
return workout_logits, mood_logits, soreness_logits
|
| 65 |
|
| 66 |
class PredictRequest(BaseModel):
|
| 67 |
user_input: str
|
| 68 |
|
| 69 |
class PredictResponse(BaseModel):
|
| 70 |
+
workout: str
|
| 71 |
+
workout_conf: float
|
| 72 |
+
mood: str
|
| 73 |
+
mood_conf: float
|
| 74 |
+
soreness: str
|
| 75 |
+
soreness_conf: float
|
| 76 |
|
| 77 |
@app.get("/")
|
| 78 |
def greet_json():
|
|
|
|
| 82 |
def predict(request: PredictRequest):
|
| 83 |
|
| 84 |
model = MultiHeadBERT(
|
| 85 |
+
num_workout_types=8,
|
| 86 |
+
num_moods=5,
|
| 87 |
num_soreness_levels=3
|
| 88 |
)
|
| 89 |
|
|
|
|
| 104 |
return_tensors='pt'
|
| 105 |
)
|
| 106 |
|
| 107 |
+
input_ids = encoding['input_ids'].to(device)
|
| 108 |
attention_mask = encoding['attention_mask'].to(device)
|
| 109 |
|
| 110 |
with torch.no_grad():
|
| 111 |
+
workout_logits, mood_logits, soreness_logits = model(input_ids, attention_mask)
|
| 112 |
|
| 113 |
# Convert logits to probabilities
|
| 114 |
workout_probs = torch.softmax(workout_logits, dim=1)
|
| 115 |
+
mood_probs = torch.softmax(mood_logits, dim=1)
|
| 116 |
soreness_probs = torch.softmax(soreness_logits, dim=1)
|
| 117 |
|
| 118 |
# Get predicted class and confidence percentage for each head
|
| 119 |
+
workout_conf, workout_pred = workout_probs.max(dim=1)
|
| 120 |
+
mood_conf, mood_pred = mood_probs.max(dim=1)
|
| 121 |
soreness_conf, soreness_pred = soreness_probs.max(dim=1)
|
| 122 |
|
| 123 |
# Map predictions to labels
|
| 124 |
+
predicted_workout = workout_label_map[workout_logits.argmax().item()]
|
| 125 |
+
predicted_mood = mood_label_map[mood_logits.argmax().item()]
|
| 126 |
predicted_soreness = soreness_label_map[soreness_logits.argmax().item()]
|
| 127 |
|
| 128 |
|
| 129 |
return PredictResponse(
|
| 130 |
+
workout = predicted_workout,
|
| 131 |
+
workout_conf = round(workout_conf.item() * 100, 1),
|
| 132 |
+
mood = predicted_mood,
|
| 133 |
+
mood_conf = round(mood_conf.item() * 100, 1),
|
| 134 |
+
soreness = predicted_soreness,
|
| 135 |
+
soreness_conf = round(soreness_conf.item() * 100, 1),
|
| 136 |
)
|
| 137 |
|