Ë
    ÛÓ^jÈ–  ã                   ó  — d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
mZ ddlmZ dd	lmZmZmZ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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)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/  ed¬«      e G d„ de«      «       «       Z0 G d„ de,«      Z1 G d„ de)«      Z2 G d„ dejf                  «      Z4 G d „ d!e(«      Z5 G d"„ d#e+«      Z6 G d$„ d%e&«      Z7 G d&„ d'e*«      Z8e G d(„ d)e-«      «       Z9e G d*„ d+e9«      «       Z: G d,„ d-ejf                  «      Z; ed.¬«       G d/„ d0e9«      «       Z< ed1¬«       G d2„ d3e9«      «       Z= G d4„ d5e$«      Z> G d6„ d7ejf                  «      Z? G d8„ d9ejf                  «      Z@ G d:„ d;ejf                  «      ZA G d<„ d=ejf                  «      ZB G d>„ d?ejf                  «      ZC G d@„ dAejf                  «      ZDe G dB„ dCe9«      «       ZE edD¬«       G dE„ dFe
e9«      «       ZFg dG¢ZGy)HzPyTorch BEiT model.é    )Ú	dataclassN)ÚTensorÚnné   )Úinitialization)ÚBackboneMixinÚfilter_output_hidden_states)Úcreate_bidirectional_mask)ÚBackboneOutputÚBaseModelOutputWithPoolingÚImageClassifierOutputÚMaskedLMOutputÚSemanticSegmenterOutput)ÚPreTrainedModel)ÚUnpack)Ú#compile_compatible_method_lru_cache)ÚTransformersKwargsÚauto_docstringÚ	torch_int)Úcan_return_tupleÚmerge_with_config_defaults)Úcapture_outputsé   )ÚResNetConvLayer)ÚSwinDropPath)ÚViTAttentionÚViTEmbeddingsÚViTLayerÚViTMLPÚViTPatchEmbeddingsÚViTPreTrainedModelé   )Ú
BeitConfigz-
    Class for outputs of [`BeitModel`].
    )Úcustom_introc                   ó   — e Zd ZdZy)ÚBeitModelOutputWithPoolingaF  
    pooler_output (`torch.FloatTensor` of shape `(batch_size, hidden_size)`):
        Average of the last layer hidden states of the patch tokens (excluding the *[CLS]* token) if
        *config.use_mean_pooling* is set to True. If set to False, then the final hidden state of the *[CLS]* token
        will be returned.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úp/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/beit/modular_beit.pyr&   r&   +   s   „ òr,   r&   c                   ó   — e Zd Zy)ÚBeitPatchEmbeddingsN©r'   r(   r)   r+   r,   r-   r/   r/   :   ó   „ Ør,   r/   c                   óv   — e Zd Zdeddfd„Z	 ddej                  dej                  dz  dej                  fd„Zy)	ÚBeitEmbeddingsÚconfigÚreturnNc                 óŒ  — t         j                  j                  | «       t        j                  t	        j
                  dd|j                  «      «      | _        |j                  r4t        j                  t	        j
                  dd|j                  «      «      nd | _	        t        |«      | _        |j                  | _        | j                  j                  }|j                  r7t        j                  t	        j
                  d|dz   |j                  «      «      nd | _        t        j                   |j"                  «      | _        y )Nr"   )r   ÚModuleÚ__init__Ú	ParameterÚtorchÚzerosÚhidden_sizeÚ	cls_tokenÚuse_mask_tokenÚ
mask_tokenr/   Úpatch_embeddingsÚ
patch_sizeÚnum_patchesÚ use_absolute_position_embeddingsÚposition_embeddingsÚDropoutÚhidden_dropout_probÚdropout)Úselfr4   rB   s      r-   r8   zBeitEmbeddings.__init__?   sã   € Ü
�	‰	×Ñ˜4Ô äŸ™¤e§k¡k°!°Q¸×8JÑ8JÓ&KÓLˆŒØQW×QfÒQfœ"Ÿ,™,¤u§{¡{°1°a¸×9KÑ9KÓ'LÔMÐlpˆŒÜ 3°FÓ ;ˆÔØ ×+Ñ+ˆŒØ×+Ñ+×7Ñ7ˆð ×6Ò6ô �L‰LœŸ™ Q¨°a©¸×9KÑ9KÓLÔMàð 	Ô ô
 —z‘z &×"<Ñ"<Ó=ˆ�r,   Úpixel_valuesÚbool_masked_posc                 óÞ  — |j                   \  }}}}| j                  |«      }|j                  «       \  }}}|�K| j                  j	                  ||d«      }	|j                  d«      j                  |	«      }
|d|
z
  z  |	|
z  z   }| j                  j	                  |dd«      }t        j                  ||fd¬«      }| j                  �|| j                  |||«      z   }| j                  |«      }|S ©Néÿÿÿÿr"   ©Údim)Úshaper@   Úsizer?   ÚexpandÚ	unsqueezeÚtype_asr=   r:   ÚcatrD   Úinterpolate_pos_encodingrG   )rH   rI   rJ   Ú_ÚheightÚwidthÚ
embeddingsÚ
batch_sizeÚseq_lenÚmask_tokensÚmaskÚ
cls_tokenss               r-   ÚforwardzBeitEmbeddings.forwardN   sô   € ð
 +×0Ñ0Ñˆˆ1ˆf�eØ×*Ñ*¨<Ó8ˆ
Ø!+§¡Ó!2Ñˆ
�G˜QàÐ&ØŸ/™/×0Ñ0°¸WÀbÓIˆKà"×,Ñ,¨RÓ0×8Ñ8¸ÓEˆDØ# q¨4¡xÑ0°;ÀÑ3EÑEˆJà—^‘^×*Ñ*¨:°r¸2Ó>ˆ
Ü—Y‘Y 
¨JÐ7¸QÔ?ˆ
à×#Ñ#Ð/Ø# d×&CÑ&CÀJÐPVÐX]Ó&^Ñ^ˆJà—\‘\ *Ó-ˆ
àÐr,   ©N)	r'   r(   r)   r#   r8   r:   r   Ú
BoolTensorr`   r+   r,   r-   r3   r3   >   sN   „ ð>˜zð >¨dó >ð$ 48ñà—l‘lðð ×)Ñ)¨DÑ0ðð 
�‰ô	r,   r3   c                   óž   ‡ — e Zd Zdeddfˆ fd„Ze ed¬«      deeef   de	j                  fd„«       «       Zdd	ede	j                  fd
„Zˆ xZS )ÚBeitRelativePositionBiasr4   r5   Nc                 óª  •— t         ‰| �  «        |j                  }t        |t        t
        f«      s||f}|d   |j                  z  |d   |j                  z  f| _        d| j                  d   z  dz
  d| j                  d   z  dz
  z  dz   | _        t        j                  t        j                  | j                  |j                  «      «      | _        y ©Nr   r"   r   r   )Úsuperr8   Ú
image_sizeÚ
isinstanceÚtupleÚlistrA   Úwindow_sizeÚnum_relative_distancer   r9   r:   r;   Únum_attention_headsÚrelative_position_bias_table)rH   r4   rh   Ú	__class__s      €r-   r8   z!BeitRelativePositionBias.__init__i   sÇ   ø€ Ü‰ÑÔØ×&Ñ&ˆ
Ü˜*¤u¬d mÔ4Ø$ jÐ1ˆJØ& q™M¨V×->Ñ->Ñ>À
È1ÁÐQW×QbÑQbÑ@bÐcˆÔØ&'¨$×*:Ñ*:¸1Ñ*=Ñ&=ÀÑ&AÀaÈ$×JZÑJZÐ[\ÑJ]ÑF]Ð`aÑFaÑ%bÐefÑ%fˆÔ"Ü,.¯L©LÜ�K‰K˜×2Ñ2°F×4NÑ4NÓOó-
ˆÕ)r,   é
   )Úmaxsizerl   c                 óþ  — d| d   z  dz
  d| d   z  dz
  z  dz   }| d   | d   z  }t        j                  t        j                  t        j                  t        j                  | d   «      t        j                  | d   «      d¬«      «      d¬«      }|dd…dd…df   |dd…ddd…f   z
  j                  ddd«      j                  «       }|dd…dd…dfxx   | d   dz
  z  cc<   |dd…dd…dfxx   | d   dz
  z  cc<   |dd…dd…dfxx   d| d   z  dz
  z  cc<   t        j                  |dz   fdz  |j                  ¬	«      }|j                  d
