o
    ߥi>7                     @   sz   d dl Z d dlZd dlmZ ddlmZ ddgZG dd deZG dd	 d	ej	Z
G d
d dej	ZG dd dej	ZdS )    N   )SplAtConv2dResNet
Bottleneckc                   @   s   e Zd Zdd ZdS )DropBlock2Dc                 O   s   t )N)NotImplementedError)selfargskwargs r   b/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/animal_recognition/resnet.py__init__   s   zDropBlock2D.__init__N)__name__
__module____qualname__r   r   r   r   r   r      s    r   c                       s$   e Zd Z fddZdd Z  ZS )GlobalAvgPool2dc                    s   t t|   dS )z:Global average pooling over the input's spatial dimensionsN)superr   r   )r   	__class__r   r   r      s   zGlobalAvgPool2d.__init__c                 C   s   t j|d|ddS )Nr   r   )nn
functionaladaptive_avg_pool2dviewsize)r   inputsr   r   r   forward   s
   zGlobalAvgPool2d.forward)r   r   r   r   r   __classcell__r   r   r   r   r      s    r   c                       sF   e Zd ZdZ														d fdd	Zd	d
 Z  ZS )r      r   N@   F        c                    s  t t|   t||d  | }tj||ddd| _||| _|| _|| _	|o-|dkp-|| _
|	| _| j
r@tjd|dd| _d}|dkrZt|d| _|dkrTt|d| _t|d| _|dkrqt||d||
|
|d|||||d| _n)|rtj||d||
|
|dd	| _||| _ntj||d||
|
|dd	| _||| _tj||d
 ddd| _||d
 | _|rddlm} || jj tjdd| _|| _|
| _|| _d S )Ng      P@r   F)kernel_sizebias   )paddingr    )r!   strider$   dilationgroupsr"   radixrectifyrectify_avg
norm_layerdropblock_prob)r!   r%   r$   r&   r'   r"   r   r   )zeros_Tinplace)r   r   r   intr   Conv2dconv1bn1r,   r(   avd	avd_first	AvgPool2d	avd_layerr   
dropblock1
dropblock2
dropblock3r   conv2bn2conv3bn3torch.nn.initr-   weightReLUrelu
downsampler&   r%   )r   inplanesplanesr%   rC   r(   cardinalitybottleneck_widthr4   r5   r&   is_firstrectified_convr*   r+   r,   
last_gammagroup_widthr-   r   r   r   r   "   s   

	
	
zBottleneck.__init__c                 C   s   |}|  |}| |}| jdkr| |}| |}| jr&| jr&| |}| |}| j	dkrD| 
|}| jdkr?| |}| |}| jrO| jsO| |}| |}| |}| jdkrc| |}| jd urm| |}||7 }| |}|S )Nr    r   )r2   r3   r,   r8   rB   r4   r5   r7   r;   r(   r<   r9   r=   r>   r:   rC   )r   xresidualoutr   r   r   r   y   s2   



















zBottleneck.forward)r   Nr   r   r   FFr   FFFNr    F)r   r   r   	expansionr   r   r   r   r   r   r   r      s$    Wc                       s^   e Zd Zddddddddddddddddejf fdd	Z						
dddZdd Z  ZS )r   r   r   i  Fr    r   c                    s  || _ || _|	r|
d nd| _|| _|| _|| _|| _|| _tt	| 
  || _|| _|r1tj}ntj}|r:d|ini }|	r}t|d|
fddddd|||
tjdd	||
|
fddddd|||
tjdd	||
|
d fddddd|| _n|		dd
dddd|| _|| j| _tjdd	| _tjdddd| _| j|d|d |dd| _| j|d|d d|d| _|s|dkr| j|d|d dd||d| _| j|d|d dd||d| _n@|dkr| j|d|d dd||d| _| j|d|d dd||d| _n| j|d|d d||d| _| j|d|d d||d| _t | _|dkr/t|nd | _td|j  || _!| " D ]9}t#|tjre|j$d |j$d  |j% }|j&j'(dt)*d|  q@t#||rx|j&j'+d |j,j'-  q@d S )N   r   average_moder#   r   F)r!   r%   r$   r"   Tr.      )r!   r%   r$   r   )r+   rH      )r%   r+   r      )r%   r&   r+   r,   i   )r%   r+   r,   r    g       @)r#   r   ).rF   rG   rD   avg_downrJ   r(   r4   r5   r   r   r   rI   r*   r   r1   
SequentialrA   r2   r3   rB   	MaxPool2dmaxpool_make_layerlayer1layer2layer3layer4r   avgpoolDropoutdropLinearrO   fcmodules
isinstancer!   out_channelsr@   datanormal_mathsqrtfill_r"   zero_)r   blocklayersr(   r'   rG   num_classesdilatedr&   	deep_stem
stem_widthrU   rI   r*   r4   r5   
final_dropr,   rJ   r+   
conv_layerconv_kwargsmnr   r   r   r      s  




	zResNet.__init__NTc	                 C   s  d }	|dks| j ||j krbg }
| jrB|dkr$|
tj||ddd n|
tjddddd |
tj| j ||j dddd n|
tj| j ||j d|dd |
|||j  tj|
 }	g }|dksl|dkr||| j |||	| j| j	| j
| j| jd|| j| j||| jd n,|dkr||| j |||	| j| j	| j
| j| jd|| j| j||| jd ntd	|||j | _ td|D ]}||| j || j| j	| j
| j| j|| j| j||| jd
 qtj| S )Nr   TF)r!   r%   	ceil_modecount_include_pad)r!   r%   r"   rP   )rC   r(   rF   rG   r4   r5   r&   rH   rI   r*   r+   r,   rJ   r   z=> unknown dilation size: {})r(   rF   rG   r4   r5   r&   rI   r*   r+   r,   rJ   )rD   rO   rU   appendr   r6   r1   rV   r(   rF   rG   r4   r5   rI   r*   rJ   RuntimeErrorformatrange)r   rl   rE   blocksr%   r&   r+   r,   rH   rC   down_layersrm   ir   r   r   rY   2  s   	

zResNet._make_layerc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}t	
|d}| jr;| |}| |}|S )Nr   )r2   r3   rB   rX   rZ   r[   r\   r]   r^   torchflattenr`   rb   )r   rL   r   r   r   r     s   










zResNet.forward)r   r   Nr    T)	r   r   r   r   BatchNorm2dr   rY   r   r   r   r   r   r   r      s6     
k)rh   r   torch.nnr   splatr   __all__objectr   Moduler   r   r   r   r   r   r   <module>   s   ~