Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
HJHGJGHHG
GitHub Repository: HJHGJGHHG/CCF-BDCI-AQYI
Path: blob/main/models/__pycache__/layers.cpython-38.pyc
153 views
U

1$za�"�@sxddlZddlZddlmZddlmmZGdd�dej�ZGdd�dej�Z	Gdd�de	�Z
Gdd	�d	ej�ZdS)
�Ncs*eZdZdZd�fdd�	Zdd�Z�ZS)�SqueezeEmbeddingzK
    Squeeze sequence embedding length to the longest one in the batch
    Tcstt|���||_dS�N)�superr�__init__�batch_first)�selfr��	__class__�� D:\CCF-BDCI\AQY\models\layers.pyrszSqueezeEmbedding.__init__cCs|t�|�d��}t�|�d��}||}||}tjjjj||��|jd�}tjjjj	||jd�}|d}||}|S)z�
        sequence -> sort -> pad and pack -> unpack ->unsort
        :param x: sequence embedding vectors
        :param x_len: numpy/tensor list
        :return:
        ��rr)
�torch�sort�long�nn�utils�rnn�pack_padded_sequence�cpur�pad_packed_sequence)r�x�x_len�
x_sort_idx�x_unsort_idx�x_emb_p�outr
r
r�forwardszSqueezeEmbedding.forward)T)�__name__�
__module__�__qualname__�__doc__rr�
__classcell__r
r
rrrsrcs.eZdZd�fdd�	Zdd�Zd	d
�Z�ZS)�	AttentionNr�dot_productrcs�tt|���|dkr||}|dkr*|}||_||_||_||_t�|||�|_	t�|||�|_
t�|||�|_t�|�|_
|dkr�t�t�|d��|_n,|jdkr�t�t�||��|_n|�dd�|��dS)a$ Attention Mechanism
        :param embed_dim:
        :param hidden_dim:
        :param out_dim:
        :param n_head: num of head (Multi-Head Attention)
        :param score_function: scaled_dot_product / mlp (concat) / bi_linear (general dot)
        :return (?, q_len, out_dim,)
        N�mlp��	bi_linear�weight)rr#r�	embed_dim�
hidden_dim�n_head�score_functionr�Linear�w_k�w_q�proj�Dropout�dropout�	Parameterr�Tensorr(�register_parameter�reset_parameters)rr)r*�out_dimr+r,r2rr
rr's&	
zAttention.__init__cCs0dt�|j�}|jdk	r,|jj�||�dS�Ng�?)�math�sqrtr*r(�data�uniform_�r�stdvr
r
rr6Es
zAttention.reset_parameterscCs"t|j�dkrtj|dd�}t|j�dkr8tj|dd�}|jd}|jd}|jd}|�|��|||j|j�}|�dddd��	��d||j�}|�
|��|||j|j�}|�dddd��	��d||j�}|jdkr�|�ddd�}t�||�}	n�|jdk�r,|�ddd�}t�||�}
t�
|
t�|j��}	n�|jd	k�r�tj|dd��d|dd�}tj|dd��dd|d�}tj||fdd�}
t�t�|
|j��}	n>|jd
k�r�t�||j�}|�ddd�}t�||�}	ntd��tj|	dd�}	t�|	|�}tjtj||dd�dd�}|�|�}|�|�}||	fS)Nr&r)�dimr������r$Zscaled_dot_productr%r'zinvalid score_function)�len�shaper�	unsqueezer.�viewr+r*�permute�
contiguousr/r,�bmm�divr9r:�expand�cat�F�tanh�matmulr(�RuntimeError�softmax�splitr0r2)r�k�q�mb_sizeZk_len�q_lenZkxZqx�kt�scoreZqktZkxxZqxxZkqZqw�outputr
r
rrJsD


  


zAttention.forward)NNrr$r)rrr rr6rr"r
r
rrr#&sr#cs6eZdZdZd�fdd�	Zdd	�Z�fd
d�Z�ZS)
�NoQueryAttentionzq is a parameterNrr$rcs@tt|��||||||�||_t�t�||��|_|�	�dSr)
rrYrrUrr3rr4rS�reset_q)rr)r*r7r+r,rUr2rr
rrzszNoQueryAttention.__init__cCs&dt�|j�}|jj�||�dSr8)r9r:r)rSr;r<r=r
r
rrZ�szNoQueryAttention.reset_qcs,|jd}|j�|dd�}tt|��||�S)NrrA)rCrSrJrrYr)rrR�kwargsrTrSrr
rr�s
zNoQueryAttention.forward)NNrr$rr)rrr r!rrZrr"r
r
rrrYws�rYcs&eZdZd
�fdd�	Zdd	�Z�ZS)�DynamicLSTMrTrF�LSTMc

	s�tt|���||_||_||_||_||_||_||_	||_
|	|_|jdkrjtj
|||||||d�|_nJ|jdkr�tj|||||||d�|_n$|jdkr�tj|||||||d�|_dS)u�
        使LSTM支持一个batch中含有长度不同的句子,基于pack_padded_sequence方法实现
        参考:https://zhuanlan.zhihu.com/p/34418001
        r])�
input_size�hidden_size�
num_layers�biasrr2�
bidirectional�GRU�RNNN)rr\rr^r_r`rarr2rb�only_use_last_hidden_state�rnn_typerr]rdrc)
rr^r_r`rarr2rbrerfrr
rr�sP
�

�

�zDynamicLSTM.__init__c
Cst�|�d��}t�|�d��}||�d�}||}tjjjj|||jd�}|j	dkrt|�
|d�\}\}}n|�
|d�\}}d}t�|dd�|}t�|dd�}|jr�|Stjjjj
||jd�}	|	d}	|	|}	|j	dk�rt�|dd�|}t�|dd�}|	||ffSdS)z�
        sequence -> sort -> pad and pack ->process using RNN -> unpack ->unsort

        :param x: sequence embedding vectors
        :param x_len: numpy/tensor list
        :return:
        rrr
r]Nr)rrr�torrrrrrfrd�	transposerer)
rrrrrrZout_pack�ht�ctrr
r
rr�s0	
��zDynamicLSTM.forward)rTTrFFr])rrr rrr"r
r
rrr\�s�r\)r9r�torch.nnrZtorch.nn.functional�
functionalrL�Modulerr#rYr\r
r
r
r�<module>sQ