| | import torch |
| | import torch.nn as nn |
| | from transformers import AutoModel |
| |
|
| | MODEL_ID = "Omartificial-Intelligence-Space/SA-BERT-V1" |
| |
|
| | class EOUClassifier(nn.Module): |
| | def __init__(self, model_id=MODEL_ID, num_labels=2, use_class_weights=True, pooling="cls"): |
| | super().__init__() |
| | self.num_labels = num_labels |
| | self.pooling = pooling |
| |
|
| | |
| | self.bert = AutoModel.from_pretrained(model_id) |
| |
|
| | self.dropout = nn.Dropout(0.15) |
| | self.layer_1 = nn.Linear(768, 384) |
| | self.act = nn.GELU() |
| | self.layer_2 = nn.Linear(384, num_labels) |
| |
|
| | |
| | self.loss_fn = nn.CrossEntropyLoss() |
| |
|
| |
|
| | def forward(self, input_ids, attention_mask, labels=None): |
| | outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask) |
| |
|
| | if self.pooling == "cls": |
| | pooled = outputs.last_hidden_state[:, 0] |
| | else: |
| | |
| | hidden = outputs.last_hidden_state |
| | mask = attention_mask.unsqueeze(-1) |
| | pooled = (hidden * mask).sum(dim=1) / mask.sum(dim=1) |
| |
|
| | x = self.dropout(pooled) |
| | x = self.layer_1(x) |
| | x = self.act(x) |
| | x = self.dropout(x) |
| | logits = self.layer_2(x) |
| |
|
| | if labels is not None: |
| | loss = self.loss_fn(logits, labels) |
| | return {"loss": loss, "logits": logits} |
| |
|
| | return {"logits": logits} |
| |
|