U
    ¯Ê¹j6  ã                   @   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eeeeee dœdd„Zddd„Zdeeeeeee dœdd„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   sD   | }|s"|dks|st dƒ‚d}t|||d�}| | ¡  }||fS )Nr   zUPooling can only be disabled if classifier is also removed or conv classifier is usedF)r   Úflattenr   )ÚAssertionErrorr	   Ú	feat_mult)r   r   r   r   r   Zflatten_in_poolÚglobal_poolÚnum_pooled_features© r   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/layers/classifier.pyÚ_create_pool   s    ÿýr   c                 C   s>   |dkrt  ¡ }n(|r*t j| |ddd�}nt j| |dd�}|S )Nr   r   T)Úbias)ÚnnÚIdentityÚConv2dÚLinear)r   r   r   Úfcr   r   r   Ú
_create_fc'   s    
r    ÚNCHW)r   r   r   r   r   Ú	drop_ratec           
      C   sH   t | ||||d�\}}t|||d�}|d k	r@t |¡}	||	|fS ||fS )N©r   r   ©r   )r   r    r   ÚDropout)
r   r   r   r   r   r"   r   r   r   Zdropoutr   r   r   Úcreate_classifier1   s     û
ý

r&   c                       sL   e Zd ZdZdeeeeeedœ‡ fdd„Zdd
d„Z	dedœdd„Z
‡  ZS )ÚClassifierHeadz;Classifier head w/ configurable global pooling and dropout.r   ç        Fr!   )Úin_featuresr   r   r"   r   r   c           	         sn   t t| ƒ ¡  || _|| _|| _t|||||d�\}}|| _t 	|¡| _
|| _|r`|r`t d¡n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+   N   s    û
zClassifierHead.__init__Nc                 C   sz   |d k	rT|| j jkrTt| j||| j| jd�\| _ | _| jrH|rHt d¡nt 	¡ | _
n"| 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   Úreseto   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!   )N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚstrÚfloatÚboolr+   r1   r7   Ú__classcell__r   r   r/   r   r'   K   s       ùù!
r'   c                
       s^   e Zd Zdeeee eeeeef eeef dœ‡ fdd„Z	dd	d
„Z
dedœdd„Z‡  ZS )ÚNormMlpClassifierHeadNr   r(   Úlayernorm2dÚtanh)r)   r   Úhidden_sizer   r"   Ú
norm_layerÚ	act_layerc           	         sä   t ƒ  ¡  || _|| _|| _| | _t|ƒ}t|ƒ}| jrHtt	j
dd�nt	j}t|d�| _||ƒ| _|rrt	 d¡nt	 ¡ | _|r¬t	 td|||ƒfd|ƒ fgƒ¡| _|| _n
t	 ¡ | _t	 |¡| _|dkrÖ|| j|ƒnt	 ¡ | _dS )a  
        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   ©Zkernel_size©r   r   Zactr   N)r*   r+   r)   rD   r   r   r   r
   r   r   r   r   r	   r   Únormr-   r   r   Z
Sequentialr   r3   r%   r,   r   )	r.   r)   r   rD   r   r"   rE   rF   Úlinear_layerr/   r   r   r+   Œ   s(    

þ

zNormMlpClassifierHead.__init__c              	   C   sþ   |d k	r,t |d�| _|r"t d¡nt ¡ | _| j ¡ | _| jrLttj	dd�ntj
}| jrÜt| jjtj	ƒrn| jr„t| jjtj
ƒrÜ| jrÜt ¡ �J || j| jƒ}|j | jjj |jj¡¡ |j | jjj¡ || j_W 5 Q R X |dkrð|| j|ƒnt ¡ | _d S )NrH   r   rG   r   )r	   r   r   r-   r   r   Zis_identityr   r   r   r   rD   Ú
isinstancer3   r   ÚtorchZno_gradr)   ÚweightZcopy_ZreshapeÚshaper   r   )r.   r   r   rJ   Znew_fcr   r   r   r1   ·   s"    ÿÿ
zNormMlpClassifierHead.resetFr2   c                 C   sH   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|r:|S |  |¡}|S r4   )r   rI   r   r3   r,   r   r5   r   r   r   r7   Ç   s    





zNormMlpClassifierHead.forward)Nr   r(   rB   rC   )N)F)r8   r9   r:   r<   r   r=   r>   r   r   r+   r1   r?   r7   r@   r   r   r/   r   rA   Š   s         ø

ø+
rA   )r   FN)F)r   Fr!   N)r;   Úcollectionsr   Ú	functoolsr   Útypingr   r   r   rL   Ztorch.nnr   r   ÚFZadaptive_avgmax_poolr	   Z
create_actr
   Zcreate_normr   r<   r=   r?   r   r    r>   r&   ÚModuler'   rA   r   r   r   r   Ú<module>   sD      ûû
    úú?