ó
    qyüi†O  ã                   óŠ  • S r SSK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
JrJr  SSKJr  SS	KJrJr  S
SKJr  \R(                  " \5      rS\S\4S jrS+S\\-  S\4S jjr " S S\R8                  5      r " S S\R<                  5      r " S S\R8                  5      r  " S S\R8                  5      r! " S S\R8                  5      r" " S S\R8                  5      r# " S S\R8                  5      r$ " S  S!\R8                  5      r%\ " S" S#\5      5       r&\ " S$ S%\&5      5       r'\" S&S'9 " S( S)\&5      5       r(/ S*Qr)g),zPyTorch EfficientNet model.é    N)Únné   )Úinitialization)ÚACT2FN)ÚBaseModelOutputWithNoAttentionÚ(BaseModelOutputWithPoolingAndNoAttentionÚ$ImageClassifierOutputWithNoAttention)ÚPreTrainedModel)Úauto_docstringÚloggingé   )ÚEfficientNetConfigÚconfigÚnum_channelsc                 ó¦   • U R                   nXR                  -  n[        U[        XS-  -   5      U-  U-  5      nUSU-  :  a  X2-  n[        U5      $ )z4
Round number of filters based on depth multiplier.
é   gÍÌÌÌÌÌì?)Údepth_divisorÚwidth_coefficientÚmaxÚint)r   r   ÚdivisorÚnew_dims       Ús/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/models/efficientnet/modeling_efficientnet.pyÚround_filtersr   $   s`   € ð ×"Ñ"€GØ×,Ñ,Ñ,€LÜ�'œ3˜|¸©kÑ9Ó:¸gÑEÈÑOÓP€Gð ��|Ñ#Ó#ØÑˆäˆw‹<Ðó    Úkernel_sizeÚadjustc                 ó´   • [        U [        5      (       a  X 4n U S   S-  U S   S-  4nU(       a  US   S-
  US   US   S-
  US   4$ US   US   US   US   4$ )a.  
Utility function to get the tuple padding value for the depthwise convolution.

Args:
    kernel_size (`int` or `tuple`):
        Kernel size of the convolution layers.
    adjust (`bool`, *optional*, defaults to `True`):
        Adjusts padding value to apply to right and bottom sides of the input.
r   r   r   )Ú
isinstancer   )r   r   Úcorrects      r   Úcorrect_padr!   3   s~   € ô �+œs×#Ñ#Ø"Ð0ˆà˜1‰~ Ñ" K°¡N°aÑ$7Ð8€GÞØ˜‘
˜Q‘ ¨¡
¨G°A©J¸©N¸GÀA¹JÐGÐGà˜‘
˜G A™J¨°©
°G¸A±JÐ?Ð?r   c                   ón   ^ • \ rS rSrSrS\4U 4S jjrS\R                  S\R                  4S jr	Sr
U =r$ )	ÚEfficientNetEmbeddingséG   zD
A module that corresponds to the stem module of the original work.
r   c           	      ó|  >• [         TU ]  5         [        US5      U l        [        R
                  " SS9U l        [        R                  " UR                  U R                  SSSSS9U l	        [        R                  " U R                  UR                  UR                  S	9U l        [        UR                     U l        g )
Né    )r   r   r   r   ©Úpaddingr   r   ÚvalidF©r   Ústrider(   Úbias)ÚepsÚmomentum)ÚsuperÚ__init__r   Úout_dimr   Ú	ZeroPad2dr(   ÚConv2dr   ÚconvolutionÚBatchNorm2dÚbatch_norm_epsÚbatch_norm_momentumÚ	batchnormr   Ú
hidden_actÚ
activation©Úselfr   Ú	__class__s     €r   r0   ÚEfficientNetEmbeddings.__init__L   s�   ø€ Ü‰ÑÔä$ V¨RÓ0ˆŒÜ—|’|¨LÑ9ˆŒÜŸ9š9Ø×Ñ §¡¸1ÀQÐPWÐ^cñ
ˆÔô Ÿš¨¯©¸&×:OÑ:OÐZ`×ZtÑZtÑuˆŒÜ  ×!2Ñ!2Ñ3ˆ�r   Úpixel_valuesÚreturnc                 óŽ   • U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ ©N)r(   r4   r8   r:   )r<   r?   Úfeaturess      r   ÚforwardÚEfficientNetEmbeddings.forwardW   sA   € Ø—<‘< Ó-ˆØ×#Ñ# HÓ-ˆØ—>‘> (Ó+ˆØ—?‘? 8Ó,ˆàˆr   )r:   r8   r4   r1   r(   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r0   ÚtorchÚTensorrD   Ú__static_attributes__Ú__classcell__©r=   s   @r   r#   r#   G   s5   ø† ñð	4Ð1÷ 	4ð E§L¡Lð °U·\±\÷ ò r   r#   c                   ó:   ^ • \ rS rSr       SU 4S jjrSrU =r$ )ÚEfficientNetDepthwiseConv2dé`   c	                 ó8   >• X-  n	[         T
U ]  UU	UUUUUUUS9	  g )N)	Úin_channelsÚout_channelsr   r+   r(   ÚdilationÚgroupsr,   Úpadding_mode)r/   r0   )r<   rT   Údepth_multiplierr   r+   r(   rV   r,   rX   rU   r=   s             €r   r0   Ú$EfficientNetDepthwiseConv2d.__init__a   s:   ø€ ð #Ñ5ˆÜ‰ÑØ#Ø%Ø#ØØØØØØ%ð 	ò 
	
r   © )r   r   r   r   r   TÚzeros)rF   rG   rH   rI   r0   rM   rN   rO   s   @r   rQ   rQ   `   s$   ø† ð ØØØØØØ÷
õ 
r   rQ   c                   óz   ^ • \ rS rSrSrS\S\S\S\4U 4S jjrS\R                  S	\R                  4S
 jrSrU =r$ )ÚEfficientNetExpansionLayeréz   zW
This corresponds to the expansion phase of each block in the original implementation.
r   Úin_dimr1   r+   c                 óÒ   >• [         TU ]  5         [        R                  " UUSSSS9U l        [        R
                  " X1R                  S9U l        [        UR                     U l
        g )Nr   ÚsameF©rT   rU   r   r(   r,   )Únum_featuresr-   )r/   r0   r   r3   Úexpand_convr5   r6   Ú	expand_bnr   r9   Ú
expand_act)r<   r   r`   r1   r+   r=   s        €r   r0   Ú#EfficientNetExpansionLayer.__init__   sX   ø€ Ü‰ÑÔÜŸ9š9ØØ ØØØñ
ˆÔô Ÿš°W×BWÑBWÑXˆŒÜ  ×!2Ñ!2Ñ3ˆ�r   Úhidden_statesr@   c                 ól   • U R                  U5      nU R                  U5      nU R                  U5      nU$ rB   )re   rf   rg   ©r<   ri   s     r   rD   Ú"EfficientNetExpansionLayer.forward‹   s4   € à×(Ñ(¨Ó7ˆØŸ™ }Ó5ˆØŸ™¨Ó6ˆàÐr   )rg   rf   re   )rF   rG   rH   rI   rJ   r   r   r0   rK   ÚFloatTensorrL   rD   rM   rN   rO   s   @r   r^   r^   z   sM   ø† ñð
4Ð1ð 
4¸3ð 
4Èð 
4ÐVY÷ 
4ð U×%6Ñ%6ð ¸5¿<¹<÷ ò r   r^   c            
       ó~   ^ • \ rS rSrSrS\S\S\S\S\4
