Ë
    éÓ^jÙ]  ã                   óŠ  — d Z ddlmZmZ ddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZmZ ddlmZ ddlmZmZmZmZmZmZ dd	l­ dd
lmZ g d¢Z ej6                  e«      ZdZdZdZ  e!ee ¬«      Z"eeee#ef         Z$d„ Z%d„ Z&dd„Z'dd„Z(d„ Z)d„ Z*d„ Z+d d„Z,	 	 	 	 	 d!d„Z- G d„ d«      Z.d"d„Z/d#dej`                  fd„Z1y)$zü EfficientNet, MobileNetV3, etc Builder

Assembles EfficieNet and related network feature blocks from string definitions.
Handles stride, dilation calculations, and selects feature extraction points.

Hacked together by / Copyright 2019, Ross Wightman
é    )ÚCallableÚOptionalN)Údeepcopy)Úpartial)ÚAnyÚDictÚList)Ú
CondConv2dÚget_condconv_initializerÚget_act_layerÚget_attnÚmake_divisibleÚ	LayerTypeé   )Ú*)Únamed_modules)	ÚEfficientNetBuilderÚ	BlockArgsÚdecode_arch_defÚefficientnet_init_weightsÚresolve_bn_argsÚresolve_act_layerÚround_channelsÚBN_MOMENTUM_TF_DEFAULTÚBN_EPS_TF_DEFAULTFg€®Gáz„?gü©ñÒMbP?)ÚmomentumÚepsc                  ó*   — t         j                  «       S ©N)Ú_BN_ARGS_TFÚcopy© ó    úl/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/_efficientnet_builder.pyÚget_bn_args_tfr%   +   s   € Ü×ÑÓÐr#   c                 ón   — i }| j                  dd «      }|�||d<   | j                  dd «      }|�||d<   |S )NÚbn_momentumr   Úbn_epsr   )Úpop)ÚkwargsÚbn_argsr'   r(   s       r$   r   r   /   sK   € Ø€GØ—*‘*˜]¨DÓ1€KØÐØ)ˆ�
ÑØ�Z‰Z˜ $Ó'€FØÐØˆ�‰Ø€Nr#   c                 ó8   — t        | j                  d|«      «      S )NÚ	act_layer)r   r)   )r*   Údefaults     r$   r   r   :   s   € Ü˜Ÿ™ K°Ó9Ó:Ð:r#   c                 ó.   — |s| S t        | |z  |||¬«      S )z2Round number of filters based on depth multiplier.)Úround_limit)r   )ÚchannelsÚ
multiplierÚdivisorÚchannel_minr0   s        r$   r   r   >   s!   € áØˆÜ˜( ZÑ/°¸+ÐS^Ô_Ð_r#   c                 ó4   — |rt         j                  | «       y y r   )Ú_loggerÚinfo)ÚmsgÚ	conditions     r$   Ú_log_info_ifr:   E   s   € ÙÜ�‰�SÕð r#   c                 ó’   — | j                  «       rt        | «      S | j                  d«      D �cg c]  }t        |«      ‘Œ c}S c c}w )Nú.)ÚisdigitÚintÚsplit)ÚssÚks     r$   Ú_parse_ksizerB   J   s4   € Ø	‡z�z„|Ü�2‹wˆà "§¡¨£Ö.˜1”�A•Ò.Ð.ùÒ.s   ¯Ac                 óâ  — t        | t        «      sJ ‚| j                  d«      }|d   }|dd }i }d}|D ]»  }|dk(  rd}Œ|dk(  rd}Œ|j                  d	«      rf|d   }|dd }|d
k(  rt	        d«      }nE|dk(  rt	        d«      }n4|dk(  rt	        d«      }n#|dk(  rt	        d«      }n|dk(  rt	        d«      }nŒ„|||<   ŒŠt        j                  d|«      }	t        |	«      dk\  sŒ¯|	dd \  }}|||<   Œ½ d	|v r|d	   nd}
d|v rt        |d   «      nd}d|v rt        |d   «      nd}d|v rt        |d   «      nd}t        |d   «      }t        |t        |d   «      t        |d   «      |
¬«      }|dk(  rˆ|j                  t        t        |d   «      ||t        |d   «      t        |j                  d d!«      «      |du t        |j                  d"d«      «      dkD  ¬#«      «       d$|v �rpt        |d$   «      |d%<   �n]|d&k(  s|d'k(  ro|j                  t        t        |d   «      |t        |j                  d d!«      «      |d'k(  |d'k(  xs |du t        |j                  d"d«      «      dkD  ¬(«      «       �nä|d)k(  rU|j                  t        t        |d   «      |t        |d   «      |t        |j                  d d!«      «      |du ¬*«      «       �nŠ|d+k(  r,|j                  t        t        |d   «      |du ¬,«      «       �nY|d-k(  r|d|v rt        |d   «      nd}d|v rt        |d   «      nd}|j                  t        |t        |d   «      |t        |d   «      t        |j                  d d!«      «      |du ¬.«      «       nØ|d/k(  rbt        |d"   «      }|j                  t        t        |d   «      t        |d0   «      ||t        |j                  d1d«      «      |du ¬2«      «       nq|d3k(  rbt        |d"   «      }|j                  t        t        |d   «      t        |d0   «      ||t        |j                  d1d«      «      |du ¬2«      «       n
J d4|z  «       ‚d5|v rt        |d5   «      |d6<   ||fS )7a@   Decode block definition string

    Gets a list of block arg (dicts) through a string notation of arguments.
    E.g. ir_r2_k3_s2_e1_i32_o16_se0.25_noskip

    All args can exist in any order with the exception of the leading string which
    is assumed to indicate the block type.

    leading string - block type (
      ir = InvertedResidual, ds = DepthwiseSep, dsa = DeptwhiseSep with pw act, cn = ConvBnAct)
    r - number of repeat blocks,
    k - kernel size,
    s - strides (1-9),
    e - expansion ratio,
    c - output channels,
    se - squeeze/excitation ratio
    n - activation fn ('re', 'r6', 'hs', or 'sw')
    Args:
        block_str: a string representation of block arguments.
    Returns:
        A list of block args (dicts)
    Raises:
        ValueError: if the string def not properly specified (TODO)
    Ú_r   r   NÚnoskipFÚskipTÚnÚreÚreluÚr6Úrelu6ÚhsÚ
hard_swishÚswÚswishÚmiÚmishz(\d.*)é   ÚaÚpÚfcÚrÚcÚs)Ú
block_typeÚout_chsÚstrider-   ÚirrA   ÚeÚseç        Úd)Údw_kernel_sizeÚexp_kernel_sizeÚpw_kernel_sizeÚ	exp_ratioÚse_ratiorE   Ús2dÚccÚnum_expertsÚdsÚdsa)ra   rc   re   Úpw_actrE   rf   Úer)rb   rc   rd   Úforce_in_chsre   rE   Úcn)Úkernel_sizerF   Úuir)Údw_kernel_size_startÚdw_kernel_size_midÚdw_kernel_size_endrd   re   rE   ÚmhaÚhÚv)ra   Ú	num_headsÚkey_dimÚ	value_dimÚ	kv_striderE   ÚmqazUnknown block type (%s)ÚgsÚ
group_size)Ú
isinstanceÚstrr?   Ú
startswithr   rH   ÚlenrB   r>   ÚdictÚupdateÚfloatÚget)Ú	block_strÚopsrY   ÚoptionsrF   ÚopÚkeyrv   ÚvalueÚsplitsr-   Ústart_kernel_sizeÚend_kernel_sizerm   Ú
num_repeatÚ
block_argsÚkv_dims                    r$   Ú_decode_block_strr’   Q   s¼  € ô2 �i¤Ô%Ð%Ð%Ø
�/‰/˜#Ó
€CØ�Q‘€JØ
ˆaˆbˆ'€CØ€GØ€DØò %ˆà�Š>Ø‰DØ�6Š\Ø‰DØ�]‰]˜3Ôà�Q‘%ˆCØ�1�2�ˆAØ�DŠyÜ% fÓ-‘Ø�d’Ü% gÓ.‘Ø�d’Ü% lÓ3‘Ø�d’Ü% gÓ.‘Ø�d’Ü% fÓ-‘àØ ˆG�CŠLô —X‘X˜i¨Ó,ˆFÜ�6‹{˜aÓØ# B Q˜Z‘
��UØ$�˜’ð9%ð> !$ w¡�˜’°D€IØ69¸W±nœ W¨S¡\Ô2È!ÐØ47¸7±N”l 7¨3¡<Ô0È€OØ)-°©”3�w˜t‘}Ô%¸a€LÜ�W˜S‘\Ó"€Jô ØÜ�G˜C‘LÓ!Ü�7˜3‘<Ó Øô	€Jð �TÒØ×Ñœ$Ü'¨°©Ó5Ø-Ø*Ü˜G C™LÓ)Ü˜7Ÿ;™; t¨RÓ0Ó1Ø˜5�=Ü�G—K‘K  QÓ'Ó(¨1Ñ,ô
ô 	ð �7Š?Ü(+¨G°D©MÓ(:ˆJ�}Ó%Ø	�tÒ	˜z¨UÒ2Ø×Ñœ$Ü'¨°©Ó5Ø*Ü˜7Ÿ;™; t¨RÓ0Ó1Ø Ñ&Ø Ñ&Ò7¨$°%¨-Ü�G—K‘K  QÓ'Ó(¨1Ñ,ô
ö 	ð 
�tÒ	Ø×Ñœ$Ü(¨°©Ó6Ø*Ü˜G C™LÓ)Ø%Ü˜7Ÿ;™; t¨RÓ0Ó1Ø˜5�=ô
ö 	ð 
�tÒ	Ø×Ñœ$Ü˜G C™LÓ)Ø˜�ô
ö 	ð 
�uÒ	à:=À¹.œL¨°©Ô6ÈaÐØ8;¸w¹œ, w¨s¡|Ô4ÈAˆØ×Ñœ$Ø!2Ü+¨G°C©LÓ9Ø.Ü˜G C™LÓ)Ü˜7Ÿ;™; t¨RÓ0Ó1Ø˜5�=ô
õ 	ð 
�uÒ	Ü�W˜S‘\Ó"ˆØ×Ñœ$Ü'¨°©Ó5Ü˜' #™,Ó'ØØÜ˜'Ÿ+™+ c¨1Ó-Ó.Ø˜5�=ô
õ 	ð 
�uÒ	Ü�W˜S‘\Ó"ˆØ×Ñœ$Ü'¨°©Ó5Ü˜' #™,Ó'ØØÜ˜'Ÿ+™+ c¨1Ó-Ó.Ø˜5�=ô
õ 	ð 	=Ð/°*Ñ<Ó<ˆuàˆw�Ü#& w¨t¡}Ó#5ˆ
�<Ñ à�zÐ!Ð!r#   c           	      óÌ  — t        |«      }|dk(  rt        dt        ||z  «      «      }n!t        t	        j
                  ||z  «      «      }g }|ddd…   D ]8  }t        dt        ||z  |z  «      «      }|j                  |«       ||z  }||z  }Œ: |ddd…   }g }	t        | |«      D ]6  \  }
}|	j                  t        |«      D �cg c]  }t        |
«      ‘Œ c}«       Œ8 |	S c c}w )a   Per-stage depth scaling
    Scales the block repeats in each stage. This depth scaling impl maintains
    compatibility with the EfficientNet scaling method, while allowing sensible
    scaling for other models that may have multiple block arg definitions in each stage.
    Úroundr   Néÿÿÿÿ)ÚsumÚmaxr”   r>   ÚmathÚceilÚappendÚzipÚextendÚranger   )Ú
