o
    پi.<                     @   s:  d Z ddlm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ZG dd de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&
iZed*d'efd(d)ZdS )+z
 pnasnet5large implementation grabbed from Cadene's pretrained models
 Additional credit to https://github.com/creafz

 https://github.com/Cadene/pretrained-models.pytorch/blob/master/pretrainedmodels/models/pnasnet.py

    )OrderedDict)partialN)ConvNormActcreate_conv2dcreate_pool2dcreate_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsPNASNet5Largec                       &   e Zd Zd fdd	Zdd Z  ZS )SeparableConv2d c                    s:   t t|   t||||||d| _t||d|d| _d S )N)kernel_sizestridepaddinggroupsr   r   r   )superr   __init__r   depthwise_conv2dpointwise_conv2dselfin_channelsout_channelsr   r   r   	__class__ G/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/pnasnet.pyr      s   zSeparableConv2d.__init__c                 C      |  |}| |}|S N)r   r   r   xr   r   r    forward      

zSeparableConv2d.forwardr   __name__
__module____qualname__r   r%   __classcell__r   r   r   r    r      s    r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	BranchSeparablesr   Fr   c                    sz   t t|   |r|n|}t | _t|||||d| _tj|dd| _	t | _
t|||d|d| _tj|dd| _d S )Nr   r   MbP?epsr   )r   r-   r   nnReLUact_1r   separable_1BatchNorm2dbn_sep_1act_2separable_2bn_sep_2)r   r   r   r   r   	stem_cellr   middle_channelsr   r   r    r   '   s   



zBranchSeparables.__init__c                 C   s@   |  |}| |}| |}| |}| |}| |}|S r"   )r4   r5   r7   r8   r9   r:   r#   r   r   r    r%   3   s   





zBranchSeparables.forward)r   Fr   r(   r   r   r   r    r-   %   s    r-   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	ActConvBnr   r   c                    s@   t t|   t | _t|||||d| _tj|dd| _	d S )Nr   r   r   r/   r0   )
r   r=   r   r2   r3   actr   convr6   bnr   r   r   r    r   ?   s   

zActConvBn.__init__c                 C   s"   |  |}| |}| |}|S r"   )r?   r@   rA   r#   r   r   r    r%   F   s   


zActConvBn.forward)r   r   r(   r   r   r   r    r=   =   s    r=   c                       r   )FactorizedReductionr   c                    s   t t|   t | _ttdtjddddfdt	||d d|dfg| _
ttdtd	fdtjddddfdt	||d d|dfg| _tj|d
d| _d S )Navgpoolr      F)r   count_include_padr@   r   pad)r   rG   r   r/   r0   )r   rB   r   r2   r3   r?   
Sequentialr   	AvgPool2dr   path_1	ZeroPad2dpath_2r6   final_path_bn)r   r   r   r   r   r   r    r   O   s   


zFactorizedReduction.__init__c                 C   s8   |  |}| |}| |}| t||gd}|S Nr   )r?   rJ   rL   rM   torchcat)r   r$   x_path1x_path2outr   r   r    r%   ]   s
   


zFactorizedReduction.forwardr'   r(   r   r   r   r    rB   M   s    rB   c                   @   s   e Zd Zdd ZdS )CellBasec                 C   s   |  |}| |}|| }| |}| |}|| }| |}	| |}
|	|
 }| |}| |}|| }| |}| j	d urH| 	|}n|}|| }t
|||||gd}|S rN   )comb_iter_0_leftcomb_iter_0_rightcomb_iter_1_leftcomb_iter_1_rightcomb_iter_2_leftcomb_iter_2_rightcomb_iter_3_leftcomb_iter_3_rightcomb_iter_4_leftcomb_iter_4_rightrO   rP   )r   x_leftx_right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_left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    cell_forwardg   s&   









zCellBase.cell_forwardN)r)   r*   r+   rq   r   r   r   r    rT   e   s    rT   c                       r   )	CellStem0r   c                    s  t t|   t||d|d| _t||ddd|d| _tt	dt
dd	d|d
fdt||d|dfdtj|ddfg| _t||dd|d| _t
dd	d|d
| _t||dd|d| _t||d	d|d| _t||d	|d| _t
dd	d|d
| _t||d	dd|d| _t||dd|d| _d S )Nr   r      rD   T)r   r   r;   r   max_poolmax   r.   r@   rA   r/   r0      r>   )r   rr   r   r=   conv_1x1r-   rU   r2   rH   r   r   r   r6   rV   rW   rX   rY   rZ   r[   r\   r]   r^   )r   in_chs_leftout_chs_leftin_chs_rightout_chs_rightpad_typer   r   r    r      s<   




