o
    )j                      @   s   d Z ddlZddlm  mZ ddlm  mZ	 ddlmZ dd Z
dd
dZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZdS )zH Some implementations are adapted from https://github.com/yuyq96/D-TDNN
    N)nnc                 C   s   t  }| dD ]C}|dkr|dt jdd q	|dkr(|dt | q	|dkr6|dt | q	|dkrF|dt j|dd	 q	td
||S )N-reluTZinplaceZpreluZ	batchnormZ
batchnorm_F)ZaffinezUnexpected module ({}).)	r   
Sequentialsplit
add_moduleReLUZPReLUZBatchNorm1d
ValueErrorformat)
config_strZchannels	nonlinearname r   h/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/audio/sv/DTDNN_layers.pyget_nonlinear   s   r   FT{Gz?c                 C   s@   | j |d}| j||d}tj||gdd}|r|j|d}|S )Ndim)r   unbiasedr   )meanstdtorchcat	unsqueeze)xr   keepdimr   epsr   r   statsr   r   r   statistics_pooling   s   r    c                   @   s   e Zd Zdd ZdS )	StatsPoolc                 C   s   t |S N)r    selfr   r   r   r   forward'   s   zStatsPool.forwardN)__name__
__module____qualname__r%   r   r   r   r   r!   %   s    r!   c                       s0   e Zd Z					d	 fdd	Zdd Z  ZS )
	TDNNLayer   r   Fbatchnorm-reluc	           	   	      sj   t t|   |dk r |d dksJ d||d d | }tj|||||||d| _t||| _d S )Nr      r*   4Expect equal paddings, but got even kernel size ({})stridepaddingdilationbias)	superr)   __init__r   r   Conv1dlinearr   r   )	r$   in_channelsout_channelskernel_sizer/   r0   r1   r2   r   	__class__r   r   r4   -   s    	zTDNNLayer.__init__c                 C      |  |}| |}|S r"   )r6   r   r#   r   r   r   r%   E      

zTDNNLayer.forward)r*   r   r*   Fr+   r&   r'   r(   r4   r%   __classcell__r   r   r:   r   r)   +   s    r)   c                       s2   e Zd Z	d
 fdd	Zdd Zddd	Z  ZS )CAMLayerr,   c	           	   	      sl   t t|   tj|||||||d| _t||| d| _tjdd| _t|| |d| _	t
 | _d S )Nr.   r*   Tr   )r3   r@   r4   r   r5   linear_locallinear1r	   r   linear2ZSigmoidsigmoid)	r$   bn_channelsr8   r9   r/   r0   r1   r2   Z	reductionr:   r   r   r4   M   s   	zCAMLayer.__init__c                 C   sJ   |  |}|jddd| | }| | |}| | |}|| S )Nr   T)r   )rA   r   seg_poolingr   rB   rD   rC   )r$   r   ycontextmr   r   r   r%   d   s
   
zCAMLayer.forwardd   avgc                 C   s   |dkrt j|||dd}n|dkrt j|||dd}ntd|j}|djg ||R  jg |d d dR  }|dd |jd f }|S )NrK   T)r9   r/   Z	ceil_modemaxzWrong segment pooling type.r   .)FZ
avg_pool1dZ
max_pool1dr
   shaper   expandZreshape)r$   r   Zseg_lenstypesegrN   r   r   r   rF   k   s*   
zCAMLayer.seg_pooling)r,   )rJ   rK   )r&   r'   r(   r4   r%   rF   r?   r   r   r:   r   r@   K   s
    
r@   c                       s8   e Zd Z					d
 fdd	Zdd Zdd	 Z  ZS )CAMDenseTDNNLayerr*   Fr+   c
              	      s   t t|   |d dksJ d||d d | }
|	| _t||| _tj||ddd| _	t||| _
t|||||
||d| _d S )Nr,   r*   r-   Fr2   r.   )r3   rR   r4   r   memory_efficientr   
nonlinear1r   r5   rB   
nonlinear2r@   	cam_layer)r$   r7   r8   rE   r9   r/   r1   r2   r   rT   r0   r:   r   r   r4   }   s$   
zCAMDenseTDNNLayer.__init__c                 C   s   |  | |S r"   )rB   rU   r#   r   r   r   bn_function   s   zCAMDenseTDNNLayer.bn_functionc                 C   s:   | j r| jrt| j|}n| |}| | |}|S r"   )ZtrainingrT   cp
checkpointrX   rW   rV   r#   r   r   r   r%      s
   
zCAMDenseTDNNLayer.forwardr*   r*   Fr+   F)r&   r'   r(   r4   rX   r%   r?   r   r   r:   r   rR   {   s    rR   c                       s0   e Zd Z					d fdd	Zdd Z  ZS )	CAMDenseTDNNBlockr*   Fr+   c                    sV   t t|   t|D ]}t|||  |||||||	|
d	}| d|d  | qd S )N)	r7   r8   rE   r9   r/   r1   r2   r   rT   ztdnnd%dr*   )r3   r\   r4   rangerR   r   )r$   Z
num_layersr7   r8   rE   r9   r/   r1   r2   r   rT   ilayerr:   r   r   r4      s   

zCAMDenseTDNNBlock.__init__c                 C   s$   | D ]}t j|||gdd}q|S )Nr*   r   )r   r   )r$   r   r_   r   r   r   r%      s   zCAMDenseTDNNBlock.forwardr[   r>   r   r   r:   r   r\      s    r\   c                       *   e Zd Z		d fdd	Zdd Z  ZS )TransitLayerTr+   c                    s2   t t|   t||| _tj||d|d| _d S Nr*   rS   )r3   ra   r4   r   r   r   r5   r6   r$   r7   r8   r2   r   r:   r   r   r4      s   zTransitLayer.__init__c                 C   r<   r"   )r   r6   r#   r   r   r   r%      r=   zTransitLayer.forward)Tr+   r>   r   r   r:   r   ra      
    	ra   c                       r`   )
DenseLayerFr+   c                    s2   t t|   tj||d|d| _t||| _d S rb   )r3   re   r4   r   r5   r6   r   r   rc   r:   r   r   r4      s   zDenseLayer.__init__c                 C   sB   t |jdkr| |jddjdd}n| |}| |}|S )Nr,   r   r   )lenrN   r6   r   Zsqueezer   r#   r   r   r   r%      s
   

zDenseLayer.forward)Fr+   r>   r   r   r:   r   re      rd   re   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )BasicResBlockr*   c              	      s   t t|   tj||d|dfddd| _t|| _tj||ddddd| _t|| _	t
 | _|dks=|| j| krYt
tj|| j| d|dfddt| j| | _d S d S )N   r*   F)r9   r/   r0   r2   )r9   r/   r2   )r3   rg   r4   r   ZConv2dconv1ZBatchNorm2dbn1conv2bn2r   shortcut	expansion)r$   Z	in_planesZplanesr/   r:   r   r   r4      s6   

zBasicResBlock.__init__c                 C   sB   t | | |}| | |}|| |7 }t |}|S r"   )rM   r   rj   ri   rl   rk   rm   )r$   r   outr   r   r   r%     s
   
zBasicResBlock.forward)r*   )r&   r'   r(   rn   r4   r%   r?   r   r   r:   r   rg      s    rg   )r   FTr   )__doc__r   Ztorch.nn.functionalr   Z
functionalrM   Ztorch.utils.checkpointutilsrZ   rY   r   r    Moduler!   r)   r@   rR   Z
ModuleListr\   ra   re   rg   r   r   r   r   <module>   s   
	 0)!