o
    ߥi$
                     @   s   d dl mZ d dlZd dlm  mZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZ d d	lmZ ejeje
jd
ejeje
jd
ejeje
jd
G dd deZdS )    )DictN)nn)CrossEntropyLoss)Heads)	TorchHead)HEADS)'AttentionTokenClassificationModelOutputModelOutputBase
OutputKeys)Tasks)module_namec                       sN   e Zd Z			d fdd	Z		ddefddZd	ejd
ejfddZ  Z	S )TokenClassificationHead   皙?Nc                    s<   t  j|||d |d usJ t|| _t||| _d S )N)
num_labelsclassifier_dropouthidden_size)super__init__r   DropoutdropoutLinear
classifier)selfr   r   r   kwargs	__class__ i/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/nlp/heads/token_classification_head.pyr      s   z TokenClassificationHead.__init__inputsc                 K   sH   |j }| |}| |}d }|d ur| |||}t|||j|jdS )N)losslogitshidden_states
attentions)last_hidden_stater   r   compute_lossr   r"   r#   )r   r   attention_masklabelsr   sequence_outputr!   r    r   r   r   forward'   s   

zTokenClassificationHead.forwardr!   returnc           	      C   sx   t  }|d ur-|ddk}|d| j}t||dt|j|}|||}|S ||d| j|d}|S )N   )r   viewr   torchwheretensorignore_indextype_as)	r   r!   r&   r'   loss_fctactive_lossactive_logitsactive_labelsr    r   r   r   r%   9   s   

z$TokenClassificationHead.compute_loss)r   r   N)NN)
__name__
__module____qualname__r   r	   r)   r.   Tensorr%   __classcell__r   r   r   r   r      s    	
r   )typingr   r.   torch.nn.functionalr   
functionalFtorch.nnr   modelscope.metainfor   modelscope.models.baser   modelscope.models.builderr   modelscope.outputsr   r	   r
   modelscope.utils.constantr   register_moduletoken_classificationnamed_entity_recognitionpart_of_speechr   r   r   r   r   <module>   s(   