U
    ¯Ê¹jh  ã                   @   sj  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 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/ed+œd,d-„ƒZ!dS )0zŒ 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                       s&   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Úpaddingçü©ñÒMbP?çš™™™™™¹?©ÚepsZmomentum)
Úsuperr   Ú__init__ÚnnÚReLUÚactr   ÚconvÚBatchNorm2dÚbn©ÚselfÚin_channelsÚout_channelsr   r   r   ©Ú	__class__© úQ/var/www/html/bwave/python/venv/lib/python3.8/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                       s&   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   r.   r   r   Údepthwise_conv2dÚpointwise_conv2dr   r!   r#   r$   r   %   s        þ   ÿzSeparableConv2d.__init__c                 C   s   |   |¡}|  |¡}|S r%   )r0   r1   r&   r#   r#   r$   r(   -   s    

zSeparableConv2d.forward)r   r)   r#   r#   r!   r$   r.   #   s   r.   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©Zinplacer   )r   r2   r   r   r   Úact_1r.   Úseparable_1r   Úbn_sep_1Úact_2Úseparable_2Úbn_sep_2)r   r   r    r   r   Úpad_typeÚ	stem_cellZmiddle_channelsr!   r#   r$   r   5   s(    
    ÿ    ÿzBranchSeparables.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r%   )r5   r6   r7   r8   r9   r:   r&   r#   r#   r$   r(   A   s    





zBranchSeparables.forward)r   r   Fr)   r#   r#   r!   r$   r2   3   s   r2   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	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)r<   Úmaxé   ©r   ÚavgF©Úcount_include_padr   )r   r=   r   Únum_channelsÚ	stem_sizer   Úconv_1x1r2   Ú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   rJ   rI   r;   r!   r#   r$   r   L   s    zCellStem0.__init__c                 C   s¤   |   |¡}|  |¡}|  |¡}|| }|  |¡}|  |¡}|| }|  |¡}	|  |¡}
|	|
 }|  |¡}|| }|  |¡}|  	|¡}|| }t
 ||||gd¡}|S ©Nr   )rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   Ú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)r>   r   r)   r#   r#   r!   r$   r=   K   s   r=   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	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 )NrA   r   r?   ÚavgpoolF©r   rH   r   ©r   ZbiasÚpad©éÿÿÿÿr   ro   r   r   r   r   r@   rB   rC   rD   rE   rF   rG   )r   ri   r   rI   rJ   r   rK   r   r   r   Ú
SequentialÚpath_1Ú
add_moduleÚ	AvgPool2dÚConv2dÚpath_2Ú	ZeroPad2dr   Úfinal_path_bnr2   rL   rM   r   rN   rO   rP   rQ   rR   rS   rT   rU   r!   r#   r$   r   |   s,    

&
&zCellStem1.__init__c                 C   sØ   |   |¡}|  |¡}|  |¡}|  |¡}|  t ||gd¡¡}|  |¡}|  |¡}	||	 }
|  	|¡}|  
|¡}|| }|  |¡}|  |¡}|| }|  |
¡}|| }|  |
¡}|  |¡}|| }t ||||gd¡}|S rV   )rK   r   rq   ru   rw   rW   rX   rL   rM   rN   rO   rP   rQ   rR   rS   rT   )r   Úx_conv0Úx_stem_0Úx_leftÚx_reluÚx_path1Úx_path2Úx_rightrZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   r#   r#   r$   r(   œ   s*    












zCellStem1.forward)r   r)   r#   r#   r!   r$   ri   z   s    ri   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	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   r?   rj   rA   Frk   r   rl   rm   rn   r   r   r   r@   rD   rF   rG   )r   r   r   r   rK   r   r   r   rp   rq   rr   rs   rt   ru   rv   r   rw   r2   rL   rM   rN   rO   r   rP   Úcomb_iter_3_leftrR   rS   ©r   Úin_chs_leftÚout_chs_leftÚin_chs_rightÚout_chs_rightr;   r!   r#   r$   r   À   s&    


zFirstCell.__init__c                 C   sÒ   |   |¡}|  |¡}|  |¡}|  t ||gd¡¡}|  |¡}|  |¡}|  |¡}	||	 }
|  	|¡}|  
|¡}|| }|  |¡}|| }|  |¡}|  |¡}|| }|  |¡}|| }t ||
||||gd¡}|S rV   )r   rq   ru   rw   rW   rX   rK   rL   rM   rN   rO   rP   r€   rR   rS   )r   r'   Úx_prevr{   r|   r}   rz   r~   rZ   r[   r\   r]   r^   r_   r`   rb   Úx_comb_iter_3_leftrc   rd   re   rg   rh   r#   r#   r$   r(   Ý   s(    











zFirstCell.forward)r   r)   r#   r#   r!   r$   r   ¾   s   r   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú
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   r3   r@   rD   rF   FrG   )r   rˆ   r   r   Úconv_prev_1x1rK   r2   rL   rM   rN   rO   r   rP   r€   rR   rS   r�   r!   r#   r$   r   ü   s    zNormalCell.__init__c                 C   s¨   |   |¡}|  |¡}|  |¡}|  |¡}|| }|  |¡}|  |¡}	||	 }
|  |¡}|| }|  |¡}|  |¡}|| }|  	|¡}|| }t
 |||
|||gd¡}|S rV   )r‰   rK   rL   rM   rN   rO   rP   r€   rR   rS   rW   rX   )r   r'   r†   rz   r~   rZ   r[   r\   r]   r^   r_   r`   rb   r‡   rc   rd   re   rg   rh   r#   r#   r$   r(     s"    









