
    ^j	+                     \   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ZddZ	 	 	 	 	 	 ddedededededee   fdZ G d dej6                        Z G d dej6                        Z G d dej6                        Zy)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num_featuresnum_classes	pool_typeuse_conv	input_fmtc                 Z    | }|sd}t        |||      }| |j                         z  }||fS )NF)r   flattenr   )r
   	feat_mult)r   r   r   r   r   flatten_in_poolglobal_poolnum_pooled_featuress           a/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/classifier.py_create_poolr      sH     #lO&K
 ')>)>)@@+++    c                     |dk  rt        j                         }|S |rt        j                  | |dd||      }|S t        j                  | |d||      }|S )Nr   r	   T)biasdevicedtype)nnIdentityConv2dLinear)r   r   r   r   r   fcs         r   
_create_fcr$   %   s_    a[[]
 I	 
YY|[!$vUZ[ I YY|[tFRWXIr   	drop_ratec                     t        | ||||      \  }}	t        |	||||      }
|t        j                  |      }|||
fS ||
fS )N)r   r   )r   r   r   )r   r$   r   Dropout)r   r   r   r   r   r%   r   r   r   r   r#   dropouts               r   create_classifierr)   /   sk     (4($K$ 

B **Y'GR''?r   c                   p     e Zd ZdZ	 	 	 	 	 	 ddedededededef fdZddede	e   fd	Z
dd
efdZ xZS )ClassifierHeadz;Classifier head w/ configurable global pooling and dropout.in_featuresr   r   r%   r   r   c	           	      6   t         |           || _        || _        || _        t        |||||||      \  }	}
|	| _        t        j                  |      | _	        |
| _
        |r|rt        j                  d      | _        yt        j                         | _        y)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   r   r   r	   N)super__init__r,   r   r   r)   r   r   r'   dropr#   Flattenr    r   )selfr,   r   r   r%   r   r   r   r   r   r#   	__class__s              r   r/   zClassifierHead.__init__P   s    $ 	& "+
R 'JJy)	(0Yrzz!}BKKMr   c                    ||| j                   j                  k7  r~t        | j                  ||| j                  | j
                        \  | _         | _        | j                  r|rt        j                  d      | _
        y t        j                         | _
        y | j                  | j                   j                         z  }t        ||| j                        | _        y )N)r   r   r   r	   )r   )r   r   r)   r,   r   r   r#   r   r1   r    r   r   r$   )r2   r   r   r   s       r   resetzClassifierHead.resetu   s     Y$2B2B2L2L%L(9  #..)%Ddg -1MMi2::a=DLR[[]DL"&"2"2T5E5E5O5O5Q"Q #DGr   
pre_logitsc                     | j                  |      }| j                  |      }|r| j                  |      S | j                  |      }| j                  |      S N)r   r0   r   r#   r2   xr6   s      r   forwardzClassifierHead.forward   sK    QIIaL<<?"GGAJ||Ar   )avg        FNCHWNNr8   F)__name__
__module____qualname____doc__intstrfloatboolr/   r   r5   r;   __classcell__r3   s   @r   r+   r+   M   s    E #!"##R#R #R 	#R
 #R #R #RJ # &T r   r+   c                        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	Z
ddedee   fd
ZddefdZ xZS )NormMlpClassifierHeadzA A Pool -> Norm -> Mlp Classifier Head for '2D' NCHW tensors
    r,   r   hidden_sizer   r%   
norm_layer	act_layerc
           
         ||	d}
t         |           || _        || _        || _        | | _        t        |      }t        |      }| j
                  rt        t        j                  d      nt        j                  }t        |      | _         ||fi |
| _        |rt        j                  d      nt        j                          | _        |r>t        j$                  t'        d |||fi |
fd |       fg            | _        || _        nt        j                          | _        t        j*                  |      | _        |dkD  r || j                  |fi |
| _        yt        j                          | _        y)	  
        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   r   r	   kernel_sizer   r#   actr   N)r.   r/   r,   rL   r   r   r   r   r   r   r!   r"   r
   r   normr1   r    r   
Sequentialr   r6   r'   r0   r#   )r2   r,   r   rL   r   r%   rM   rN   r   r   ddlinear_layerr3   s               r   r/   zNormMlpClassifierHead.__init__   s6   , /&&'%#J/
!),	<@MMwryya8ryy/)D{1b1	(1rzz!}r{{} mmK|KCCD	$9 - DO !,D kkmDOJJy)	HSVW,t00+DD]_]h]h]jr   c                 ~   |At        |      | _        |rt        j                  d      nt        j                         | _        | j                  j                         | _        | j                  rt        t        j                  d      nt        j                  }| j                  rTt        | j                  j                  t        j                        r| j                  r:t        | j                  j                  t        j                        r| j                  rt        j                          5   || j"                  | j                        }|j$                  j'                  | j                  j                  j$                  j)                  |j$                  j*                               |j,                  j'                  | j                  j                  j,                         || j                  _        d d d        |dkD  r || j.                  |      | _        y t        j                         | _        y # 1 sw Y   AxY w)NrT   r	   rR   r   )r
   r   r   r1   r    r   is_identityr   r   r!   r"   rL   