«      |dd…dd…f<   |dz
  |ddd…f<   |dz
  |dd…df<   |dz
  |d<   |S )z¿
        This method creates the relative position index, modified to support arbitrary window sizes,
        as introduced in [MiDaS v3.1](https://huggingface.co/papers/2307.14460).
        r   r   r"   r   Úij)Úindexing)Ú	start_dimN)rQ   ÚdtyperM   )r   r   )
r:   ÚflattenÚstackÚmeshgridÚarangeÚpermuteÚ
contiguousr;   rw   Úsum)rl   rm   Úwindow_areaÚcoords_flattenÚrelative_coordsÚrelative_position_indexs         r-   Ú generate_relative_position_indexz9BeitRelativePositionBias.generate_relative_position_indexu   s²  € ð "# [°¡^Ñ!3°aÑ!7¸AÀÈAÁÑ<NÐQRÑ<RÑ SÐVWÑ WÐØ! !‘n {°1¡~Ñ5ˆô Ÿ™Ü�K‰KœŸ™¤u§|¡|°KÀ±NÓ'CÄUÇ\Á\ÐR]Ð^_ÑR`ÓEaÐlpÔqÓrØô
ˆð *ª!ªQ°¨*Ñ5¸ÂqÈ$ÒPQÀzÑ8RÑR×[Ñ[Ð\]Ð_`ÐbcÓd×oÑoÓqˆàšš1˜a˜Ó  K°¡N°QÑ$6Ñ6Ó Øšš1˜a˜Ó  K°¡N°QÑ$6Ñ6Ó Øšš1˜a˜Ó  A¨°A©Ñ$6¸Ñ$:Ñ:Ó ä"'§+¡+°KÀ!±OÐ3EÈÑ3IÐQ`×QfÑQfÔ"gÐØ*9×*=Ñ*=¸bÓ*AÐ ¡ A¡B Ñ'Ø)>ÀÑ)BÐ  1¡2 Ñ&Ø)>ÀÑ)BÐ ¡ A Ñ&Ø(=ÀÑ(AÐ Ñ%Ø&Ð&r,   rV   c                 ó   — d| j                   d   z  dz
  }d| j                   d   z  dz
  }d|d   z  dz
  }d|d   z  dz
  }| j                  }| j                  }	||z  dz   }
|d|	dz
   }|j                  d||d«      j	                  dddd«      }t
        j                  j                  |t        |«      t        |«      fd¬«      }|j	                  dddd«      j                  |
dz
  d«      }t        j                  |||	dz
  d g«      }| j                  |«      }||j                  d«         }|j                  |d   |d   z  dz   |d   |d   z  dz   d«      }|j	                  ddd«      j                  «       }|rCt
        j                  j                  |j                  d«      ||fdd	¬
«      j                  d«      }|j                  d«      S )zu
        Modification of timm.models.beit.py: Attention._get_rel_pos_bias to support arbitrary window sizes.
        r   r   r"   r   NrM   Úbilinear)rQ   ÚmodeF©rQ   r†   Úalign_corners)rl   ro   rm   Úreshaper|   r   Ú
functionalÚinterpolater   r:   rU   rƒ   Úviewr}   rS   Úsqueeze)rH   rl   rV   Údim_sizeÚ
old_heightÚ	old_widthÚ
new_heightÚ	new_widthÚ old_relative_position_bias_tableÚold_num_relative_distanceÚnew_num_relative_distanceÚold_sub_tableÚnew_sub_tableÚ new_relative_position_bias_tabler‚   Úrelative_position_biass                   r-   r`   z BeitRelativePositionBias.forward‘   s-  € ð ˜×)Ñ)¨!Ñ,Ñ,¨qÑ0ˆ
Ø˜×(Ñ(¨Ñ+Ñ+¨aÑ/ˆ	à˜ Q™Ñ'¨!Ñ+ˆ
Ø˜ A™Ñ&¨Ñ*ˆ	à+/×+LÑ+LÐ(à$(×$>Ñ$>Ð!Ø$.°Ñ$:¸QÑ$>Ð!à8Ð9XÐ;TÐWXÑ;XÐYˆà%×-Ñ-¨a°¸JÈÓK×SÑSÐTUÐWXÐZ[Ð]^Ó_ˆÜŸ™×1Ñ1Ø¤¨:Ó!6¼	À)Ó8LÐ MÐT^ð 2ó 
ˆð &×-Ñ-¨a°°A°qÓ9×AÑAÐB[Ð^_ÑB_ÐacÓdˆä+0¯9©9ØÐ<Ð=VÐYZÑ=ZÐ=\Ð]Ð^ó,
Ð(ð #'×"GÑ"GÈÓ"TÐØ!AÐBY×B^ÑB^Ð_aÓBbÑ!cÐð "8×!<Ñ!<Ø˜‰N˜[¨™^Ñ+¨aÑ/°¸Q±À+ÈaÁ.Ñ1PÐSTÑ1TÐVXó"
Ðð "8×!?Ñ!?ÀÀ1ÀaÓ!H×!SÑ!SÓ!UÐá#Ü%'§]¡]×%>Ñ%>Ø&×0Ñ0°Ó3Ø Ð)ØØ#ð	 &?ó &÷
 ‰g�a‹jð #ð &×/Ñ/°Ó2Ð2r,   )FN)r'   r(   r)   r#   r8   Ústaticmethodr   rj   Úintr:   r   rƒ   Úboolr`   Ú__classcell__©rp   s   @r-   rd   rd   h   sk   ø„ ð	
˜zð 	
¨dõ 	
ð Ù(°Ô4ð'°e¸CÀ¸H±oð 'È%Ï,É,ò 'ó 5ó ð'ñ4-3¸Tð -3Ð]b×]iÑ]i÷ -3r,   rd   c                   ó$   ‡ — e Zd Zdefˆ fd„Zˆ xZS )ÚBeitAttentionr4   c                 ó  •— t         ‰| �  |«       t        j                  |j                  |j
                  | j                  z  «      | _        t        j                  |j                  |j
                  | j                  z  d¬«      | _        t        j                  |j                  |j
                  | j                  z  «      | _	        t        j                  |j
                  | j                  z  |j                  «      | _
        y )NF)Úbias)rg   r8   r   ÚLinearr<   rn   Úhead_dimÚq_projÚk_projÚv_projÚo_proj©rH   r4   rp   s     €r-   r8   zBeitAttention.__init__Â   s¸   ø€ Ü‰Ñ˜Ô Ü—i‘i × 2Ñ 2°F×4NÑ4NÐQU×Q^ÑQ^Ñ4^Ó_ˆŒÜ—i‘i × 2Ñ 2°F×4NÑ4NÐQU×Q^ÑQ^Ñ4^ÐejÔkˆŒÜ—i‘i × 2Ñ 2°F×4NÑ4NÐQU×Q^ÑQ^Ñ4^Ó_ˆŒÜ—i‘i × :Ñ :¸T¿]¹]Ñ JÈF×L^ÑL^Ó_ˆ�r,   )r'   r(   r)   r#   r8   r�   rž   s   @r-   r    r    Á   s   ø„ ð`˜z÷ `ñ `r,   r    c                   ó   — e Zd Zy)ÚBeitMLPNr0   r+   r,   r-   r«   r«   Ê   r1   r,   r«   c                   ó   — e Zd Zy)ÚBeitDropPathNr0   r+   r,   r-   r­   r­   Î   r1   r,   r­   c                   ó®   ‡ — e Zd ZdZddedefˆ fd„Z	 	 	 ddej                  dej                  dz  de	d	e
