U
    ¯Ê¹jF>  ã                
   @   sè  d Z ddl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  mZ ddlmZ ddlmZmZ ddlmZmZmZmZ ddlmZ dd	lmZ dd
lmZ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'dd„ Z(dd„ Z)d0dd„Z*ee*dddd�e*dddd�e*ƒ e*dd�e*dd�e*dd�e*dd�dœƒZ+ed1e'd!œd"d#„ƒZ,ed2e'd!œd$d%„ƒZ-ed3e'd!œd&d'„ƒZ.ed4e'd!œd(d)„ƒZ/ed5e'd!œd*d+„ƒZ0ed6e'd!œd,d-„ƒZ1ee2d.d/iƒ dS )7zËPytorch Densenet implementation w/ tweaks
This file is a copy of https://github.com/pytorch/vision 'densenet.py' (BSD-3-Clause) with
fixed kwargs passthrough and addition of dynamic global avg/max pool.
é    N)ÚOrderedDict)ÚList©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚBatchNormAct2dÚget_norm_act_layerÚ
BlurPool2dÚcreate_classifieré   )Úbuild_model_with_cfg)ÚMATCH_PREV_GROUP)Úregister_modelÚgenerate_default_cfgsÚregister_model_deprecationsÚDenseNetc                       sl   e Zd Zeddf‡ fdd„	Zdd„ Zdd„ Zejj	d	d
„ ƒZ
ejjdd„ ƒZejjdd„ ƒZdd„ Z‡  ZS )Ú
DenseLayerç        Fc                    s�   t t| ƒ ¡  |  d||ƒ¡f |  dtj||| dddd�¡f |  d||| ƒ¡f |  dtj|| |ddddd	�¡f t|ƒ| _|| _d S )
NÚnorm1Úconv1r   F©Úkernel_sizeÚstrideÚbiasÚnorm2Úconv2é   ©r   r   Úpaddingr   )	Úsuperr   Ú__init__Ú
add_moduleÚnnÚConv2dÚfloatÚ	drop_rateÚgrad_checkpointing)ÚselfÚnum_input_featuresÚgrowth_rateÚbn_sizeÚ
norm_layerr%   r&   ©Ú	__class__© úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/densenet.pyr       s(    	
    ÿ

     ÿ

zDenseLayer.__init__c                 C   s    t  |d¡}|  |  |¡¡}|S ©Nr   )ÚtorchÚcatr   r   )r'   ÚxsZconcated_featuresÚbottleneck_outputr.   r.   r/   Úbottleneck_fn+   s    zDenseLayer.bottleneck_fnc                 C   s   |D ]}|j r dS qdS )NTF)Zrequires_grad)r'   ÚxZtensorr.   r.   r/   Úany_requires_grad2   s    zDenseLayer.any_requires_gradc                    s   ‡ fdd„}t j|f|žŽ S )Nc                     s
   ˆ   | ¡S ©N)r5   )r3   ©r'   r.   r/   Úclosure<   s    z6DenseLayer.call_checkpoint_bottleneck.<locals>.closure)ÚcpÚ
checkpoint)r'   r6   r:   r.   r9   r/   Úcall_checkpoint_bottleneck9   s    z%DenseLayer.call_checkpoint_bottleneckc                 C   s   d S r8   r.   ©r'   r6   r.   r.   r/   ÚforwardA   s    zDenseLayer.forwardc                 C   s   d S r8   r.   r>   r.   r.   r/   r?   F   s    c                 C   s‚   t |tjƒr|g}n|}| jrF|  |¡rFtj ¡ r:tdƒ‚|  |¡}n
|  	|¡}|  
|  |¡¡}| jdkr~tj|| j| jd�}|S )Nz%Memory Efficient not supported in JITr   )ÚpÚtraining)Ú
isinstancer1   ZTensorr&   r7   ÚjitZis_scriptingÚ	Exceptionr=   r5   r   r   r%   ÚFZdropoutrA   )r'   r6   Zprev_featuresr4   Únew_featuresr.   r.   r/   r?   M   s    


)Ú__name__Ú
__module__Ú__qualname__r   r    r5   r7   r1   rC   Zunusedr=   Z_overload_methodr?   Ú__classcell__r.   r.   r,   r/   r      s   ù


r   c                       s0   e Zd ZdZeddf‡ fdd„	Zdd„ Z‡  ZS )Ú
DenseBlocké   r   Fc           
   	      sP   t t| ƒ ¡  t|ƒD ]4}t|||  |||||d�}	|  d|d  |	¡ qd S )N)r)   r*   r+   r%   r&   zdenselayer%dr   )r   rK   r    Úranger   r!   )
r'   Ú
num_layersr(   r*   r)   r+   r%   r&   ÚiÚlayerr,   r.   r/   r    c   s    