U 4S jjrS	\	R                  S
\	R                  4S jrSrU =r$ )ÚEfficientNetDepthwiseLayeré”   zc
This corresponds to the depthwise convolution phase of each block in the original implementation.
r   r`   r+   r   Úadjust_paddingc                 óF  >• [         TU ]  5         X0l        U R                  S:X  a  SOSn[        XES9n[        R
                  " US9U l        [        X$X6SS9U l        [        R                  " X!R                  UR                  S9U l        [        UR                     U l        g )	Nr   r)   rb   )r   r'   Fr*   ©rd   r-   r.   )r/   r0   r+   r!   r   r2   Údepthwise_conv_padrQ   Údepthwise_convr5   r6   r7   Údepthwise_normr   r9   Údepthwise_act)	r<   r   r`   r+   r   rq   Úconv_padr(   r=   s	           €r   r0   Ú#EfficientNetDepthwiseLayer.__init__™   s�   ø€ ô 	‰ÑÔØŒØ"Ÿk™k¨QÓ.‘7°FˆÜ˜kÑAˆä"$§,¢,°wÑ"?ˆÔÜ9Ø°FÐSXñ
ˆÔô !ŸnšnØ×%:Ñ%:ÀV×E_ÑE_ñ
ˆÔô $ F×$5Ñ$5Ñ6ˆÕr   ri   r@   c                 ó®   • U R                   S:X  a  U R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU$ )Nr   )r+   rt   ru   rv   rw   rk   s     r   rD   Ú"EfficientNetDepthwiseLayer.forward¯   sT   € à�;‰;˜!ÓØ ×3Ñ3°MÓBˆMà×+Ñ+¨MÓ:ˆØ×+Ñ+¨MÓ:ˆØ×*Ñ*¨=Ó9ˆàÐr   )rw   ru   rt   rv   r+   ©rF   rG   rH   rI   rJ   r   r   Úboolr0   rK   rm   rL   rD   rM   rN   rO   s   @r   ro   ro   ”   s_   ø† ñð7à"ð7ð ð7ð ð	7ð
 ð7ð ÷7ð,	 U×%6Ñ%6ð 	¸5¿<¹<÷ 	ò 	r   ro   c            	       ó~   ^ • \ rS rSrSrSS\S\S\S\4U 4S jjjrS\	R                  S	\	R                  4S
 jrSrU =r$ )ÚEfficientNetSqueezeExciteLayeré»   zd