isinstancer6   r#   torchno_gradr,   weightcopy_reshapeshaper   r   )r2   r   r   rY   new_fcs        r   r5   zNormMlpClassifierHead.reset   so    3iHD,52::a=2;;=DL((446<@MMwryya8ryyDOO..		:4== 2 2BII>4==]]_ 0)$*:*:D<L<LMFMM''(:(:(A(A(I(I&--J]J](^_KK%%doo&8&8&=&=>)/DOO&	0
 CNPQ/,t00+>WYWbWbWd0 0s   /CH33H<r6   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }|r|S | j                  |      }|S r8   )r   rV   r   r6   r0   r#   r9   s      r   r;   zNormMlpClassifierHead.forward   sa    QIIaLLLOOOAIIaLHGGAJr   )Nr<   r=   layernorm2dtanhNNr8   r?   )r@   rA   rB   rC   rD   r   rE   rF   r   r   r/   r5   rG   r;   rH   rI   s   @r   rK   rK      s     *."!/<.4,k,k ,k "#	,k
 ,k ,k c8m,,k S(]+,k\e e# e"	T 	r   rK   c                        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
Z
ddedee   defdZd ZddefdZ xZS )ClNormMlpClassifierHeadz@ A Pool -> Norm -> Mlp Classifier Head for n-D NxxC tensors
    r,   r   rL   r   r%   rM   rN   r   c           
      j   |	|
d}t         |           || _        || _        || _        |dv sJ || _        |dv sJ |dk(  rdnd| _        t        |      }t        |      } ||fi || _	        |rKt        j                  t        dt        j                  ||fi |fd |       fg            | _        || _        nt        j                         | _        t        j                   |      | _        |d	kD  r't        j                  | j                  |fi || _        y
t        j                         | _        y
)rP   rQ   ) r<   maxavgmax)NHWCNLCrn   r	   )r	      r#   rU   r   N)r.   r/   r,   rL   r   r   pool_dimr   r   rV   r   rW   r   r"   r6   r    r'   r0   r#   )r2   r,   r   rL   r   r%   rM   rN   r   r   r   rX   r3   s               r   r/   z ClNormMlpClassifierHead.__init__   s'   . /&&'8888"O+++&%/V#J/
!),	{1b1	 mmKryyk@R@A	$9 - DO !,D kkmDOJJy)	EPST_"))D--{AbAZ\ZeZeZgr   reset_otherc                    ||| _         |r2t        j                         | _        t        j                         | _        |dkD  r&t        j
                  | j                  |      | _        y t        j                         | _        y )Nr   )r   r   r    r6   rV   r"   r   r#   )r2   r   r   rq   s       r   r5   zClNormMlpClassifierHead.reset  sZ     &DN kkmDODI?JQ"))D--{;TVT_T_Tar   c                 h   | j                   r| j                   dk(  r|j                  | j                        }|S | j                   dk(  r|j                  | j                        }|S | j                   dk(  r<d|j                  | j                        |j                  | j                        z   z  }|S )Nr<   )dimrk   rl   g      ?)r   meanrp   amax)r2   r:   s     r   _global_poolz$ClNormMlpClassifierHead._global_pool  s    >>~~&FFt}}F-
 	 5(FFt}}F-  8+166dmm64qvv$--v7PPQr   r6   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|r|S | j	                  |      }|S r8   )rw   rV   r6   r0   r#   r9   s      r   r;   zClNormMlpClassifierHead.forward$  sT    a IIaLOOAIIaLHGGAJr   )Nr<   r=   	layernormgelurm   NN)NFr?   )r@   rA   rB   rC   rD   r   rE   rF   r   r   r/   rG   r5   rw   r;   rH   rI   s   @r   rh   rh      s     *."!/:.4#-h-h -h "#	-h
 -h -h c8m,-h S(]+-h -h^b b# bTX bT r   rh   )r<   FN)FNN)r<   Fr>   NNN)rC   collectionsr   	functoolsr   typingr   r   r   r]   torch.nnr   r   Fadaptive_avgmax_poolr
   
create_actr   create_normr   rD   rE   rG   r   r$   rF   r)   Moduler+   rK   rh    r   r   <module>r      s    $  , ,   $ 6 % ' #',,, , 	,
 C=,& %)  	
  E?<ARYY AHKBII K\Mbii Mr   