eef   dz  d
ee   dej                  fd„Zˆ xZS )Ú	BeitLayerz?This corresponds to the Block class in the timm implementation.r4   Údrop_path_ratec                 ó  •— t         ‰| �  «        |j                  | _        |dkD  rt        |«      nt	        j
                  «       | _        |j                  }|dkD  r7t	        j                  |t        j                  |j                  «      z  d¬«      nd| _        |dkD  r7t	        j                  |t        j                  |j                  «      z  d¬«      nd| _        |j                  rt        |«      | _        y d | _        y )Nç        r   T)Úrequires_gradg      ð?)rg   r8   rA   r­   r   ÚIdentityÚ	drop_pathÚlayer_scale_init_valuer9   r:   Úonesr<   Úlambda_1Úlambda_2Úuse_relative_position_biasrd   r™   )rH   r4   r°   Úinit_valuesrp   s       €r-   r8   zBeitLayer.__init__Õ   sÕ   ø€ Ü‰ÑÔØ ×+Ñ+ˆŒØ9GÈ#Ò9Mœ nÔ5ÔSU×S^ÑS^ÓS`ˆŒà×3Ñ3ˆà^iÐlmÒ^mŒB�L‰L˜¤u§z¡z°&×2DÑ2DÓ'EÑEÐUYÕZÐsvð 	Œð _jÐlmÒ^mŒB�L‰L˜¤u§z¡z°&×2DÑ2DÓ'EÑEÐUYÕZÐsvð 	Œð KQ×JkÒJkÔ&>¸vÓ&FˆÕ#ÐquˆÕ#r,   NÚhidden_statesÚattention_maskrV   Ú
resolutionÚkwargsr5   c                 ó&  — | j                   �M|\  }}|| j                  z  || j                  z  f}| j                  |||j                  d   ¬«      }	|�|	|z   n|	}|}
| j                  |«      } | j                  |fd|i|¤Ž\  }}| j                  |«      }| j                  |z  }| j                  |«      |
z   }|}
| j                  |«      }| j                  |«      }| j                  |«      }| j                  |z  }| j                  |«      |
z   }|S )Nr"   )rŽ   r½   )r™   rA   rP   Úlayernorm_beforeÚ	attentionrG   r¸   rµ   Úlayernorm_afterÚmlpr¹   )rH   r¼   r½   rV   r¾   r¿   rX   rY   rl   r™   ÚresidualrW   s               r-   r`   zBeitLayer.forwardã   sE  € ð ×&Ñ&Ð2Ø&‰MˆF�EØ! T§_¡_Ñ4°e¸t¿¹Ñ6NÐOˆKØ%)×%@Ñ%@ØÐ5À×@SÑ@SÐTUÑ@Vð &Aó &Ð"ð <JÐ;UÐ&¨Ò7Ð[qð ð
 !ˆØ×-Ñ-¨mÓ<ˆØ)˜4Ÿ>™>Øñ
à)ð
ð ñ
Ñˆ�qð
 Ÿ™ ]Ó3ˆØŸ™¨Ñ5ˆØŸ™ }Ó5¸Ñ@ˆð !ˆØ×,Ñ,¨]Ó;ˆØŸ™ Ó/ˆØŸ™ ]Ó3ˆØŸ™¨Ñ5ˆØŸ™ }Ó5¸Ñ@ˆàÐr,   )r²   ©NFN)r'   r(   r)   r*   r#   Úfloatr8   r:   r   rœ   rj   r›   r   r   r`   r�   rž   s   @r-   r¯   r¯   Ò   sŠ   ø„ ÙIñv˜zð v¸5õ vð" /3Ø).Ø-1ñ&à—|‘|ð&ð Ÿ™ tÑ+ð&ð #'ð	&ð
 ˜#˜s˜(‘O dÑ*ð&ð Ð+Ñ,ð&ð 
�‰÷&r,   r¯   c                   ó&   — e Zd ZdgZdgZdZdZd„ Zy)ÚBeitPreTrainedModelr¯   z.*relative_position_index.*Fc                 óÚ  — t        j                  | |«       t        |t        «      rwt	        j
                  |j                  «       |j                  �t	        j
                  |j                  «       |j                  � t	        j
                  |j                  «       yyt        |t        «      r t	        j
                  |j                  «       yt        |t        «      rŽt        |j                  t        j                  «      rit	        j                  |j                  | j                   j"                  «       t	        j                  |j$                  | j                   j"                  «       yyy)zInitialize the weightsN)r   Ú_init_weightsri   r3   ÚinitÚzeros_r=   r?   rD   rd   ro   r¯   r¸   r   r9   Ú	constant_r4   r¶   r¹   )rH   Úmodules     r-   rË   z!BeitPreTrainedModel._init_weights  sê   € ä×%Ñ% d¨FÔ3Ü�fœnÔ-Ü�K‰K˜×(Ñ(Ô)Ø× Ñ Ð,Ü—‘˜F×-Ñ-Ô.Ø×)Ñ)Ð5Ü—‘˜F×6Ñ6Õ7ð 6ä˜Ô 8Ô9Ü�K‰K˜×;Ñ;Õ<Ü˜¤	Ô*Ü˜&Ÿ/™/¬2¯<©<Ô8Ü—‘˜vŸ™°·±×0RÑ0RÔSÜ—‘˜vŸ™°·±×0RÑ0RÕSð 9ð +r,   N)r'   r(   r)   Ú_no_split_modulesÚ"_keys_to_ignore_on_load_unexpectedÚ_supports_flash_attnÚ_supports_flex_attnrË   r+   r,   r-   rÉ   rÉ     s%   „ à$˜ÐØ*HÐ)IÐ&Ø ÐØÐóTr,   rÉ   c                   óÐ   ‡ — e Zd Zddededdfˆ fd„Ze ed¬«      e	 	 	 dde	j                  d	e	j                  dz  d
ede	j                  dz  dee   defd„«       «       «       Zˆ xZS )Ú	BeitModelr4   Úadd_pooling_layerr5   Nc           	      ó‚  •— t         ‰| �  |«       || _        t        |«      | _        |j
                  rt        |«      nd| _        t        |j                  «      D �cg c]+  }|j                  |z  t        |j                  dz
  d«      z  ‘Œ- }}t        j                  |D �cg c]  }t        ||¬«      ‘Œ c}«      | _        |j                   rt        j"                  «       n*t        j$                  |j&                  |j(                  ¬«      | _        |rt-        |«      nd| _        | j1                  «        yc c}w c c}w )zv
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        Nr"   )r°   ©Úeps)rg   r8   r4   r3   rZ   Ú!use_shared_relative_position_biasrd   Úshared_position_biasÚrangeÚnum_hidden_layersr°   Úmaxr   Ú
ModuleListr¯   ÚlayersÚuse_mean_poolingr´   Ú	LayerNormr<   Úlayer_norm_epsÚ	layernormÚ
BeitPoolerÚpoolerÚ	post_init)rH   r4   rÖ   ÚiÚdrop_path_ratesÚrrp   s         €r-   r8   zBeitModel.__init__&  s  ø€ ô
 	‰Ñ˜Ô ØˆŒä(¨Ó0ˆŒà06×0XÒ0XÔ$ VÔ,Ð^bð 	Ô!ô W\Ð\b×\tÑ\tÓVuö
ØQRˆF×!Ñ! AÑ%¬¨F×,DÑ,DÀqÑ,HÈ!Ó(LÓLð
ˆð 
ô —m‘mÐRaÖ$bÈQ¤Y¨vÀaÖ%HÒ$bÓcˆŒð $×4Ò4ŒB�K‰KŒM¼"¿,¹,Àv×GYÑGYÐ_e×_tÑ_tÔ:uð 	Œñ ->”j Ô(À4ˆŒð 	�‰Õùò
ùò %cs   Á0D7Â"D<F)Útie_last_hidden_statesrI   rJ   rV   r½   r¿   c                 ó
  — | j                  ||¬«      }|j                  dd }t        | j                  ||¬«      }| j                  �a|\  }}	|| j                  j
                  z  |	| j                  j
                  z  f}
