Ë
    éÓ^jªN  ã                   ó  — d Z ddl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
c mZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZ d
gZd„ Z G d„ de
j4                  «      Z G d„ de
j4                  «      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de
j4                  «      Z  G d„ d
e
j4                  «      Z!d2d„Z"d3d„Z# e e#d¬«       e#dd¬«       e#d ¬«       e#d!¬«       e#d"¬«       e#d#¬«       e#d$d¬«       e#d%¬«       e#d&¬«      d'œ	«      Z$ed2d(e!fd)„«       Z%ed2d(e!fd*„«       Z&ed2d(e!fd+„«       Z'ed2d(e!fd,„«       Z(ed2d(e!fd-„«       Z)ed2d(e!fd.„«       Z*ed2d(e!fd/„«       Z+ed2d(e!fd0„«       Z,ed2d(e!fd1„«       Z-y)4a:  
SEResNet implementation from Cadene's pretrained models
https://github.com/Cadene/pretrained-models.pytorch/blob/master/pretrainedmodels/models/senet.py
Additional credit to https://github.com/creafz

Original model: https://github.com/hujie-frank/SENet

ResNet code gently borrowed from
https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py

FIXME I'm deprecating this model and moving them to ResNet as I don't want to maintain duplicate
support for extras like dilation, switchable BN/activations, feature extraction, etc that don't exist here.
é    N)ÚOrderedDict)ÚTypeÚOptionalÚTuple©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Úcreate_classifieré   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgsÚSENetc                 óp  — t        | t        j                  «      r-t        j                  j	                  | j
                  dd¬«       y t        | t        j                  «      rUt        j                  j                  | j
                  d«       t        j                  j                  | j                  d«       y y )NÚfan_outÚrelu)ÚmodeÚnonlinearityg      ð?ç        )	Ú
isinstanceÚnnÚConv2dÚinitÚkaiming_normal_ÚweightÚBatchNorm2dÚ	constant_Úbias)Úms    ú\/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/senet.pyÚ_weight_initr!      sp   € Ü�!”R—Y‘YÔÜ
�‰×Ñ §¡¨yÀvÐÕNÜ	�A”r—~‘~Ô	&Ü
�‰×Ñ˜!Ÿ(™( BÔ'Ü
�‰×Ñ˜!Ÿ&™& "Õ%ð 
'ó    c                   ó0   ‡ — e Zd Zddedefˆ fd„Zd„ Zˆ xZS )ÚSEModuleÚchannelsÚ	reductionc                 ó  •— ||dœ}t         ‰| �  «        t        j                  |||z  fddi|¤Ž| _        t        j
                  d¬«      | _        t        j                  ||z  |fddi|¤Ž| _        t        j                  «       | _	        y )N©ÚdeviceÚdtypeÚkernel_sizer   T©Úinplace)
ÚsuperÚ__init__r   r   Úfc1ÚReLUr   Úfc2ÚSigmoidÚsigmoid)Úselfr%   r&   r)   r*   ÚddÚ	__class__s         €r    r/   zSEModule.__init__(   sw   ø€ Ø¨Ñ/ˆÜ‰ÑÔÜ—9‘9˜X x°9Ñ'<ÑRÈ!ÐRÈrÑRˆŒÜ—G‘G DÔ)ˆŒ	Ü—9‘9˜X¨Ñ2°HÑRÈ!ÐRÈrÑRˆŒÜ—z‘z“|ˆ�r"   c                 ó¾   — |}|j                  dd¬«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }||z  S )N)é   é   T)Úkeepdim)Úmeanr0   r   r2   r4   )r5   ÚxÚmodule_inputs      r    ÚforwardzSEModule.forward0   sX   € ØˆØ�F‰F�6 4ˆFÓ(ˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�L‰L˜‹OˆØ˜aÑÐr"   )NN)Ú__name__Ú
__module__Ú__qualname__Úintr/   r?   Ú__classcell__©r7   s   @r    r$   r$   &   s   ø„ ñ$ ð $°õ $ö r"   r$   c                   ó   — e Zd ZdZd„ Zy)Ú
BottleneckzH
    Base class for bottlenecks that implements `forward()` method.
    c                 óž  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j                  �| j                  |«      }| j                  |«      |z   }| j                  |«      }|S ©N)	Úconv1Úbn1r   Úconv2Úbn2Úconv3Úbn3Ú
