o
    پi(                     @   s  d Z ddlmZ ddlmZ ddlmZmZmZ ddl	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ededededee f
ddZd!ddZ				d"dedededededee fddZG dd dejZG dd dejZG dd dejZdS )#zV Classifier head and layer factory

Hacked together by / Copyright 2020 Ross Wightman
    )OrderedDict)partial)OptionalUnionCallableN)
functional   )SelectAdaptivePool2d)get_act_layer)get_norm_layeravgFnum_featuresnum_classes	pool_typeuse_conv	input_fmtc                 C   s0   | }|sd}t |||d}| |  }||fS )NF)r   flattenr   )r	   	feat_mult)r   r   r   r   r   flatten_in_poolglobal_poolnum_pooled_features r   J/home/ubuntu/.local/lib/python3.10/site-packages/timm/layers/classifier.py_create_pool   s   r   c                 C   sB   |dkr
t  }|S |rt j| |ddd}|S t j| |dd}|S )Nr   r   T)bias)nnIdentityConv2dLinear)r   r   r   fcr   r   r   
_create_fc%   s   r    NCHW	drop_ratec           
      C   sH   t | ||||d\}}t|||d}|d ur t|}	||	|fS ||fS )Nr   r   r   )r   r    r   Dropout)
r   r   r   r   r   r"   r   r   r   dropoutr   r   r   create_classifier/   s    


r'   c                       sl   e Zd ZdZ				ddededed	ed
edef fddZddede	e fddZ
ddefddZ  ZS )ClassifierHeadz;Classifier head w/ configurable global pooling and dropout.r           Fr!   in_featuresr   r   r"   r   r   c           	         st   t t|   || _|| _|| _t|||||d\}}|| _t	|| _
|| _|r3|r3td| _dS t | _dS )a.  
        Args:
            in_features: The number of input features.
            num_classes:  The number of classes for the final classifier layer (output).
            pool_type: Global pooling type, pooling disabled if empty string ('').
            drop_rate: Pre-classifier dropout rate.
        r#   r   N)superr(   __init__r*   r   r   r'   r   r   r%   dropr   Flattenr   r   )	selfr*   r   r   r"   r   r   r   r   	__class__r   r   r,   L   s   
&zClassifierHead.__init__Nc                 C   s   |d ur.|| j jkr.t| j||| j| jd\| _ | _| jr'|r'td| _
d S t	 | _
d S | j| j   }t||| jd| _d S )N)r   r   r   r   r$   )r   r   r'   r*   r   r   r   r   r.   r   r   r   r    )r/   r   r   r   r   r   r   resetm   s   (zClassifierHead.reset
pre_logitsc                 C   s6   |  |}| |}|r| |S | |}| |S N)r   r-   r   r   r/   xr3   r   r   r   forward   s   




zClassifierHead.forward)r   r)   Fr!   r4   F)__name__
__module____qualname____doc__intstrfloatboolr,   r   r2   r7   __classcell__r   r   r0   r   r(   I   s*    !r(   c                       s   e Zd ZdZ					ddeded	ee d
ededeee	f deee	f f fddZ
dded
ee fddZddefddZ  ZS )NormMlpClassifierHeadzA A Pool -> Norm -> Mlp Classifier Head for '2D' NCHW tensors
    Nr   r)   layernorm2dtanhr*   r   hidden_sizer   r"   
norm_layer	act_layerc           	         s   t    || _|| _|| _| | _t|}t|}| jr$tt	j
ddnt	j}t|d| _||| _|r9t	dnt	 | _|rVt	td|||fd| fg| _|| _nt	 | _t	|| _|dkrn|| j|| _dS t	 | _dS )  
        Args:
            in_features: The number of input features.
            num_classes:  The number of classes for the final classifier layer (output).
            hidden_size: The hidden size of the MLP (pre-logits FC layer) if not None.
            pool_type: Global pooling type, pooling disabled if empty string ('').
            drop_rate: Pre-classifier dropout rate.
            norm_layer: Normalization layer type.
            act_layer: MLP activation layer type (only used if hidden_size is not None).
        r   kernel_sizer   r   actr   N)r+   r,   r*   rE   r   r   r   r
   r   r   r   r   r	   r   normr.   r   r   