stack_argsÚrepeatsÚdepth_multiplierÚdepth_truncr�   Únum_repeat_scaledÚrepeats_scaledrV   ÚrsÚ	sa_scaledÚbaÚreprD   s                r$   Ú_scale_stage_depthr¨   è   s  € ô �W“€JØ�gÒô   ¤5¨Ð6FÑ)FÓ#GÓHÑô  ¤§	¡	¨*Ð7GÑ*GÓ HÓIÐð
 €NØ‘T�r�T‰]ò  ˆÜ�”E˜1˜z™>Ð,=Ñ=Ó?Ó@ˆØ×Ñ˜bÔ!Ø�a‰ˆ
Ø˜RÑÑð	 ð
 $¡D b DÑ)€Nð €IÜ�z >Ó2ò =‰ˆˆCØ×Ñ´°c³
Ö;¨1œ( 2�,Ò;Õ<ð=àÐùò <s   ÃC!
c           	      ó”  — g }t        |t        «      rt        |«      t        | «      k(  sJ ‚|ft        | «      z  }t        t	        | |«      «      D ]õ  \  }\  }}	t        |t
        «      sJ ‚g }
g }|D ]  }t        |t        «      sJ ‚t        |«      \  }}|j                  dd«      dkD  r|dkD  r|dxx   |z  cc<   |�|j                  d|«       |
j                  |«       |j                  |«       Œ� |r4|dk(  s|t        | «      dz
  k(  r|j                  t        |
|d|«      «       ŒÙ|j                  t        |
||	|«      «       Œ÷ |S )a6   Decode block architecture definition strings -> block kwargs

    Args:
        arch_def: architecture definition strings, list of list of strings
        depth_multiplier: network depth multiplier
        depth_trunc: networ depth truncation mode when applying multiplier
        experts_multiplier: CondConv experts multiplier
        fix_first_last: fix first and last block depths when multiplier is applied
        group_size: group size override for all blocks that weren't explicitly set in arch string

    Returns:
        list of list of block kwargs
    rh   r   r   r}   ç      ð?)r~   Útupler�   Ú	enumerater›   Úlistr   r’   r…   Ú