This corresponds to the Squeeze and Excitement phase of each block in the original implementation.
r   r`   Ú
expand_dimÚexpandc                 óä  >• [         TU ]  5         U(       a  UOUU l        [        S[	        X!R
                  -  5      5      U l        [        R                  " SS9U l	        [        R                  " U R                  U R                  SSS9U l        [        R                  " U R                  U R                  SSS9U l        [        UR                     U l        [        R                   " 5       U l        g )Nr   )Úoutput_sizerb   )rT   rU   r   r(   )r/   r0   Údimr   r   Úsqueeze_expansion_ratioÚdim_ser   ÚAdaptiveAvgPool2dÚsqueezer3   Úreducer‚   r   r9   Ú
act_reduceÚSigmoidÚ
act_expand)r<   r   r`   r�   r‚   r=   s        €r   r0   Ú'EfficientNetSqueezeExciteLayer.__init__À   s²   ø€ Ü‰ÑÔÞ!'‘:¨VˆŒÜ˜!œS ×*HÑ*HÑ!HÓIÓJˆŒä×+Ò+¸Ñ:ˆŒÜ—i’iØŸ™ØŸ™ØØñ	
ˆŒô —i’iØŸ™ØŸ™ØØñ	
ˆŒô ! ×!2Ñ!2Ñ3ˆŒÜŸ*š*›,ˆ�r   ri   r@   c                 óà   • Un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[
        R                  " X!5      nU$ rB   )r‰   rŠ   r‹   r‚   r�   rK   Úmul)r<   ri   Úinputss      r   rD   Ú&EfficientNetSqueezeExciteLayer.forwardÕ   sa   € ØˆØŸ™ ]Ó3ˆØŸ™ MÓ2ˆØŸ™¨Ó6ˆàŸ™ MÓ2ˆØŸ™¨Ó6ˆÜŸ	š	 &Ó8ˆàÐr   )r�   r‹   r…   r‡   r‚   rŠ   r‰   )Fr|   rO   s   @r   r   r   »   sR   ø† ññ'Ð1ð '¸3ð 'ÈCð 'ÐY]÷ 'ð 'ð*
 U×%6Ñ%6ð 
¸5¿<¹<÷ 
ò 
r   r   c                   óš   ^ • \ rS rSrSrS\S\S\S\S\S\4U 4S	 jjr	S
\
R                  S\
R                  S\
R                  4S jrSrU =r$ )ÚEfficientNetFinalBlockLayeréâ   zS
This corresponds to the final phase of each block in the original implementation.
r   r`   r1   r+   Ú	drop_rateÚid_skipc                 ó  >• [         TU ]  5         US:H  =(       a    U(       + U l        [        R                  " UUSSSS9U l        [        R                  " X1R                  UR                  S9U l	        [        R                  " US9U l        g )Nr   rb   Frc   rs   ©Úp)r/   r0   Úapply_dropoutr   r3   Úproject_convr5   r6   r7   Ú
project_bnÚDropoutÚdropout)r<   r   r`   r1   r+   r–   r—   r=   s          €r   r0   Ú$EfficientNetFinalBlockLayer.__init__ç   sx   ø€ ô 	‰ÑÔØ# q™[×8°¬[ˆÔÜŸIšIØØ ØØØñ
ˆÔô Ÿ.š.Ø ×&;Ñ&;Àf×F`ÑF`ñ
ˆŒô —z’z IÑ.ˆ�r   Ú
embeddingsri   r@   c                 ó–   • U R                  U5      nU R                  U5      nU R                  (       a  U R                  U5      nX!-   nU$ rB   )rœ   r�   r›   rŸ   )r<   r¡   ri   s      r   rD   Ú#EfficientNetFinalBlockLayer.forwardø   sE   € Ø×)Ñ)¨-Ó8ˆØŸ™¨Ó6ˆà××Ø ŸL™L¨Ó7ˆMØ)Ñ6ˆMàÐr   )r›   rŸ   r�   rœ   ©rF   rG   rH   rI   rJ   r   r   Úfloatr}   r0   rK   rm   rL   rD   rM   rN   rO   s   @r   r”   r”   â   so   ø† ñð/Ø(ð/Ø25ð/Ø@Cð/ØMPð/Ø]bð/Ømq÷/ð" %×"3Ñ"3ð ÀE×DUÑDUð ÐZ_×ZfÑZf÷ ò r   r”   c                   óŽ   ^ • \ rS rSrSrS\S\S\S\S\S\S	\S
\S\4U 4S jjr	S\
R                  S\
R                  4S jrSrU =r$ )ÚEfficientNetBlocki  aA  
This corresponds to the expansion and depthwise convolution phase of each block in the original implementation.