downsampleÚ	se_module©r5   r=   ÚshortcutÚouts       r    r?   zBottleneck.forward?   s¬   € Øˆà�j‰j˜‹mˆØ�h‰h�s‹mˆØ�i‰i˜‹nˆà�j‰j˜‹oˆØ�h‰h�s‹mˆØ�i‰i˜‹nˆà�j‰j˜‹oˆØ�h‰h�s‹mˆà�?‰?Ð&Ø—‘ qÓ)ˆHà�n‰n˜SÓ! HÑ,ˆØ�i‰i˜‹nˆàˆ
r"   N)r@   rA   rB   Ú__doc__r?   © r"   r    rG   rG   :   s   „ ñór"   rG   c                   ód   ‡ — e Zd ZdZdZ	 	 	 	 d
dedededededeej                     fˆ fd	„Z	ˆ xZ
S )ÚSEBottleneckz"
    Bottleneck for SENet154.
    é   ÚinplanesÚplanesÚgroupsr&   ÚstriderP   c	           	      ó<  •— ||dœ}	t         ‰
| �  «        t        j                  ||dz  fdddœ|	¤Ž| _        t        j
                  |dz  fi |	¤Ž| _        t        j                  |dz  |dz  fd|d|ddœ|	¤Ž| _        t        j
                  |dz  fi |	¤Ž| _        t        j                  |dz  |dz  fdddœ|	¤Ž| _	        t        j
                  |dz  fi |	¤Ž| _
        t        j                  d	¬
«      | _        t        |dz  fd|i|	¤Ž| _        || _        || _        y )Nr(   r9   r   F©r+   r   rY   r:   ©r+   r]   Úpaddingr\   r   Tr,   r&   ©r.   r/   r   r   rJ   r   rK   rL   rM   rN   rO   r1   r   r$   rQ   rP   r]   ©r5   rZ   r[   r\   r&   r]   rP   r)   r*   r6   r7   s             €r    r/   zSEBottleneck.__init__\   s'  ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—Y‘Y˜x¨°!©ÐUÀÈÑUÐRTÑUˆŒ
Ü—>‘> &¨1¡*Ñ3°Ñ3ˆŒÜ—Y‘YØ�Q‰JØ�Q‰Jð	
ð ØØØØñ	
ð ñ	
ˆŒ
ô —>‘> &¨1¡*Ñ3°Ñ3ˆŒÜ—Y‘Y˜v¨™z¨6°A©:ÐWÀ1È5ÑWÐTVÑWˆŒ
Ü—>‘> &¨1¡*Ñ3°Ñ3ˆŒÜ—G‘G DÔ)ˆŒ	Ü! &¨1¡*ÑH¸	ÐHÀRÑHˆŒØ$ˆŒØˆ�r"   ©r   NNN©r@   rA   rB   rU   Ú	expansionrC   r   r   ÚModuler/   rD   rE   s   @r    rX   rX   V   sj   ø„ ñð €Ið Ø.2ØØñàðð ðð ð	ð
 ðð ðð ! §¡Ñ+÷ñ r"   rX   c                   ód   ‡ — e Zd ZdZdZ	 	 	 	 d
dedededededeej                     fˆ fd	„Z	ˆ xZ
S )ÚSEResNetBottleneckzâ
    ResNet bottleneck with a Squeeze-and-Excitation module. It follows Caffe
    implementation and uses `stride=stride` in `conv1` and not in `conv2`
    (the latter is used in the torchvision implementation of ResNet).
    rY   rZ   r[   r\   r&   r]   rP   c	                 ó  •— ||dœ}	t         ‰
| �  «        t        j                  ||fdd|dœ|	¤Ž| _        t        j
                  |fi |	¤Ž| _        t        j                  ||fdd|ddœ|	¤Ž| _        t        j
                  |fi |	¤Ž| _        t        j                  ||dz  fdddœ|	¤Ž| _	        t        j
                  |dz  fi |	¤Ž| _
        t        j                  d	¬