| j	                  |
||j                  d   ¬«      }|�||z   n|}|}| j                  D ]  } ||f|||dœ|¤Ž}Œ | j                  |«      }| j                  �| j                  |«      nd}t        ||¬«      S )	zË
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, num_patches)`, *optional*):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).
        )rJ   r   N)r4   Úinputs_embedsr½   r"   )rV   rŽ   )r½   rV   r¾   )Úlast_hidden_stateÚpooler_output)
rZ   rP   r
   r4   rÛ   rA   rà   rä   ræ   r&   )rH   rI   rJ   rV   r½   r¿   Úembedding_outputr¾   rX   rY   rl   Úshared_relative_position_biasr¼   ÚlayerÚsequence_outputÚpooled_outputs                   r-   r`   zBeitModel.forward?  s<  € ð  Ÿ?™?¨<È˜?ÓYÐØ!×'Ñ'¨¨Ð+ˆ
ä2Ø—;‘;Ø*Ø)ô
ˆð ×$Ñ$Ð0Ø&‰MˆF�EØ! T§[¡[×%;Ñ%;Ñ;¸UÀdÇkÁk×F\ÑF\Ñ=\Ð]ˆKØ,0×,EÑ,EØÐ6NÐYi×YoÑYoÐpqÑYrð -Fó -Ð)ð
 "Ð-ð .°Ò>à2ð ð )ˆØ—[‘[ò 	ˆEÙ!Øðà-Ø)AØ%ñ	ð
 ñ‰Mð	ð Ÿ.™.¨Ó7ˆØ8<¿¹Ð8O˜Ÿ™ OÔ4ÐUYˆä)¸OÐ[hÔiÐir,   )TrÆ   )r'   r(   r)   r#   rœ   r8   r   r   r   r:   r   rb   r   r   r&   r`   r�   rž   s   @r-   rÕ   rÕ   $  s±   ø„ ñ˜zð ¸dð Èdõ ð2  Ù¨EÔ2Øð 48Ø).Ø.2ñ-jà—l‘lð-jð ×)Ñ)¨DÑ0ð-jð #'ð	-jð
 Ÿ™ tÑ+ð-jð Ð+Ñ,ð-jð 
$ò-jó ó 3ó  ô-jr,   rÕ   c                   ó`   ‡ — e Zd Zdeddfˆ fd„Zdej                  dej                  fd„Zˆ xZS )rå   r4   r5   Nc                 óª   •— t         ‰| �  «        |j                  r1t        j                  |j
                  |j                  ¬«      | _        y d | _        y )NrØ   )rg   r8   rá   r   râ   r<   rã   rä   r©   s     €r-   r8   zBeitPooler.__init__s  sA   ø€ Ü‰ÑÔàKQ×KbÒKbŒB�L‰L˜×+Ñ+°×1FÑ1FÔGð 	�Øhlð 	�r,   r¼   c                 ó„   — | j                   �,| j                  |d d …dd …d d …f   j                  d«      «      S |d d …df   S )Nr"   r   )rä   Úmean©rH   r¼   s     r-   r`   zBeitPooler.forwardy  sD   € àBFÇ.Á.ÐB\ˆt�~‰~˜mªA¨q©r²1¨HÑ5×:Ñ:¸1Ó=Ó>ÐuÐboÒpqÐstÐptÑbuÐur,   )	r'   r(   r)   r#   r8   r:   r   r`   r�   rž   s   @r-   rå   rå   r  s4   ø„ ð
˜zð 
¨dõ 
ðv U§\¡\ð v°e·l±l÷ vr,   rå   aÔ  
    Beit Model transformer with a 'language' modeling head on top. BEiT does masked image modeling by predicting
    visual tokens of a Vector-Quantize Variational Autoencoder (VQ-VAE), whereas other vision models like ViT and DeiT
    predict RGB pixel values. As a result, this class is incompatible with [`AutoModelForMaskedImageModeling`], so you
    will need to use [`BeitForMaskedImageModeling`] directly if you wish to do masked image modeling with BEiT.
    c                   óæ   ‡ — e Zd Zdeddfˆ fd„Zd„ Zee	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  d	ed
ej                  dz  dee   deez  fd„«       «       Zˆ xZS )ÚBeitForMaskedImageModelingr4   r5   Nc                 óH  •— t         ‰| �  |«       |j                  | _        t        |d¬«      | _        t        j                  |j                  |j                  ¬«      | _	        t        j                  |j                  |j                  «      | _        | j                  «        y )NF©rÖ   rØ   )rg   r8   Ú
num_labelsrÕ   Úbeitr   râ   r<   rã   rä   r£   Ú
vocab_sizeÚlm_headrç   r©   s     €r-   r8   z#BeitForMaskedImageModeling.__init__‡  su   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ˜f¸Ô>ˆŒ	ô Ÿ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÜ—y‘y ×!3Ñ!3°V×5FÑ5FÓGˆŒð 	�‰Õr,   c                  ó   — y ra   r+   )rH   s    r-   Úget_output_embeddingsz0BeitForMaskedImageModeling.get_output_embeddings”  s   € Ør,   rI   rJ   ÚlabelsrV   r½   r¿   c                 ó,  —  | j                   |f|||dœ|¤Ž}|j                  }| j                  |«      }| j                  |dd…dd…f   «      }	d}
|� t	        j
                  «       } ||	|   |«      }
t        |
|	|j                  |j                  ¬«      S )a…  
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, num_patches)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the image classification/regression loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).

        Examples:

        ```python
        >>> from transformers import AutoImageProcessor, BeitForMaskedImageModeling
        >>> import torch
        >>> from PIL import Image
        >>> import requests

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = Image.open(requests.get(url, stream=True).raw)

        >>> image_processor = AutoImageProcessor.from_pretrained("microsoft/beit-base-patch16-224-pt22k")
        >>> model = BeitForMaskedImageModeling.from_pretrained("microsoft/beit-base-patch16-224-pt22k")

        >>> num_patches = (model.config.image_size // model.config.patch_size) ** 2
        >>> pixel_values = image_processor(images=image, return_tensors="pt").pixel_values
        >>> # create random boolean mask of shape (batch_size, num_patches)
        >>> bool_masked_pos = torch.randint(low=0, high=2, size=(1, num_patches)).bool()

        >>> outputs = model(pixel_values, bool_masked_pos=bool_masked_pos)
        >>> loss, logits = outputs.loss, outputs.logits
        >>> list(logits.shape)
        [1, 196, 8192]
        ```)rJ   rV   r½   Nr"   ©ÚlossÚlogitsr¼   Ú
attentions)	rÿ   rî   rä   r  r   ÚCrossEntropyLossr   r¼   r	  )rH   rI   rJ   r  rV   r½   r¿   Úoutputsró   Úprediction_scoresÚmasked_lm_lossÚloss_fcts               r-   r`   z"BeitForMaskedImageModeling.forward—  sµ   € ðX �$—)‘)Øð
à+Ø%=Ø)ñ	
ð
 ñ
ˆð "×3Ñ3ˆØŸ.™.¨Ó9ˆØ ŸL™L¨º¸A¹B¸Ñ)?Ó@ÐàˆØÐÜ×*Ñ*Ó,ˆHÙ%Ð&7¸Ñ&HÈ&ÓQˆNäØØ$Ø!×/Ñ/Ø×)Ñ)ô	
ð 	
r,   )NNNFN)r'   r(   r)   r#   r8   r  r   r   r:   r   rb   rœ   r   r   rj   r   r`   r�   rž   s   @r-   rû   rû   ~  sÆ   ø„ ð˜zð ¨dõ òð Øð -1Ø37Ø&*Ø).Ø.2ñ@
à—l‘l TÑ)ð@
ð ×)Ñ)¨DÑ0ð@
ð —‘˜tÑ#ð	@
ð
 #'ð@
