U
    ¯Ê¹jü*  ã                   @   sž  U d Z ddlmZmZmZmZmZ ddlZddlm	Z	 ddl
m	  mZ ddlmZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZ d
gZdddddddddddddgdddddddddddddddgddddddddddddddddddgdddddddddddddddddddddgdœZeeeeeef  f ed< eG dd„ de	jƒƒZG dd
„ d
e	jƒZ dd„ Z!ee"ee dœdd„Z#d2dd„Z$ee$dd�e$dd�e$dd�e$dd�e$dd�e$dd�e$dd�e$dd�dœƒZ%ed3e"ee d!œd"d#„ƒZ&ed4e"ee d!œd$d%„ƒZ'ed5e"ee d!œd&d'„ƒZ(ed6e"ee d!œd(d)„ƒZ)ed7e"ee d!œd*d+„ƒZ*ed8e"ee d!œd,d-„ƒZ+ed9e"ee d!œd.d/„ƒZ,ed:e"ee d!œd0d1„ƒZ-dS );z•VGG

Adapted from https://github.com/pytorch/vision 'vgg.py' (BSD-3-Clause) with a few changes for
timm functionality.

Copyright 2021 Ross Wightman
é    )ÚUnionÚListÚDictÚAnyÚcastN©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚClassifierHeadé   )Úbuild_model_with_cfg)Úregister_notrace_module)Úregister_modelÚgenerate_default_cfgsÚVGGé@   ÚMé€   é   é   )Úvgg11Úvgg13Úvgg16Úvgg19Úcfgsc                       s4   e Zd Zdeejejdœ‡ fdd	„Zd
d„ Z‡  ZS )ÚConvMlpr   é   é   ç      ð?çš™™™™™É?N)Ú	drop_rateÚ	act_layerÚ
conv_layerc           	         sh   t t| ƒ ¡  || _t|| ƒ}||||dd�| _|dƒ| _t |¡| _	|||ddd�| _
|dƒ| _d S )NT)Úbiasr   )Úsuperr   Ú__init__Úinput_kernel_sizeÚintÚfc1Úact1ÚnnZDropoutÚdropÚfc2Úact2)	ÚselfZin_featuresZout_featuresÚkernel_sizeÚ	mlp_ratior    r!   r"   Zmid_features©Ú	__class__© úN/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/vgg.pyr%   "   s    

zConvMlp.__init__c                 C   s†   |j d | jk s |j d | jk rPt| j|j d ƒt| j|j d ƒf}t ||¡}|  |¡}|  |¡}|  |¡}|  |¡}|  	|¡}|S )Néþÿÿÿéÿÿÿÿ)
Úshaper&   ÚmaxÚFZadaptive_avg_pool2dr(   r)   r+   r,   r-   )r.   ÚxZoutput_sizer3   r3   r4   Úforward5   s     $




zConvMlp.forward)r   r   r   r   r   NN)	Ú__name__Ú
__module__Ú__qualname__Úfloatr*   ÚModuler%   r;   Ú__classcell__r3   r3   r1   r4   r      s          øør   c                       sà   e Zd Zddddejejdddf	ee eeee	ej
ej
ej
ee	d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ejejdœdd„Zd#ejedœdd„Zejejdœdd„Zddœdd„Z‡  ZS )$r   éè  é   é    r   NÚavgg        )ÚcfgÚnum_classesÚin_chansÚoutput_strider0   r!   r"   Ú
norm_layerÚglobal_poolr    Úreturnc              	      sf  t t| ƒ ¡  |dkst‚|| _d| _|
| _d| _|d k	| _g | _	|}d}t
j}g }|D ]¢}t|ƒd }|dkr¨| j	 t||d|› �d�¡ ||ddd	�g7 }|d9 }qXtt|ƒ}|||d
dd�}|d k	rä||||ƒ|dd�g7 }n|||dd�g7 }|}qXt
j|Ž | _| j	 t||dt|ƒd › �d�¡ t|| jd||
||d�| _t| j||	|
d�| _|  ¡  d S )NrD   r   Fr   r   z	features.)Znum_chsZ	reductionÚmoduleé   )r/   ZstriderC   )r/   ÚpaddingT)Zinplacer   )r0   r    r!   r"   ©Z	pool_typer    )r$   r   r%   ÚAssertionErrorrG   Únum_featuresr    Zgrad_checkpointingZuse_normZfeature_infor*   Z	MaxPool2dÚlenÚappendÚdictr   r'   Z
SequentialÚfeaturesr   Ú
pre_logitsr
   ÚheadÚ_initialize_weights)r.   rF   rG   rH   rI   r0   r!   r"   rJ   rK   r    Zprev_chsZ