setdefaultrš   r¨   )Úarch_defr    r¡   Úexperts_multiplierÚfix_first_lastr}   Ú	arch_argsÚ	stack_idxÚblock_stringsr2   rž   rŸ   r†   r¦   r§   s                  r$   r   r     s_  € ð* €IÜÐ"¤EÔ*ÜÐ#Ó$¬¨H«Ò5Ð5Ð5à,Ð.´°X³Ñ>ÐÜ2;¼CÀÐJZÓ<[Ó2\ò _Ñ.ˆ	Ñ.�M :Ü˜-¬Ô.Ð.Ð.Øˆ
ØˆØ&ò 	 ˆIÜ˜i¬Ô-Ð-Ð-Ü'¨	Ó2‰GˆB�Ø�v‰v�m QÓ'¨!Ò+Ð0BÀQÒ0FØ�=Ó!Ð%7Ñ7Ó!ØÐ%Ø—‘˜l¨JÔ7Ø×Ñ˜bÔ!Ø�N‰N˜3Õð	 ñ ˜y¨Aš~°¼cÀ(»mÈaÑ>OÒ1OØ×ÑÔ/°
¸GÀSÈ+ÓVÕWà×ÑÔ/°
¸GÀZÐQ\Ó]Õ^ð!_ð" Ðr#   c                   óŠ   — e Zd ZdZddeddddddddddfdeded	ed
ede	e
   de	e
   de	e
   de	e
   dede	e   defd„Zd„ Zd„ Zy)r   a/   Build Trunk Blocks

    This ended up being somewhat of a cross between
    https://github.com/tensorflow/tpu/blob/master/models/official/mnasnet/mnasnet_models.py
    and
    https://github.com/facebookresearch/maskrcnn-benchmark/blob/master/maskrcnn_benchmark/modeling/backbone/fbnet_builder.py

    é    Ú FNr_   Úoutput_strideÚpad_typeÚround_chs_fnÚse_from_expr-   Ú
