o
    پi.h                     @   sX  d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddl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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$d%d&d&d'd(d)d*iZed.d+efd,d-ZdS )/z NasNet-A (Large)
 nasnetalarge implementation grabbed from Cadene's pretrained models
 https://github.com/Cadene/pretrained-models.pytorch
    )partialN)ConvNormActcreate_conv2dcreate_pool2dcreate_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsNASNetALargec                       &   e Zd Zd fdd	Zdd Z  ZS )	ActConvBnr    c                    sB   t t|   t | _t|||||d| _tj|ddd| _	d S )N)kernel_sizestridepaddingMbP?皙?epsmomentum)
superr   __init__nnReLUactr   convBatchNorm2dbnselfin_channelsout_channelsr   r   r   	__class__ F/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/nasnet.pyr      s   

zActConvBn.__init__c                 C   s"   |  |}| |}| |}|S N)r   r   r   r    xr%   r%   r&   forward   s   


zActConvBn.forward)r   r   __name__
__module____qualname__r   r*   __classcell__r%   r%   r#   r&   r      s    r   c                       &   e Zd Zd fdd	Zdd Z  ZS )SeparableConv2dr   c                    s:   t t|   t||||||d| _t||ddd| _d S )N)r   r   r   groupsr   r   )r   r   )r   r1   r   r   depthwise_conv2dpointwise_conv2dr   r#   r%   r&   r   $   s   zSeparableConv2d.__init__c                 C      |  |}| |}|S r'   )r3   r4   r(   r%   r%   r&   r*   ,      

zSeparableConv2d.forwardr   r+   r%   r%   r#   r&   r1   "   s    r1   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	BranchSeparablesr   r   Fc                    s   t t|   |r|n|}t | _t|||||d| _tj|ddd| _	tjdd| _
t|||d|d| _tj|ddd| _d S )Nr   r   r   r   r   Tinplacer   )r   r8   r   r   r   act_1r1   separable_1r   bn_sep_1act_2separable_2bn_sep_2)r    r!   r"   r   r   pad_type	stem_cellmiddle_channelsr#   r%   r&   r   4   s   


zBranchSeparables.__init__c                 C   s@   |  |}| |}| |}| |}| |}| |}|S r'   )r<   r=   r>   r?   r@   rA   r(   r%   r%   r&   r*   @   s   





zBranchSeparables.forward)r   r   Fr+   r%   r%   r#   r&   r8   2   s    r8   c                       r   )	CellStem0*   r   c                    s   t t|   || _|| _t| j| jddd| _t| j| jdd|| _t| j| jdd|dd| _	t
dd	d|d
| _t| j| jdd|dd| _t
dd	dd|d| _t| j| jdd|dd| _t
dd	dd|d| _t| j| jd	d|| _t
dd	d|d
| _d S )Nr   r            T)rC   max   r   avgFcount_include_padr   )r   rE   r   num_channels	stem_sizer   conv_1x1r8   comb_iter_0_leftcomb_iter_0_rightr   comb_iter_1_leftcomb_iter_1_rightcomb_iter_2_leftcomb_iter_2_rightcomb_iter_3_rightcomb_iter_4_leftcomb_iter_4_rightr    rR   rQ   rB   r#   r%   r&   r   K   s   zCellStem0.__init__c                 C   s   |  |}| |}| |}|| }| |}| |}|| }| |}	| |}
|	|
 }| |}|| }| |}| 	|}|| }t
||||gd}|S Nr   )rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   torchcat)r    r)   x1x_comb_iter_0_leftx_comb_iter_0_rightx_comb_iter_0x_comb_iter_1_leftx_comb_iter_1_rightx_comb_iter_1x_comb_iter_2_leftx_comb_iter_2_rightx_comb_iter_2x_comb_iter_3_rightx_comb_iter_3x_comb_iter_4_leftx_comb_iter_4_rightx_comb_iter_4x_outr%   r%   r&   r*   _   s"   









zCellStem0.forward)rF   r   r+   r%   r%   r#   r&   rE   J   s    rE   c                       r0   )	CellStem1r   c              
      s  t t|   || _|| _td| j | jddd| _t | _	t
 | _| jdtjdddd | jdtj| j| jd dddd t
 | _| jd	td
 | jdtjdddd | jdtj| j| jd dddd tj| jddd| _t| j| jdd|| _t| j| jdd|| _tddd|d| _t| j| jdd|| _tdddd|d| _t| j| jdd|| _tdddd|d| _t| j| jdd|| _tddd|d| _d S )NrI   r   rG   avgpoolFr   rP   r   r   biaspadr   rx   r   r   r   r   rH   rJ   rK   rL   rM   rN   rO   )r   rq   r   rQ   rR   r   rS   r   r   r   