zCellStem0.__init__c                 C   s   |  |}| ||}|S r"   )rx   rq   r   r_   r`   rp   r   r   r    r%      s   
zCellStem0.forwardr'   r(   r   r   r   r    rr      s    rr   c                       s,   e Zd Z			d fdd	Zdd Z  ZS )Cellr   Fc           	         s*  t t|   |rdnd}|| _|rt|||d| _n	t||d|d| _t||d|d| _t||d||d| _	t
dd||d	| _t||d
||d| _t
dd||d	| _t||d||d| _t||d||d| _t||dd| _t
dd||d	| _t||d||d| _|rt||d||d| _d S d | _d S )NrD   r   )r   r   rs   r>   ru   rv   r.   rw   )r   )r   r   r   match_prev_layer_dimensionsrB   conv_prev_1x1r=   rx   r-   rU   r   rV   rW   rX   rY   rZ   r[   r\   r]   r^   )	r   ry   rz   r{   r|   r}   is_reductionmatch_prev_layer_dimsr   r   r   r    r      s>   







zCell.__init__c                 C   s$   |  |}| |}| ||}|S r"   )r   rx   rq   r~   r   r   r    r%      s   

zCell.forward)r   FFr(   r   r   r   r    r      s    3r   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     rv               avgr   c                    s  t t|   || _d | _| _|dksJ t|ddddttj	ddd	d
d| _
tdddd|d| _tdddd|ddd| _td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d| _tdddd|dd| _tdddd|d| _tdddd|d| _tdddd|dd| _tdddd|dd| _tdddd|d| _tdddd|d| _t | _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#\| _ | _!| _"d S )$Ni  r   `   rv   rD   r   r/   g?)r1   momentumF)r   r   r   
norm_layer	apply_act6   )ry   rz   r{   r|   r}   l   i  T)ry   rz   r{   r|   r}   r   r      i  )ry   rz   r{   r|   r}   r   i8  i  )ry   rz   r{   r|   r}   r   ip  i`  conv_0)num_chs	reductionmodule   zcell_stem_1.conv_1x1.act   zcell_4.conv_1x1.act   zcell_8.conv_1x1.actr?   )	pool_type	drop_rate)#r   r   r   num_classesnum_featureshead_hidden_sizer   r   r2   r6   r   rr   cell_stem_0r   cell_stem_1cell_0cell_1cell_2cell_3cell_4cell_5cell_6cell_7cell_8cell_9cell_10cell_11r3   r?   dictfeature_infor   global_pool	head_droplast_linear)r   r   in_chansoutput_strider   r   r}   r   r   r    r      s   	















zPNASNet5Large.__init__Fc                 C   s   t dddS )Nz^conv_0|cell_stem_[01]z^cell_(\d+))stemblocks)r   )r   coarser   r   r    group_matcher)  s   zPNASNet5Large.group_matcherTc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr   )r   enabler   r   r    set_grad_checkpointing-  s   z$PNASNet5Large.set_grad_checkpointingreturnc                 C   s   | j S r"   )r   )r   r   r   r    get_classifier1  s   zPNASNet5Large.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_classifier5  s   
zPNASNet5Large.reset_classifierc                 C   s   |  |}| |}| ||}| ||}| ||}| ||}| ||}| ||}	| ||	}
| 	|	|
}| 
|
|}| ||}| ||}| ||}| ||}| |}|S r"   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r?   )r   r$   x_conv_0x_stem_0x_stem_1x_cell_0x_cell_1x_cell_2x_cell_3x_cell_4x_cell_5x_cell_6x_cell_7x_cell_8x_cell_9	x_cell_10	x_cell_11r   r   r    forward_features:  s"   


zPNASNet5Large.forward_features
pre_logitsc                 C   s&   |  |}| |}|r|S | |S r"   )r   r   r   )r   r$   r   r   r   r    forward_headM  s   

zPNASNet5Large.forward_headc                 C   r!   r"   )r   r   r#   r   r   r    r%   R  r&   zPNASNet5Large.forward)r   rv   r   r   r   r   F)T)r   )r)   r*   r+   r   rO   jitignorer   r   r2   Moduler   intstrr   r   boolr   r%   r,   r   r   r   r    r      s$    C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_pnasnetX  s   
r   zpnasnet5large.tf_in1kztimm/)rv   K  r   )   r   gx&?bicubic)      ?r   r   r   zconv_0.convr   )
	hf_hub_id
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 )zPNASNet-5 model architecture from the
    `"Progressive Neural Architecture Search"
    <https://arxiv.org/abs/1712.00559>`_ paper.
    r}   samepnasnet5largeNr   )r   r   )r   r   model_kwargsr   r   r    r   r  s   r   r   )__doc__collectionsr   	functoolsr   rO   torch.nnr2   timm.layersr   r   r   r   _builderr	   	_registryr
   r   __all__r   r   r-   r=   rB   rT   rr   r   r   r   default_cfgsr   r   r   r   r    <module>   sD    &<
s
