import torch import torch.nn as nn from transformers import ( AutoModel, PreTrainedModel ) from transformers.modeling_outputs import SequenceClassifierOutput from .configuration_veritas import BERTClassifierConfig from transformers import AutoModel, AutoConfig class BERTClassifier(PreTrainedModel): config_class = BERTClassifierConfig def __init__(self, config): super().__init__(config) bert_config = AutoConfig.from_pretrained( "neuralmind/bert-base-portuguese-cased" ) self.bert = AutoModel.from_config(bert_config) for param in self.bert.encoder.layer[:6].parameters(): param.requires_grad = False hidden = self.bert.config.hidden_size self.classifier = nn.Sequential( nn.Linear(hidden, 32), nn.GELU(), nn.Dropout(config.drop_rate), nn.Linear(32, 16), nn.GELU(), nn.Linear(16, config.num_labels) ) self.post_init() def forward( self, input_ids=None, attention_mask=None, labels=None ): outputs = self.bert( input_ids=input_ids, attention_mask=attention_mask ) pooler = outputs.last_hidden_state[:, 0, :] logits = self.classifier(pooler) loss = None if labels is not None: loss_fn = nn.CrossEntropyLoss() loss = loss_fn(logits, labels) return SequenceClassifierOutput( loss=loss, logits=logits )