«      | _        t        |dz  fd|i|	¤Ž| _        || _        || _        y )Nr(   r   F©r+   r   r]   r:   ©r+   ra   r\   r   rY   r_   Tr,   r&   rb   rc   s             €r    r/   zSEResNetBottleneck.__init__†   sÿ   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—Y‘Y˜x¨Ð`¸QÀUÐSYÑ`Ð]_Ñ`ˆŒ
Ü—>‘> &Ñ/¨BÑ/ˆŒÜ—Y‘Y˜v vÐi¸1ÀaÐPVÐ]bÑiÐfhÑiˆŒ
Ü—>‘> &Ñ/¨BÑ/ˆŒÜ—Y‘Y˜v v°¡zÐS¸qÀuÑSÐPRÑSˆŒ
Ü—>‘> &¨1¡*Ñ3°Ñ3ˆŒÜ—G‘G DÔ)ˆŒ	Ü! &¨1¡*ÑH¸	ÐHÀRÑHˆŒØ$ˆŒØˆ�r"   rd   re   rE   s   @r    ri   ri   ~   sj   ø„ ñð
 €Ið Ø.2ØØñàðð ðð ð	ð
 ðð ðð ! §¡Ñ+÷ñ r"   ri   c                   ój   ‡ — e Zd ZdZdZ	 	 	 	 	 ddedededededeej                     d	efˆ fd
„Z	ˆ xZ
S )ÚSEResNeXtBottleneckzI
    ResNeXt bottleneck type C with a Squeeze-and-Excitation module.
    rY   rZ   r[   r\   r&   r]   rP   Ú
base_widthc
           	      óV  •— ||	dœ}
t         ‰| �  «        t        j                  ||dz  z  «      |z  }t	        j
                  ||fddddœ|
¤Ž| _        t	        j                  |fi |
¤Ž| _        t	        j
                  ||fd|d|ddœ|
¤Ž| _	        t	        j                  |fi |
¤Ž| _
        t	        j
                  ||dz  fddd	œ|
¤Ž| _        t	        j                  |dz  fi |
¤Ž| _        t	        j                  d
¬«      | _        t        |dz  fd|i|
¤Ž| _        || _        || _        y )Nr(   é@   r   Frk   r:   r`   rY   r_   Tr,   r&   )r.   r/   ÚmathÚfloorr   r   rJ   r   rK   rL   rM   rN   rO   r1   r   r$   rQ   rP   r]   )r5   rZ   r[   r\   r&   r]   rP   ro   r)   r*   r6   Úwidthr7   s               €r    r/   zSEResNeXtBottleneck.__init__¥   s  ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—
‘
˜6 Z°"¡_Ñ5Ó6¸Ñ?ˆÜ—Y‘Y˜x¨ÐZ¸AÀEÐRSÑZÐWYÑZˆŒ
Ü—>‘> %Ñ.¨2Ñ.ˆŒÜ—Y‘Y˜u eÐv¸À6ÐSTÐ]cÐjoÑvÐsuÑvˆŒ
Ü—>‘> %Ñ.¨2Ñ.ˆŒÜ—Y‘Y˜u f¨q¡jÐR¸aÀeÑRÈrÑRˆŒ
Ü—>‘> &¨1¡*Ñ3°Ñ3ˆŒÜ—G‘G DÔ)ˆŒ	Ü! &¨1¡*ÑH¸	ÐHÀRÑHˆŒØ$ˆŒØˆ�r"   )r   NrY   NNre   rE   s   @r    rn   rn   Ÿ   sw   ø„ ñð €Ið Ø.2ØØØñàðð ðð ð	ð
 ðð ðð ! §¡Ñ+ðð ÷ñ r"   rn   c                   óf   ‡ — e Zd ZdZ	 	 	 	 d
dedededededeej                     fˆ fd„Zd	„ Z	ˆ xZ
S )ÚSEResNetBlockr   rZ   r[   r\   r&   r]   rP   c	                 ó”  •— ||dœ}	t         ‰
| �  «        t        j                  ||fdd|ddœ|	¤Ž| _        t        j
                  |fi |	¤Ž| _        t        j                  ||fdd|ddœ|	¤Ž| _        t        j
                  |fi |	¤Ž| _        t        j                  d¬«      | _
        t        |fd	|i|	¤Ž| _        || _        || _        y )