net_strideZ
pool_layerZlayersÚvZlast_idxZconv2dr1   r3   r4   r%   D   sT    


$ù	üzVGG.__init__Fc                 C   s   t ddd�S )Nz^features\.0z^features\.(\d+))ÚstemÚblocks)rU   )r.   Zcoarser3   r3   r4   Úgroup_matcher€   s    zVGG.group_matcherTc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)rQ   )r.   Úenabler3   r3   r4   Úset_grad_checkpointing…   s    zVGG.set_grad_checkpointingc                 C   s   | j jS ©N)rX   Úfc)r.   r3   r3   r4   Úget_classifier‰   s    zVGG.get_classifierc                 C   s"   || _ t| j| j || jd�| _d S )NrP   )rG   r
   rR   r    rX   )r.   rG   rK   r3   r3   r4   Úreset_classifier�   s    üzVGG.reset_classifier)r:   rL   c                 C   s   |   |¡}|S r`   )rV   ©r.   r:   r3   r3   r4   Úforward_features–   s    
zVGG.forward_features)r:   rW   c                 C   s   |   |¡}|r|S |  |¡S r`   )rW   rX   )r.   r:   rW   r3   r3   r4   Úforward_headš   s    
zVGG.forward_headc                 C   s   |   |¡}|  |¡}|S r`   )re   rf   rd   r3   r3   r4   r;   ž   s    

zVGG.forward)rL   c                 C   sª   |   ¡ D ]œ}t|tjƒrHtjj|jddd� |jd k	r¤tj |jd¡ qt|tj	ƒrvtj |jd¡ tj |jd¡ qt|tj
ƒrtj |jdd¡ tj |jd¡ qd S )NZfan_outZrelu)ÚmodeZnonlinearityr   r   g{®Gáz„?)ÚmodulesÚ
isinstancer*   ÚConv2dÚinitZkaiming_normal_Úweightr#   Z	constant_ÚBatchNorm2dZLinearZnormal_)r.   Úmr3   r3   r4   rY   £   s    
zVGG._initialize_weights)F)T)rE   )F)r<   r=   r>   r*   ZReLUrj   r   r   r'   r?   r@   Ústrr%   ÚtorchZjitÚignorer]   r_   rb   rc   ZTensorre   Úboolrf   r;   rY   rA   r3   r3   r1   r4   r   B   sB   õô<

	c                 C   sz   i }|   ¡ D ]h\}}|}| dd¡}| dd¡}| dd¡}d|krT| dd	d
d
¡}d|krl| dddd¡}|||< q|S )zJ convert patch embedding weight from manual patchify + linear proj to convzclassifier.0zpre_logits.fc1zclassifier.3zpre_logits.fc2zclassifier.6úhead.fczclassifier.0.weightr6   r   r   zclassifier.3.weightr   r   )ÚitemsÚreplaceZreshape)Z
state_dictZout_dictÚkrZ   Zk_rr3   r3   r4   Ú
_filter_fn±   s    
rw   )ÚvariantÚ
pretrainedÚkwargsrL   c                 K   sF   |   d¡d }| dd¡}tt| |ft| td|d�tdœ|—Ž}|S )NÚ_r   Úout_indices)r   r   rN   rC   é   é   T)Zflatten_sequentialr|   )Z	model_cfgZfeature_cfgZpretrained_filter_fn)ÚsplitÚpopr   r   r   rU   rw   )rx   ry   rz   rF   r|   Úmodelr3   r3   r4   Ú_create_vggÁ   s    ý
úù	r‚   Ú c                 K   s   | dddddt tdddœ
|–S )	NrB   )rC   éà   r„   )r   r   g      ì?Zbilinearz
features.0rs   )
ÚurlrG   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifierr   )r…   rz   r3   r3   r4   Ú_cfgÑ   s         ûúrˆ   ztimm/)Z	hf_hub_id)zvgg11.tv_in1kzvgg13.tv_in1kzvgg16.tv_in1kzvgg19.tv_in1kzvgg11_bn.tv_in1kzvgg13_bn.tv_in1kzvgg16_bn.tv_in1kzvgg19_bn.tv_in1kF)ry   rz   rL   c                 K   s   t f |Ž}tdd| i|—ŽS )z£VGG 11-layer model (configuration "A") from
    `"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`._
    r   ry   )r   ©rU   r‚   ©ry   rz   Z
