o
    پiGC                  	   @   s  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mZmZ ddlmZmZmZmZ ddl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%d-ddZ&ee&dd d!e&dd"e&dd"e&dee
d#d$Z'ed,d%e$fd&d'Z(ee)d(d)d*d+ dS ).z Inception-V3

Originally from torchvision Inception3 model
Licensed BSD-Clause 3 https://github.com/pytorch/vision/blob/master/LICENSE
    )partialN)IMAGENET_DEFAULT_STDIMAGENET_DEFAULT_MEANIMAGENET_INCEPTION_MEANIMAGENET_INCEPTION_STD)trunc_normal_create_classifierLinearConvNormAct   )build_model_with_cfg)resolve_pretrained_cfg)flatten_modules)register_modelgenerate_default_cfgsregister_model_deprecationsInceptionV3c                       .   e Zd Zd fdd	Zdd Zdd Z  ZS )	
InceptionANc                    s   t t|   |p
t}||ddd| _||ddd| _|ddddd| _||ddd| _|ddd	dd| _|ddd	dd| _	|||dd| _
d S )
N@   r   kernel_size0         r   padding`      )superr   __init__r
   	branch1x1branch5x5_1branch5x5_2branch3x3dbl_1branch3x3dbl_2branch3x3dbl_3branch_pool)selfin_channelspool_features
conv_block	__class__ L/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/inception_v3.pyr       s   zInceptionA.__init__c                 C   sh   |  |}| |}| |}| |}| |}| |}tj|dddd}| |}||||g}|S Nr   r   r   strider   )	r!   r"   r#   r$   r%   r&   F
avg_pool2dr'   )r(   xr!   	branch5x5branch3x3dblr'   outputsr.   r.   r/   _forward&   s   






zInceptionA._forwardc                 C      |  |}t|dS Nr   r9   torchcatr(   r5   r8   r.   r.   r/   forward6      
zInceptionA.forwardN__name__
__module____qualname__r    r9   r@   __classcell__r.   r.   r,   r/   r      s    r   c                       r   )	
InceptionBNc                    s`   t t|   |p
t}||dddd| _||ddd| _|ddddd	| _|ddddd| _d S )
N  r   r   r   r2   r   r   r   r   r   )r   rH   r    r
   	branch3x3r$   r%   r&   r(   r)   r+   r,   r.   r/   r    =   s   zInceptionB.__init__c                 C   sF   |  |}| |}| |}| |}tj|ddd}|||g}|S Nr   r   rJ   )rK   r$   r%   r&   r3   
max_pool2d)r(   r5   rK   r7   r'   r8   r.   r.   r/   r9   F   s   




zInceptionB._forwardc                 C   r:   r;   r<   r?   r.   r.   r/   r@   R   rA   zInceptionB.forwardrB   rC   r.   r.   r,   r/   rH   ;   s    	rH   c                       r   )	
InceptionCNc                    s   t t|   |p
t}||ddd| _|}|||dd| _|||ddd| _||dddd| _|||dd| _|||ddd| _	|||ddd| _
|||ddd| _||dddd| _||ddd| _d S )	N   r   r   r      r   r   r   rR   r   r   r   )r   rO   r    r
   r!   branch7x7_1branch7x7_2branch7x7_3branch7x7dbl_1branch7x7dbl_2branch7x7dbl_3branch7x7dbl_4branch7x7dbl_5r'   )r(   r)   channels_7x7r+   c7r,   r.   r/   r    Y   s   zInceptionC.__init__c                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}t	j
|dddd}| |}||||g}|S r0   )r!   rV   rW   rX   rY   rZ   r[   r\   r]   r3   r4   r'   )r(   r5   r!   	branch7x7branch7x7dblr'   r8   r.   r.   r/   r9   k   s   