ð Ÿ™ tÑ+ð@
ð Ð+Ñ,ð@
ð 
�Ñ	ò@
ó ó ô@
r,   rû   z¶
    Beit Model transformer with an image classification head on top (a linear layer on top of the average of the final
    hidden states of the patch tokens) e.g. for ImageNet.
    c                   ó    ‡ — e Zd Zdeddfˆ fd„Zee	 	 	 d
dej                  dz  dej                  dz  de	de
e   deez  f
d	„«       «       Zˆ xZS )ÚBeitForImageClassificationr4   r5   Nc                 ó.  •— t         ‰| �  |«       |j                  | _        t        |d¬«      | _        |j                  dkD  r*t        j                  |j                  |j                  «      nt        j                  «       | _	        | j                  «        y )NTrý   r   )rg   r8   rþ   rÕ   rÿ   r   r£   r<   r´   Ú
classifierrç   r©   s     €r-   r8   z#BeitForImageClassification.__init__ã  ss   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ˜f¸Ô=ˆŒ	ð OU×N_ÑN_ÐbcÒNcœ"Ÿ)™) F×$6Ñ$6¸×8IÑ8IÔJÔik×itÑitÓivˆŒð 	�‰Õr,   rI   r  rV   r¿   c                 óî   —  | j                   |fd|i|¤Ž}|j                  }| j                  |«      }d}|�| j                  ||| j                  «      }t        |||j                  |j                  ¬«      S )aŠ  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the image classification/regression loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
        rV   Nr  )rÿ   rï   r  Úloss_functionr4   r   r¼   r	  )	rH   rI   r  rV   r¿   r  rô   r  r  s	            r-   r`   z"BeitForImageClassification.forwardï  sŒ   € ð �$—)‘)Øñ
à%=ð
ð ñ
ˆð  ×-Ñ-ˆà—‘ Ó/ˆàˆØÐØ×%Ñ% f¨f°d·k±kÓBˆDä$ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r,   ©NNF)r'   r(   r)   r#   r8   r   r   r:   r   rœ   r   r   rj   r   r`   r�   rž   s   @r-   r  r  Ü  s‹   ø„ ð
˜zð 
¨dõ 
ð Øð -1Ø&*Ø).ñ	 
à—l‘l TÑ)ð 
ð —‘˜tÑ#ð 
ð #'ð	 
ð
 Ð+Ñ,ð 
ð 
Ð&Ñ	&ò 
ó ó ô 
r,   r  c                   óŠ   ‡ — e Zd Z	 	 	 	 	 	 	 ddededeeeef   z  dedeeeef   z  ez  dedeeeef   z  ded	efˆ fd
„Zˆ xZS )ÚBeitConvLayerÚin_channelsÚout_channelsÚkernel_sizeÚstrideÚpaddingr¢   ÚdilationÚgroupsÚ
activationc
           
      óf   •— t         ‰
| �  «        t        j                  ||||||||¬«      | _        y )N)r  r  r  r  r  r  r  r¢   )rg   r8   r   ÚConv2dÚconvolution)rH   r  r  r  r  r  r¢   r  r  r  rp   s             €r-   r8   zBeitConvLayer.__init__  s9   ø€ ô 	‰ÑÔÜŸ9™9Ø#Ø%Ø#ØØØØØô	
ˆÕr,   )r   r"   r   Fr"   r"   Úrelu)	r'   r(   r)   r›   rj   Ústrrœ   r8   r�   rž   s   @r-   r  r    s¨   ø„ ð
 ./ØØ/0ØØ*+ØØ ñ
àð
ð ð
ð ˜5  c ™?Ñ*ð	
ð
 ð
ð �u˜S #˜X‘Ñ&¨Ñ,ð
ð ð
ð ˜˜c 3˜h™Ñ'ð
ð ð
ð ÷
ñ 
r,   r  c                   óv   ‡ — e Zd Zdedededdfˆ fd„Zdej                  deeef   dej                  fd	„Zˆ xZ	S )
ÚBeitPyramidPoolingBlockÚ
pool_scaler  Úchannelsr5   Nc                 ó|   •— t         ‰| �  «        t        j                  |«      | _        t        ||d¬«      | _        y )Nr"   ©r  )rg   r8   r   ÚAdaptiveAvgPool2dÚpoolingr  Úconv)rH   r'  r  r(  rp   s       €r-   r8   z BeitPyramidPoolingBlock.__init__/  s0   ø€ Ü‰ÑÔÜ×+Ñ+¨JÓ7ˆŒÜ! +¨xÀQÔGˆ�	r,   ÚinputrQ   c                 ó�   — | j                  |«      }| j                  |«      }t        j                  j	                  ||dd¬«      }|S )Nr…   Fr‡   )r,  r-  r   rŠ   r‹   )rH   r.  rQ   Úhidden_states       r-   r`   zBeitPyramidPoolingBlock.forward4  sB   € Ø—|‘| EÓ*ˆØ—y‘y Ó.ˆÜ—}‘}×0Ñ0°ÀDÈzÐinÐ0ÓoˆØÐr,   )
r'   r(   r)   r›   r8   r:   r   rj   r`   r�   rž   s   @r-   r&  r&  .  sS   ø„ ðH 3ð H°Sð HÀCð HÈDõ Hð
˜UŸ\™\ð °°s¸C°x±ð ÀUÇ\Á\÷ r,   r&  c                   ó|   ‡ — e Zd ZdZdeedf   dededdfˆ fd„Zd	ej                  de	ej                     fd
„Z
ˆ xZS )ÚBeitPyramidPoolingModuleak  
    Pyramid Pooling Module (PPM) used in PSPNet.

    Args:
        pool_scales (tuple[int]): Pooling scales used in Pooling Pyramid
            Module.
        in_channels (int): Input channels.
        channels (int): Channels after modules, before conv_seg.

    Based on OpenMMLab's implementation, found in https://github.com/open-mmlab/mmsegmentation.
    Úpool_scales.r  r(  r5   Nc           
      ó¾   •— t         ‰| �  «        || _        || _        || _        t        j                  |D �cg c]  }t        |||¬«      ‘Œ c}«      | _        y c c}w )N)r'  r  r(  )	rg   r8   r3  r  r(  r   rß   r&  Úblocks)rH   r3  r  r(  r'  rp   s        €r-   r8   z!BeitPyramidPoolingModule.__init__H  s\   ø€ Ü‰ÑÔØ&ˆÔØ&ˆÔØ ˆŒÜ—m‘mð #.öàô (°:È;ÐaiÖjòó
ˆ�ùòs   ¸Ar¼   c                 óv   — |j                  «       dd  }| j                  D �cg c]  } |||¬«      ‘Œ c}S c c}w )Nr   )rQ   )rQ   r5  )rH   r¼   Úoriginal_sizeÚblocks       r-   r`   z BeitPyramidPoolingModule.forwardT  s6   € Ø%×*Ñ*Ó,¨Q¨RÐ0ˆØFJÇkÁkÖR¸U‘�m¨-Ö8ÒRÐRùÒRs   ¢6)r'   r(   r)   r*   rj   r›   r8   r:   r   rk   r`   r�   rž   s   @r-   r2  r2  ;  sV   ø„ ñ
ð

 E¨#¨s¨(¡Oð 

À#ð 

ÐQTð 

ÐY]õ 