model_argsr3   r3   r4   r   è   s    
r   c                 K   s&   t f dtji|—Ž}tdd| i|—ŽS )z·VGG 11-layer model (configuration "A") with batch normalization
    `"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`._
    rJ   Úvgg11_bnry   )r‹   ©rU   r*   rm   r‚   rŠ   r3   r3   r4   r‹   ñ   s    r‹   c                 K   s   t f |Ž}tdd| i|—ŽS )zžVGG 13-layer model (configuration "B")
    `"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`._
    r   ry   )r   r‰   rŠ   r3   r3   r4   r   ú   s    
r   c                 K   s&   t f dtji|—Ž}tdd| i|—ŽS )z·VGG 13-layer model (configuration "B") with batch normalization
    `"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`._
    rJ   Úvgg13_bnry   )r�   rŒ   rŠ   r3   r3   r4   r�     s    r�   c                 K   s   t f |Ž}tdd| i|—ŽS )zžVGG 16-layer model (configuration "D")
    `"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`._
    r   ry   )r   r‰   rŠ   r3   r3   r4   r     s    
r   c                 K   s&   t f dtji|—Ž}tdd| i|—ŽS )z·VGG 16-layer model (configuration "D") with batch normalization
    `"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`._
    rJ   Úvgg16_bnry   )rŽ   rŒ   rŠ   r3   r3   r4   rŽ     s    rŽ   c                 K   s   t f |Ž}tdd| i|—ŽS )zžVGG 19-layer model (configuration "E")
    `"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`._
    r   ry   )r   r‰   rŠ   r3   r3   r4   r     s    
r   c                 K   s&   t f dtji|—Ž}tdd| i|—ŽS )z·VGG 19-layer model (configuration 'E') with batch normalization
    `"Very Deep Convolutional Networks For Large-Scale Image Recognition" <https://arxiv.org/pdf/1409.1556.pdf>`._
    rJ   Úvgg19_bnry   )r�   rŒ   rŠ   r3   r3   r4   r�   '  s    r�   )rƒ   )F)F)F)F)F)F)F)F).Ú__doc__Útypingr   r   r   r   r   rp   Ztorch.nnr*   Ztorch.nn.functionalZ
functionalr9   Z	timm.datar   r	   Ztimm.layersr
   Z_builderr   Z_features_fxr   Ú	_registryr   r   Ú__all__r   ro   r'   Ú__annotations__r@   r   r   rw   rr   r‚   rˆ   Zdefault_cfgsr   r‹   r   r�   r   rŽ   r   r�   r3   r3   r3   r4   Ú<module>   s^    &,ü""o
ø