o  âg—5ã@sDdZ ddlZddlmZddlmZddlmmZddl m Z m Z ddl m Z ddlmZmZmZmZmZddlmZdd lmZddlZddlmZd#d d „Zed deddedddœZGdd„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZd$dd„Zed$dd„ƒZ ed$dd „ƒZ!ed$d!d"„ƒZ"dS)%a¼ ConViT Model @article{d2021convit, title={ConViT: Improving Vision Transformers with Soft Convolutional Inductive Biases}, author={d'Ascoli, St{'e}phane and Touvron, Hugo and Leavitt, Matthew and Morcos, Ari and Biroli, Giulio and Sagun, Levent}, journal={arXiv preprint arXiv:2103.10697}, year={2021} } Paper link: https://arxiv.org/abs/2103.10697 Original code: https://github.com/facebookresearch/convit, original copyright below éN)Úpartial©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STDé)Úbuild_model_with_cfg)ÚDropPathÚ to_2tupleÚ trunc_normal_Ú PatchEmbedÚMlp)Úregister_model)Ú HybridEmbedÚc Ks|dddttddddœ |¥S)Néè)ééàrTzpatch_embed.projÚhead) ÚurlÚ num_classesÚ input_sizeÚ pool_sizeÚmeanÚstdÚfixed_input_sizeÚ first_convÚ classifierr)rÚkwargs©rú+/home/terry/ogs_model/timm/models/convit.pyÚ_cfg&süûr z5https://dl.fbaipublicfiles.com/convit/convit_tiny.pth)rz6https://dl.fbaipublicfiles.com/convit/convit_small.pthz5https://dl.fbaipublicfiles.com/convit/convit_base.pth)Ú convit_tinyÚ convit_smallÚ convit_basecsXeZdZ  d‡fdd„ Zdd„Zd d „Zdd d „Zd d„Zdede j fdd„Z ‡Z S)ÚGPSAéFççð?cs´tƒ ¡||_||_||}|d|_||_tj||d|d|_tj|||d|_ t  |¡|_ t ||¡|_ t d|¡|_ t  |¡|_t t |j¡¡|_t dddd¡|_dS)Nçà¿é©Úbiasrr)ÚsuperÚ__init__Ú num_headsÚdimÚscaleÚlocality_strengthÚnnÚLinearÚqkÚvÚDropoutÚ attn_dropÚprojÚpos_projÚ proj_dropÚ ParameterÚtorchÚonesÚ gating_paramÚzerosÚ rel_indices)Úselfr/r.Úqkv_biasr7r:r1Úhead_dim©Ú __class__rrr-<s    z GPSA.__init__cCs˜|j\}}}|jdus|jjd|kr| |¡|_| |¡}| |¡ |||j||j¡ dddd¡}|| dd¡ |||¡}|  |¡}|  |¡}|S)Nrrr)r) Úshaper@Úget_rel_indicesÚ get_attentionr5Úreshaper.ÚpermuteÚ transposer8r:)rAÚxÚBÚNÚCÚattnr5rrrÚforwardOs   *  z GPSA.forwardc Csø|j\}}}| |¡ ||d|j||j¡ ddddd¡}|d|d}}|j |ddd¡}| |¡ dddd¡}|| dd¡|j } | j dd} |j dd}|j   dddd¡} d t  | ¡| t  | ¡|} | | jdd d¡} | | ¡} | S) Nr)rrrééÿÿÿÿéþÿÿÿ©r/r')rFr4rIr.rJr@Úexpandr9rKr0Úsoftmaxr>Úviewr<ÚsigmoidÚsumÚ unsqueezer7) rArLrMrNrOr4ÚqÚkÚ pos_scoreÚ patch_scoreÚgatingrPrrrrHZs .    zGPSA.get_attentioncCsZ| |¡ d¡}|j ¡dd…dd…dfd}t d||f¡| d¡}|r+||fS|S)NrrSçà?ú nm,hnm->h)rHrr@Úsqueezer<ÚeinsumÚsize)rArLÚ return_mapÚattn_mapÚ distancesÚdistrrrÚget_attention_mapjs  zGPSA.get_attention_mapcCsØ|jjj t |j¡¡d}t|jdƒ}|ddkr!|ddn|d}t |ƒD]6}t |ƒD]/}|||}d|j jj|df<d||||j jj|df<d||||j jj|df<q/q)|j jj|j 9_dS)Nrrar)rrS) r5ÚweightÚdataÚcopy_r<Úeyer/Úintr.Úranger9r1)rAÚlocality_distanceÚ kernel_sizeÚcenterÚh1Úh2ÚpositionrrrÚ local_initss     üzGPSA.local_initÚ num_patchesÚreturnc Csît|dƒ}t d||d¡}t |¡ dd¡t |¡ dd¡}| ||¡}|j|ddj|dd}|d|d}| d¡|dd…dd…dd…df<| d¡|dd…dd…dd…df<| d¡|dd…dd…dd…df<|jj j }|  |¡S)NrarrrSrrUr)) ror<r?ÚarangerXÚrepeatÚrepeat_interleaver[r4rkÚdeviceÚto) rArxÚimg_sizer@ÚindÚindxÚindyÚinddr}rrrrGs $ """  zGPSA.get_rel_indices)r%Fr&r&r'©F) Ú__name__Ú __module__Ú __qualname__r-rQrHrjrwror<ÚTensorrGÚ __classcell__rrrDrr$;sÿ  r$cs0eZdZd ‡fdd„ Zd dd„Zdd „Z‡ZS) ÚMHSAr%Fr&csbtƒ ¡||_||}|d|_tj||d|d|_t |¡|_t ||¡|_ t |¡|_ dS)Nr(rr*) r,r-r.r0r2r3Úqkvr6r7r8r:)rAr/r.rBr7r:rCrDrrr-s   z MHSA.__init__cCs|j\}}}| |¡ ||d|j||j¡ ddddd¡}|d|d|d}}} || dd¡|j} | jdd d¡} t |d ƒ} t   | ¡  dd¡t   | ¡  dd¡} |   | | ¡} | j| ddj| dd}| d|d}|d }| d ¡}t  d || f¡|}|rŠ|| fS|S) Nrr)rrrRrTrSrUraÚcudarb)rFr‹rIr.rJrKr0rWrror<rzrXr{r|r~rd)rArLrfrMrNrOr‹r\r]r5rgrr€rr‚rƒrhrirrrrj›s . $  zMHSA.get_attention_mapc Cs´|j\}}}| |¡ ||d|j||j¡ ddddd¡}|d|d|d}}}|| dd¡|j} | jdd} | | ¡} | | dd¡ |||¡}|  |¡}|  |¡}|S) Nrr)rrrRrTrSrU) rFr‹rIr.rJrKr0rWr7r8r:) rArLrMrNrOr‹r\r]r5rPrrrrQ°s .    z MHSA.forward)r%Fr&r&r„)r…r†r‡r-rjrQr‰rrrDrrŠs rŠcs:eZdZdddddejejdf‡fdd„ Zdd„Z‡ZS) ÚBlockç@Fr&Tc  s˜tƒ ¡| |ƒ|_| |_|jrt|f||||dœ| ¤Ž|_n t|||||d|_|dkr1t|ƒnt  ¡|_ | |ƒ|_ t ||ƒ} t || ||d|_dS)N)r.rBr7r:r&)Ú in_featuresÚhidden_featuresÚ act_layerÚdrop)r,r-Únorm1Úuse_gpsar$rPrŠrr2ÚIdentityÚ drop_pathÚnorm2ror Úmlp) rAr/r.Ú mlp_ratiorBr’r7r–r‘Ú norm_layerr”rÚmlp_hidden_dimrDrrr-Ás  ÿÿ ÿ  zBlock.__init__cCs8|| | | |¡¡¡}|| | | |¡¡¡}|S©N)r–rPr“r˜r—©rArLrrrrQÐsz Block.forward) r…r†r‡r2ÚGELUÚ LayerNormr-rQr‰rrrDrr¿s  ÿrcs‚eZdZdZddddddddd d d d d ejd dd d f‡fdd„ Zdd„Zej j dd„ƒZ dd„Z ddd„Z dd„Zdd„Z‡ZS)ÚConViTzI Vision Transformer with support for patch or hybrid CNN input stage rérrié rŽFr&Nr'Tc s„tƒ ¡ˆˆ9‰||_ˆ|_ˆ|_|_ˆ|_||_| dur)t| ||ˆd|_ n t |||ˆd|_ |j j }||_ t   t ddˆ¡¡|_t jˆd|_|jr`t   t d|ˆ¡¡|_t|jdddd„t d | |¡Dƒ‰t  ‡‡‡‡‡‡‡‡‡‡ f d d„t|ƒDƒ¡|_ˆˆƒ|_tˆd d d g|_|d krœt  ˆ|¡nt  ¡|_t|jdd| |j ¡| !¡D] \}}t"|d ƒr¿| #¡q²dS)N)rÚin_chansÚ embed_dim)rÚ patch_sizer£r¤r)Úpç{®Gáz”?©rcSsg|]}| ¡‘qSr)Úitem)Ú.0rLrrrÚ ösz#ConViT.__init__..rcsRg|]%}|ˆkrtˆˆˆˆ ˆˆˆ|ˆdˆd ntˆˆˆˆ ˆˆˆ|ˆdd ‘qS)T) r/r.r™rBr’r7r–ršr”r1F) r/r.r™rBr’r7r–ršr”)r)rªÚi© Úattn_drop_rateÚdprÚ drop_rater¤Úlocal_up_to_layerr1r™ršr.rBrrr«÷s ûû ü ýùr)Únum_chsÚ reductionÚmodulerw)$r,r-rr±Ú num_featuresr¤r1Ú use_pos_embedrÚ patch_embedr rxr2r;r<r?Ú cls_tokenr6Úpos_dropÚ pos_embedr ÚlinspaceÚ ModuleListrpÚblocksÚnormÚdictÚ feature_infor3r•rÚapplyÚ _init_weightsÚ named_modulesÚhasattrrw)rArr¥r£rr¤Údepthr.r™rBr°r®Údrop_path_rateÚhybrid_backboneršÚ global_poolr±r1r¶rxÚnÚmrDr­rr-ÚsF   ÿÿ  õ   €þzConViT.__init__cCs€t|tjƒr&t|jddt|tjƒr"|jdur$tj |jd¡dSdSdSt|tjƒr>tj |jd¡tj |jd¡dSdS)Nr§r¨rr') Ú isinstancer2r3r rkr+ÚinitÚ constant_rŸ)rArÊrrrrÂs ÿ þzConViT._init_weightscCsddhS)Nrºr¸r©rArrrÚno_weight_decayszConViT.no_weight_decaycCs|jSrœ)rrÎrrrÚget_classifierszConViT.get_classifierrcCs0||_|dkrt |j|¡|_dSt ¡|_dS)Nr)rr2r3r¤r•r)rArrÈrrrÚreset_classifiers*zConViT.reset_classifiercCs|jd}| |¡}|j |dd¡}|jr||j}| |¡}t|jƒD]\}}||j kr6t j ||fdd}||ƒ}q$|  |¡}|dd…dfS)NrrSrrU) rFr·r¸rVr¶rºr¹Ú enumerater½r±r<Úcatr¾)rArLrMÚ cls_tokensÚuÚblkrrrÚforward_features#s       zConViT.forward_featurescCs| |¡}| |¡}|Srœ)r×rrrrrrQ5s  zConViT.forward©r)r…r†r‡Ú__doc__r2rŸr-rÂr<ÚjitÚignorerÏrÐrÑr×rQr‰rrrDrr Ös   ý5  r FcKs0| dd¡r tdƒ‚tt||fdt|i|¤ŽS)NÚ features_onlyz©Úeps©r±r1r¤r.ršr!©rárâr©r¿rr2rŸrã©rârÚ model_argsÚmodelrrrr!Eóþþr!c Krä) Nrår'ræé rçrèrêr"rërrìrírrrr"Nrðr"c Krä) Nrår'rær¡rçrèrêr#rërrìrírrrr#Wrðr#rØr„)#rÙr<Útorch.nnr2Ú functoolsrÚtorch.nn.functionalÚ functionalÚFÚ timm.datarrÚhelpersrÚlayersrr r r r Úregistryr Úvision_transformer_hybridrr ràÚModuler$rŠrr rãr!r"r#rrrrÚsF        ÿÿÿú T0 e