Ë
    éÓ^j†  ã                   ó¶   — d Z ddlmZmZ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	„ Z G d
„ dej                   «      Z G d„ dej                   «      Zy)z  Selective Kernel Convolution/Attention

Paper: Selective Kernel Networks (https://arxiv.org/abs/1903.06586)

Hacked together by / Copyright 2020 Ross Wightman
é    )ÚListÚOptionalÚTupleÚTypeÚUnionN)Únné   )ÚConvNormAct)Úmake_divisible)Ú_assertc                 ón   — t        | t        t        f«      r| D ]  }t        |«      c S  | dk\  r| dz  sJ ‚y )Né   é   )Ú
isinstanceÚlistÚtupleÚ_kernel_valid)ÚkÚkis     úg/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/selective_kernel.pyr   r      s?   € Ü�!”dœE�]Ô#Øò 	%ˆBÜ  Ó$Ò$ð	%à�Š6�a˜!’eÐÐ�eó    c                   ó¤   ‡ — e Zd Zddej                  ej
                  ddfdedededeej                     deej                     f
ˆ fd	„Z	d
„ Z
ˆ xZS )ÚSelectiveKernelAttnr   é    NÚchannelsÚ	num_pathsÚattn_channelsÚ	act_layerÚ
norm_layerc                 óô   •— ||dœ}t         ‰	| �  «        || _        t        j                  ||fdddœ|¤Ž| _         ||fi |¤Ž| _         |d¬«      | _        t        j                  |||z  fdddœ|¤Ž| _        y)z| Selective Kernel Attention Module

        Selective Kernel attention mechanism factored out into its own module.

        ©ÚdeviceÚdtyper	   F)Úkernel_sizeÚbiasT)ÚinplaceN)	ÚsuperÚ__init__r   r   ÚConv2dÚ	fc_reduceÚbnÚactÚ	fc_select)
Úselfr   r   r   r   r   r"   r#   ÚddÚ	__class__s
            €r   r(   zSelectiveKernelAttn.__init__   s„   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ"ˆŒÜŸ™ 8¨]Ð\ÈÐPUÑ\ÐY[Ñ\ˆŒÙ˜]Ñ1¨bÑ1ˆŒÙ TÔ*ˆŒÜŸ™ =°(¸YÑ2FÐhÐTUÐ\aÑhÐegÑhˆ�r   c                 óÆ  — t        |j                  d   | j                  k(  d«       |j                  d«      j	                  dd¬«      }| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }|j                  \  }}}}|j                  || j                  || j                  z  ||«      }t        j                  |d¬«      }|S )Nr	   Ú )r   r   T)Úkeepdim©Údim)r   Úshaper   ÚsumÚmeanr*   r+   r,   r-   ÚviewÚtorchÚsoftmax)r.   ÚxÚBÚCÚHÚWs         r   ÚforwardzSelectiveKernelAttn.forward0   s¶   € Ü�—‘˜‘
˜dŸn™nÑ,¨bÔ1Ø�E‰E�!‹H�M‰M˜&¨$ˆMÓ/ˆØ�N‰N˜1ÓˆØ�G‰G�A‹JˆØ�H‰H�Q‹KˆØ�N‰N˜1ÓˆØ—W‘W‰
ˆˆ1ˆa�Ø�F‰F�1�d—n‘n a¨4¯>©>Ñ&9¸1¸aÓ@ˆÜ�M‰M˜! Ô#ˆØˆr   )Ú__name__Ú
__module__Ú__qualname__r   ÚReLUÚBatchNorm2dÚintr   ÚModuler(   rA   Ú__classcell__©r0   s   @r   r   r      so   ø„ ð Ø!#Ø)+¯©Ø*,¯.©.ØØñiàðið ðið ð	ið
 ˜BŸI™I‘ðið ˜RŸY™Y™õiö.
r   r   c            !       óB  ‡ — e Zd Zddddddddddej                  ej
                  ddddfdedee   deeee	e   f      d	ed
edede
dee   dedededeej                     deej                     deeej                        deeej                        fˆ fd„Zd„ Zˆ xZS )ÚSelectiveKernelNr	   g      °?é   TÚin_channelsÚout_channelsr$   ÚstrideÚdilationÚgroupsÚrd_ratioÚrd_channelsÚ
rd_divisorÚkeep_3x3Úsplit_inputr   r   Úaa_layerÚ
drop_layerc                 óâ  •— ||dœ}t         ‰| �  «        |xs |}|xs ddg}t        |«       t        |t        «      s|gdz  }|
r(|D �cg c]  }||dz
  z  dz  ‘Œ }}dgt        |«      z  }n|gt        |«      z  }t        |«      | _        || _        || _        || _	        | j                  r#|| j                  z  dk(  sJ ‚|| j                  z  }t        ||«      }t        d||||||dœ|¤Ž}t        j                  t        ||«      D ��cg c]  \  }}t        ||f||dœ|¤Ž‘Œ c}}«      | _        |xs t#        ||z  |	¬	«      }t%        || j                  |fi |¤Ž| _        y
