U
    ¯Ê¹j-/  ã                   @   sp  d Z ddlmZ ddlZddlmZ ddlm  mZ ddl	m
Z
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mZ d
gZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd
„ d
ejƒZd*dd„Z edddddd e
ed!d"d#œ
dddddd e
ed!d"d#œ
d$œƒZ!ed+ed%œd&d'„ƒZ"ee#d(d)iƒ dS ),zß Pytorch Inception-Resnet-V2 implementation
Sourced from https://github.com/Cadene/tensorflow-model-zoo.torch (MIT License) which is
based upon Google's Tensorflow implementation and pretrained weights (Apache 2.0 License)
é    )ÚpartialN)ÚIMAGENET_INCEPTION_MEANÚIMAGENET_INCEPTION_STD)Úcreate_classifierÚConvNormActé   )Úbuild_model_with_cfg)Úflatten_modules)Úregister_modelÚgenerate_default_cfgsÚregister_model_deprecationsÚInceptionResnetV2c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚMixed_5bNc                    s´   t t| ƒ ¡  |pt}|ddddd�| _t |ddddd�|dddddd	�¡| _t |ddddd�|ddd
ddd	�|ddd
ddd	�¡| _t tj	d
dddd�|ddddd�¡| _
d S )NéÀ   é`   r   ©Úkernel_sizeÚstrideé0   é@   é   é   ©r   r   Úpaddingé   F)r   r   Zcount_include_pad)Úsuperr   Ú__init__r   Úbranch0ÚnnÚ
SequentialÚbranch1Úbranch2Z	AvgPool2dÚbranch3©ÚselfÚ
conv_block©Ú	__class__© ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/inception_resnet_v2.pyr      s     þýþzMixed_5b.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}t ||||fd¡}|S ©Nr   ©r   r    r!   r"   ÚtorchÚcat©r$   ÚxÚx0Úx1Úx2Zx3Úoutr(   r(   r)   Úforward*   s    



zMixed_5b.forward)N©Ú__name__Ú
__module__Ú__qualname__r   r4   Ú__classcell__r(   r(   r&   r)   r      s   r   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚBlock35ç      ð?Nc                    s°   t t| ƒ ¡  || _|pt}|ddddd�| _t |ddddd�|dddddd�¡| _t |ddddd�|dddddd�|dddddd�¡| _	tj
d	dddd�| _t ¡ | _d S )
Né@  é    r   r   r   r   r   r   é€   )r   r:   r   Úscaler   r   r   r   r    r!   ÚConv2dÚconv2dÚReLUÚact©r$   r?   r%   r&   r(   r)   r   4   s    þýzBlock35.__init__c                 C   sV   |   |¡}|  |¡}|  |¡}t |||fd¡}|  |¡}|| j | }|  |¡}|S r*   )r   r    r!   r,   r-   rA   r?   rC   ©r$   r/   r0   r1   r2   r3   r(   r(   r)   r4   I   s    




zBlock35.forward)r;   Nr5   r(   r(   r&   r)   r:   3   s   r:   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚMixed_6aNc              
      sr   t t| ƒ ¡  |pt}|ddddd�| _t |ddddd�|dddddd�|ddddd�¡| _tjddd	�| _	d S )
Nr<   é€  r   r   r   é   r   r   ©r   )
r   rF   r   r   r   r   r   r    Ú	MaxPool2dr!   r#   r&   r(   r)   r   U   s    ýzMixed_6a.__init__c                 C   s4   |   |¡}|  |¡}|  |¡}t |||fd¡}|S r*   )r   r    r!   r,   r-   rE   r(   r(   r)   r4   c   s
    


zMixed_6a.forward)Nr5   r(   r(   r&   r)   rF   T   s   rF   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚBlock17r;   Nc                    sˆ   t t| ƒ ¡  || _|pt}|ddddd�| _t |ddddd�|dddddd	�|ddd
ddd	�¡| _tj	ddddd�| _
t ¡ | _d S )Né@  r   r   r   r>   é    )r   é   )r   r   r   )rN   r   )r   r   rG   )r   rK   r   r?   r   r   r   r   r    r@   rA   rB   rC   rD   r&   r(   r)   r   l   s    ýzBlock17.__init__c                 C   sJ   |   |¡}|  |¡}t ||fd¡}|  |¡}|| j | }|  |¡}|S r*   )r   r    r,   r-   rA   r?   rC   ©r$   r/   r0   r1   r3   r(   r(   r)   r4   |   s    



zBlock17.forward)r;   Nr5   r(   r(   r&   r)   rK   k   s   rK   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚMixed_7aNc              
      s¬   t t| ƒ ¡  |pt}t |ddddd�|ddddd�¡| _t |ddddd�|ddddd�¡| _t |ddddd�|dddddd	�|dd
ddd�¡| _tj	ddd�| _
d S )NrL   rH   r   r   rG   r   r   i   r   r<   rI   )r   rP   r   r   r   r   r   r    r!   rJ   r"   r#   r&   r(   r)   r   ‡   s     þþýzMixed_7a.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}t ||||fd¡}|S r*   r+   r.   r(   r(   r)   r4   �   s    



zMixed_7a.forward)Nr5   r(   r(   r&   r)   rP   †   s   rP   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )	ÚBlock8r;   FNc                    s�   t t| ƒ ¡  || _|pt}|ddddd�| _t |ddddd�|dddddd�|dd	d
ddd�¡| _tj	ddddd�| _
|r‚d nt ¡ | _d S )Né   r   r   r   éà   )r   r   )r   r   r   rH   )r   r   )r   r   iÀ  )r   rQ   r   r?   r   r   r   r   r    r@   rA   rB   Úrelu)r$   r?   Úno_relur%   r&   r(   r)   r   ¨   s    ýzBlock8.__init__c                 C   sT   |   |¡}|  |¡}t ||fd¡}|  |¡}|| j | }| jd k	rP|  |¡}|S r*   )r   r    r,   r-   rA   r?   rT   rO   r(   r(   r)   r4   ¸   s    




zBlock8.forward)r;   FNr5   r(   r(   r&   r)   rQ   ¦   s   rQ   c                       s|   e Zd Zd‡ fd	d
„	Zejjddd„ƒZejjddd„ƒZejjdd„ ƒZ	ddd„Z
dd„ Zd edœdd„Zdd„ Z‡  ZS )!r   éè  r   ç        r=   ÚavgÚbatchnorm2dçü©ñÒMbP?rT   c	           	   	      s  t t| ƒ ¡  || _d| _|dks&t‚ttd||t|d�tdd�d�‰ ˆ |ddd	d
�| _	ˆ ddddd
�| _
ˆ dddddd�| _tdd	dd�g| _tjdd	d�| _ˆ ddddd
�| _ˆ ddddd
�| _|  jtdddd�g7  _tjdd	d�| _tˆ d�| _tj‡ fdd„tdƒD ƒŽ | _|  jtdddd�g7  _tˆ d�| _tj‡ fdd„tdƒD ƒŽ | _|  jtddd d�g7  _tˆ d�| _tj‡ fd!d„td"ƒD ƒŽ | _tdˆ d#�| _ˆ d$| jddd
�| _ |  jt| jdd%d�g7  _t!| j| j||d&�\| _"| _#| _$d S )'Ni   r=   r   )ÚepsT)Zinplace)r   Ú
norm_layerÚ	act_layerZnorm_kwargsZ
act_kwargsr   r   r   r   r   r   Ú	conv2d_2b)Znum_chsZ	reductionÚmodulerI   éP   r   é   Ú	conv2d_4a©r%   c                    s   g | ]}t d ˆ d�‘qS )gÃõ(\�ÂÅ?©r?   r%   )r:   ©Ú.0Ú_rc   r(   r)   Ú
<listcomp>è   s     z.InceptionResnetV2.__init__.<locals>.<listcomp>é
   r<   é   Úrepeatc                    s   g | ]}t d ˆ d�‘qS )gš™™™™™¹?rd   )rK   re   rc   r(   r)   rh   ì   s     é   rL   é   Úrepeat_1c                    s   g | ]}t d ˆ d�‘qS )gš™™™™™É?rd   )rQ   re   rc   r(   r)   rh   ð   s     é	   )rU   r%   rR   Ú	conv2d_7b)Ú	pool_typeÚ	drop_rate)%r   r   r   Únum_classesÚnum_featuresÚAssertionErrorr   r   ÚdictÚ	conv2d_1aÚ	conv2d_2ar^   Zfeature_infor   rJ   Ú
maxpool_3aÚ	conv2d_3brb   Ú
maxpool_5ar   Úmixed_5br   Úrangerk   rF   Úmixed_6arn   rP   Úmixed_7aÚrepeat_2rQ   Úblock8rp   r   Úglobal_poolÚ	head_dropÚclassif)	r$   rs   Zin_chansrr   Zoutput_strider‚   r\   Znorm_epsr]   r&   rc   r)   r   Ä   sL    ú	   ÿzInceptionResnetV2.__init__Fc                    s8   dd„ t t|  ¡ dd�ƒD ƒ‰ ˆ  d¡ ‡ fdd„}|S )Nc                 S   s   i | ]\}\}}||“qS r(   r(   )rf   ÚiÚkrg   r(   r(   r)   Ú
<dictcomp>û   s    
  z3InceptionResnetV2.group_matcher.<locals>.<dictcomp>r(   )Úprefix©r„   c                    sš   t ‡ fdd„dD ƒƒrdS t ‡ fdd„dD ƒƒr4dS t ‡ fdd„d	D ƒƒrVtˆƒd S ˆ ¡ D ].}|tˆ  d
¡d t|ƒ… ƒkr^ˆ|   S q^tdƒS d S )Nc                    s   g | ]}ˆ   |¡‘qS r(   ©Ú
startswith©rf   Ún©Únamer(   r)   rh   ÿ   s     zEInceptionResnetV2.group_matcher.<locals>._matcher.<locals>.<listcomp>)Zconv2d_1Zconv2d_2r   c                    s   g | ]}ˆ   |¡‘qS r(   rŠ   rŒ   rŽ   r(   r)   rh     s     )Zconv2d_3Zconv2d_4r   c                    s   g | ]}ˆ   |¡‘qS r(   rŠ   rŒ   rŽ   r(   r)   rh     s     )r�   Zconv2d_7Ú.Úinf)ÚanyÚlenÚkeysÚtupleÚsplitÚfloat)r�   r†   ©Z
module_maprŽ   r)   Ú_matcherþ   s    z1InceptionResnetV2.group_matcher.<locals>._matcher)Ú	enumerater	   Znamed_childrenÚpop)r$   Zcoarser™   r(   r˜   r)   Úgroup_matcherù   s    
zInceptionResnetV2.group_matcherTc                 C   s   |rt dƒ‚d S )Nzcheckpointing not supported)ru   )r$   Úenabler(   r(   r)   Úset_grad_checkpointing  s    z(InceptionResnetV2.set_grad_checkpointingc                 C   s   | j S ©Nr‰   )r$   r(   r(   r)   Úget_classifier  s    z InceptionResnetV2.get_classifierc                 C   s$   || _ t| j| j |d�\| _| _d S )N)rq   )rs   r   rt   r‚   r„   )r$   rs   r‚   r(   r(   r)   Úreset_classifier  s    z"InceptionResnetV2.reset_classifierc                 C   sš   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  	|¡}|  
|¡}|  |¡}|  |¡}|  |¡}|  |¡}|S rŸ   )rw   rx   r^   ry   rz   rb   r{   r|   rk   r~   rn   r   r€   r�   rp   ©r$   r/   r(   r(   r)   Úforward_features  s     














z"InceptionResnetV2.forward_features)Ú
pre_logitsc                 C   s&   |   |¡}|  |¡}|r|S |  |¡S rŸ   )r‚   rƒ   r„   )r$   r/   r¤   r(   r(   r)   Úforward_head*  s    

zInceptionResnetV2.forward_headc                 C   s   |   |¡}|  |¡}|S rŸ   )r£   r¥   r¢   r(   r(   r)   r4   /  s    

zInceptionResnetV2.forward)rV   r   rW   r=   rX   rY   rZ   rT   )F)T)rX   )F)r6   r7   r8   r   r,   ZjitÚignorerœ   rž   r    r¡   r£   Úboolr¥   r4   r9   r(   r(   r&   r)   r   Ã   s&           ÷5

Fc                 K   s   t t| |f|ŽS rŸ   )r   r   )ÚvariantÚ
pretrainedÚkwargsr(   r(   r)   Ú_create_inception_resnet_v25  s    r«   ztimm/rV   )r   é+  r¬   )rj   rj   g¸…ëQ¸ì?Zbicubiczconv2d_1a.convr„   )
Z	hf_hub_idrs   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifier)zinception_resnet_v2.tf_in1kú#inception_resnet_v2.tf_ens_adv_in1k)Úreturnc                 K   s   t dd| i|—ŽS )NÚinception_resnet_v2r©   )r±   )r«   )r©   rª   r(   r(   r)   r±   N  s    r±   Zens_adv_inception_resnet_v2r¯   )F)F)$Ú__doc__Ú	functoolsr   r,   Ztorch.nnr   Ztorch.nn.functionalZ
functionalÚFZ	timm.datar   r   Ztimm.layersr   r   Z_builderr   Z_manipulater	   Ú	_registryr
   r   r   Ú__all__ÚModuler   r:   rF   rK   rP   rQ   r   r«   Zdefault_cfgsr±   r6   r(   r(   r(   r)   Ú<module>   s`    ! r
     û
     ûõ ÿ