Nr(   r:   r   F)r+   ra   r]   r   rl   Tr,   r&   )r.   r/   r   r   rJ   r   rK   rL   rM   r1   r   r$   rQ   rP   r]   rc   s             €r    r/   zSEResNetBlock.__init__Ã   sÂ   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—Y‘Y˜x¨Ðk¸QÈÐRXÐ_dÑkÐhjÑkˆŒ
Ü—>‘> &Ñ/¨BÑ/ˆŒÜ—Y‘Y˜v vÐi¸1ÀaÐPVÐ]bÑiÐfhÑiˆŒ
Ü—>‘> &Ñ/¨BÑ/ˆŒÜ—G‘G DÔ)ˆŒ	Ü! &ÑD°IÐDÀÑDˆŒØ$ˆŒØˆ�r"   c                 óZ  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }| j
                  �| j                  |«      }| j                  |«      |z   }| j                  |«      }|S rI   )rJ   rK   r   rL   rM   rP   rQ   rR   s       r    r?   zSEResNetBlock.forwardÙ   s’   € Øˆà�j‰j˜‹mˆØ�h‰h�s‹mˆØ�i‰i˜‹nˆà�j‰j˜‹oˆØ�h‰h�s‹mˆØ�i‰i˜‹nˆà�?‰?Ð&Ø—‘ qÓ)ˆHà�n‰n˜SÓ! HÑ,ˆØ�i‰i˜‹nˆàˆ
r"   rd   )r@   rA   rB   rf   rC   r   r   rg   r/   r?   rD   rE   s   @r    rv   rv   À   sc   ø„ Ø€Ið Ø.2ØØñàðð ðð ð	ð
 ðð ðð ! §¡Ñ+õö,r"   rv   c                   óˆ  ‡ — e Zd Z	 	 	 	 	 	 	 	 	 	 ddeej
                     deedf   dededededed	e	d
ededede
fˆ fd„Z	 	 dd„Zej                  j                  dd„«       Zej                  j                  dd„«       Zej                  j                  dej
                  fd„«       Zddede
