import inspect import torch.nn as nn from transformers import AutoConfig, AutoModel, PreTrainedModel from transformers.modeling_outputs import SequenceClassifierOutput from custom_text_config import CustomTextConfig class CustomTextForSequenceClassification(PreTrainedModel): config_class = CustomTextConfig def __init__(self, config: CustomTextConfig): super().__init__(config) if not getattr(config, "_name_or_path", None) and not getattr( config, "_is_meta", False ): self.backbone = AutoModel.from_pretrained(config.backbone_name_or_path) else: backbone_config = AutoConfig.from_pretrained(config.backbone_name_or_path) self.backbone = AutoModel.from_config(backbone_config) hidden_size = self.backbone.config.hidden_size self.classifier = nn.Linear(hidden_size, config.num_labels) self.post_init() def forward( self, input_ids, attention_mask=None, token_type_ids=None, labels=None, **kwargs, ): backbone_inputs = { "input_ids": input_ids, "attention_mask": attention_mask, "token_type_ids": token_type_ids, **kwargs, } accepted_args = set(inspect.signature(self.backbone.forward).parameters) backbone_inputs = { key: value for key, value in backbone_inputs.items() if value is not None and key in accepted_args } outputs = self.backbone(**backbone_inputs) cls_output = outputs.last_hidden_state[:, 0, :] logits = self.classifier(cls_output) loss = None if labels is not None: loss = nn.CrossEntropyLoss()(logits, labels) return SequenceClassifierOutput(loss=loss, logits=logits) CustomTextForSequenceClassification.register_for_auto_class( "AutoModelForSequenceClassification" )