úzDenseBlock.__init__c                 C   s6   |g}|   ¡ D ]\}}||ƒ}| |¡ qt |d¡S r0   )ÚitemsÚappendr1   r2   )r'   Zinit_featuresÚfeaturesÚnamerP   rF   r.   r.   r/   r?   y   s
    zDenseBlock.forward)rG   rH   rI   Ú_versionr   r    r?   rJ   r.   r.   r,   r/   rK   `   s   ørK   c                       s"   e Zd Zedf‡ fdd„	Z‡  ZS )ÚDenseTransitionNc              
      sr   t t| ƒ ¡  |  d||ƒ¡ |  dtj||dddd�¡ |d k	rX|  d||dd�¡ n|  dtjddd	�¡ d S )
NZnormÚconvr   Fr   ÚpoolrL   )r   )r   r   )r   rV   r    r!   r"   r#   Z	AvgPool2d)r'   r(   Únum_output_featuresr+   Úaa_layerr,   r.   r/   r    ‚   s    
    ÿzDenseTransition.__init__)rG   rH   rI   r   r    rJ   r.   r.   r,   r/   rV   �   s   ûrV   c                       sp   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‡  ZS )!r   a/  Densenet-BC model class, based on
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`_

    Args:
        growth_rate (int) - how many filters to add each layer (`k` in paper)
        block_config (list of 4 ints) - how many layers in each pooling block
        bn_size (int) - multiplicative factor for number of bottle neck layers
          (i.e. bn_size * k features in the bottleneck layer)
        drop_rate (float) - dropout rate before classifier layer
        proj_drop_rate (float) - dropout rate after each dense layer
        num_classes (int) - number of classification classes
        memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient,
          but slower. Default: *False*. See `"paper" <https://arxiv.org/pdf/1707.06990.pdf>`_
    é    ©é   é   é   é   éè  r   Úavgé   Ú ÚreluÚbatchnorm2dNr   FTc                    s2  || _ tt| ƒ ¡  t|	|d�}	d|k}|d }|
d krJtjdddd�}n"tjtjdddd�|
|dd�gŽ }|�r$| }}d|kr¦d|d	  }d
|krš|n
d|d	  }t tdtj	||ddddd�fd|	|ƒfdtj	||ddddd�fd|	|ƒfdtj	||ddddd�fd|	|ƒfd|fgƒ¡| _
n8t tdtj	||ddddd�fd|	|ƒfd|fgƒ¡| _
t|dd|�rndnd› �d�g| _d	}|}t|ƒD ]Â\}}t|||||	||d�}d|d › �}| j
 ||¡ |||  }|�rÞd n|
}|t|ƒd k�rŽ|  jt||d| d�g7  _|d9 }t||d |	|d�}| j
 d|d › �|¡ |d }�qŽ| j
 d|	|ƒ¡ |  jt||d d�g7  _|| _t| j| j |d!�\}}|| _t |¡| _|| _|  ¡ D ]r}t|tj	ƒ�rÜtj |j¡ nNt|tjƒ�rtj |jd¡ tj |jd¡ nt|tj ƒ�rºtj |jd¡ �qºd S )"N)Ú	act_layerÚdeeprL   r   r   )r   r   r   )Zchannelsr   Ztieredrc   Znarrowr]   Zconv0F)r   r   r   Znorm0r   r   r   r   Zpool0é   r   zfeatures.normr   )Znum_chsZ	reductionÚmodule)rN   r(   r*   r)   r+   r%   r&   Z
denseblockz	features.)r(   rY   r+   rZ   Z
transitionZnorm5zfeatures.norm5©Z	pool_type)!Únum_classesr   r   r    r   r"   Z	MaxPool2dÚ
Sequentialr   r#   rS   ÚdictZfeature_infoÚ	enumeraterK   r!   ÚlenrV   Únum_featuresr
   Úglobal_poolZDropoutÚ	head_dropÚ
classifierÚmodulesrB   ÚinitZkaiming_normal_ÚweightZBatchNorm2dZ	constant_r   ZLinear)r'   r)   Úblock_configrl   Zin_chansrr   r*   Ú	stem_typerg   r+   rZ   r%   Zproj_drop_rateZmemory_efficientZaa_stem_onlyZ	deep_stemZnum_init_featuresZ	stem_poolZ
stem_chs_1Z
stem_chs_2Zcurrent_striderq   rO   rN   ÚblockÚmodule_nameZtransition_aa_layerZtransrt   Úmr,   r.   r/   r    £   s     
þ


ù