fd„Zd„ Zdde	fd„Zd„ Zˆ xZS )r   ÚblockÚlayers.r\   r&   Ú	drop_rateÚin_chansrZ   Ú	input_3x3Údownsample_kernel_sizeÚdownsample_paddingÚnum_classesÚglobal_poolc                 óÌ  •— t         ‰| �  «        ||dœ}|| _        || _        || _        || _        |rßdt        j                  |ddfddddœ|¤Žfd	t        j                  d)i |¤Žfd
t        j                  d¬«      fdt        j                  dddddœ|¤Žfdt        j                  d)i |¤Žfdt        j                  d¬«      fdt        j                  d|dfddddœ|¤Žfdt        j                  |fi |¤Žfdt        j                  d¬«      fg	}nMdt        j                  ||fdddddœ|¤Žfd	t        j                  |fi |¤Žfd
t        j                  d¬«      fg}t        j                  t        |«      «      | _        t        j                  ddd¬«      | _        t        |dd¬«      g| _         | j"                  |fd|d   ||dddœ|¤Ž| _        | xj                   t        d|j&                  z  dd¬«      gz  c_         | j"                  |fd|d   d|||	|
dœ|¤Ž| _        | xj                   t        d|j&                  z  dd ¬«      gz  c_         | j"                  |fd!|d   d|||	|
dœ|¤Ž| _        | xj                   t        d!|j&                  z  d"d#¬«      gz  c_         | j"                  |fd$|d   d|||	|
dœ|¤Ž| _        | xj                   t        d$|j&                  z  d%d&¬«      gz  c_        d$|j&                  z  x| _        | _        t3        | j.                  | j                  fd'|i|¤Ž\  | _        | _        | j9                  «       D ]  }t;        |«       Œ y()*af  
        Parameters
        ----------
        block (nn.Module): Bottleneck class.
            - For SENet154: SEBottleneck
            - For SE-ResNet models: SEResNetBottleneck
            - For SE-ResNeXt models:  SEResNeXtBottleneck
        layers (list of ints): Number of residual blocks for 4 layers of the
            network (layer1...layer4).
        groups (int): Number of groups for the 3x3 convolution in each
            bottleneck block.
            - For SENet154: 64
            - For SE-ResNet models: 1
            - For SE-ResNeXt models:  32
        reduction (int): Reduction ratio for Squeeze-and-Excitation modules.
            - For all models: 16
        dropout_p (float or None): Drop probability for the Dropout layer.
            If `None` the Dropout layer is not used.
            - For SENet154: 0.2
            - For SE-ResNet models: None
            - For SE-ResNeXt models: None
        inplanes (int):  Number of input channels for layer1.
            - For SENet154: 128
            - For SE-ResNet models: 64
            - For SE-ResNeXt models: 64
        input_3x3 (bool): If `True`, use three 3x3 convolutions instead of
            a single 7x7 convolution in layer0.
            - For SENet154: True
            - For SE-ResNet models: False
            - For SE-ResNeXt models: False
        downsample_kernel_size (int): Kernel size for downsampling convolutions
            in layer2, layer3 and layer4.
            - For SENet154: 3
            - For SE-ResNet models: 1
            - For SE-ResNeXt models: 1
        downsample_padding (int): Padding for downsampling convolutions in
            layer2, layer3 and layer4.
            - For SENet154: 1
            - For SE-ResNet models: 0
            - For SE-ResNeXt models: 0
        num_classes (int): Number of outputs in `last_linear` layer.
            - For all models: 1000
        r(   rJ   rq   r:   r9   r   F)r]   ra   r   rK   Úrelu1Tr,   rL   )rq   rq   r:   rM   Úrelu2rN   rO   Úrelu3é   ©r+   r]   ra   r   )r]   Ú	ceil_modeÚlayer0)Únum_chsr&   Úmoduler   )r[   Úblocksr\   r&   r   r€   rY   Úlayer1é€   )r[   r�   r]   r\   r&   r   r€   é   Úlayer2é   é   Úlayer3i   é    Úlayer4Ú	pool_typeN)rq   )r.   r/   rZ   r�   r}   r|   r   r   r   r1   Ú