Sequentialr   r3   r%   r-   r   )	r/   r*   r   rE   r   r"   rF   rG   linear_layerr0   r   r   r,      s(   



(zNormMlpClassifierHead.__init__c                 C   s  |d urt |d| _|rtdnt | _| j | _| jr&ttj	ddntj
}| jrxt| jjtj	r7| jrBt| jjtj
rx| jrxt * || j| j}|j| jjj|jj |j| jjj || j_W d    n1 ssw   Y  |dkr|| j|| _d S t | _d S )NrK   r   rI   r   )r	   r   r   r.   r   r   is_identityr   r   r   r   rE   
isinstancer3   r   torchno_gradr*   weightcopy_reshapeshaper   r   )r/   r   r   rO   new_fcr   r   r   r2      s$   

(zNormMlpClassifierHead.resetFr3   c                 C   sH   |  |}| |}| |}| |}| |}|r|S | |}|S r4   )r   rM   r   r3   r-   r   r5   r   r   r   r7      s   





zNormMlpClassifierHead.forward)Nr   r)   rC   rD   r4   r8   )r9   r:   r;   r<   r=   r   r>   r?   r   r   r,   r2   r@   r7   rA   r   r   r0   r   rB      s0    

+rB   c                       s   e Zd ZdZ						dded	ed
ee dededeee	f deee	f def fddZ
dd	edee defddZdd ZddefddZ  ZS )ClNormMlpClassifierHeadz@ A Pool -> Norm -> Mlp Classifier Head for n-D NxxC tensors
    Nr   r)   	layernormgeluNHWCr*   r   rE   r   r"   rF   rG   r   c	           	         s   t    || _|| _|| _|dv sJ || _|dv sJ |dkr#dnd| _t|}t|}||| _	|rLt
tdt
||fd| fg| _|| _nt
 | _t
|| _|dkret
| j|| _d	S t
 | _d	S )
rH   ) r   maxavgmax)r\   NLCr`   r   )r      r   rL   r   N)r+   r,   r*   rE   r   r   pool_dimr   r
   rM   r   rN   r   r   r3   r   r%   r-   r   )	r/   r*   r   rE   r   r"   rF   rG   r   r0   r   r   r,      s(   



*z ClNormMlpClassifierHead.__init__Freset_otherc                 C   sP   |d ur|| _ |rt | _t | _|dkr!t| j|| _d S t | _d S )Nr   )r   r   r   r3   rM   r   r   r   )r/   r   r   rc   r   r   r   r2     s   

*zClNormMlpClassifierHead.resetc                 C   sl   | j r4| j dkr|j| jd}|S | j dkr|j| jd}|S | j dkr4d|j| jd|j| jd  }|S )Nr   )dimr^   r_   g      ?)r   meanrb   amax)r/   r6   r   r   r   _global_pool	  s   


 z$ClNormMlpClassifierHead._global_poolr3   c                 C   s>   |  |}| |}| |}| |}|r|S | |}|S r4   )rg   rM   r3   r-   r   r5   r   r   r   r7     s   




zClNormMlpClassifierHead.forward)Nr   r)   rZ   r[   r\   )NFr8   )r9   r:   r;   r<   r=   r   r>   r?   r   r   r,   r@   r2   rg   r7   rA   r   r   r0   r   rY      s8    

	,
rY   )r   FNr8   )r   Fr!   N)r<   collectionsr   	functoolsr   typingr   r   r   rR   torch.nnr   r   Fadaptive_avgmax_poolr	   
create_actr
   create_normr   r=   r>   r@   r   r    r?   r'   Moduler(   rB   rY   r   r   r   r   <module>   sZ    


?J