norm_layerÚaa_layerÚse_layerÚdrop_path_rateÚlayer_scale_init_valueÚfeature_locationc                 óœ  — || _         || _        || _        || _        || _        || _        || _        t        |«      | _        	 | j                  dd¬«       d| _	        |	| _        |
| _        |dk(  rt        j                  d«       d}|| _        |d	v sJ ‚||d
œ| _        t"        | _        d | _        g | _        y # t        $ r
 d| _	        Y Œmw xY w)Né   rª   ©Úrd_ratioTFÚ	depthwisez>feature_location=='depthwise' is deprecated, using 'expansion'Ú	expansion)Ú
bottleneckrÇ   r·   )ÚdeviceÚdtype)r¸   r¹   rº   r»   r-   r¼   r½   r   r¾   Úse_has_ratioÚ	TypeErrorr¿   rÀ   r6   ÚwarningrÁ   ÚddÚ_DEBUG_BUILDERÚverboseÚin_chsÚfeatures)Úselfr¸   r¹   rº   r»   r-   r¼   r½   r¾   r¿   rÀ   rÁ   rÉ   rÊ   s                 r$   Ú__init__zEfficientNetBuilder.__init__E  sá   € ð  +ˆÔØ ˆŒØ(ˆÔØ&ˆÔØ"ˆŒØ$ˆŒØ ˆŒÜ  Ó*ˆŒð	&Ø�M‰M˜! cˆMÔ*Ø $ˆDÔð -ˆÔØ&<ˆÔ#Ø˜{Ò*ä�O‰OÐ\Ô]Ø*ÐØ 0ˆÔØÐ#BÑBÐBÐBØ#¨eÑ4ˆŒÜ%ˆŒð ˆŒØˆ�øô ò 	&Ø %ˆDÖð	&ús   ÁB8 Â8CÃ
Cc                 ó\  — | j                   |z  |z  }|j                  d«      }| j                  |d<   | j                  |d   «      |d<   |j	                  dd«      }|dkD  r|dxx   dz  cc<   d|v r|d   r| j                  |d   «      |d<   | j
                  |d<   |d	   �|d	   n| j                  |d	<   |d	   €J ‚| j                  |d