c c}w c c}}w )a:   Selective Kernel Convolution Module

        As described in Selective Kernel Networks (https://arxiv.org/abs/1903.06586) with some modifications.

        Largest change is the input split, which divides the input channels across each convolution path, this can
        be viewed as a grouping of sorts, but the output channel counts expand to the module level value. This keeps
        the parameter count from ballooning when the convolutions themselves don't have groups, but still provides
        a noteworthy increase in performance over similar param count models without this attention layer. -Ross W

        Args:
            in_channels:  module input (feature) channel count
            out_channels:  module output (feature) channel count
            kernel_size: kernel size for each convolution branch
            stride: stride for convolutions
            dilation: dilation for module as a whole, impacts dilation of each branch
            groups: number of groups for each branch
            rd_ratio: reduction factor for attention features
            keep_3x3: keep all branch convolution kernels as 3x3, changing larger kernels for dilations
            split_input: split input channels evenly across each convolution branch, keeps param count lower,
                can be viewed as grouping by path, output expands to module out_channels count
            act_layer: activation layer to use
            norm_layer: batchnorm/norm layer to use
            aa_layer: anti-aliasing module
            drop_layer: spatial drop module in convs (drop block, etc)
        r!   r   é   r   r	   r   )rP   rR   r   r   rX   rY   )r$   rQ   )ÚdivisorN© )r'   r(   r   r   r   Úlenr   rN   rO   rW   ÚminÚdictr   Ú
ModuleListÚzipr
   Úpathsr   r   Úattn)r.   rN   rO   r$   rP   rQ   rR   rS   rT   rU   rV   rW   r   r   rX   rY   r"   r#   r/   r   Úconv_kwargsÚdr   r0   s                          €r   r(   zSelectiveKernel.__init__?   sŸ  ø€ ðZ ¨Ñ/ˆÜ‰ÑÔØ#Ò2 {ˆØ!Ò+ a¨ VˆÜ�kÔ"Ü˜+¤tÔ,Ø&˜-¨!Ñ+ˆKÙØ9DÖE°A˜ A¨¡EÑ*¨aÓ/ÐEˆHÐEØ˜#¤ KÓ 0Ñ0‰Kà �z¤C¨Ó$4Ñ4ˆHÜ˜[Ó)ˆŒØ&ˆÔØ(ˆÔØ&ˆÔØ×ÒØ §¡Ñ/°1Ò4Ð4Ð4Ø%¨¯©Ñ7ˆKÜ�\ 6Ó*ˆäð <Ø &°IÈ*Ø¨*ñ<à8:ñ<ˆô —]‘]ä˜K¨Ó2÷$4á��1ô ˜ \Ð\¸qÈ1Ñ\ÐP[Ó\ó$4ó 5ˆŒ
ð $Òb¤~°lÀXÑ6MÐWaÔ'bˆÜ'¨°d·n±nÀmÑZÐWYÑZˆ�	ùò+ Fùó $4s   Á
E&ÄE+
c                 ó¸  — | j                   r_t        j                  || j                  | j                  z  d«      }t        | j                  «      D ��cg c]  \  }} |||   «      ‘Œ }}}n| j                  D �cg c]
  } ||«      ‘Œ }}t        j                  |d¬«      }| j                  |«      }||z  }t        j                  |d¬«      }|S c c}}w c c}w )Nr	   r4   )
rW   r:   ÚsplitrN   r   Ú	enumeraterc   Ústackrd   r7   )r.   r<   Úx_splitÚiÚopÚx_pathsÚx_attns          r   rA   zSelectiveKernel.forward‹   s³   € Ø×ÒÜ—k‘k ! T×%5Ñ%5¸¿¹Ñ%GÈÓKˆGÜ3<¸T¿Z¹ZÓ3H×I©%¨!¨R‘r˜' !™*•~ÐIˆGÒIà'+§z¡zÖ2 ‘r˜!•uÐ2ˆGÐ2Ü�K‰K˜ QÔ'ˆØ—‘˜1“ˆØ�‰JˆÜ�I‰I�a˜QÔˆØˆùó Jùâ2s   ÁCÁ:C)rB   rC   rD   r   rE   rF   rG   r   r   r   ÚfloatÚboolr   rH   r(   rA   rI   rJ   s   @r   rL   rL   =   s@  ø„ ð
 +/Ø;?ØØØØ#Ø)-ØØ!Ø $Ø)+¯©Ø)+¯©Ø26Ø48ØØñ%J[àðJ[ð # 3™-ðJ[ð " %¨¨T°#©Y¨Ñ"7Ñ8ð	J[ð
 ðJ[ð ðJ[ð ðJ[ð ðJ[ð " #™ðJ[ð ðJ[ð ðJ[ð ðJ[ð ˜BŸI™I‘ðJ[ð ˜RŸY™Y™ðJ[ð ˜t B§I¡I™Ñ/ðJ[ð  !  b§i¡i¡Ñ1õ!J[öX
r   rL   )Ú__doc__Útypingr   r   r   r   r   r:   r   Úconv_bn_actr
   Úhelpersr   Útrace_utilsr   r   rH   r   rL   r]   r   r   ú<module>rw      sI   ðñ÷ 6Õ 5ã Ý å $Ý #Ý  òô"˜"Ÿ)™)ô "ôJX�b—i‘iõ Xr   