Args:
    config ([`EfficientNetConfig`]):
        Model configuration class.
    in_dim (`int`):
        Number of input channels.
    out_dim (`int`):
        Number of output channels.
    stride (`int`):
        Stride size to be used in convolution layers.
    expand_ratio (`int`):
        Expand ratio to set the output dimensions for the expansion and squeeze-excite layers.
    kernel_size (`int`):
        Kernel size for the depthwise convolution layer.
    drop_rate (`float`):
        Dropout rate to be used in the final phase of each block.
    id_skip (`bool`):
        Whether to apply dropout and sum the final hidden states with the input embeddings during the final phase
        of each block. Set to `True` for the first block of each stage.
    adjust_padding (`bool`):
        Whether to apply padding to only right and bottom side of the input kernel before the depthwise convolution
        operation, set to `True` for inputs with odd input sizes.
r   r`   r1   r+   Úexpand_ratior   r–   r—   rq   c
           	      óf  >• [         TU ]  5         XPl        U R                  S:g  U l        X%-  n
U R                  (       a  [	        XX¤S9U l        [        UU R                  (       a  U
OUUUU	S9U l        [        XX R                  S9U l	        [        UU R                  (       a  U
OUUUUUS9U l        g )Nr   )r   r`   r1   r+   )r   r`   r+   r   rq   )r   r`   r�   r‚   )r   r`   r1   r+   r–   r—   )r/   r0   r¨   r‚   r^   Ú	expansionro   ru   r   Úsqueeze_exciter”   Ú
projection)r<   r   r`   r1   r+   r¨   r   r–   r—   rq   Úexpand_in_dimr=   s              €r   r0   ÚEfficientNetBlock.__init__  s®   ø€ ô 	‰ÑÔØ(ÔØ×'Ñ'¨1Ñ,ˆŒØÑ-ˆà�;�;Ü7Ø°mñˆDŒNô 9ØØ$(§K§K‘=°VØØ#Ø)ñ
ˆÔô =Ø°]Ï;É;ñ
ˆÔô 6ØØ$(§K§K‘=°VØØØØñ
ˆ�r   ri   r@   c                 ó²   • UnU R                   S:w  a  U R                  U5      nU R                  U5      nU R                  U5      nU R	                  X!5      nU$ )Nr   )r¨   rª   ru   r«   r¬   )r<   ri   r¡   s      r   rD   ÚEfficientNetBlock.forwardG  sY   € Ø"ˆ
à×Ñ Ó!Ø ŸN™N¨=Ó9ˆMØ×+Ñ+¨MÓ:ˆð ×+Ñ+¨MÓ:ˆØŸ™¨
ÓBˆØÐr   )ru   r‚   r¨   rª   r¬   r«   r¤   rO   s   @r   r§   r§     sˆ   ø† ñð4'
à"ð'
ð ð'
ð ð	'
ð
 ð'