zInceptionC._forwardc                 C   r:   r;   r<   r?   r.   r.   r/   r@   ~   rA   zInceptionC.forwardrB   rC   r.   r.   r,   r/   rO   W   s    rO   c                       r   )	
InceptionDNc                    s   t t|   |p
t}||ddd| _|ddddd| _||ddd| _|dddd	d
| _|ddddd
| _|ddddd| _	d S )NrP   r   r   @  r   r   rJ   rQ   rS   r   rT   rU   )
r   rb   r    r
   branch3x3_1branch3x3_2branch7x7x3_1branch7x7x3_2branch7x7x3_3branch7x7x3_4rL   r,   r.   r/   r       s   zInceptionD.__init__c                 C   sZ   |  |}| |}| |}| |}| |}| |}tj|ddd}|||g}|S rM   )rd   re   rf   rg   rh   ri   r3   rN   )r(   r5   rK   branch7x7x3r'   r8   r.   r.   r/   r9      s   






zInceptionD._forwardc                 C   r:   r;   r<   r?   r.   r.   r/   r@      rA   zInceptionD.forwardrB   rC   r.   r.   r,   r/   rb      s    rb   c                       r   )	
InceptionENc                    s   t t|   |p
t}||ddd| _||ddd| _|ddddd| _|dddd	d| _||d
dd| _|d
dddd| _	|ddddd| _
|dddd	d| _||ddd| _d S )Nrc   r   r   rI   )r   r   )r   r   r   )r   r   )r   r   i  r   rP   )r   rk   r    r
   r!   rd   branch3x3_2abranch3x3_2br$   r%   branch3x3dbl_3abranch3x3dbl_3br'   rL   r,   r.   r/   r       s   zInceptionE.__init__c                 C   s   |  |}| |}| || |g}t|d}| |}| |}| || 	|g}t|d}t
j|dddd}| |}||||g}|S )Nr   r   r1   )r!   rd   rl   rm   r=   r>   r$   r%   rn   ro   r3   r4   r'   )r(   r5   r!   rK   r7   r'   r8   r.   r.   r/   r9      s    




zInceptionE._forwardc                 C   r:   r;   r<   r?   r.   r.   r/   r@      rA   zInceptionE.forwardrB   rC   r.   r.   r,   r/   rk      s    rk   c                       s&   e Zd Zd fdd	Zdd Z  ZS )InceptionAuxNc                    sV   t t|   |p
t}||ddd| _|dddd| _d| j_td|| _d| j_d S )N   r   r      r   g{Gz?MbP?)	r   rp   r    r
   conv0conv1stddevr	   fc)r(   r)   num_classesr+   r,   r.   r/   r       s   zInceptionAux.__init__c                 C   sJ   t j|ddd}| |}| |}t |d}t|d}| |}|S )Nr   r   rJ   )r   r   r   )r3   r4   rt   ru   adaptive_avg_pool2dr=   flattenrw   r(   r5   r.   r.   r/   r@      s   


zInceptionAux.forwardrB   )rD   rE   rF   r    r@   rG   r.   r.   r,   r/   rp      s    	rp   c                       s   e Zd ZU dZejje ed< 									
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 Zdd Zd%defd d!Zd"d# Z  ZS )(r   zInception-V3
    
aux_logits  r           avgFbatchnorm2drs   reluc	              	      sb  t t|   || _|| _ttd||t|dtddd}	|	|dddd	| _|	dddd
| _	|	ddddd| _
tjddd	| _|	dddd
| _|	dddd
| _tjddd	| _tdd|	d| _tdd|	d| _tdd|	d| _td|	d| _tdd|	d| _tdd|	d| _tdd|	d| _tdd|	d| _|rtd||	d| _nd | _td|	d| _t d|	d| _!t d|	d| _"tddddtddddtddddtdd d!dtddd"dg| _#d | _$| _%t&| j$| j||d#\| _'| _(| _)| * D ]:}
t+|
tj,st+|
tj-rt.|
d$r|
j/nd%}t0|
j1|d& qt+|
tj2r.tj34|
j1d tj34|
j5d qd S )'Nr   )epsT)inplace)r   
norm_layer	act_layernorm_kwargs
act_kwargs    r   r   rJ   r   r   r   r   P   rP   )r*   r+      i   )r+   rr   rq   )r^   r+      i   i   Conv2d_2b_3x3)num_chs	reductionmodule   Conv2d_4a_3x3   Mixed_5d   Mixed_6eMixed_7c)	pool_type	drop_raterv   g?)std)6r   r   r    rx   r|   r   r
   dictConv2d_1a_3x3Conv2d_2a_3x3r   nn	MaxPool2dPool1Conv2d_3b_1x1r   Pool2r   Mixed_5bMixed_5cr   rH   Mixed_6arO   Mixed_6bMixed_6cMixed_6dr   rp   	AuxLogitsrb   Mixed_7ark   Mixed_7br   feature_infonum_featureshead_hidden_sizer   global_pool	head_droprw   modules
