U
    ¯Ê¹j<  ã                   @   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__© úR/var/www/html/bwave/python/venv/lib/python3.8/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 k	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   †   sv         ÿý
    ÿ    ÿ    ÿ   ÿ     ÿ    ÿ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   ¬   sn    
    ÿ    ÿ    ÿ    ÿ    ÿ    ÿ
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&t‚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_acté6   )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_featuresÚAssertionErrorr   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t dƒ‚d S )Nz$gradient checkpointing not supported)ry   )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   rz   r{   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ž   gôýÔxé&í?Zbicubic)ç      à?rŸ   rŸ   rh   zconv_0.convr‹   )
Z	hf_hub_idZ
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdrw   Z
first_convÚ
classifier)Úreturnc                 K   s    t f ddi|—Ž}td| f|ŽS )zˆPNASNet-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

öÿ