
    |2g                     b    d dl Z d dlmZ d dlmZ d dlmZ  G d dej                        ZddZ	y)    N)trunc_normal_)weight_normc                   6     e Zd Z	 	 	 	 	 d fd	Zd Zd Z xZS )DINOHeadc                 F   t         |           t        |d      }t        ||||||      | _        | j                  | j                         t        t        j                  ||d            | _
        | j                  j                  j                  j                  d       y )N   )
hidden_dimuse_bnbiasFr   )super__init__max
_build_mlpmlpapply_init_weightsr   nnLinear
last_layerweight_gdatafill_)	selfin_dimout_dimr
   nlayersr	   bottleneck_dimmlp_bias	__class__s	           M/home/cameronsmith/repos/FeatUp/featup/featurizers/dinov2/layers/dino_head.pyr   zDINOHead.__init__   s|     	gq/gv~*]cjrs

4%%&%biie&TU  %%++A.    c                    t        |t        j                        rjt        |j                  d       t        |t        j                        r8|j
                  +t        j                  j                  |j
                  d       y y y y )Ng{Gz?)stdr   )
isinstancer   r   r   weightr   init	constant_)r   ms     r!   r   zDINOHead._init_weights   sZ    a#!((-!RYY'AFF,>!!!&&!, -?' $r"   c                     | j                  |      }|j                  t        j                  k(  rdnd}t        j
                  j                  |dd|      }| j                  |      }|S )Ngư>g-q=   )dimpeps)r   dtypetorchfloat16r   
functional	normalizer   )r   xr/   s      r!   forwardzDINOHead.forward$   sU    HHQKgg.dEMM##A2#<OOAr"   )F   i      T)__name__
__module____qualname__r   r   r6   __classcell__)r    s   @r!   r   r      s#    
 /"-r"   r   c                 x   | dk(  rt        j                  |||      S t        j                  |||      g}|r$|j                  t        j                  |             |j                  t        j                                t        | dz
        D ]r  }|j                  t        j                  |||             |r$|j                  t        j                  |             |j                  t        j                                t |j                  t        j                  |||             t        j                  | S )Nr   r   r,   )r   r   appendBatchNorm1dGELUrange
Sequential)r   r   r   r	   r
   r   layers_s           r!   r   r   ,   s    !|yyd;;))FJT:;MM"..45bggi w{# 	%AMM"))J
FGbnnZ89MM"'')$		%
 	bii
NFG}}f%%r"   )NFT)
r1   torch.nnr   torch.nn.initr   torch.nn.utilsr   Moduler   r    r"   r!   <module>rJ      s)      ' &ryy @&r"   