ð ð'
ð ð'
ð ð'
ð ð'
ð ÷'
ðR
 U×%6Ñ%6ð 
¸5¿<¹<÷ 
ò 
r   r§   c            	       óv   ^ • \ rS rSrSrS\4U 4S jjr  SS\R                  S\	S-  S\	S-  S	\
4S
 jjrSrU =r$ )ÚEfficientNetEncoderiT  z“
Forward propagates the embeddings through each EfficientNet block.

Args:
    config ([`EfficientNetConfig`]):
        Model configuration class.
r   c                 óà  >^ ^• [         TT ]  5         UT l        UR                  T l        U 4S jm[	        UR
                  5      n[        U4S jUR                   5       5      nSn/ n[        U5       Hå  n[        XR
                  U   5      n[        XR                  U   5      nUR                  U   n	UR                  U   n
UR                  U   n[        T" UR                  U   5      5       Hc  nUS:H  nUS:”  a  SOU	n	US:”  a  UOUnXAR                  ;  nUR                  U-  U-  n[!        UUUU	U
UUUUS9	nUR#                  U5        US-  nMe     Mç     [$        R&                  " U5      T l        [$        R*                  " W[        US5      SSSS	9T l        [$        R.                  " UR0                  UR2                  UR4                  S
9T l        [8        UR:                     T l        g )Nc                 ó\   >• [        [        R                  " TR                  U -  5      5      $ rB   )r   ÚmathÚceilÚdepth_coefficient)Úrepeatsr<   s    €r   Úround_repeatsÚ3EfficientNetEncoder.__init__.<locals>.round_repeatsb  s"   ø€ ä”t—y’y ×!7Ñ!7¸'Ñ!AÓBÓCÐCr   c              3   ó4   >#   • U  H  nT" U5      v •  M     g 7frB   r[   )Ú.0Únr¹   s     €r   Ú	<genexpr>Ú/EfficientNetEncoder.__init__.<locals>.<genexpr>g  s   øé € ÐLÒ3K¨a™ q×)Ð)Ò3Kùs   ƒr   r   )	r   r`   r1   r+   r   r¨   r–   r—   rq   i   rb   Frc   rs   )r/   r0   r   r·   ÚlenrT   ÚsumÚnum_block_repeatsÚranger   rU   ÚstridesÚkernel_sizesÚexpand_ratiosÚdepthwise_paddingÚdrop_connect_rater§   Úappendr   Ú
ModuleListÚblocksr3   Útop_convr5   Ú
hidden_dimr6   r7   Útop_bnr   r9   Útop_activation)r<   r   Únum_base_blocksÚ
num_blocksÚcurr_block_numrË   Úir`   r1   r+   r   r¨   Újr—   rq   r–   Úblockr¹   r=   s   `                @€r   r0   ÚEfficientNetEncoder.__init__]  sÞ  ú€ Ü‰ÑÔØˆŒØ!'×!9Ñ!9ˆÔõ	Dô ˜f×0Ñ0Ó1ˆÜÔL°6×3KÒ3KÓLÓLˆ
àˆØˆÜ�Ö'ˆAÜ" 6×+=Ñ+=¸aÑ+@ÓAˆFÜ# F×,?Ñ,?ÀÑ,BÓCˆGØ—^‘^ AÑ&ˆFØ ×-Ñ-¨aÑ0ˆKØ!×/Ñ/°Ñ2ˆLä™=¨×)AÑ)AÀ!Ñ)DÓEÖF�Ø˜q™&�Ø !›e™¨�Ø$%¨£E™¨v�Ø!/×7OÑ7OÑ!O�Ø"×4Ñ4°~ÑEÈ
ÑR�	ä)Ø!Ø!Ø#Ø!Ø +Ø!-Ø'Ø#Ø#1ñ
�ð —‘˜eÔ$Ø !Ñ#’ó' Gñ (ô8 —m’m FÓ+ˆŒÜŸ	š	ØÜ& v¨tÓ4ØØØñ
ˆŒô —n’nØ×*Ñ*°×0EÑ0EÐPV×PjÑPjñ
ˆŒô % V×%6Ñ%6Ñ7ˆÕr   ri   Úoutput_hidden_statesNÚreturn_dictr@   c                 ó  • U(       a  U4OS nU R                    H  nU" U5      nU(       d  M  XA4-  nM     U R                  U5      nU R                  U5      nU R                  U5      nU(       d  [	        S X4 5       5      $ [        UUS9$ )Nc              3   ó.   #   • U  H  oc  M  Uv •  M     g 7frB   r[   )r¼   Úvs     r   r¾   Ú.EfficientNetEncoder.forward.<locals>.<genexpr>¦  s   é € ÐXÒ$F˜qŸ™Ò$Fùs   ‚Œ	)Úlast_hidden_stateri   )rË   rÌ   rÎ   rÏ   Útupler   )r<   ri   r×   rØ   Úall_hidden_statesrÕ   s         r   rD   ÚEfficientNetEncoder.forward”  s”   € ö 1E˜]Ñ,È$Ðà—[”[ˆEÙ! -Ó0ˆMß#Ð#Ø!Ð%5Ñ5Ò!ñ !ð
 Ÿ™ mÓ4ˆØŸ™ MÓ2ˆØ×+Ñ+¨MÓ:ˆæÜÑX ]Ñ$FÓXÓXÐXä-Ø+Ø+ñ
ð 	
r   )rË   r   r·   rÏ   rÎ   rÌ   )FT)rF   rG   rH   rI   rJ   r   r0   rK   rm   r}   r   rD   rM   rN   rO   s   @r   r²   r²   T  s\   ø† ñð58Ð1÷ 58ðt -2Ø#'ñ	
à×(Ñ(ð
ð # T™kð
ð ˜D‘[ð	
ð
 
(÷
ó 
r   r²   c                   ó|   • \ rS rSr% \\S'   SrSrSrS/r	\
R                  " 5       S\R                  4S j5       rS	rg
)ÚEfficientNetPreTrainedModeli®  r   Úefficientnetr?   )Úimager§   Úmodulec                 ó"  • [        U[        R                  [        R                  [        R                  45      (       aÑ  [
        R                  " UR                  SU R                  R                  S9  UR                  b   [
        R                  " UR                  5        [        USS5      ba  [
        R                  " UR                  5        [
        R                  " UR                  5        [
        R                  " UR                   5        ggg)zInitialize the weightsg        )ÚmeanÚstdNÚrunning_mean)r   r   ÚLinearr3   r5   ÚinitÚnormal_Úweightr   Úinitializer_ranger,   Úzeros_Úgetattrré   Úones_Úrunning_varÚnum_batches_tracked)r<   rå   s     r   Ú_init_weightsÚ)EfficientNetPreTrainedModel._init_weights¶  s­   € ô �fœrŸy™y¬"¯)©)´R·^±^ÐD×EÑEÜ�LŠL˜Ÿ™¨S°d·k±k×6SÑ6SÒTØ�{‰{Ñ&Ü—’˜FŸK™KÔ(Ü�v˜~¨tÓ4Ñ@Ü—’˜F×/Ñ/Ô0Ü—
’
˜6×-Ñ-Ô.Ü—’˜F×6Ñ6Õ7ð Að	 Fr   r[   N)rF   rG   rH   rI   r   Ú__annotations__Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚ_no_split_modulesrK   Úno_gradr   ÚModulerô   rM   r[   r   r   râ   râ   ®  sE   ‡ àÓØ&ÐØ$€OØ!ÐØ,Ð-Ðà
‡]‚]ƒ_ð	8 B§I¡Ió 	8ó ó	8r   râ   c                   óŠ   ^ • \ rS rSrS\4U 4S jjr\   SS\R                  S-  S\	S-  S\	S-  S\
\-  4S	 jj5       rS
rU =r$ )ÚEfficientNetModeliÃ  r   c                 ó”  >• [         TU ]  U5        Xl        [        U5      U l        [        U5      U l        UR                  S:X  a%  [        R                  " UR                  SS9U l        OMUR                  S:X  a%  [        R                  " UR                  SS9U l        O[        SUR                   35      eU R                  5         g )Nrç   T)Ú	ceil_moder   z2config.pooling must be one of ['mean', 'max'] got )r/   r0   r   r#   r¡   r²   ÚencoderÚpooling_typer   Ú	AvgPool2drÍ   ÚpoolerÚ	MaxPool2dÚ
ValueErrorÚpoolingÚ	post_initr;   s     €r   r0   ÚEfficientNetModel.__init__Å  s¢   ø€ Ü‰Ñ˜Ô ØŒÜ0°Ó8ˆŒÜ*¨6Ó2ˆŒð ×Ñ &Ó(ÜŸ,š, v×'8Ñ'8ÀDÑIˆD�KØ× Ñ  EÓ)ÜŸ,š, v×'8Ñ'8ÀDÑIˆD�KäÐQÐRX×R`ÑR`ÐQaÐbÓcÐcð 	�‰Õr   Nr?   r×   rØ   r@   c                 ó€  • Ub  UOU R                   R                  nUb  UOU R                   R                  nUc  [        S5      eU R	                  U5      nU R                  UUUS9nUS   nU R                  U5      nUR                  UR                  S S 5      nU(       d	  Xx4USS  -   $ [        UUUR                  S9$ )Nz You have to specify pixel_values©r×   rØ   r   r   r   )rÝ   Úpooler_outputri   )r   r×   rØ   r  r¡   r  r  ÚreshapeÚshaper   ri   )	r<   r?   r×   rØ   ÚkwargsÚembedding_outputÚencoder_outputsrÝ   Úpooled_outputs	            r   rD   ÚEfficientNetModel.forwardÖ  sà   € ð %9Ñ$DÑ È$Ï+É+×JjÑJjð 	ð &1Ñ%<‘kÀ$Ç+Á+×BYÑBYˆàÑÜÐ?Ó@Ð@àŸ?™?¨<Ó8ÐàŸ,™,ØØ!5Ø#ð 'ð 
ˆð ,¨AÑ.ÐØŸ™Ð$5Ó6ˆà%×-Ñ-¨m×.AÑ.AÀ"À1Ð.EÓFˆæØ%Ð5¸ÈÈÐ8KÑKÐKä7Ø/Ø'Ø)×7Ñ7ñ
ð 	
r   )r   r¡   r  r  )NNN)rF   rG   rH   rI   r   r0   r   rK   rm   r}   rÞ   r   rD   rM   rN   rO   s   @r   rþ   rþ   Ã  sn   ø† ðÐ1÷ ð" ð 26Ø,0Ø#'ñ	#
à×'Ñ'¨$Ñ.ð#
ð # T™kð#
ð ˜D‘[ð	#
ð 
Ð9Ñ	9ô#
ó ö#
r   rþ   zŒ
    EfficientNet Model with an image classification head on top (a linear layer on top of the pooled features), e.g.
    for ImageNet.
    )Úcustom_introc                   ó¢   ^ • \ rS rSrU 4S jr\    SS\R                  S-  S\R                  S-  S\	S-  S\	S-  S\