Sequentialr   rŠ   Ú	MaxPool2dÚpool0ÚdictÚfeature_infoÚ_make_layerrŽ   rf   r‘   r”   r–   Únum_featuresÚhead_hidden_sizer
   r‚   Úlast_linearÚmodulesr!   )r5   rz   r{   r\   r&   r|   r}   rZ   r~   r   r€   r�   r‚   r)   r*   r6   Úlayer0_modulesr   r7   s                     €r    r/   zSENet.__init__ï   s½  ø€ ôx 	‰ÑÔØ¨Ñ/ˆØ ˆŒØ&ˆÔØ ˆŒØ"ˆŒÙàœ"Ÿ)™) H¨b°!Ð[¸AÀqÈuÑ[ÐXZÑ[Ð\ØœŸ™Ñ0¨RÑ0Ð1Øœ"Ÿ'™'¨$Ô/Ð0Øœ"Ÿ)™)ÐU°aÀÈÑUÐRTÑUÐVØœŸ™Ñ0¨RÑ0Ð1Øœ"Ÿ'™'¨$Ô/Ð0Øœ"Ÿ)™) B¨°!Ð[¸AÀqÈuÑ[ÐXZÑ[Ð\ØœŸ™ xÑ6°2Ñ6Ð7Øœ"Ÿ'™'¨$Ô/Ð0ð
‰Nð œ"Ÿ)™) H¨hÐmÀAÈaÐYZÐafÑmÐjlÑmÐnØœŸ™ xÑ6°2Ñ6Ð7Øœ"Ÿ'™'¨$Ô/Ð0ðˆNô
 —m‘m¤K°Ó$?Ó@ˆŒä—\‘\ !¨A¸Ô>ˆŒ
Ü!¨(¸aÈÔQÐRˆÔØ&�d×&Ñ&Øð	
àØ˜!‘9ØØØ#$Ø ñ	
ð ñ	
ˆŒð 	×Òœd¨2°·±Ñ+?È1ÐU]Ô^Ð_Ñ_ÕØ&�d×&Ñ&Øð

àØ˜!‘9ØØØØ#9Ø1ñ

ð ñ

ˆŒð 	×Òœd¨3°·±Ñ+@ÈAÐV^Ô_Ð`Ñ`ÕØ&�d×&Ñ&Øð

àØ˜!‘9ØØØØ#9Ø1ñ

ð ñ

ˆŒð 	×Òœd¨3°·±Ñ+@ÈBÐW_Ô`ÐaÑaÕØ&�d×&Ñ&Øð

àØ˜!‘9ØØØØ#9Ø1ñ

ð ñ

ˆŒð 	×Òœd¨3°·±Ñ+@ÈBÐW_Ô`ÐaÑaÕØ47¸%¿/¹/Ñ4IÐIˆÔ˜DÔ1Ü->Ø×ÑØ×Ññ.
ð "ð.
ð ñ	.
Ñ*ˆÔ˜$Ô*ð —‘“ò 	ˆAÜ˜�Oñ	r"   c           
      ó  — |	|
dœ}d }|dk7  s| j                   ||j                  z  k7  rht        j                  t        j                  | j                   ||j                  z  f|||ddœ|¤Žt        j
                  ||j                  z  fi |¤Ž«      } || j                   |||||fi |¤Žg}||j                  z  | _         t        d|«      D ]'  }|j                   || j                   |||fi |¤Ž«       Œ) t        j                  |Ž S )Nr(   r   Frˆ   )rZ   rf   r   r˜   r   r   ÚrangeÚappend)r5   rz   r[   r�   r\   r&   r]   r   r€   r)   r*   r6   rP   r{   Úis                  r    r�   zSENet._make_layer�  s  € à¨Ñ/ˆØˆ
Ø�QŠ;˜$Ÿ-™-¨6°E·O±OÑ+CÒCÜŸ™Ü—	‘	Ø—M‘M 6¨E¯O©OÑ#;ðQØI_Ø!Ð+=ÀEñQàMOñQô —‘˜v¨¯©Ñ7Ñ>¸2Ñ>ó	ˆJñ ˜Ÿ™ v¨v°yÀ&È*Ñ[ÐXZÑ[Ð\ˆØ §¡Ñ0ˆŒÜ�q˜&Ó!ò 	QˆAØ�M‰M™% §¡¨v°v¸yÑOÈBÑOÕPð	Qô �}‰}˜fÐ%Ð%r"   c                 ó(   — t        d|rdnd¬«      }|S )Nz^layer0z^layer(\d+)z^layer(\d+)\.(\d+))Ústemr�   )r›   )r5   ÚcoarseÚmatchers      r    Úgroup_matcherzSENet.group_matcher”  s   € ä˜JÁ©~ÐMbÔcˆØˆr"   c                 ó   — |rJ d«       ‚y )Nz$gradient checkpointing not supportedrV   )r5   Úenables     r    Úset_grad_checkpointingzSENet.set_grad_checkpointing™  s   € áÐAÐAÓAˆz�6r"   Úreturnc                 ó   — | j                   S rI   )r    )r5   s    r    Úget_classifierzSENet.get_classifier�  s   € à×ÑÐr"   c                 óp   — || _         t        | j                  | j                   |¬«      \  | _        | _        y )N)r—   )r�   r
   rž   r‚   r    )r5   r�   r‚   s      r    Úreset_classifierzSENet.reset_classifier¡  s3   € Ø&ˆÔÜ->Ø×Ñ˜t×/Ñ/¸;ô.HÑ*ˆÔ˜$Õ*r"   c                 óÒ   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }|S rI   )rŠ   rš   rŽ   r‘   r”   r–   ©r5   r=   s     r    Úforward_featureszSENet.forward_features¦  sU   € Ø�K‰K˜‹NˆØ�J‰J�q‹MˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØˆr"   Ú
