o
    پi&                     @   s   d Z ddlZddlZddl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 eeZG d	d
 d
e	jZG dd deZdS )zZ Image to Patch Hybird Embedding Layer

Hacked together by / Copyright 2020 Ross Wightman
    N)ListOptionalTupleUnion)nn   )Formatnchw_to)	to_2tuple)resample_patch_embedc                       s.  e Zd ZU dZeed< ejje	 ed< 																
d'de
jdeeeeef f deeeeef f deeeeeef f  deeeeeef f  dedede	de	de	dee de	de	f fddZ					d(deeeeef f deeeeef f deeeeeef f  deeeeeef f  dee f
ddZ					d)deeeeeef f  deeeeeef f  deeeeeef f  deeeeeef f  dee f
ddZd*deeeef ef fddZdeeef deeef fd d!Zejjd*d"e	fd#d$Zd%d& Z  ZS )+HybridEmbedd CNN Feature Map Embedding
    Extract feature map from CNN, flatten, project to embedding dim.
    
output_fmtdynamic_img_pad   r   N      TFbackboneimg_size
patch_sizefeature_sizefeature_ratioin_chans	embed_dimbiasprojflattenstrict_img_sizec                    s  t    t|tjsJ || _|| _| j||||d\| _| _	| _
| _| _| _| _|d ur7d| _t|| _n|
| _tj| _|| _|| _|s`| j
d | j	d  dkr^| j
d | j	d  dks`J |	rptj| j||||d| _d S | j|ksJ d| j d| dt | _d S )	N)r   r   r   r   Fr   r   kernel_sizestrider   zThe feature dim (z must match embed dim (z) when projection disabled.)super__init__
isinstancer   Moduler   r   _init_backboner   r   r   r   feature_dim	grid_sizenum_patchesr   r   r   NCHWr   r   Conv2dr   Identity)selfr   r   r   r   r   r   r   r   r   r   r   r   r   	__class__ L/home/ubuntu/.local/lib/python3.10/site-packages/timm/layers/hybrid_embed.pyr"      sN   
	4zHybridEmbed.__init__r&   c           
   
   C   sF  t |}t |}|d u ret @ | jj}|r| j  | td| j|d |d }t|t	t
fr7|d }|jdd  }|jd }| j| W d    n1 sSw   Y  t
dd t||D }n!t |}t |pmd}|d u rt| jdr| jj d }n| jj}t
d	d t||D }|d |d  }	|||||||	fS )
Nr   r   c                 S      g | ]\}}|| qS r/   r/   ).0sfr/   r/   r0   
<listcomp>n       z.HybridEmbed._init_backbone.<locals>.<listcomp>   feature_infoc                 S   r3   r/   r/   )r4   r6   pr/   r/   r0   r7   w   r8   )r
   torchno_gradr   trainingevalzerosr   r#   listtupleshapetrainziphasattrr:   channelsnum_features)
r,   r   r   r   r   r&   r>   or'   r(   r/   r/   r0   r%   X   s0   

 
zHybridEmbed._init_backbonec                 C   s<  |d us
|d us
J |p| j }d }|d urt|}|d urs|| jkrst| jtjs-J dt 8 tj| jj	| jj
||| jjd ud}|jt| jj|dd | jjd ur_|j| jj || _W d    n1 slw   Y  |}|pw| j}|| j ks|| jkr| j|||||d\| _ | _| _| _| _| _| _d S d S )Nz>HybridEmbed must have a projection layer to change patch size.r   T)verbose)r   r   r   r   r&   )r   r
   r   r#   r   r   r*   r<   r=   in_channelsout_channelsr   weightcopy_r   r%   r   r   r&   r'   r(   )r,   r   r   r   r   r&   new_patch_sizenew_projr/   r/   r0   set_input_size{   sN   



	zHybridEmbed.set_input_sizereturnc                 C   s8   | j d | jd  | j d | jd  f}|rt|S |S )Nr   r   )r   r   max)r,   	as_scalartotal_reductionr/   r/   r0   
feat_ratio   s   zHybridEmbed.feat_ratioc                 C   s~   |d | j d  |d | j d  f}| jr-t|d | jd  t|d | jd  fS |d | jd  |d | jd  fS )zb Get feature grid size taking account dynamic padding and backbone network feat reduction
        r   r   )r   r   mathceilr   )r,   r   	feat_sizer/   r/   r0   dynamic_feat_size   s   $0$zHybridEmbed.dynamic_feat_sizeenablec                 C   :   t | jdr| jj|d d S t | jdr|| j_d S d S Nset_grad_checkpointing)r[   grad_checkpointingrF   r   r^   r_   r,   r[   r/   r/   r0   r^      
   z"HybridEmbed.set_grad_checkpointingc                 C   s   |  |}t|ttfr|d }|j\}}}}| jrF| jd || jd   | jd  }| jd || jd   | jd  }t|d|d|f}| 	|}| j
rY|
ddd}|S | jtjkret|| j}|S )Nr1   r   r      )r   r#   rA   rB   rC   r   r   Fpadr   r   	transposer   r   r)   r	   )r,   x_HWpad_hpad_wr/   r/   r0   forward   s   
""
zHybridEmbed.forward)r   r   NNr   r   TTTNTF)r   r   NNN)NNNNNT)__name__
__module____qualname____doc__r   __annotations__r<   jitFinalboolr   r$   r   intr   r   strr"   r%   rQ   rV   rZ   ignorer^   rm   __classcell__r/   r/   r-   r0   r      s   
 	
>
%
 /"
	r   c                       s   e Zd ZdZ								ddejd	eeeeef f d
eeeeef f de	eeeeef f  de	eeeeef f  dedef fddZ
ejjddefddZdeejee f fddZ  ZS )HybridEmbedWithSizer   r   r   Nr   r   Tr   r   r   r   r   r   r   c
           
         s"   t  j|||||||||	d	 d S )N)	r   r   r   r   r   r   r   r   r   )r!   r"   )
r,   r   r   r   r   r   r   r   r   r   r-   r/   r0   r"      s   
zHybridEmbedWithSize.__init__r[   c                 C   r\   r]   r`   ra   r/   r/   r0   r^      rb   z*HybridEmbedWithSize.set_grad_checkpointingrR   c                 C   sJ   |  |}t|ttfr|d }| |}|ddd|jdd  fS )Nr1   rc   r   r2   )r   r#   rA   rB   r   r   rf   rC   )r,   rg   r/   r/   r0   rm      s
   

 zHybridEmbedWithSize.forward)r   r   NNr   r   TTrn   )ro   rp   rq   rr   r   r$   r   rw   r   r   r"   r<   rt   ry   rv   r^   Tensorr   rm   rz   r/   r/   r-   r0   r{      s8    $r{   )rr   loggingrW   typingr   r   r   r   r<   r   torch.nn.functional
functionalrd   formatr   r	   helpersr
   patch_embedr   	getLoggerro   _loggerr$   r   r{   r/   r/   r/   r0   <module>   s    
 A