ðS U§\¡\ð S°d¸5¿<¹<Ñ6H÷ Sr,   r2  c                   ó¨   ‡ — e Zd ZdZdeddfˆ fd„Zdeej                     dej                  fd„Z	deej                     dej                  fd	„Z
ˆ xZS )
ÚBeitUperHeadzú
    Unified Perceptual Parsing for Scene Understanding. This head is the implementation of
    [UPerNet](https://huggingface.co/papers/1807.10221).

    Based on OpenMMLab's implementation, found in https://github.com/open-mmlab/mmsegmentation.
    r4   r5   Nc           	      óÖ  •— t         ‰| �  «        |j                  | _        |j                  gdz  | _        |j                  | _        t        j                  | j
                  |j                  d¬«      | _	        t        | j                  | j                  d   | j
                  «      | _        t        | j                  d   t        | j                  «      | j
                  z  z   | j
                  dd¬«      | _        t        j                  «       | _        t        j                  «       | _        | j                  d d D ]o  }| j                   j%                  t        || j
                  d¬«      «       | j"                  j%                  t        | j
                  | j
                  dd¬«      «       Œq t        t        | j                  «      | j
                  z  | j
                  dd¬«      | _        y )Né   r"   r*  rM   r   ©r  r  )rg   r8   r3  r<   r  r(  r   r!  rþ   r  r2  Úpsp_modulesr  ÚlenÚpsp_bottleneckrß   Úlateral_convsÚ	fpn_convsÚappendÚfpn_bottleneck)rH   r4   r  rp   s      €r-   r8   zBeitUperHead.__init__a  s…  ø€ Ü‰ÑÔà!×-Ñ-ˆÔØ"×.Ñ.Ð/°!Ñ3ˆÔØ×*Ñ*ˆŒÜŸ)™) D§M¡M°6×3DÑ3DÐRSÔTˆŒô 4Ø×ÑØ×Ñ˜RÑ Ø�M‰Mó
ˆÔô
 ,Ø×Ñ˜RÑ ¤3 t×'7Ñ'7Ó#8¸4¿=¹=Ñ#HÑHØ�M‰MØØô	
ˆÔô  Ÿ]™]›_ˆÔÜŸ™›ˆŒØ×+Ñ+¨C¨RÐ0ò 	iˆKØ×Ñ×%Ñ%¤m°KÀÇÁÐ\]Ô&^Ô_Ø�N‰N×!Ñ!¤-°·±¸t¿}¹}ÐZ[ÐefÔ"gÕhð	iô ,Ü�× Ñ Ó! D§M¡MÑ1Ø�M‰MØØô	
ˆÕr,   r¼   c                 ó€   — |d   }t        j                  |g| j                  |«      ¢d¬«      }| j                  |«      S rL   )r:   rU   r>  r@  )rH   r¼   r0  s      r-   Úpsp_forwardzBeitUperHead.psp_forwardƒ  sA   € Ø$ RÑ(ˆÜ—y‘y ,Ð!P°×1AÑ1AÀ,Ó1OÐ!PÐVWÔXˆØ×"Ñ" <Ó0Ð0r,   Úencoder_hidden_statesc                 ó6  — g }t        | j                  |«      D ]  \  }}|j                   ||«      «       Œ |j                  | j                  |«      «       t	        |«      }t        |dz
  dd«      D ]L  }||dz
     j                  dd  }||dz
     t        j                  j                  ||   |dd¬«      z   ||dz
  <   ŒN g }t        |dz
  «      D ])  }|j                   | j                  |   ||   «      «       Œ+ |j                  |d   «       t        |dz
  dd«      D ];  }t        j                  j                  ||   |d   j                  dd  dd¬«      ||<   Œ= t        j                  |d¬«      }| j                  |«      }	| j                  |	«      }	|	S )	Nr"   r   rM   r   r…   Fr‡   rN   )ÚziprA  rC  rF  r?  rÜ   rP   r   rŠ   r‹   rB  r:   rU   rD  r  )
rH   rG  ÚlateralsÚlateral_convr0  Úused_backbone_levelsrè   Ú
prev_shapeÚfpn_outsÚoutputs
             r-   r`   zBeitUperHead.forwardˆ  s¹  € àˆÜ*-¨d×.@Ñ.@ÐBWÓ*Xò 	8Ñ&ˆL˜,Ø�O‰O™L¨Ó6Õ7ð	8ð 	�‰˜×(Ñ(Ð)>Ó?Ô@ô  # 8›}ÐÜÐ+¨aÑ/°°BÓ7ò 	ˆAØ! ! a¡%™×.Ñ.¨q¨rÐ2ˆJØ& q¨1¡u™o´·±×0IÑ0IØ˜‘ *°:ÈUð 1Jó 1ñ ˆH�Q˜‘UŠOð	ð ˆÜÐ+¨aÑ/Ó0ò 	<ˆAØ�O‰OÐ-˜DŸN™N¨1Ñ-¨h°q©kÓ:Õ;ð	<ð 	�‰˜ ™Ô%äÐ+¨aÑ/°°BÓ7ò 	ˆAÜŸ-™-×3Ñ3Ø˜‘ (¨1¡+×"3Ñ"3°A°BÐ"7¸jÐX]ð 4ó ˆH�QŠKð	ô —9‘9˜X¨1Ô-ˆØ×$Ñ$ XÓ.ˆØ—‘ Ó(ˆàˆr,   )r'   r(   r)   r*   r#   r8   rk   r:   r   rF  r`   r�   rž   s   @r-   r:  r:  Y  s\   ø„ ñð 
˜zð  
¨dõ  
ðD1¨¨e¯l©lÑ);ð 1ÀÇÁó 1ð
¨T°%·,±,Ñ-?ð ÀEÇLÁL÷ r,   r:  c                   óŠ   ‡ — e Zd ZdZ	 ddedededeeeef   z  ddf
ˆ fd„Zd	ee	j                     de	j                  fd
„Zˆ xZS )ÚBeitFCNHeadaÛ  
    Fully Convolution Networks for Semantic Segmentation. This head is implemented of
    [FCNNet](https://huggingface.co/papers/1411.4038>).

    Args:
        config (BeitConfig): Configuration.
        in_channels
        kernel_size (int): The kernel size for convs in the head. Default: 3.
        dilation (int): The dilation rate for convs in the head. Default: 1.


    Based on OpenMMLab's implementation, found in https://github.com/open-mmlab/mmsegmentation.
    r4   Úin_indexr  r  r5   Nc           
      ó0  •— t         ‰| �  «        |j                  | _        |j                  | _        |j                  | _        |j                  | _	        || _
        |dz  |z  }t        j                  «       | _        | j                  dkD  r—| j                  j                  t        | j                  | j
                  |||¬«      «       t!        | j                  dz
  «      D ]?  }| j                  j                  t        | j
                  | j
                  |||¬«      «       ŒA | j                  r8t        | j                  | j
                  z   | j
                  ||dz  ¬«      | _        t        j$                  | j
                  |j&                  d¬«      | _        y )Nr   r   )r  r  r  r"   r=  r*  )rg   r8   r<   r  Úauxiliary_channelsr(  Úauxiliary_num_convsÚ	num_convsÚauxiliary_concat_inputÚconcat_inputrR  r   rß   ÚconvsrC  r  rÜ   Úconv_catr!  rþ   r  )rH   r4   rR  r  r  Úconv_paddingrW   rp   s          €r-   r8   zBeitFCNHead.__init__¹  sQ  ø€ ô 	‰ÑÔØ!×-Ñ-ˆÔØ×1Ñ1ˆŒØ×3Ñ3ˆŒØ"×9Ñ9ˆÔØ ˆŒà# qÑ(¨HÑ4ˆÜ—]‘]“_ˆŒ
Ø�>‰>˜AÒØ�J‰J×ÑÜØ×$Ñ$ d§m¡mÀÐVbÐmuôôô
 ˜4Ÿ>™>¨AÑ-Ó.ò 	�Ø—