pre_logitsc                 óÄ   — | j                  |«      }| j                  dkD  r,t        j                  || j                  | j                  ¬«      }|r|S | j                  |«      S )Nr   )ÚpÚtraining)r‚   r|   ÚFÚdropoutrº   r    )r5   r=   r·   s      r    Úforward_headzSENet.forward_head¯  sP   € Ø×Ñ˜QÓˆØ�>‰>˜BÒÜ—	‘	˜!˜tŸ~™~¸¿¹ÔFˆAÙˆqÐ7 D×$4Ñ$4°QÓ$7Ð7r"   c                 óJ   — | j                  |«      }| j                  |«      }|S rI   )r¶   r½   rµ   s     r    r?   zSENet.forwardµ  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr"   )
gš™™™™™É?r:   rq   Fr   r   éè  ÚavgNN)r   r   r   NN©F)T)rÀ   )r@   rA   rB   r   r   rg   r   rC   ÚfloatÚboolÚstrr/   r�   ÚtorchÚjitÚignorer«   r®   r±   r³   r¶   r½   r?   rD   rE   s   @r    r   r   í   s^  ø„ ð  #ØØØ#Ø*+Ø&'Ø#Ø$ØØñPà˜Ÿ	™	‘?ðPð ˜#˜s˜(‘OðPð ð	Pð
 ðPð ðPð ðPð ðPð ðPð %(ðPð !$ðPð ðPð õPðd LMØW[ó&ð& ‡Y�Y×Ñòó ðð ‡Y�Y×ÑòBó ðBð ‡Y�Y×Ñð  §	¡	ò  ó ð ñH¨Cð H¸có Hò
ñ8¨$ó 8ör"   c                 ó&   — t        t        | |fi |¤ŽS rI   )r   r   )ÚvariantÚ
pretrainedÚkwargss      r    Ú_create_senetrÌ   »  s   € Ü¤ w°
ÑE¸fÑEÐEr"   c                 ó2   — | dddddt         t        dddd	œ|¥S )
Nr¿   )r:   éà   rÎ   )r‡   r‡   g      ì?Úbilinearzlayer0.conv1r    z
apache-2.0)Úurlr�   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationr<   ÚstdÚ
first_convÚ
classifierÚlicenser   )rÐ   rË   s     r    Ú_cfgrÙ   ¿  s2   € à 4°}ÐSYØ¨JÜ%Ô.BØ$°MÈlñ	ð
 ðð r"   zmhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/legacy_senet154-e9eb9fe6.pth)rÐ   zhhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnet18-4bb0ce65.pthÚbicubic)rÐ   rÔ   zhhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnet34-a4004e63.pthzhhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/se_resnet50-ce0d4300.pthzihttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/se_resnet101-7e38fcc6.pthzihttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/se_resnet152-d17c99b7.pthzphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnext26_32x4d-65ebdb501.pthzwhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/legacy_se_resnext50_32x4d-f3651bad.pthzxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/legacy_se_resnext101_32x4d-37725eac.pth)	zlegacy_senet154.in1kzlegacy_seresnet18.in1kzlegacy_seresnet34.in1kzlegacy_seresnet50.in1kzlegacy_seresnet101.in1kzlegacy_seresnet152.in1kzlegacy_seresnext26_32x4d.in1kzlegacy_seresnext50_32x4d.in1kzlegacy_seresnext101_32x4d.in1kr¯   c           	      óZ   — t        t        g d¢dd¬«      }t        d| fi t        |fi |¤Ž¤ŽS )N©r9   r9   r9   r9   r   r“   ©rz   r{   r\   r&   Úlegacy_seresnet18©r›   rv   rÌ   ©rÊ   rË   Ú