Sequentialpath_1
add_module	AvgPool2dConv2dpath_2	ZeroPad2dr   final_path_bnr8   rT   rU   r   rV   rW   rX   rY   rZ   r[   r\   r]   r#   r%   r&   r   {   s,   

&
&zCellStem1.__init__c                 C   s   |  |}| |}| |}| |}| t||gd}| |}| |}	||	 }
| 	|}| 
|}|| }| |}| |}|| }| |
}|| }| |
}| |}|| }t||||gd}|S r^   )rS   r   rz   r~   r   r_   r`   rT   rU   rV   rW   rX   rY   rZ   r[   r\   )r    x_conv0x_stem_0x_leftx_relux_path1x_path2x_rightrb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   r%   r%   r&   r*      s*   












zCellStem1.forwardr7   r+   r%   r%   r#   r&   rq   y   s     rq   c                       r0   )	FirstCellr   c              
      sr  t t|   t||ddd| _t | _t | _	| j	
dtjdddd | j	
dtj||dddd t | _| j
d	td
 | j
dtjdddd | j
dtj||dddd tj|d ddd| _t||dd|| _t||dd|| _t||dd|| _t||dd|| _tdddd|d| _tdddd|d| _tdddd|d| _t||dd|| _d S )Nr   rG   rr   rI   Frs   r   rt   rv   rw   r   r   r   rH   rL   rN   rO   )r   r   r   r   rS   r   r   r   ry   rz   r{   r|   r}   r~   r   r   r   r8   rT   rU   rV   rW   r   rX   comb_iter_3_leftrZ   r[   r    in_chs_leftout_chs_leftin_chs_rightout_chs_rightrB   r#   r%   r&   r      s&   


zFirstCell.__init__c                 C   s   |  |}| |}| |}| t||gd}| |}| |}| |}	||	 }
| 	|}| 
|}|| }| |}|| }| |}| |}|| }| |}|| }t||
||||gd}|S r^   )r   rz   r~   r   r_   r`   rS   rT   rU   rV   rW   rX   r   rZ   r[   )r    r)   x_prevr   r   r   r   r   rb   rc   rd   re   rf   rg   rh   rj   x_comb_iter_3_leftrk   rl   rm   ro   rp   r%   r%   r&   r*      s(   











zFirstCell.forwardr7   r+   r%   r%   r#   r&   r      s    r   c                       r0   )
NormalCellr   c                    s   t t|   t||dd|d| _t||dd|d| _t||dd|| _t||dd|| _t||dd|| _	t||dd|| _
tdddd|d| _tdddd|d| _tdddd|d| _t||dd|| _d S )Nr   r9   rH   rL   rN   FrO   )r   r   r   r   conv_prev_1x1rS   r8   rT   rU   rV   rW   r   rX   r   rZ   r[   r   r#   r%   r&   r      s   zNormalCell.__init__c                 C   s   |  |}| |}| |}| |}|| }| |}| |}	||	 }
| |}|| }| |}| |}|| }| 	|}|| }t
|||
|||gd}|S r^   )r   rS   rT   rU   rV   rW   rX   r   rZ   r[   r_   r`   )r    r)   r   r   r   rb   rc   rd   re   rf   rg   rh   rj   r   rk   rl   rm   ro   rp   r%   r%   r&   r*     s"   









zNormalCell.forwardr7   r+   r%   r%   r#   r&   r      s    r   c                       r0   )ReductionCell0r   c                       t t|   t||dd|d| _t||dd|d| _t||dd|| _t||dd|| _t	ddd|d| _
t||dd|| _t	d	ddd
|d| _t||dd|| _t	d	ddd
|d| _t||dd|| _t	ddd|d| _d S Nr   r9   rH   rI   rJ   rK   rL   rM   rN   FrO   )r   r   r   r   r   rS   r8   rT   rU   r   rV   rW   rX   rY   rZ   r[   r\   r   r#   r%   r&   r   )     zReductionCell0.__init__c                 C      |  |}| |}| |}| |}|| }| |}| |}	||	 }
| |}| |}|| }| |}||
 }| 	|}| 
|}|| }t|
|||gd}|S r^   r   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r_   r`   r    r)   r   r   r   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   r%   r%   r&   r*   <  $   










zReductionCell0.forwardr7   r+   r%   r%   r#   r&   r   '      r   c                       r0   )ReductionCell1r   c                    r   r   )r   r   r   r   r   rS   r8   rT   rU   r   rV   rW   rX   rY   rZ   r[   r\   r   r#   r%   r&   r   Y  r   zReductionCell1.__init__c                 C   r   r^   r   r   r%   r%   r&   r*   l  r   zReductionCell1.forwardr7   r+   r%   r%   r#   r&   r   W  r   r   c                       s   e Zd 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   zNASNetALarge (6 @ 4032)   rL   `   rI                 rN   samec
                    s  t t|   || _|| _| | _| _|| _|dksJ | jd }