‘
×!Ñ!Ü!ØŸ™ØŸ™Ø$/Ø ,Ø!)ôõð	ð ×ÒÜ)Ø× Ñ  4§=¡=Ñ0°$·-±-È[ÐbmÐqrÑbrôˆDŒMô Ÿ)™) D§M¡M°6×3DÑ3DÐRSÔTˆ�r,   rG  c                 óä   — || j                      }|}| j                  D ]
  } ||«      }Œ | j                  r(| j                  t	        j
                  ||gd¬«      «      }| j                  |«      }|S )Nr"   rN   )rR  rY  rX  rZ  r:   rU   r  )rH   rG  rÅ   r¼   r-  s        r-   r`   zBeitFCNHead.forwardÜ  sn   € Ø(¨¯©Ñ7ˆØ ˆØ—J‘Jò 	0ˆDÙ  Ó/‰Mð	0à×ÒØ ŸM™M¬%¯)©)°X¸}Ð4MÐSTÔ*UÓVˆMØŸ™¨Ó6ˆØÐr,   )r   r   r"   )r'   r(   r)   r*   r#   r›   rj   r8   rk   r:   r   r`   r�   rž   s   @r-   rQ  rQ  ª  su   ø„ ñð noñ!UØ ð!UØ,/ð!UØBEð!UØUXÐ[`ÐadÐfiÐaiÑ[jÑUjð!Uà	õ!UðF¨T°%·,±,Ñ-?ð ÀEÇLÁL÷ r,   rQ  c            	       ón   ‡ — e Zd ZdZd
dedededdfˆ fd„Zdej                  dej                  fd	„Zˆ xZ	S )ÚBeitFPNUpBlockuE   4x upsampling block: ConvTranspose â†’ BN â†’ GELU â†’ ConvTranspose.r<   r  r  r5   Nc                 ó   •— t         ‰| �  «        t        j                  ||||¬«      | _        t        j
                  |«      | _        t        j                  «       | _        t        j                  ||||¬«      | _	        y )N©r  r  )
rg   r8   r   ÚConvTranspose2dÚconv_transpose1ÚBatchNorm2dÚnormalizationÚGELUr  Úconv_transpose2)rH   r<   r  r  rp   s       €r-   r8   zBeitFPNUpBlock.__init__ê  sb   ø€ Ü‰ÑÔÜ!×1Ñ1°+¸{ÐXcÐlrÔsˆÔÜŸ^™^¨KÓ8ˆÔÜŸ'™'›)ˆŒÜ!×1Ñ1°+¸{ÐXcÐlrÔsˆÕr,   r¼   c                 óŽ   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }|S ra   )rb  rd  r  rf  rù   s     r-   r`   zBeitFPNUpBlock.forwardñ  sF   € Ø×,Ñ,¨]Ó;ˆØ×*Ñ*¨=Ó9ˆØŸ™¨Ó6ˆØ×,Ñ,¨]Ó;ˆØÐr,   )r   r   )
r'   r(   r)   r*   r›   r8   r:   r   r`   r�   rž   s   @r-   r^  r^  ç  sH   ø„ ÙOñt Cð t°cð tÀsð tÐSWõ tð U§\¡\ð °e·l±l÷ r,   r^  c                   ót   ‡ — e Zd ZdZdefˆ fd„Zdeej                  df   deej                  df   fd„Z	ˆ xZ
S )ÚBeitFPNNeckz¤
    4-level feature pyramid neck for BeiT. Produces x4 upsample, x2 upsample,
    identity, and x2 downsample outputs from the four selected ViT feature maps.
    r4   c                 óò   •— t         ‰| �  «        t        |j                  «      | _        t        j                  |j                  |j                  dd¬«      | _        t        j                  dd¬«      | _	        y )Nr   r`  )
rg   r8   r^  r<   Úfpn1r   ra  Úfpn2Ú	MaxPool2dÚfpn4r©   s     €r-   r8   zBeitFPNNeck.__init__ÿ  sX   ø€ Ü‰ÑÔÜ" 6×#5Ñ#5Ó6ˆŒ	Ü×&Ñ& v×'9Ñ'9¸6×;MÑ;MÐ[\ÐefÔgˆŒ	Ü—L‘L¨Q°qÔ9ˆ�	r,   Úfeature_maps.r5   c                 ó€   — | j                  |d   «      | j                  |d   «      |d   | j                  |d   «      fS rf   )rk  rl  rn  )rH   ro  s     r-   r`   zBeitFPNNeck.forward  sC   € à�I‰I�l 1‘oÓ&Ø�I‰I�l 1‘oÓ&Ø˜‰OØ�I‰I�l 1‘oÓ&ð	
ð 	
r,   )r'   r(   r)   r*   r#   r8   rj   r:   r   r`   r�   rž   s   @r-   ri  ri  ù  sD   ø„ ñð
:˜zõ :ð
 E¨%¯,©,¸Ð*;Ñ$<ð 
ÀÀuÇ|Á|ÐUXÐGXÑAY÷ 
r,   ri  c                   óª   ‡ — e Zd Zdeddfˆ fd„Zeee	 	 	 d
dej                  dz  dej                  dz  de
dee   deez  f
d	„«       «       «       Zˆ xZS )ÚBeitForSemanticSegmentationr4   r5   Nc                 ó`  •— t         ‰| �  |«       |j                  | _        t        |d¬«      | _        t        | j                  j                  «      dk7  rt        d«      ‚t        |«      | _
        t        |«      | _        |j                  rt        |«      nd | _        | j!                  «        y )NFrý   r<  zÇBeitForSemanticSegmentation requires config.out_indices to be a list of 4 integers, specifying which features to use from the backbone. One can use [3, 5, 7, 11] in case of a base-sized architecture.)rg   r8   rþ   rÕ   rÿ   r?  r4   Úout_indicesÚ
ValueErrorri  Úfpnr:  Údecode_headÚuse_auxiliary_headrQ  Úauxiliary_headrç   r©   s     €r-   r8   z$BeitForSemanticSegmentation.__init__  s•   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ˜f¸Ô>ˆŒ	äˆt�{‰{×&Ñ&Ó'¨1Ò,Üð-óð ô
 ˜vÓ&ˆŒô (¨Ó/ˆÔØ5;×5NÒ5Nœk¨&Ô1ÐTXˆÔð 	�‰Õr,   rI   r  rV   r¿   c                 óÀ  ‡‡‡‡— |�$| j                   j                  dk(  rt        d«      ‚ | j                  |fd|i|¤Ž}|j                  Š|j
                  \  Š}}}|| j                   j                  z  Š|| j                   j                  z  Št        ˆˆˆˆfd„| j                   j                  D «       «      }	| j                  |	«      }	| j                  |	«      }
d}| j                  �| j                  |	«      }d}|�>| j                  |
|| j                   j                  || j                   j                  ¬«      }t        ||
|j                  |j                   ¬«      S )aD  
        labels (`torch.LongTensor` of shape `(batch_size, height, width)`, *optional*):
            Ground truth semantic segmentation maps for computing the loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels > 1`, a classification loss is computed (Cross-Entropy).

        Examples:

        ```python
        >>> from transformers import AutoImageProcessor, BeitForSemanticSegmentation
        >>> from PIL import Image
        >>> import requests

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = Image.open(requests.get(url, stream=True).raw)

        >>> image_processor = AutoImageProcessor.from_pretrained("microsoft/beit-base-finetuned-ade-640-640")
        >>> model = BeitForSemanticSegmentation.from_pretrained("microsoft/beit-base-finetuned-ade-640-640")

        >>> inputs = image_processor(images=image, return_tensors="pt")
        >>> outputs = model(**inputs)
        >>> # logits are of shape (batch_size, num_labels, height, width)
        >>> logits = outputs.logits
        ```Nr"   z/The number of labels should be greater than onerV   c              3   ó„   •K  — | ]7  }‰|d z
     dd…d d…f   j                  d d«      j                  ‰d‰‰«      –— Œ9 y­w)r"   Nr   rM   )Ú	transposer‰   )Ú.0rè   r[   rG  Úpatch_heightÚpatch_widths     €€€€r-   ú	<genexpr>z6BeitForSemanticSegmentation.forward.<locals>.<genexpr>U  sN   øè ø€ ò 
