o
    پi>/                     @   s^  d Z ddlmZ ddlZddl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*d%ef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                       &   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stride0   @         r   r   padding   F)r   r   count_include_pad)superr   __init__r   branch0nn
Sequentialbranch1branch2	AvgPool2dbranch3self
conv_block	__class__ S/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/inception_resnet_v2.pyr      s    
zMixed_5b.__init__c                 C   @   |  |}| |}| |}| |}t||||fd}|S Nr   r   r"   r#   r%   torchcatr'   xx0x1x2x3outr+   r+   r,   forward)      



zMixed_5b.forwardN__name__
__module____qualname__r   r9   __classcell__r+   r+   r)   r,   r          r   c                       &   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   rC   r   scaler   r   r    r!   r"   r#   Conv2dconv2dReLUactr'   rH   r(   r)   r+   r,   r   3   s   zBlock35.__init__c                 C   sV   |  |}| |}| |}t|||fd}| |}|| j | }| |}|S r.   )r   r"   r#   r0   r1   rJ   rH   rL   r'   r3   r4   r5   r6   r8   r+   r+   r,   r9   H   s   




zBlock35.forwardrD   Nr<   r+   r+   r)   r,   rC   2   s    rC   c                       r   )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 )
NrE     r   r   r      r   r   r   )
r   rP   r   r   r   r    r!   r"   	MaxPool2dr#   r&   r)   r+   r,   r   T   s   zMixed_6a.__init__c                 C   s4   |  |}| |}| |}t|||fd}|S r.   )r   r"   r#   r0   r1   rN   r+   r+   r,   r9   b   s
   


zMixed_6a.forwardr;   r<   r+   r+   r)   r,   rP   S   s    rP   c                       rB   )Block17rD   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   rG      )r      )r   r   r   )rX   r   )r   r   rQ   )r   rU   r   rH   r   r   r    r!   r"   rI   rJ   rK   rL   rM   r)   r+   r,   r   k   s   zBlock17.__init__c                 C   sJ   |  |}| |}t||fd}| |}|| j | }| |}|S r.   )r   r"   r0   r1   rJ   rH   rL   r'   r3   r4   r5   r8   r+   r+   r,   r9   {   s   



zBlock17.forwardrO   r<   r+   r+   r)   r,   rU   j   s    rU   c                       r   )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 )NrV   rR   r   r   rQ   r   r   i   r   rE   rS   )r   rZ   r   r   r    r!   r   r"   r#   rT   r%   r&   r)   r+   r,   r      s    zMixed_7a.__init__c                 C   r-   r.   r/   r2   r+   r+   r,   r9      r:   zMixed_7a.forwardr;   r<   r+   r+   r)   r,   rZ      rA   rZ   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	Block8rD   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| _
|rDd | _d S t | _d S )N   r   r   r      )r   r   )r   r   r   rR   )r   r   )r   r   i  )r   r[   r   rH   r   r   r    r!   r"   rI   rJ   rK   relu)r'   rH   no_relur(   r)   r+   r,   r      s   zBlock8.__init__c                 C   sT   |  |}| |}t||fd}| |}|| j | }| jd ur(| |}|S r.   )r   r"   r0   r1   rJ   rH   r^   rY   r+   r+   r,   r9      s   




zBlock8.forward)rD   FNr<   r+   r+   r)   r,   r[      s    r[   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e	j
fddZd"dedefddZdd Zd defddZdd Z  ZS )#r     r           rF   avgbatchnorm2dMbP?r^   c	           	   	      s  t t|   || _d | _| _|dksJ 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   rF   r   )epsT)inplace)r   
norm_layer	act_layernorm_kwargs
act_kwargsr   r   r   r   r   r   	conv2d_2b)num_chs	reductionmodulerS   P   r      	conv2d_4ar(   c                       g | ]}t d  dqS )g(\?rH   r(   )rC   .0_rr   r+   r,   
<listcomp>       z.InceptionResnetV2.__init__.<locals>.<listcomp>
   rE      repeatc                    rs   )g?rt   )rU   ru   rr   r+   r,   rx      ry      rV      repeat_1c                    rs   )g?rt   )r[   ru   rr   r+   r,   rx      ry   	   )r_   r(   r\   	conv2d_7b)	pool_type	drop_rate)%r   r   r   num_classesnum_featureshead_hidden_sizer   r   dict	conv2d_1a	conv2d_2ark   feature_infor    rT   