ý
ÿù	ÿüý
zDenseNet.__init__c                 C   s    t d|rdn
ddtfgd�}|S )Nz<^features\.conv[012]|features\.norm[012]|features\.pool[012]z)^features\.(?:denseblock|transition)(\d+))z+^features\.denseblock(\d+)\.denselayer(\d+)Nz^features\.transition(\d+))ÚstemÚblocks)rn   r   )r'   ZcoarseZmatcherr.   r.   r/   Úgroup_matcher  s    þþzDenseNet.group_matcherc                 C   s$   | j  ¡ D ]}t|tƒr
||_q
d S r8   )rS   ru   rB   r   r&   )r'   ÚenableÚbr.   r.   r/   Úset_grad_checkpointing  s    
zDenseNet.set_grad_checkpointingc                 C   s   | j S r8   )rt   r9   r.   r.   r/   Úget_classifier!  s    zDenseNet.get_classifierc                 C   s$   || _ t| j| j |d�\| _| _d S )Nrk   )rl   r
   rq   rr   rt   )r'   rl   rr   r.   r.   r/   Úreset_classifier%  s      ÿzDenseNet.reset_classifierc                 C   s
   |   |¡S r8   )rS   r>   r.   r.   r/   Úforward_features*  s    zDenseNet.forward_featuresc                 C   s,   |   |¡}|  |¡}|  |¡}|  |¡}|S r8   )r…   rr   rs   rt   r>   r.   r.   r/   r?   -  s
    



zDenseNet.forward)r[   r\   ra   r   rb   rc   rd   re   rf   Nr   r   FT)F)T)rb   )rG   rH   rI   Ú__doc__r    r1   rC   Úignorer   r‚   rƒ   r„   r…   r?   rJ   r.   r.   r,   r/   r   “   s2                 ñm


c                 C   sT   t  d¡}t|  ¡ ƒD ]8}| |¡}|r| d¡| d¡ }| | | |< | |= q| S )Nz]^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$r   rL   )ÚreÚcompileÚlistÚkeysÚmatchÚgroup)Z
state_dictÚpatternÚkeyÚresZnew_keyr.   r.   r/   Ú_filter_torchvision_pretrained5  s    ÿ
r‘   c                 K   s0   ||d< ||d< t t| |ftdd�tdœ|—ŽS )Nr)   rx   T)Zflatten_sequential)Zfeature_cfgZpretrained_filter_fn)r   r   rn   r‘   )Úvariantr)   rx   Ú
pretrainedÚkwargsr.   r.   r/   Ú_create_densenetB  s    ýûúr•   rd   c                 K   s   | dddddt tdddœ
|–S )	Nra   )r   éà   r–   )ri   ri   g      ì?Zbicubiczfeatures.conv0rt   )
Úurlrl   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdZ
first_convrt   r   )r—   r”   r.   r.   r/   Ú_cfgO  s          üür™   ztimm/)r   é   rš   gffffffî?)Ú	hf_hub_idZtest_input_sizeZtest_crop_pct)r›   )zdensenet121.ra_in1kzdensenetblur121d.ra_in1kzdensenet264d.untrainedúdensenet121.tv_in1kzdensenet169.tv_in1kzdensenet201.tv_in1kzdensenet161.tv_in1kF)Úreturnc                 K   s*   t ddd�}tdd| it |f|Ž—Ž}|S )ztDensenet-121 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r[   r\   ©r)   rx   Údensenet121r“   )rŸ   ©rn   r•   ©r“   r”   Z
model_argsÚmodelr.   r.   r/   rŸ   g  s    rŸ   c                 K   s.   t dddtd�}tdd| it |f|Ž—Ž}|S )zŒDensenet-121 w/ blur-pooling & 3-layer 3x3 stem
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r[   r\   rh   )r)   rx   ry   rZ   Údensenetblur121dr“   )r£   )rn   r	   r•   r¡   r.   r.   r/   r£   q  s    r£   c                 K   s*   t ddd�}tdd| it |f|Ž—Ž}|S )ztDensenet-169 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r[   )r]   r^   r[   r[   rž   Údensenet169r“   )r¤   r    r¡   r.   r.   r/   r¤   {  s    r¤   c                 K   s*   t ddd�}tdd| it |f|Ž—Ž}|S )ztDensenet-201 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r[   )r]   r^   é0   r[   rž   Údensenet201r“   )r¦   r    r¡   r.   r.   r/   r¦   …  s    r¦   c                 K   s*   t ddd�}tdd| it |f|Ž—Ž}|S )ztDensenet-161 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r¥   )r]   r^   é$   r_   rž   Údensenet161r“   )r¨   r    r¡   r.   r.   r/   r¨   �  s    r¨   c                 K   s,   t dddd�}tdd| it |f|Ž—Ž}|S )ztDensenet-264 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r¥   )r]   r^   é@   r¥   rh   )r)   rx   ry   Údensenet264dr“   )rª   r    r¡   r.   r.   r/   rª   ™  s    rª   Ztv_densenet121rœ   )rd   )F)F)F)F)F)F)3r†   rˆ   Úcollectionsr   r1   Ztorch.nnr"   Ztorch.nn.functionalZ
functionalrE   Ztorch.utils.checkpointÚutilsr<   r;   Ztorch.jit.annotationsr   Z	timm.datar   r   Ztimm.layersr   r   r	   r
   Z_builderr   Z_manipulater   Ú	_registryr   r   r   Ú__all__ÚModuler   Z
ModuleDictrK   rm   rV   r   r‘   r•   r™   Zdefault_cfgsrŸ   r£   r¤   r¦   r¨   rª   rG   r.   r.   r.   r/   Ú<module>   sl   I! #
	 þ þõ						 ÿ