àð " ! a¡%Ñ(ª¨A©B¨Ñ/×9Ñ9¸!¸QÓ?×GÑGÈ
ÐTVÐXdÐfq×rñ
ùs   ƒ=A )Úignore_indexÚauxiliary_logitsÚauxiliary_loss_weightr  )r4   rþ   ru  rÿ   r¼   rP   rA   rj   rt  rv  rw  ry  r  Úsemantic_loss_ignore_indexrƒ  r   r	  )rH   rI   r  rV   r¿   r  rW   rX   rY   ro  r  r‚  r  r[   rG  r~  r  s                @@@@r-   r`   z#BeitForSemanticSegmentation.forward%  sh  û€ ðB Ð $§+¡+×"8Ñ"8¸AÒ"=ÜÐNÓOÐOØ�$—)‘)Øñ
à%=ð
ð ñ
ˆð !(× 5Ñ 5ÐØ'3×'9Ñ'9Ñ$ˆ
�A�v˜uØ §¡×!7Ñ!7Ñ7ˆØ˜tŸ{™{×5Ñ5Ñ5ˆô ö 
à—[‘[×,Ñ,ô
ó 
ˆð —x‘x Ó-ˆà×!Ñ! ,Ó/ˆàÐØ×ÑÐ*Ø#×2Ñ2°<Ó@ÐàˆØÐØ×%Ñ%ØØØ!Ÿ[™[×CÑCØ!1Ø&*§k¡k×&GÑ&Gð &ó ˆDô 'ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r,   r  )r'   r(   r)   r#   r8   r   r	   r   r:   r   rœ   r   r   rj   r   r`   r�   rž   s   @r-   rr  rr    sš   ø„ ð˜zð ¨dõ ð* Ø Øð -1Ø&*Ø).ñ	G
à—l‘l TÑ)ðG
ð —‘˜tÑ#ðG
ð #'ð	G
ð
 Ð+Ñ,ðG
ð 
Ð(Ñ	(òG
ó ó !ó ôG
r,   rr  zM
    BEiT backbone, to be used with frameworks like DETR and MaskFormer.
    c            	       óV   ‡ — e Zd Zˆ fd„Zeeededee	   de
fd„«       «       «       Zˆ xZS )ÚBeitBackbonec                 ó<  •— t         ‰| �  |«       t        |j                  dz   «      D �cg c]  }|j                  ‘Œ c}| _        t        |d¬«      | _        |j                  rt        |«      nt        j                  «       | _        | j                  «        y c c}w )Nr"   Frý   )rg   r8   rÜ   rÝ   r<   Únum_featuresrÕ   rÿ   Úadd_fpnri  r   r´   rv  rç   )rH   r4   rW   rp   s      €r-   r8   zBeitBackbone.__init__x  st   ø€ Ü‰Ñ˜Ô ä9>¸v×?WÑ?WÐZ[Ñ?[Ó9\Ö]°A˜V×/Ó/Ò]ˆÔÜ˜f¸Ô>ˆŒ	Ø*0¯.ª.”;˜vÔ&¼b¿k¹k»mˆŒð 	�‰Õùò ^s   «BrI   r¿   r5   c                 ó*  — |j                   \  }}}}|| j                  j                  z  }|| j                  j                  z  } | j                  |fi |¤Ž}	|	j                  }
d}t        | j                  |
«      D ]d  \  }}|| j                  v sŒ| j                  j                  r4|dd…dd…dd…f   }|j                  dd«      }|j                  |d||«      }||fz  }Œf | j                  |«      }t        ||	j                  |	j                  ¬«      S )a:  
        Examples:

        ```python
        >>> from transformers import AutoImageProcessor, AutoBackbone
        >>> import torch
        >>> from PIL import Image
        >>> import requests

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = Image.open(requests.get(url, stream=True).raw)

        >>> processor = AutoImageProcessor.from_pretrained("microsoft/beit-base-patch16-224")
        >>> model = AutoBackbone.from_pretrained(
        ...     "microsoft/beit-base-patch16-224", out_features=["stage1", "stage2", "stage3", "stage4"]
        ... )

        >>> inputs = processor(image, return_tensors="pt")

        >>> outputs = model(**inputs)
        >>> feature_maps = outputs.feature_maps
        >>> list(feature_maps[-1].shape)
        [1, 768, 14, 14]
        ```r+   Nr"   r   rM   )ro  r¼   r	  )rP   r4   rA   rÿ   r¼   rI  Ústage_namesÚout_featuresÚreshape_hidden_statesr|  r‰   rv  r   r	  )rH   rI   r¿   r[   rW   rX   rY   r~  r  r  r¼   ro  Ústager0  s                 r-   r`   zBeitBackbone.forward‚  s  € ð@ (4×'9Ñ'9Ñ$ˆ
�A�v˜uØ §¡×!7Ñ!7Ñ7ˆØ˜tŸ{™{×5Ñ5Ñ5ˆØ�$—)‘)˜LÑ3¨FÑ3ˆà×-Ñ-ˆØˆÜ#& t×'7Ñ'7¸Ó#Gò 	0ÑˆE�<Ø˜×)Ñ)Ò)Ø—;‘;×4Ò4Ø#/²°1±2²q°Ñ#9�LØ#/×#9Ñ#9¸!¸QÓ#?�LØ#/×#7Ñ#7¸
ÀBÈÐVaÓ#b�Là  Ñ/‘ð	0ð —x‘x Ó-ˆäØ%Ø!×/Ñ/Ø×)Ñ)ô
ð 	
r,   )r'   r(   r)   r8   r   r	   r   r   r   r   r   r`   r�   rž   s   @r-   r†  r†  r  sN   ø„ ôð Ø Øð3
àð3
ð Ð+Ñ,ð3
ð 
ò	3
ó ó !ó ô3
r,   r†  )r  rû   rr  rÕ   rÉ   r†  )Hr*   Údataclassesr   r:   r   r   Ú r   rÌ   Úbackbone_utilsr   r	   Úmasking_utilsr
   Úmodeling_outputsr   r   r   r   r   Úmodeling_utilsr   Úprocessing_utilsr   Úpytorch_utilsr   Úutilsr   r   r   Úutils.genericr   r   Úutils.output_capturingr   Úresnet.modeling_resnetr   Úswin.modeling_swinr   Úvit.modeling_vitr   r   r   r   r    r!   Úconfiguration_beitr#   r&   r/   r3   r7   rd   r    r«   r­   r¯   rÉ   rÕ   rå   rû   r  r  r&  r2  r:  rQ  r^  ri  rr  r†  Ú__all__r+   r,   r-   ú<module>rŸ     sF  ðñ å !ã ß å &ß HÝ 6÷õ õ .Ý &Ý @ß BÑ Bß IÝ 5Ý 4Ý -ß t× tÝ *ñ ðôð
 ôÐ!;ó ó óðô	Ð,ô 	ô'�]ô 'ôTV3˜rŸy™yô V3ôr`�Lô `ô	ˆfô 	ô	�<ô 	ô7�ô 7ðt ôTÐ,ó Tó ðTð. ôJjÐ#ó Jjó ðJjôZ	v�—‘ô 	vñ ðôôS
Ð!4ó S
óðS
ñl ðôô/
Ð!4ó /
óð/
ôd
�Oô 
ô4
˜bŸi™iô 
ôS˜rŸy™yô Sô<N�2—9‘9ô Nôb:�"—)‘)ô :ôz�R—Y‘Yô ô$
�"—)‘)ô 
ð* ô`
Ð"5ó `
ó ð`
ñF ðôô
A
�=Ð"5ó A
óð
A
òH�r,   