a
    d<                     @   sL  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  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+ed'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                       s&   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__ \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/pnasnet.pyr      s    zSeparableConv2d.__init__c                 C   s   |  |}| |}|S N)r   r   r   xr   r   r   forward    s    

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   Zmiddle_channelsr   r   r   r   (   s    



zBranchSeparables.__init__c                 C   s@   |  |}| |}| |}| |}| |}| |}|S r    )r0   r1   r3   r4   r5   r6   r!   r   r   r   r#   4   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+   r,   )
r   r8   r   r.   r/   actr   convr2   bnr   r   r   r   r   @   s    

zActConvBn.__init__c                 C   s"   |  |}| |}| |}|S r    )r:   r;   r<   r!   r   r   r   r#   G   s    


zActConvBn.forward)r   r   r$   r   r   r   r   r8   >   s   r8   c                       s&   e Zd Zd fdd	Zdd Z  ZS )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 )NZavgpoolr      F)r   Zcount_include_padr;   r   pad)r   r@   r   r+   r,   )r   r=   r   r.   r/   r:   
Sequentialr   Z	AvgPool2dr   path_1Z	ZeroPad2dpath_2r2   final_path_bn)r   r   r   r   r   r   r   r   P   s    


zFactorizedReduction.__init__c                 C   s8   |  |}| |}| |}| t||gd}|S Nr   )r:   rB   rC   rD   torchcat)r   r"   Zx_path1Zx_path2outr   r   r   r#   ^   s
    


zFactorizedReduction.forward)r   r$   r   r   r   r   r=   N   s   r=   c                   @   s   e Zd Zdd ZdS )CellBasec                 C   s   |  |}| |}|| }| |}| |}|| }| |}	| |}
|	|
 }| |}| |}|| }| |}| j	d ur| 	|}n|}|| }t
|||||gd}|S rE   )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_rightrF   rG   )r   x_leftx_rightZx_comb_iter_0_leftZx_comb_iter_0_rightZx_comb_iter_0Zx_comb_iter_1_leftZx_comb_iter_1_rightZx_comb_iter_1Zx_comb_iter_2_leftZx_comb_iter_2_rightZx_comb_iter_2Zx_comb_iter_3_leftZx_comb_iter_3_rightZx_comb_iter_3Zx_comb_iter_4_leftZx_comb_iter_4_rightZx_comb_iter_4x_outr   r   r   cell_forwardh   s&    









zCellBase.cell_forwardN)r%   r&   r'   rW   r   r   r   r   rI   f   s   rI   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	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      r>   T)r   r   r7   r   Zmax_poolmax   r*   r;   r<   r+   r,      r9   )r   rX   r   r8   conv_1x1r)   rJ   r.   rA   r   r   r   r2   rK   rL   rM   rN   rO   rP   rQ   rR   rS   )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    )r]   rW   r   rT   rU   rV   r   r   r   r#      s    
zCellStem0.forward)r   r$   r   r   r   r   rX      s   rX   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}|| _|r6t|||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| _|r t||d||d| _nd | _d S )Nr>   r   )r   r   rY   r9   rZ   r[   r*   r\   )r   )r   rd   r   Zmatch_prev_layer_dimensionsr=   conv_prev_1x1r8   r]   r)   rJ   r   rK   rL   rM   rN   rO   rP   rQ   rR   rS   )	r   r^   r_   r`   ra   rb   is_reductionmatch_prev_layer_dimsr   r   r   r   r      s>    







zCell.__init__c                 C   s$   |  |}| |}| ||}|S r    )re   r]   rW   rc   r   r   r   r#      s    

zCell.forward)r   FFr$   r   r   r   r   rd      s
      3rd   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[               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  ri   `   r[   r>   r   r+   g?)r-   ZmomentumF)r   r   r   Z
norm_layerZ	apply_act6   )r^   r_   r`   ra   rb   l   i  T)r^   r_   r`   ra   rb   rg   rf      i  )r^   r_   r`   ra   rb   rg   i8  i  )r^   r_   r`   ra   rb   rf   ip  i`  conv_0)Znum_chsZ	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_featuresr   r   r.   r2   rp   rX   cell_stem_0rd   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_11r/   r:   dictZfeature_infor   global_pool	head_droplast_linear)r   rw   Zin_chansZoutput_striderv   r   rb   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   Z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_checkpointingc                 C   s   | j S r    )r   )r   r   r   r   get_classifier2  s    zPNASNet5Large.get_classifierc                 C   s$   || _ t| j| j |d\| _| _d S )N)ru   )rw   r   rx   r   r   )r   rw   r   r   r   r   reset_classifier6  s    
zPNASNet5Large.reset_classifierc                 C   s   |  |}| |}| ||}| ||}| ||}| ||}| ||}| ||}	| ||	}
| 	|	|
}| 
|
|}| ||}| ||}| ||}| ||}| |}|S r    )rp   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r:   )r   r"   Zx_conv_0Zx_stem_0Zx_stem_1Zx_cell_0Zx_cell_1Zx_cell_2Zx_cell_3Zx_cell_4Zx_cell_5Zx_cell_6Zx_cell_7Zx_cell_8Zx_cell_9Z	x_cell_10Z	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_headN  s    

zPNASNet5Large.forward_headc                 C   s   |  |}| |}|S r    )r   r   r!   r   r   r   r#   S  s    

zPNASNet5Large.forward)rh   r[   ri   rj   rk   r   )F)T)rk   )F)r%   r&   r'   r   rF   Zjitignorer   r   r   r   r   boolr   r#   r(   r   r   r   r   r      s"         C

Fc                 K   s    t t| |fdtdddi|S )NZfeature_cfghookT)Zfeature_clsZ
no_rewrite)r	   r   r   )variant
pretrainedkwargsr   r   r   _create_pnasnetY  s    
r   zpnasnet5large.tf_in1kztimm/)r[   K  r   )   r   gx&?Zbicubic)      ?r   r   rh   zconv_0.convr   )
Z	hf_hub_idZ
input_sizeZ	pool_sizeZcrop_pctinterpolationmeanZstdrw   Z
first_conv
classifier)returnc                 K   s$   t f 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.
    rb   Zsamepnasnet5large)r   r   )r   r   Zmodel_kwargsr   r   r   r   s  s    r   )F)F)"__doc__collectionsr   	functoolsr   rF   Ztorch.nnr.   Ztorch.nn.functionalZ
functionalFZtimm.layersr   r   r   r   Z_builderr	   	_registryr
   r   __all__Moduler   r)   r8   r=   rI   rX   rd   r   r   Zdefault_cfgsr   r   r   r   r   <module>   sD   &<s