model_argss      r    rÞ   rÞ   á  ó3   € äÜ¢L¸ÀbôJ€JäÐ,¨jÑW¼DÀÑ<VÈvÑ<VÑWÐWr"   c           	      óZ   — t        t        g d¢dd¬«      }t        d| fi t        |fi |¤Ž¤ŽS )N©r:   rY   é   r:   r   r“   rÝ   Úlegacy_seresnet34rß   rà   s      r    ræ   ræ   è  râ   r"   c           	      óZ   — t        t        g d¢dd¬«      }t        d| fi t        |fi |¤Ž¤ŽS )Nrä   r   r“   rÝ   Úlegacy_seresnet50©r›   ri   rÌ   rà   s      r    rè   rè   ï  s3   € äÜ ª¸aÈ2ôO€JäÐ,¨jÑW¼DÀÑ<VÈvÑ<VÑWÐWr"   c           	      óZ   — t        t        g d¢dd¬«      }t        d| fi t        |fi |¤Ž¤ŽS )N©r:   rY   é   r:   r   r“   rÝ   Úlegacy_seresnet101ré   rà   s      r    rí   rí   ö  ó4   € äÜ ª¸qÈBôP€JäÐ-¨zÑX¼TÀ*Ñ=WÐPVÑ=WÑXÐXr"   c           	      óZ   — t        t        g d¢dd¬«      }t        d| fi t        |fi |¤Ž¤ŽS )N©r:   r�   é$   r:   r   r“   rÝ   Úlegacy_seresnet152ré   rà   s      r    rò   rò   ý  rî   r"   c           
      ób   — t        t        g d¢dddddd¬«      }t        d	| fi t        |fi |¤Ž¤ŽS )
Nrð   rq   r“   r:   r   r�   T)rz   r{   r\   r&   r   r€   rZ   r~   Úlegacy_senet154)r›   rX   rÌ   rà   s      r    rô   rô     s?   € äÜ¢=¸ÀrØ °QÀ#ÐQUôW€Jô Ð*¨JÑU¼$¸zÑ:TÈVÑ:TÑUÐUr"   c           	      óZ   — t        t        g d¢dd¬«      }t        d| fi t        |fi |¤Ž¤ŽS )NrÜ   r•   r“   rÝ   Úlegacy_seresnext26_32x4d©r›   rn   rÌ   rà   s      r    rö   rö     ó4   € äÜ!ª,¸rÈRôQ€JäÐ3°ZÑ^Ä4È
ÑC]ÐV\ÑC]Ñ^Ð^r"   c           	      óZ   — t        t        g d¢dd¬«      }t        d| fi t        |fi |¤Ž¤ŽS )Nrä   r•   r“   rÝ   Úlegacy_seresnext50_32x4dr÷   rà   s      r    rú   rú     rø   r"   c           	      óZ   — t        t        g d¢dd¬«      }t        d| fi t        |fi |¤Ž¤ŽS )Nrë   r•   r“   rÝ   Úlegacy_seresnext101_32x4dr÷   rà   s      r    rü   rü     s4   € äÜ!ª-ÀÈbôR€JäÐ4°jÑ_ÄDÈÑD^ÐW]ÑD^Ñ_Ð_r"   rÁ   )Ú ).rU   rr   Úcollectionsr   Útypingr   r   r   rÅ   Útorch.nnr   Útorch.nn.functionalÚ
functionalr»   Ú	timm.datar   r	   Útimm.layersr
   Ú_builderr   Ú	_registryr   r   Ú__all__r!   rg   r$   rG   rX   ri   rn   rv   r   rÌ   rÙ   Údefault_cfgsrÞ   ræ   rè   rí   rò   rô   rö   rú   rü   rV   r"   r    ú<module>r	     sK  ðñó Ý #ß (Ñ (ã Ý ß Ð ç AÝ )Ý *ß <àˆ)€ò&ô ˆr�y‰yô  ô(�—‘ô ô8%�:ô %ôP˜ô ôB˜*ô ôB*�B—I‘Iô *ôZKˆB�I‰Iô Kó\Fóñ %Ù Ø{ô}á"ØvØô!ñ #Øvôxá"Øvôxá#Øwô yá#Øwô yá%)Ø~Øô&!ñ &*ð Fô&Gá&*ð Gô'Hñ'&ó €ð0 ñX°Uò Xó ðXð ñX°Uò Xó ðXð ñX°Uò Xó ðXð ñY°eò Yó ðYð ñY°eò Yó ðYð ñV°5ò Vó ðVð ñ_¸Eò _ó ð_ð ñ_¸Eò _ó ð_ð ñ`¸Uò `ó ñ`r"   