<   ||d<   | j                  �| j                  |d<   |j                  dd «      }|rm| j                  �a| j                  s||j	                  dd«      z  }|dk(  r|dz  }| j                  rt        | j                  |¬«      |d<   n| j                  |d<   |j                  | j                  «       |dk(  rYt        dj!                  |t#        |«      «      | j$                  «       |j	                  dd«      rt'        d'i |¤Žn
t)        d'i |¤Ž}�n¼|dk(  s|dk(  r<t        dj!                  |t#        |«      «      | j$                  «       t+        d'i |¤Ž}�nv|dk(  r<t        dj!                  |t#        |«      «      | j$                  «       t-        d'i |¤Ž}�n5|dk(  r;t        dj!                  |t#        |«      «      | j$                  «       t/        d'i |¤Ž}nõ|dk(  rIt        dj!                  |t#        |«      «      | j$                  «       t1        d'i |¤d| j2                  i¤Ž}n§|d k(  rJt        d!j!                  |t#        |«      «      | j$                  «       t5        d'i |¤d"| j2                  d#œ¤Ž}nX|d$k(  rIt        d%j!                  |t#        |«      «      | j$                  «       t5        d'i |¤d| j2                  i¤Ž}n
J d&|z  «       ‚|d   | _        |S )(NrY   rÑ   rZ   rf   r   é   rm   r¹   r-   r¼   r¿   r½   re   rd   rª   r   rÄ   r¾   r\   z  InvertedResidual {}, Args: {}rh   ri   rj   z!  DepthwiseSeparable {}, Args: {}rl   z  EdgeResidual {}, Args: {}rn   z  ConvBnAct {}, Args: {}rp   z(  UniversalInvertedResidual {}, Args: {}rÀ   r{   z(  MobileMultiQueryAttention {}, Args: {}T)Úuse_multi_queryrÀ   rt   z'  MobileMultiHeadAttention {}, Args: {}z-Unknown block type (%s) while building model.r"   )r¿   r)   rÑ   rº   r…   r¹   r-   r¼   r½   r¾   r»   rË   r   rƒ   rÎ   r:   Úformatr   rÐ   ÚCondConvResidualÚInvertedResidualÚDepthwiseSeparableConvÚEdgeResidualÚ	ConvBnActÚUniversalInvertedResidualrÀ   ÚMobileAttention)	rÓ   r¦   Ú	block_idxÚblock_countr¿   Úbtrf   re   Úblocks	            r$   Ú_make_blockzEfficientNetBuilder._make_blockq  ss  € Ø×,Ñ,¨yÑ8¸;ÑFˆØ�V‰V�LÓ!ˆØ—{‘{ˆˆ8‰Ø×)Ñ)¨"¨Y©-Ó8ˆˆ9‰Ø�f‰f�U˜AÓˆØ�Š7àˆy‹M˜QÑ‹MØ˜RÑ B ~Ò$6à!%×!2Ñ!2°2°nÑ3EÓ!FˆBˆ~ÑØŸ™ˆˆ:‰à-/°©_Ð-H˜"˜[š/ÈdÏnÉnˆˆ;‰Ø�+‰Ð*Ð*Ð*ØŸ?™?ˆˆ<ÑØ-ˆÐÑà�=‰=Ð$Ø!Ÿ]™]ˆBˆz‰Nà—6‘6˜* dÓ+ˆÙ˜Ÿ™Ð1Ø×#Ò#à˜BŸF™F ;°Ó4Ñ4�Ø�aŠxà˜A‘�Ø× Ò Ü!(¨¯©ÀÔ!J��:’à!%§¡��:‘à
�	‰	�$—'‘'Ôà�Š:ÜÐ:×AÑAÀ)ÌSÐQSËWÓUÐW[×WcÑWcÔdØ.0¯f©f°]ÀAÔ.FÔ$Ñ* rÒ*ÔL\ÑLbÐ_aÑLbŠEØ�4ŠZ˜2 š;ÜÐ<×CÑCÀIÌsÐSUËwÓWÐY]×YeÑYeÔfÜ*Ñ0¨RÑ0ŠEØ�4ŠZÜÐ6×=Ñ=¸iÌÈRËÓQÐSW×S_ÑS_Ô`Ü Ñ& 2Ñ&ŠEØ�4ŠZÜÐ3×:Ñ:¸9ÄcÈ"ÃgÓNÐPT×P\ÑP\Ô]Ü‘O ‘O‰EØ�5Š[ÜÐC×JÑJÈ9ÔVYÐZ\ÓV]Ó^Ð`d×`lÑ`lÔmÜ-Ñg°ÑgÈ4×KfÑKfÒg‰EØ�5Š[ÜÐC×JÑJÈ9ÔVYÐZ\ÓV]Ó^Ð`d×`lÑ`lÔmÜ#Ñs bÐs¸$ÐW[×WrÑWrÓs‰EØ�5Š[ÜÐB×IÑIÈ)ÔUXÐY[ÓU\Ó]Ð_c×_kÑ_kÔlÜ#Ñ] bÑ]À×A\ÑA\Ò]‰EàNÐIÈBÑNÓN�5à˜‘mˆŒØˆr#   c           	      ó  — t        dt        |«      z  | j                  «       || _        t	        |D �cg c]  }t        |«      ‘Œ c}«      }d}d}d}g }|d   d   d   dkD  r*t        d|d|¬«      }	| j                  j                  |	«       d}
t        |«      D �]b  \  }}|dz   t        |«      k(  }t        dj                  |«      | j                  «       t        |t        «      sJ ‚g }t        |«      D �]â  \  }}|dz   t        |«      k(  }t        d	j                  |«      | j                  «       |d   d
v sJ ‚|dk\  rd|d<   |
s|j                  dd«      r|d   dk(  sJ ‚d}
|
dkD  r'|
dk(  r|d   dk(  rd|d<   |dxx   dz  cc<   d}
n|
|d<   d}|r#|dz   }|t        |«      k\  xs ||   d   d   dkD  }|}|d   dkD  rV||d   z  }|| j                  kD  r=||d   z  }d|d<   t        dj                  | j                  «      | j                  «       n|}||d<   ||k7  r|}| j                  |||«      }|j                  |«       |
dk(  rd}
|r‚t        d|dz   |dœ|j                  | j                   «      ¤Ž}	|	j#                  dd«      }|rdj%                  d|› d|› �|g«      |	d<   n|sJ ‚d|› �|	d<   | j                  j                  |	«       |dz  }�Œå |j                  t'        j(                  |Ž «       �Œe |S c c}w )aY   Build the blocks
        Args:
            in_chs: Number of input-channels passed to first block
            model_block_args: A list of lists, outer list defines stages, inner
                list contains strings defining block configuration(s)
        Return:
             List of block stacks (each stack wrapped in nn.Sequential)
        z&Building model trunk with %d stages...r   rR   r   r[   Úbn1)ÚmoduleÚnum_chsÚstageÚ	reductionz	Stack: {}z
 Block: {})r   rR   rf   Frd   rÖ   z=  Converting stride to dilation to maintain output_stride=={}Údilation)ré   rê   rç   r·   r<   zblocks.r"   )r:   r�   rÐ   rÑ   r–   r‚   rÒ   rš   r¬   rØ   r~   r­   r)   r¸   rä   Úfeature_inforÁ   r…   ÚjoinÚnnÚ
Sequential)rÓ   rÑ   Úmodel_block_argsÚxÚtotal_block_countÚtotal_block_idxÚcurrent_strideÚcurrent_dilationÚstagesrì   Úspace2depthr³   rž   Ú
last_stackÚblocksrà   r�   Ú
last_blockÚextract_featuresÚnext_stack_idxÚnext_dilationÚnext_output_striderã   Ú	leaf_names                           r$   Ú__call__zEfficientNetBuilder.__call__±  s¦  € ô 	Ð=ÄÐDTÓ@UÑUÐW[×WcÑWcÔdØˆŒÜÐ1AÖ B¨A¤ Q¥Ò BÓCÐØˆØˆØÐØˆØ˜AÑ˜qÑ! (Ñ+¨aÒ/ä u°fÀAÐQ_Ô`ˆLØ�M‰M× Ñ  Ô.ð ˆÜ%.Ð/?Ó%@ó H	2Ñ!ˆI�zØ" Q™¬#Ð.>Ó*?Ñ?ˆJÜ˜×+Ñ+¨IÓ6¸¿¹ÔEÜ˜j¬$Ô/Ð/Ð/àˆFä)2°:Ó)>ó @%Ñ%�	˜:Ø&¨™]¬c°*«oÑ=�
Ü˜\×0Ñ0°Ó;¸T¿\¹\ÔJà! (Ñ+¨vÑ5Ð5Ð5Ø ’>Ø+,�J˜xÑ(á" z§~¡~°e¸UÔ'CØ% hÑ/°1Ò4Ð4Ð4Ø"#�Kà ’?à" aÒ'¨J°xÑ,@ÀAÒ,EØ/0˜
 8Ñ,à" ;Ó/°1Ñ4Ó/Ø&'™à,7˜
 5Ñ)à#(Ð ÙØ%.°¡]�NØ'5¼Ð=MÓ9NÑ'Nò (JØ(¨Ñ8¸Ñ;¸HÑEÈÑIð %ð !1�Ø˜hÑ'¨!Ò+Ø)7¸*ÀXÑ:NÑ)NÐ&Ø)¨D×,>Ñ,>Ò>Ø(8¸:ÀhÑ;OÑ(O˜Ø/0˜
 8Ñ,Ü$Ð%d×%kÑ%kØ ×.Ñ.ó&0Ø15·±õ?ð *<˜Ø)9�
˜:Ñ&Ø Ð$4Ò4Ø'4Ð$ð ×(Ñ(¨°_ÐFWÓX�Ø—‘˜eÔ$à !Ò#Ø"#�Kñ $Ü#'ð $Ø'¨!™mØ"0ñ$ð  ×,Ñ,¨T×-BÑ-BÓCñ$�Lð
 !-× 0Ñ 0°¸2Ó >�IÙ Ø14·±¸WÀYÀKÈqÐQZÐP[Ð;\Ð^gÐ:hÓ1i˜ XÒ.á)Ð)˜zØ3:¸9¸+Ð1F˜ XÑ.Ø—M‘M×(Ñ(¨Ô6à 1Ñ$’ðA@%ðB �M‰Mœ"Ÿ-™-¨Ð0Ö1ðQH	2ðR ˆùòk !Cs   ³L)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r>   r   r   Úboolr   r   r„   rÔ   rä   r   r"   r#   r$   r   r   <  sÆ   „ ñð "$ØØ%3Ø %Ø-1Ø.2Ø,0Ø,0Ø$&Ø6:Ø$&ØØñ*àð*ð ð*ð #ð	*ð
 ð*ð   	Ñ*ð*ð ! Ñ+ð*ð ˜yÑ)ð*ð ˜yÑ)ð*ð "ð*ð %-¨U¡Oð*ð "ó*òX>ó@`r#   r   c                 ó€  ‡— t        | t        «      rª| j                  d   | j                  d   z  | j                  z  Š|r‰| j                  z  Št        ˆfd„| j                  | j                  «      } || j                  «       | j                  �*t        j                  j                  | j                  «       yyt        | t        j                  «      rµ| j                  d   | j                  d   z  | j                  z  Š|r‰| j                  z  Št        j                  j                  | j                  dt        j                   d‰z  «      «       | j                  �*t        j                  j                  | j                  «       yyt        | t        j"                  «      rSt        j                  j%                  | j                  «       t        j                  j                  | j                  «       yt        | t        j&                  «      r­| j                  j)                  d«      Šd}d|v r| j                  j)                  d«      }dt        j                   |‰z   «      z  }t        j                  j+                  | j                  | |«       t        j                  j                  | j                  «       yy)a)   Weight initialization as per Tensorflow official implementations.

    Args:
        m (nn.Module): module to init
        n (str): module name
        fix_group_fanout (bool): enable correct (matching Tensorflow TPU impl) fanout calculation w/ group convs

    Handles layers in EfficientNet, EfficientNet-CondConv, MixNet, MnasNet, MobileNetV3, etc:
    * https://github.com/tensorflow/tpu/blob/master/models/official/mnasnet/mnasnet_model.py
    * https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/efficientnet_model.py
    r   r   c                 ór   •— t         j                  j                  | dt        j                  d‰z  «      «      S )Nr   ç       @)rî   ÚinitÚnormal_r˜   Úsqrt)ÚwÚfan_outs    €r$   ú<lambda>z#_init_weight_goog.<locals>.<lambda>%  s%   ø€ ”b—g‘g—o‘o a¨¬D¯I©I°c¸G±mÓ,DÓE€ r#   Nr  Ú
routing_fnrª   )r~   r
   ro   Úout_channelsÚgroupsr   rh   Úweight_shapeÚweightÚbiasrî   r	  Úzeros_ÚConv2dr
  r˜   r  ÚBatchNorm2dÚones_ÚLinearÚsizeÚuniform_)ÚmrG   Úfix_group_fanoutÚinit_weight_fnÚfan_inÚ
init_ranger  s         @r$   Ú_init_weight_googr!    sß  ø€ ô �!”ZÔ Ø—-‘- Ñ" Q§]¡]°1Ñ%5Ñ5¸¿¹ÑFˆÙØ˜Ÿ™Ñ ˆGÜ1ÛEÀqÇ}Á}ÐVW×VdÑVdófˆá�q—x‘xÔ Ø�6‰6ÐÜ�G‰G�N‰N˜1Ÿ6™6Õ"ð ä	�A”r—y‘yÔ	!Ø—-‘- Ñ" Q§]¡]°1Ñ%5Ñ5¸¿¹ÑFˆÙØ˜Ÿ™Ñ ˆGÜ
�‰�‰˜Ÿ™ !¤T§Y¡Y¨s°W©}Ó%=Ô>Ø�6‰6ÐÜ�G‰G�N‰N˜1Ÿ6™6Õ"ð ä	�A”r—~‘~Ô	&Ü
�‰�‰�a—h‘hÔÜ
�‰�‰�q—v‘vÕÜ	�A”r—y‘yÔ	!Ø—(‘(—-‘- Ó"ˆØˆØ˜1ÑØ—X‘X—]‘] 1Ó%ˆFØœ4Ÿ9™9 V¨gÑ%5Ó6Ñ6ˆ
Ü
�‰×Ñ˜Ÿ™ J ;°
Ô;Ü
�‰�‰�q—v‘vÕð 
"r#   Úmodelc                 óº   — |xs t         }| j                  «       D ]  \  }} |||«       Œ t        | «      D ]"  \  }}t        |d«      sŒ|j                  «        Œ$ y )NÚinit_weights)r!  r   Úhasattrr$  )r"  Úinit_fnrG   r  s       r$   r   r   =  s`   € ØÒ*Ô*€GØ×#Ñ#Ó%ò ‰ˆˆ1Ù��1�ðô ˜eÓ$ò ‰ˆˆ1Ü�1�nÕ%Ø�N‰NÕñr#   )rI   )rª   rÃ   NgÍÌÌÌÌÌì?)rª   r™   )rª   r™   r   FN)r·   Tr   )2r  Útypingr   r   Úloggingr˜   rH   r!   r   Ú	functoolsr   r   r   r	   Útorch.nnrî   Útimm.layersr
   r   r   r   r   r   Ú_efficientnet_blocksÚ_manipulater   Ú__all__Ú	getLoggerr  r6   rÏ   r   r   r‚   r    r   r   r%   r   r   r   r:   rB   r’   r¨   r   r   r!  ÚModuler   r"   r#   r$   ú<module>r1     sï   ðñ÷ &ã Û Û 	Ý Ý ß "Ñ "å ç p× pÜ #Ý &òt€ð ˆ'×
Ñ
˜HÓ
%€ð €ð "Ð ØÐ ÙÐ2Ð8IÔJ€à��d˜3 ˜8‘nÑ%Ñ&€	òòó;ó`òò
/òT"ón#ðP ØØØØó+÷\Uñ Uóp&ñR R§Y¡Yô r#   