isinstanceConv2dr	   hasattrrv   r   weightBatchNorm2dinit	constant_bias)r(   rx   in_chansr   r   r|   r   norm_epsr   r+   mrv   r,   r.   r/   r       sl   	zInceptionV3.__init__c                    s8   dd t t|  ddD   d  fdd}|S )Nc                 S   s   i | ]	\}\}}||qS r.   r.   ).0ik_r.   r.   r/   
<dictcomp>:  s    z-InceptionV3.group_matcher.<locals>.<dictcomp>r.   )prefixrw   c                    st   t  fdddD rdS t  fdddD rdS  D ]}|t dd t| kr5|   S qtd	S )
Nc                       g | ]}  |qS r.   
startswithr   nnamer.   r/   
<listcomp>>      z?InceptionV3.group_matcher.<locals>._matcher.<locals>.<listcomp>)Conv2d_1Conv2d_2r   c                    r   r.   r   r   r   r.   r/   r   @  r   )Conv2d_3Conv2d_4r   .inf)anykeystuplesplitlenfloat)r   r   
module_mapr   r/   _matcher=  s   z+InceptionV3.group_matcher.<locals>._matcher)	enumerater   named_childrenpop)r(   coarser   r.   r   r/   group_matcher8  s   

zInceptionV3.group_matcherTc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr.   )r(   enabler.   r.   r/   set_grad_checkpointingI  s   z"InceptionV3.set_grad_checkpointingreturnc                 C   s   | j S rB   r   )r(   r.   r.   r/   get_classifierM  s   zInceptionV3.get_classifierrx   r   c                 C   s$   || _ t| j| j |d\| _| _d S )N)r   )rx   r   r   r   rw   )r(   rx   r   r.   r.   r/   reset_classifierQ  s   zInceptionV3.reset_classifierc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}| |}| |}|S rB   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   r.   r.   r/   forward_preauxU  s    














zInceptionV3.forward_preauxc                 C   s"   |  |}| |}| |}|S rB   )r   r   r   r{   r.   r.   r/   forward_postauxg  s   


zInceptionV3.forward_postauxc                 C   s:   |  |}| jr| |}| |}||fS | |}|S rB   )r   r|   r   r   r(   r5   auxr.   r.   r/   forward_featuresm  s   



zInceptionV3.forward_features
pre_logitsc                 C   s*   |  |}| |}|r|S | |}|S rB   )r   r   rw   )r(   r5   r   r.   r.   r/   forward_headv  s   


zInceptionV3.forward_headc                 C   s>   | j r| |\}}| |}||fS | |}| |}|S rB   )r|   r   r   r   r.   r.   r/   r@   ~  s   


zInceptionV3.forward)r}   r   r~   r   Fr   rs   r   F)T)r   )rD   rE   rF   __doc__r=   jitFinalbool__annotations__r    ignorer   r   r   Moduler   intstrr   r   r   r   r   r@   rG   r.   r.   r,   r/   r      s0   
 E	Fc                 K   sl   t | |dd d}|dd}d}|r|jdk}|r&|ddr#J |}n| }tt| |f||d|S )Npretrained_cfg)r   r|   Ftv_in1kfeatures_only)r   pretrained_strict)r   r   gettagr   r   )variant
pretrainedkwargsr   r|   has_aux_logitsload_strictr.   r.   r/   _create_inception_v3  s&   
r   c                 K   s   | dddddt tddd
|S )	Nr}   )r   +  r  )r   r   g      ?bicubiczConv2d_1a_3x3.convrw   )
urlrx   
input_size	pool_sizecrop_pctinterpolationmeanr   
first_conv
classifier)r   r   )r  r   r.   r.   r/   _cfg  s   r  ztimm/zDhttps://download.pytorch.org/models/inception_v3_google-1a9a5a14.pth)	hf_hub_idr  )r  )r  r
  r   )zinception_v3.tv_in1kinception_v3.tf_in1kinception_v3.tf_adv_in1kinception_v3.gluon_in1kr   c                 K   s   t dd| i|}|S )Ninception_v3r   )r  )r  )r   r   modelr.   r.   r/   r    s   r  r  r  r  )tf_inception_v3adv_inception_v3gluon_inception_v3r   )r  )*r   	functoolsr   r=   torch.nnr   torch.nn.functional
functionalr3   	timm.datar   r   r   r   timm.layersr   r   r	   r
   _builderr   r   _manipulater   	_registryr   r   r   __all__r   r   rH   rO   rb   rk   rp   r   r  r  default_cfgsr  rD   r.   r.   r.   r/   <module>   sT    %,/ 