zNormalCell.forward)r   r)   r#   r#   r!   r$   rˆ   ú   s   rˆ   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚReductionCell0r   c                    sà   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   r3   r@   rA   rB   rC   rD   rE   rF   FrG   )r   rŠ   r   r   r‰   rK   r2   rL   rM   r   rN   rO   rP   rQ   rR   rS   rT   r�   r!   r#   r$   r   *  s    zReductionCell0.__init__c                 C   s®   |   |¡}|  |¡}|  |¡}|  |¡}|| }|  |¡}|  |¡}	||	 }
|  |¡}|  |¡}|| }|  |¡}||
 }|  	|¡}|  
|¡}|| }t |
|||gd¡}|S rV   ©r‰   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rW   rX   ©r   r'   r†   rz   r~   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   r#   r#   r$   r(   =  s$    










zReductionCell0.forward)r   r)   r#   r#   r!   r$   rŠ   (  s   rŠ   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚReductionCell1r   c                    sà   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 r‹   )r   rŽ   r   r   r‰   rK   r2   rL   rM   r   rN   rO   rP   rQ   rR   rS   rT   r�   r!   r#   r$   r   Z  s    zReductionCell1.__init__c                 C   s®   |   |¡}|  |¡}|  |¡}|  |¡}|| }|  |¡}|  |¡}	||	 }
|  |¡}|  |¡}|| }|  |¡}||
 }|  	|¡}|  
|¡}|| }t |
|||gd¡}|S rV   rŒ   r�   r#   r#   r$   r(   m  s$    










zReductionCell1.forward)r   r)   r#   r#   r!   r$   rŽ   X  s   rŽ   c                	       sx   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d„ ƒZ
d dd„Zdd„ Zdd„ Zdd„ Z‡  ZS )!r   zNASNetALarge (6 @ 4032) éè  rD   é`   rA   éÀ  é    ç        rF   Úsamec
                    s¢  t t| ƒ ¡  || _|| _|| _|| _|dks2t‚| 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’   é   rD   r   rA   r   r   r   F)r   r    r   r   r   Z
norm_layerZ	apply_act)rI   r;   )r‚   rƒ   r„   r…   r;   é   é   é   é   é   Tr4   r�   Úconv0)Znum_chsZ	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_classesrJ   Únum_featuresÚchannel_multiplierÚAssertionErrorr   r   r   r   r›   r=   Úcell_stem_0ri   Ú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   ÚdictZfeature_infor   Úglobal_poolÚ	head_dropÚlast_linear)r   r    Zin_chansrJ   r¢   r¡   Zoutput_striderŸ   r»   r;   Zchannelsr!   r#   r$   r   ‹  sf   
     þ 
 ÿ  ÿ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þ   þû   ÿzNASNetALarge.__init__Fc                 C   s   t ddddg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   ZcoarseZmatcherr#   r#   r$   Úgroup_matcherô  s    ýþzNASNetALarge.group_matcherTc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)r£   )r   Úenabler#   r#   r$   Úset_grad_checkpointing   s    z#NASNetALarge.set_grad_checkpointingc                 C   s   | j S r%   )r½   )r   r#   r#   r$   Úget_classifier  s    zNASNetALarge.get_classifierc                 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'   rx   ry   Zx_stem_1Zx_cell_0Zx_cell_1Zx_cell_2Zx_cell_3Zx_cell_4Zx_cell_5Zx_reduction_cell_0Zx_cell_6Zx_cell_7Zx_cell_8Zx_cell_9Z	x_cell_10Z	x_cell_11Zx_reduction_cell_1Z	x_cell_12Z	x_cell_13Z	x_cell_14Z	x_cell_15Z	x_cell_16Z	x_cell_17r#   r#   r$   Úforward_features  s2    


zNASNetALarge.forward_featuresc                 C   s"   |   |¡}|  |¡}|  |¡}|S r%   )r»   r¼   r½   r&   r#   r#   r$   Úforward_head,  s    


zNASNetALarge.forward_headc                 C   s   |   |¡}|  |¡}|S r%   )rÅ   rÆ   r&   r#   r#   r$   r(   2  s    

zNASNetALarge.forward)	r�   rD   r�   rA   r‘   r’   r“   rF   r”   )F)T)rF   )r*   r+   r,   Ú__doc__r   rW   ZjitÚignorerÀ   rÂ   rÃ   rÄ   rÅ   rÆ   r(   r-   r#   r#   r!   r$   r   ˆ  s*            öi

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_nasnet8  s    ý
üûrÍ   znasnetalarge.tf_in1kztimm/zjhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/nasnetalarge-dc4a7b8b.pth)rD   éK  rÎ   )é   rÏ   gôýÔxé&í?Zbicubic)ç      à?rÐ   rÐ   r�   z
conv0.convr½   )Z	hf_hub_idÚurlZ
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdr    Z
first_convÚ
classifier)Úreturnc                 K   s    t f ddi|—Ž}td| f|ŽS )z'NASNet-A large model architecture.
    r;   r”   Únasnetalarge)rº   rÍ   )rË   rÌ   Zmodel_kwargsr#   r#   r$   rÕ   S  s    rÕ   )F)F)"rÇ   Ú	functoolsr   rW   Ztorch.nnr   Ztorch.nn.functionalZ
functionalÚFZtimm.layersr   r   r   r   Z_builderr   Ú	_registryr	   r
   Ú__all__ÚModuler   r.   r2   r=   ri   r   rˆ   rŠ   rŽ   r   rÍ   Zdefault_cfgsrÕ   r#   r#   r#   r$   Ú<module>   sJ   /D<.00 1

õÿ