
    RЦi	+                     f   S r SSKJr  SSKJr  SSKJrJrJr  SSK	r	SSK
Jr  SSK
Jr  SSKJr  SS	KJr  SS
KJr     SS\S\S\S\S\\   4
S jjrSS jr      SS\S\S\S\S\S\\   4S jjr " S S\R6                  5      r " S S\R6                  5      r " S S\R6                  5      rg)zUClassifier 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                 b    U(       + nU(       d  Sn[        UUUS9nXR                  5       -  nXg4$ )NF)r   flattenr   )r
   	feat_mult)r   r   r   r   r   flatten_in_poolglobal_poolnum_pooled_featuress           U/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/classifier.py_create_poolr      sC     #lO&K
 ')>)>)@@++    c           	          US::  a  [         R                  " 5       nU$ U(       a  [         R                  " XSSX4S9nU$ [         R                  " XSX4S9nU$ )Nr   r	   T)biasdevicedtype)nnIdentityConv2dLinear)r   r   r   r   r   fcs         r   
_create_fcr$   %   sU    a[[]
 I	 
YY|!$v[ I YY|tFXIr   	drop_ratec                 z    [        U UUUUS9u  p[        U	UUUUS9n
Ub  [        R                  " U5      nXU
4$ X4$ )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)   /   sd     (4($K 

B **Y'R''?r   c                      ^  \ rS rSrSr      SS\S\S\S\S\S\4U 4S	 jjjr	SS\S\
\   4S
 jjrSS\4S jjrSrU =r$ )ClassifierHeadM   z;Classifier head w/ configurable global pooling and dropout.in_featuresr   r   r%   r   r   c	           
      >  > [         TU ]  5         Xl        XPl        X`l        [        UUUUUUUS9u  pXl        [        R                  " U5      U l	        Xl
        U(       a#  U(       a  [        R                  " S5      U l        g[        R                  " 5       U l        g)z
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   r0   ClassifierHead.__init__P   s}    $ 	& "+
 'JJy)	(0Yrzz!}BKKMr   c                    Ub  X R                   R                  :w  a  [        U R                  UUU R                  U R
                  S9u  U l         U l        U R                  (       a  U(       a  [        R                  " S5      O[        R                  " 5       U l
        g U R                  U R                   R                  5       -  n[        UUU R                  S9U l        g )N)r   r   r   r	   )r   )r   r   r)   r-   r   r   r#   r   r2   r    r   r   r$   )r3   r   r   r   s       r   resetClassifierHead.resetu   s     Y2B2B2L2L%L(9  #..)%Ddg -1MMi2::a=R[[]DL"&"2"2T5E5E5O5O5Q"Q #DGr   
pre_logitsc                     U R                  U5      nU R                  U5      nU(       a  U R                  U5      $ U R                  U5      nU R                  U5      $ N)r   r1   r   r#   r3   xr9   s      r   forwardClassifierHead.forward   sK    QIIaL<<?"GGAJ||Ar   )r1   r#   r   r   r-   r   r   )avg        FNCHWNNr;   F)__name__
__module____qualname____firstlineno____doc__intstrfloatboolr0   r   r7   r>   __static_attributes____classcell__r4   s   @r   r+   r+   M   s    E #!"##R#R #R 	#R
 #R #R #R #RJ # &T  r   r+   c                      ^  \ rS rSrSr       SS\S\S\\   S\S\S\	\\
4   S	\	\\
4   4U 4S
 jjjrSS\S\\   4S jjrSS\4S jjrSrU =r$ )NormMlpClassifierHead   z@A Pool -> Norm -> Mlp Classifier Head for '2D' NCHW tensors
    r-   r   hidden_sizer   r%   
norm_layer	act_layerc
           
        > XS.n
[         TU ]  5         Xl        X0l        Xl        U(       + U l        [        U5      n[        U5      nU R
                  (       a  [        [        R                  SS9O[        R                  n[        US9U l        U" U40 U
D6U l        U(       a  [        R                  " S5      O[        R                   " 5       U l        U(       a=  [        R$                  " ['        SU" X40 U
D64SU" 5       4/5      5      U l        X0l        O[        R                   " 5       U l        [        R*                  " U5      U l        US:  a  U" U R                  U40 U
D6U l        g[        R                   " 5       U l        g)	  
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/   r0   r-   rS   r   r   r   r   r   r   r!   r"   r
   r   normr2   r    r   
Sequentialr   r9   r'   r1   r#   )r3   r-   r   rS   r   r%   rT   rU   r   r   ddlinear_layerr4   s               r   r0   NormMlpClassifierHead.__init__   s*   , /&&'%#J/
!),	<@MMwryya8ryy/)D{1b1	(1rzz!}r{{} mmK|KCCD	$9 - DO !, kkmDOJJy)	HSVW,t00+DD]_]h]h]jr   c                    UbE  [        US9U l        U(       a  [        R                  " S5      O[        R                  " 5       U l        U R                  R                  5       U l        U R                  (       a  [        [        R                  SS9O[        R                  nU R                  (       Gah  [        U R                  R                  [        R                  5      (       a  U R                  (       aD  [        U R                  R                  [        R                  5      (       a  U R                  (       a  [        R                   " 5          U" U R"                  U R                  5      nUR$                  R'                  U R                  R                  R$                  R)                  UR$                  R*                  5      5        UR,                  R'                  U R                  R                  R,                  5        X@R                  l        S S S 5        US:  a  U" U R.                  U5      U l        g [        R                  " 5       U l        g ! , (       d  f       NH= f)Nr[   r	   rY   r   )r
   r   r   r2   r    r   is_identityr   r   r!   r"   rS   
isinstancer9   r#   torchno_gradr-   weightcopy_reshapeshaper   r   )r3   r   r   r`   new_fcs        r   r7   NormMlpClassifierHead.reset   sn    3iHD,52::a=2;;=DL((446<@MMwryya8ryyDOO..		::4== 2 2BII>>4==]]_)$*:*:D<L<LMFMM''(:(:(A(A(I(I&--J]J](^_KK%%doo&8&8&=&=>)/OO&	 %
 CNPQ/,t00+>WYWbWbWd %_s   CI
I#r9   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU(       a  U$ U R                  U5      nU$ r;   )r   r]   r   r9   r1   r#   r<   s      r   r>   NormMlpClassifierHead.forward   sa    QIIaLLLOOOAIIaLHGGAJr   )
r1   r#   r   r   rS   r-   r]   r   r9   r   )Nr@   rA   layernorm2dtanhNNr;   rC   )rD   rE   rF   rG   rH   rI   r   rJ   rK   r   r   r0   r7   rL   r>   rM   rN   rO   s   @r   rQ   rQ      s     *."!/<.4,k,k ,k "#	,k
 ,k ,k c8m,,k S(]+,k ,k\e e# e"	T 	 	r   rQ   c                      ^  \ rS rSrSr        SS\S\S\\   S\S\S\	\\
4   S	\	\\
4   S
\4U 4S jjjrSS\S\\   S\4S jjrS rSS\4S jjrSrU =r$ )ClNormMlpClassifierHead   z?A Pool -> Norm -> Mlp Classifier Head for n-D NxxC tensors
    r-   r   rS   r   r%   rT   rU   r   c           
      ~  > XS.n[         TU ]  5         Xl        X0l        Xl        US;   d   eX@l        US;   d   eUS:X  a  SOSU l        [        U5      n[        U5      nU" U40 UD6U l	        U(       aK  [        R                  " [        S[        R                  " X40 UD64SU" 5       4/5      5      U l        X0l        O[        R                  " 5       U l        [        R                   " U5      U l        US	:  a(  [        R                  " U R                  U40 UD6U l        g
[        R                  " 5       U l        g
)rW   rX   ) r@   maxavgmax)NHWCNLCry   r	   )r	      r#   r\   r   N)r/   r0   r-   rS   r   r   pool_dimr   r   r]   r   r^   r   r"   r9   r    r'   r1   r#   )r3   r-   r   rS   r   r%   rT   rU   r   r   r   r_   r4   s               r   r0    ClNormMlpClassifierHead.__init__   s   . /&&'8888"O+++&%/V#J/
!),	{1b1	 mmKryy@R@A	$9 - DO !, kkmDOJJy)	EPST_"))D--{AbAZ\ZeZeZgr   reset_otherc                    Ub  X l         U(       a4  [        R                  " 5       U l        [        R                  " 5       U l        US:  a'  [        R
                  " U R                  U5      U l        g [        R                  " 5       U l        g )Nr   )r   r   r    r9   r]   r"   r   r#   )r3   r   r   r}   s       r   r7   ClNormMlpClassifierHead.reset  sX     &N kkmDODI?JQ"))D--{;TVT_T_Tar   c                 `   U R                   (       a  U R                   S:X  a  UR                  U R                  S9nU$ U R                   S:X  a  UR                  U R                  S9nU$ U R                   S:X  a6  SUR                  U R                  S9UR                  U R                  S9-   -  nU$ )Nr@   )dimrv   rw   g      ?)r   meanr{   amax)r3   r=   s     r   _global_pool$ClNormMlpClassifierHead._global_pool  s    >>~~&FFt}}F-
 	 5(FFt}}F-  8+166dmm64qvv$--v7PPQr   r9   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU(       a  U$ U R	                  U5      nU$ r;   )r   r]   r9   r1   r#   r<   s      r   r>   ClNormMlpClassifierHead.forward$  sT    a IIaLOOAIIaLHGGAJr   )	r1   r#   rS   r-   r]   r   r{   r   r9   )Nr@   rA   	layernormgelurx   NN)NFrC   )rD   rE   rF   rG   rH   rI   r   rJ   rK   r   r   r0   rL   r7   r   r>   rM   rN   rO   s   @r   rr   rr      s     *."!/:.4#-h-h -h "#	-h
 -h -h c8m,-h S(]+-h -h -h^b b# bTX bT  r   rr   )r@   FN)FNN)r@   FrB   NNN)rH   collectionsr   	functoolsr   typingr   r   r   re   torch.nnr   r   Fadaptive_avgmax_poolr
   
create_actr   create_normr   rI   rJ   rL   r   r$   rK   r)   Moduler+   rQ   rr    r   r   <module>r      s    $  , ,   $ 6 % ' #',,, , 	,
 C=,& %)  	
  E?<ARYY AHKBII K\Mbii Mr   