Spaces:
Running
Running
import torch | |
from torch import nn | |
from transformers import AutoTokenizer, AutoModel, BertConfig | |
class TransformerRegrModel(nn.Module): | |
def __init__(self, base_transformer_model: str, num_classes: int): | |
super().__init__() | |
self.tr_model = base_transformer_model | |
self.num = num_classes | |
self.device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') | |
if self.tr_model not in ['rubert', 'base']: | |
raise Exception('unknown model') | |
elif self.tr_model == 'rubert': | |
self.tokenizer = AutoTokenizer.from_pretrained("cointegrated/rubert-tiny2") | |
self.config = BertConfig.from_pretrained("cointegrated/rubert-tiny2", output_hidden_states=True, | |
output_attentions=True) | |
elif self.tr_model == 'base': | |
self.tokenizer = AutoTokenizer.from_pretrained("ai-forever/ruBert-base", model_max_length=512) | |
self.config = BertConfig.from_pretrained("ai-forever/ruBert-base", output_hidden_states=True, | |
output_attentions=True) | |
self.model = AutoModel.from_config(self.config) | |
self.a1 = nn.ReLU() | |
self.classifier_1 = nn.Linear(self.model.pooler.dense.out_features, self.num) | |
# self.classifier_dropout = nn.Dropout(p=0.2) | |
# self.classifier_2 = nn.Linear(128, self.num) | |
def forward(self, inputs): | |
t = self.tokenizer(inputs, padding=True, truncation=True, return_tensors='pt') | |
tokens = self.tokenizer.convert_ids_to_tokens(t['input_ids'][0]) | |
model_output = self.model(**{k: v.to(self.device) for k, v in t.items()}) | |
attentions = torch.cat(model_output['attentions']).to('cpu') | |
embeddings = model_output.last_hidden_state[:, 0, :] | |
embeddings = torch.nn.functional.normalize(embeddings) | |
outputs = self.a1(embeddings) | |
outputs = self.classifier_1(outputs) | |
# outputs = self.classifier_dropout(outputs) | |
# outputs = self.a1(outputs) | |
# outputs = self.classifier_dropout(outputs) | |
# outputs = self.classifier_2(outputs) | |
return outputs, tokens, attentions | |