\-  4
S	 jj5       rS
rU =r$ )Ú"EfficientNetForImageClassificationiý  c                 ó‚  >• [         TU ]  U5        UR                  U l        Xl        [	        U5      U l        [        R                  " UR                  S9U l	        U R                  S:”  a+  [        R                  " UR                  U R                  5      O[        R                  " 5       U l        U R                  5         g )Nr™   r   )r/   r0   Ú
num_labelsr   rþ   rã   r   rž   Údropout_raterŸ   rê   rÍ   ÚIdentityÚ
classifierr  r;   s     €r   r0   Ú+EfficientNetForImageClassification.__init__  s…   ø€ Ü‰Ñ˜Ô Ø ×+Ñ+ˆŒØŒÜ-¨fÓ5ˆÔä—z’z F×$7Ñ$7Ñ8ˆŒØKOÏ?É?Ð]^ÓK^œ"Ÿ)š) F×$5Ñ$5°t·±ÔGÔdf×doÒdoÓdqˆŒð 	�‰Õr   Nr?   Úlabelsr×   rØ   r@   c                 ón  • Ub  UOU R                   R                  nU R                  XUS9nU(       a  UR                  OUS   nU R	                  U5      nU R                  U5      nSn	Ub  U R                  X(U R                   5      n	U(       d  U4USS -   n
U	b  U	4U
-   $ U
$ [        U	UUR                  S9$ )ab  
labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
    Labels for computing the image classification/regression loss. Indices should be in `[0, ...,
    config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
    `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