maxpool_3a	conv2d_3brq   
maxpool_5ar   mixed_5br!   ranger|   rP   mixed_6ar   rZ   mixed_7arepeat_2r[   block8r   r   global_pool	head_dropclassif)	r'   r   in_chansr   output_strider   rg   norm_epsrh   r)   rr   r,   r      sF   	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+   )rv   ikrw   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 rdS t  fddd	D r+td S  D ]}|t d
d t| krF|   S q/tdS )Nc                       g | ]}  |qS r+   
startswithrv   nnamer+   r,   rx          zEInceptionResnetV2.group_matcher.<locals>._matcher.<locals>.<listcomp>)conv2d_1conv2d_2r   c                    r   r+   r   r   r   r+   r,   rx      r   )conv2d_3conv2d_4r   c                    r   r+   r   r   r   r+   r,   rx     r   )r   conv2d_7.inf)anylenkeystuplesplitfloat)r   r   
module_mapr   r,   _matcher   s   z1InceptionResnetV2.group_matcher.<locals>._matcher)	enumerater	   named_childrenpop)r'   coarser   r+   r   r,   group_matcher   s   
zInceptionResnetV2.group_matcherTc                 C   s   |rJ dd S )Nzcheckpointing not supportedr+   )r'   enabler+   r+   r,   set_grad_checkpointing  s   z(InceptionResnetV2.set_grad_checkpointingreturnc                 C   s   | j S r;   r   )r'   r+   r+   r,   get_classifier  s   z InceptionResnetV2.get_classifierr   r   c                 C   s$   || _ t| j| j |d\| _| _d S )N)r   )r   r   r   r   r   )r'   r   r   r+   r+   r,   reset_classifier  s   z"InceptionResnetV2.reset_classifierc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}| |}| |}|S r;   )r   r   rk   r   r   rq   r   r   r|   r   r   r   r   r   r   r'   r3   r+   r+   r,   forward_features  s    














z"InceptionResnetV2.forward_features
pre_logitsc                 C   s&   |  |}| |}|r|S | |S r;   )r   r   r   )r'   r3   r   r+   r+   r,   forward_head)  s   

zInceptionResnetV2.forward_headc                 C   s   |  |}| |}|S r;   )r   r   r   r+   r+   r,   r9   .  s   

zInceptionResnetV2.forward)r`   r   ra   rF   rb   rc   rd   r^   F)T)rb   )r=   r>   r?   r   r0   jitignorer   r   r    Moduler   intstrr   r   boolr   r9   r@   r+   r+   r)   r,   r      s(    5Fc                 K   s   t t| |fi |S r;   )r   r   )variant
pretrainedkwargsr+   r+   r,   _create_inception_resnet_v24  s   r   ztimm/r`   )r   +  r   )r{   r{   gQ?bicubiczconv2d_1a.convr   )
	hf_hub_idr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifier)zinception_resnet_v2.tf_in1k#inception_resnet_v2.tf_ens_adv_in1kr   c                 K   s   t dd| i|S )Ninception_resnet_v2r   )r   )r   )r   r   r+   r+   r,   r   M  s   r   ens_adv_inception_resnet_v2r   r   )!__doc__	functoolsr   r0   torch.nnr    	timm.datar   r   timm.layersr   r   _builderr   _manipulater	   	_registryr
   r   r   __all__r   r   rC   rP   rU   rZ   r[   r   r   default_cfgsr   r=   r+   r+   r+   r,   <module>   sJ     ! 
r

