Ë
    éÓ^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   € ð #�l€OÙØˆÜ&ØØØô€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ñ	 
Ü�Y‰Y�| [°!¸$ÀvÐUZÔ[ˆð €Iô �Y‰Y�| [°tÀFÐRWÔ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Ó'ˆØ˜G RÐ'Ð'Ø˜ˆ?Ð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ð 'ˆÔÜ—J‘J˜yÓ)ˆŒ	ØˆŒÙ(0±Y”r—z‘z !“}ˆ�ÄBÇKÁKÃMˆ�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°$×2BÑ2B×2LÑ2LÒ%LÜ(9Ø× Ñ ØØ#ØŸ™ØŸ.™.ô)Ñ%ˆDÔ˜dœgð -1¯MªM¹iœ2Ÿ:™: a›=ˆD�LÌRÏ[É[Ë]ˆD�Là"&×"2Ñ"2°T×5EÑ5E×5OÑ5OÓ5QÑ"QÐÜ Ø#ØØŸ™ôˆD�Gr   Ú
pre_logitsc                 ó°   — | j                  |«      }| j                  |«      }|r| j                  |«      S | j                  |«      }| j                  |«      S ©N)r   r0   r   r#   ©r2   Úxr6   s      r   ÚforwardzClassifierHead.forwardˆ   sK   € Ø×Ñ˜QÓˆØ�I‰I�a‹LˆÙØ—<‘< “?Ð"Ø�G‰G�A‹JˆØ�|‰|˜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Ó/ˆ
Ü! )Ó,ˆ	Ø<@¿MºM”wœrŸy™y°aÕ8ÌrÏyÉyˆä/¸)ÔDˆÔÙ˜{Ñ1¨bÑ1ˆŒ	Ù(1”r—z‘z !”}´r·{±{³}ˆŒÙÜ Ÿm™m¬KØ‘| K°ÑCÀÑCÐDØ™	›Ð$ð9ó -ó ˆDŒOð !,ˆDÕä Ÿk™k›mˆDŒOÜ—J‘J˜yÓ)ˆŒ	ØHSÐVWÊ‘,˜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                  ràt        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  € àÐ Ü3¸iÔHˆDÔÙ,5œ2Ÿ:™: aœ=¼2¿;¹;»=ˆDŒLØ×(Ñ(×4Ñ4Ó6ˆŒØ<@¿MºM”wœrŸy™y°aÕ8ÌrÏyÉyˆØ×ÓÜ˜DŸO™O×.Ñ.´·	±	Ô:À4Ç=Â=Ü §¡× 2Ñ 2´B·I±IÔ>À4Ç=Â=Ü—]‘]“_ñ 0Ù)¨$×*:Ñ*:¸D×<LÑ<LÓM�FØ—M‘M×'Ñ'¨¯©×(:Ñ(:×(AÑ(A×(IÑ(IÈ&Ï-É-×J]ÑJ]Ó(^Ô_Ø—K‘K×%Ñ% d§o¡o×&8Ñ&8×&=Ñ&=Ô>Ø)/�D—O‘OÔ&÷	0ð
 CNÐPQÂ/‘,˜t×0Ñ0°+Ó>ˆ�ÔWY×WbÑWbÓWdˆ�÷0ð 0ús   Ä/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ÓˆØ�I‰I�a‹LˆØ�L‰L˜‹OˆØ�O‰O˜AÓˆØ�I‰I�a‹LˆÙØˆHØ�G‰G�A‹JˆØˆ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ð ˜c 8˜mÑ,ð,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Ó/ˆ
Ü! )Ó,ˆ	á˜{Ñ1¨bÑ1ˆŒ	ÙÜ Ÿm™m¬KØ”r—y‘y ¨kÑ@¸RÑ@ÐAØ™	›Ð$ð9ó -ó ˆDŒOð !,ˆDÕä Ÿk™k›mˆDŒOÜ—J‘J˜yÓ)ˆŒ	ØEPÐSTÂ_”"—)‘)˜D×-Ñ-¨{ÑA¸bÑAˆ�ÔZ\×ZeÑZeÓZgˆ�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   € àÐ Ø&ˆDŒNÙÜ Ÿk™k›mˆDŒOÜŸ™›ˆDŒIØ?JÈQº”"—)‘)˜D×-Ñ-¨{Ó;ˆ�ÔTV×T_Ñ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™   € Ø�>Š>Ø�~‰~ Ò&Ø—F‘F˜tŸ}™}�FÓ-�ð
 ˆð	 —‘ 5Ò(Ø—F‘F˜tŸ}™}�FÓ-�ð ˆð —‘ 8Ò+Ø˜1Ÿ6™6 d§m¡m˜6Ó4°q·v±vÀ$Ç-Á-°vÓ7PÑ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Ó ˆØ�I‰I�a‹LˆØ�O‰O˜AÓˆØ�I‰I�a‹LˆÙØˆHØ�G‰G�A‹JˆØˆ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ð ˜c 8˜mÑ,ð-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�R—Y‘Yô AôHK˜BŸI™Iô Kô\M˜bŸi™iõ Mr   