Nr  r   r   )ÚlossÚlogitsri   )	r   rØ   rã   r  rŸ   r  Úloss_functionr	   ri   )r<   r?   r  r×   rØ   r  Úoutputsr  r   r  Úoutputs              r   rD   Ú*EfficientNetForImageClassification.forward  sÈ   € ð &1Ñ%<‘kÀ$Ç+Á+×BYÑBYˆà×#Ñ# LÐitÐ#Ðuˆæ1<˜×-Ò-À'È!Á*ˆØŸ™ ]Ó3ˆØ—‘ Ó/ˆàˆØÑØ×%Ñ% f°d·k±kÓBˆDæØ�Y ¨¨ Ñ,ˆFØ)-Ñ)9�T�G˜fÑ$ÐE¸vÐEä3ØØØ!×/Ñ/ñ
ð 	
r   )r  r   rŸ   rã   r  )NNNN)rF   rG   rH   rI   r0   r   rK   rm   Ú
LongTensorr}   rÞ   r	   rD   rM   rN   rO   s   @r   r  r  ý  s~   ø† õ
ð ð 26Ø*.Ø,0Ø#'ñ"
à×'Ñ'¨$Ñ.ð"
ð × Ñ  4Ñ'ð"
ð # T™kð	"
ð
 ˜D‘[ð"
ð 
Ð5Ñ	5ô"
ó ö"
r   r  )r  rþ   râ   )T)*rJ   rµ   rK   r   Ú r   rë   Úactivationsr   Úmodeling_outputsr   r   r	   Úmodeling_utilsr
   Úutilsr   r   Úconfiguration_efficientnetr   Ú
get_loggerrF   Úloggerr   r   rÞ   r}   r!   rü   r#   r3   rQ   r^   ro   r   r”   r§   r²   râ   rþ   r  Ú__all__r[   r   r   Ú<module>r/     s^  ðñ "ã ã Ý å &Ý !÷ñ õ
 .ß ,Ý :ð 
×	Ò	˜HÓ	%€ðÐ,ð ¸Cô ñ@˜S 5™[ð @°$õ @ô(˜RŸY™Yô ô2
 "§)¡)ô 
ô4 §¡ô ô4$ §¡ô $ôN$ R§Y¡Yô $ôN "§)¡)ô ôBN˜Ÿ	™	ô NôbW
˜"Ÿ)™)ô W
ðt ô8 /ó 8ó ð8ð( ô6
Ð3ó 6
ó ð6
ñr ðñô0
Ð)Dó 0
óð0
òf e�r   