o
    ߥit                     @   s~   d Z ddlZddlm  mZ ddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZ dgZG dd de
ZG dd	 d	ej
ZdS )
zSplit-Attention    N)nn)BatchNorm2dConv2dLinearModuleReLU)_pairSplAtConv2dc                       s@   e Zd ZdZ												
d fdd	Zdd Z  ZS )r	   zSplit-Attention Conv2d
       r   r   r   r   T      FN        c                    sJ  t t|   t|}|o|d dkp|d dk| _|| _t||	 |
 d}|	| _|| _|| _	|| _
| jrKt|||	 ||||f||	 |d|| _nt|||	 ||||f||	 |d|| _|d u| _| jro|||	 | _tdd| _t||d| jd| _| jr||| _t|||	 d| jd| _|dkrt|d	| _t|	|| _d S )
Nr   r       )groupsbiasT)inplace)r   r      )superr	   __init__r   rectifyrectify_avgmaxradixcardinalitychannelsdropblock_probr   convuse_bnbn0r   relufc1bn1fc2DropBlock2D	dropblockrSoftMaxrsoftmax)selfin_channelsr   kernel_sizestridepaddingdilationr   r   r   reduction_factorr   r   
norm_layerr   kwargsinter_channels	__class__ a/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/animal_recognition/splat.pyr      sb   	
	


zSplAtConv2d.__init__c           	      C   s  |  |}| jr| |}| jdkr| |}| |}|jd d \}}| jdkr:tj	||| j dd}t
|}n|}t|d}| |}| jrO| |}| |}| |}| ||ddd}| jdkrtj	||| j dd}t
dd t||D }| S || }| S )Nr   r   r   dimc                 S   s   g | ]\}}|| qS r5   r5   ).0attsplitr5   r5   r6   
<listcomp>i   s    z'SplAtConv2d.forward.<locals>.<listcomp>)r   r   r    r   r&   r!   shaper   torchr<   sumFadaptive_avg_pool2dr"   r#   r$   r(   viewzip
contiguous)	r)   xbatchrchannelsplitedgapattenattensoutr5   r5   r6   forwardO   s0   











zSplAtConv2d.forward)r
   r   r
   r   Tr   r   FFNr   )__name__
__module____qualname____doc__r   rN   __classcell__r5   r5   r3   r6   r	      s    <c                       s$   e Zd Z fddZdd Z  ZS )r'   c                    s   t    || _|| _d S )N)r   r   r   r   )r)   r   r   r3   r5   r6   r   q   s   

zrSoftMax.__init__c                 C   s\   | d}| jdkr'||| j| jddd}tj|dd}||d}|S t	|}|S )Nr   r   r9   r   r7   )
sizer   rC   r   	transposerA   softmaxreshaper?   sigmoid)r)   rF   rG   r5   r5   r6   rN   v   s   


zrSoftMax.forward)rO   rP   rQ   r   rN   rS   r5   r5   r3   r6   r'   o   s    r'   )rR   r?   torch.nn.functionalr   
functionalrA   torch.nnr   r   r   r   r   torch.nn.modules.utilsr   __all__r	   r'   r5   r5   r5   r6   <module>   s   `