evillegasgarcia commited on
Commit
5ab89cb
·
verified ·
1 Parent(s): 856994d

Create modeling_residue_classification.py

Browse files
Files changed (1) hide show
  1. modeling_residue_classification.py +66 -0
modeling_residue_classification.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ from transformers import PreTrainedModel, AutoModel, T5EncoderModel
4
+ from .configuration_residue_classification import ResidueClassificationConfig # <-- added
5
+
6
+ class ModelForResidueClassification(PreTrainedModel):
7
+ config_class = ResidueClassificationConfig
8
+
9
+ def __init__(self, config): # <-- takes config object, not model_name string
10
+ super().__init__(config)
11
+
12
+ self.model_name = config.model_name
13
+ self.pos_weight = (
14
+ torch.tensor(config.pos_weight)
15
+ if config.pos_weight is not None
16
+ else None
17
+ )
18
+
19
+ # Load backbone
20
+ if any(x in self.model_name for x in ["ankh", "T5", "t5"]):
21
+ self.model = T5EncoderModel.from_pretrained(self.model_name)
22
+ self.hidden_size = self.model.config.hidden_size
23
+
24
+ elif "esm3" in self.model_name:
25
+ from esm.models.esm3 import ESM3
26
+ self.model = ESM3.from_pretrained("esm3_sm_open_v1").float()
27
+ self.hidden_size = self.model.encoder.sequence_embed.weight.shape[1]
28
+
29
+ else:
30
+ self.model = AutoModel.from_pretrained(self.model_name)
31
+ self.hidden_size = self.model.config.hidden_size
32
+
33
+ self.scaler = nn.LayerNorm(self.hidden_size)
34
+ self.classifier = nn.Linear(self.hidden_size, 1)
35
+
36
+ self.post_init()
37
+
38
+ def forward(self, input_ids=None, attention_mask=None, labels=None):
39
+
40
+ if "esm3" in self.model_name:
41
+ outputs = self.model(sequence_tokens=input_ids)
42
+ hidden_states = outputs.embeddings
43
+ else:
44
+ outputs = self.model(
45
+ input_ids=input_ids,
46
+ attention_mask=attention_mask,
47
+ )
48
+ hidden_states = outputs.last_hidden_state
49
+
50
+ scaled_hidden_states = self.scaler(hidden_states)
51
+ logits = self.classifier(scaled_hidden_states).squeeze(-1)
52
+
53
+ loss = None
54
+ if labels is not None:
55
+ mask = labels != -100
56
+ logits_masked = logits[mask]
57
+ labels_masked = labels[mask]
58
+
59
+ loss_fn = nn.BCEWithLogitsLoss(
60
+ pos_weight=self.pos_weight.to(logits.device)
61
+ if self.pos_weight is not None
62
+ else None
63
+ )
64
+ loss = loss_fn(logits_masked, labels_masked)
65
+
66
+ return {"loss": loss, "logits": logits}