t|| jdddt	t
jdddd	d
| _t| j|
|d  |	d| _t| j|
| |	d| _t|
|
d d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 |
d|
 |
|	d| _td|
 d|
 d|
 d|
 |	d| _td|
 |
d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _td|
 d|
 d|
 d|
 |	d| _ t!d|
 d|
 d|
 d|
 |	d| _"td|
 d|
 d|
 d|
 |	d| _#td|
 d|
 d|
 d|
 |	d| _$td|
 d|
 d|
 d|
 |	d| _%td|
 d|
 d|
 d|
 |	d| _&td|
 d|
 d|
 d|
 |	d| _'td|
 d|
 d|
 d|
 |	d| _(t
j)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| _,t-| j| j||d\| _.| _/| _0d S ) Nr      rL   r   rI   r   r   r   F)r!   r"   r   r   r   
norm_layer	apply_act)rQ   rB   )r   r   r   r   rB                  Tr:   r   conv0)num_chs	reductionmodule   zcell_stem_1.conv_1x1.acti  zreduction_cell_0.conv_1x1.acti  zreduction_cell_1.conv_1x1.actr   r   )	pool_type	drop_rate)1r   r   r   num_classesrR   num_featureshead_hidden_sizechannel_multiplierr   r   r   r   r   rE   cell_stem_0rq   cell_stem_1r   cell_0r   cell_1cell_2cell_3cell_4cell_5r   reduction_cell_0cell_6cell_7cell_8cell_9cell_10cell_11r   reduction_cell_1cell_12cell_13cell_14cell_15cell_16cell_17r   r   dictfeature_infor   global_pool	head_droplast_linear)r    r   in_chansrR   r   r   output_strider   r   rB   channelsr#   r%   r&   r     s   






zNASNetALarge.__init__Fc                 C   s   t dg dd}|S )Nz^conv0|cell_stem_[01]))z^cell_(\d+)N)z^reduction_cell_0)r   )z^reduction_cell_1)r   )stemblocks)r   )r    coarsematcherr%   r%   r&   group_matcher  s
   zNASNetALarge.group_matcherTc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr%   )r    enabler%   r%   r&   set_grad_checkpointing  s   z#NASNetALarge.set_grad_checkpointingreturnc                 C   s   | j S r'   )r   )r    r%   r%   r&   get_classifier  s   zNASNetALarge.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NASNetALarge.reset_classifierc                 C   s  |  |}| |}| ||}| ||}| ||}| ||}| ||}| ||}	| |	|}
| 	|
|	}| 
||	}| ||}| ||}| ||}| ||}| ||}| ||}| ||}| ||}| ||}| ||}| ||}| ||}| |}|S r'   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r    r)   r   r   x_stem_1x_cell_0x_cell_1x_cell_2x_cell_3x_cell_4x_cell_5x_reduction_cell_0x_cell_6x_cell_7x_cell_8x_cell_9	x_cell_10	x_cell_11x_reduction_cell_1	x_cell_12	x_cell_13	x_cell_14	x_cell_15	x_cell_16	x_cell_17r%   r%   r&   forward_features  s2   


zNASNetALarge.forward_features
pre_logitsc                 C   s&   |  |}| |}|r|S | |S r'   )r   r   r   )r    r)   r   r%   r%   r&   forward_head+  s   

zNASNetALarge.forward_headc                 C   r5   r'   )r   r   r(   r%   r%   r&   r*   0  r6   zNASNetALarge.forward)	r   rL   r   rI   r   r   r   rN   r   F)T)rN   )r,   r-   r.   __doc__r   r_   jitignorer   r   r   Moduler   intstrr   r   boolr   r*   r/   r%   r%   r#   r&   r     s,    iFc                 K   s    t t| |fdtdddi|S )Nfeature_cfghookT)feature_cls
no_rewrite)r   r   r   )variant
pretrainedkwargsr%   r%   r&   _create_nasnet6  s   
r  znasnetalarge.tf_in1kztimm/zjhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/nasnetalarge-dc4a7b8b.pth)rL   K  r  )   r  gx&?bicubic)      ?r	  r	  r   z
conv0.convr   )	hf_hub_idurl
input_size	pool_sizecrop_pctinterpolationmeanstdr   
first_conv
classifierr   c                 K   s$   t dddi|}td| fi |S )z'NASNet-A large model architecture.
    rB   r   nasnetalargeNr%   )r   r  )r  r  model_kwargsr%   r%   r&   r  Q  s   r  r   )r   	functoolsr   r_   torch.nnr   timm.layersr   r   r   r   _builderr   	_registryr	   r
   __all__r   r   r1   r8   rE   rq   r   r   r   r   r   r  default_cfgsr  r%   r%   r%   r&   <module>   sJ    /D<.00 
0
