o
    	۷iV7                     @   s`  d Z ddl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mZ ddlmZ dd	lmZmZ d
dlmZ eeZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZeG dd deZ eG dd de Z!ed d!G d"d# d#e Z"g d$Z#dS )%zPyTorch RegNet model.    N)Optional)Tensornn   )ACT2FN)BaseModelOutputWithNoAttention(BaseModelOutputWithPoolingAndNoAttention$ImageClassifierOutputWithNoAttention)PreTrainedModel)auto_docstringlogging   )RegNetConfigc                       sL   e Zd Z				ddededededed	ee f fd
dZdd Z  ZS )RegNetConvLayerr   r   reluin_channelsout_channelskernel_sizestridegroups
activationc              	      sX   t    tj|||||d |dd| _t|| _|d ur%t| | _	d S t | _	d S )N   F)r   r   paddingr   bias)
super__init__r   Conv2dconvolutionBatchNorm2dnormalizationr   Identityr   )selfr   r   r   r   r   r   	__class__ `/home/ubuntu/vllm_env/lib/python3.10/site-packages/transformers/models/regnet/modeling_regnet.pyr   &   s   
		$zRegNetConvLayer.__init__c                 C   s"   |  |}| |}| |}|S N)r   r   r   r!   hidden_stater$   r$   r%   forward<   s   


zRegNetConvLayer.forward)r   r   r   r   )	__name__
__module____qualname__intr   strr   r)   __classcell__r$   r$   r"   r%   r   %   s&    r   c                       s.   e Zd ZdZdef fddZdd Z  ZS )RegNetEmbeddingszO
    RegNet Embeddings (stem) composed of a single aggressive convolution.
    configc                    s0   t    t|j|jdd|jd| _|j| _d S )Nr   r   )r   r   r   )r   r   r   num_channelsembedding_size
hidden_actembedderr!   r1   r"   r$   r%   r   H   s
   
zRegNetEmbeddings.__init__c                 C   s*   |j d }|| jkrtd| |}|S )Nr   zeMake sure that the channel dimension of the pixel values match with the one set in the configuration.)shaper2   
ValueErrorr5   )r!   pixel_valuesr2   r(   r$   r$   r%   r)   O   s   


zRegNetEmbeddings.forward)r*   r+   r,   __doc__r   r   r)   r/   r$   r$   r"   r%   r0   C   s    r0   c                       sB   e Zd ZdZddededef fddZded	efd
dZ  ZS )RegNetShortCutz
    RegNet shortcut, used to project the residual features to the correct size. If needed, it is also used to
    downsample the input using `stride=2`.
    r   r   r   r   c                    s0   t    tj||d|dd| _t|| _d S )Nr   F)r   r   r   )r   r   r   r   r   r   r   )r!   r   r   r   r"   r$   r%   r   `   s   
zRegNetShortCut.__init__inputreturnc                 C   s   |  |}| |}|S r&   )r   r   )r!   r<   r(   r$   r$   r%   r)   e   s   

zRegNetShortCut.forward)r   )	r*   r+   r,   r:   r-   r   r   r)   r/   r$   r$   r"   r%   r;   Z   s    r;   c                       s2   e Zd ZdZdedef fddZdd Z  ZS )RegNetSELayerz
    Squeeze and Excitation layer (SE) proposed in [Squeeze-and-Excitation Networks](https://huggingface.co/papers/1709.01507).
    r   reduced_channelsc              	      sL   t    td| _ttj||ddt tj||ddt | _	d S )Nr   r   r   )r   )
r   r   r   AdaptiveAvgPool2dpooler
Sequentialr   ReLUSigmoid	attention)r!   r   r?   r"   r$   r%   r   p   s   

zRegNetSELayer.__init__c                 C   s    |  |}| |}|| }|S r&   )rB   rF   )r!   r(   pooledrF   r$   r$   r%   r)   {   s   

zRegNetSELayer.forward)r*   r+   r,   r:   r-   r   r)   r/   r$   r$   r"   r%   r>   k   s    r>   c                	       <   e Zd ZdZddedededef fddZd	d
 Z  ZS )RegNetXLayerzt
    RegNet's layer composed by three `3x3` convolutions, same as a ResNet bottleneck layer with reduction = 1.
    r   r1   r   r   r   c              
      s   t    ||kp|dk}td||j }|rt|||dnt | _tt	||d|j
dt	|||||j
dt	||dd d| _t|j
 | _d S )Nr   r   r   r   r   r   r   )r   r   maxgroups_widthr;   r   r    shortcutrC   r   r4   layerr   r   r!   r1   r   r   r   should_apply_shortcutr   r"   r$   r%   r      s   
zRegNetXLayer.__init__c                 C   .   |}|  |}| |}||7 }| |}|S r&   rP   rO   r   r!   r(   residualr$   r$   r%   r)         


zRegNetXLayer.forwardr   	r*   r+   r,   r:   r   r-   r   r)   r/   r$   r$   r"   r%   rI      s     rI   c                	       rH   )RegNetYLayerzC
    RegNet's Y layer: an X layer with Squeeze and Excitation.
    r   r1   r   r   r   c                    s   t    ||kp|dk}td||j }|rt|||dnt | _tt	||d|j
dt	|||||j
dt|tt|d dt	||dd d| _t|j
 | _d S )Nr   rJ   rK   rL      )r?   )r   r   rM   rN   r;   r   r    rO   rC   r   r4   r>   r-   roundrP   r   r   rQ   r"   r$   r%   r      s   
zRegNetYLayer.__init__c                 C   rS   r&   rT   rU   r$   r$   r%   r)      rW   zRegNetYLayer.forwardrX   rY   r$   r$   r"   r%   rZ      s     rZ   c                       sD   e Zd ZdZ		ddededededef
 fdd	Zd
d Z  ZS )RegNetStagez4
    A RegNet stage composed by stacked layers.
    r   r1   r   r   r   depthc                    sZ   t     jdkrtnttj ||dg fddt|d D R  | _d S )NxrJ   c                    s   g | ]} qS r$   r$   ).0_r1   rP   r   r$   r%   
<listcomp>   s    z(RegNetStage.__init__.<locals>.<listcomp>r   )	r   r   
layer_typerI   rZ   r   rC   rangelayers)r!   r1   r   r   r   r^   r"   rb   r%   r      s   
zRegNetStage.__init__c                 C   s   |  |}|S r&   )rf   r'   r$   r$   r%   r)      s   
zRegNetStage.forward)r   r   rY   r$   r$   r"   r%   r]      s     	r]   c                	       s@   e Zd Zdef fddZ	ddededed	efd
dZ  Z	S )RegNetEncoderr1   c              	      s   t    tg | _| jt||j|jd |j	rdnd|j
d d t|j|jdd  }t||j
dd  D ]\\}}}| jt||||d q9d S )Nr   r   r   )r   r^   )r^   )r   r   r   
ModuleListstagesappendr]   r3   hidden_sizesdownsample_in_first_stagedepthszip)r!   r1   in_out_channelsr   r   r^   r"   r$   r%   r      s   
	 zRegNetEncoder.__init__FTr(   output_hidden_statesreturn_dictr=   c                 C   sb   |rdnd }| j D ]}|r||f }||}q	|r||f }|s+tdd ||fD S t||dS )Nr$   c                 s   s    | ]	}|d ur|V  qd S r&   r$   )r`   vr$   r$   r%   	<genexpr>   s    z(RegNetEncoder.forward.<locals>.<genexpr>)last_hidden_statehidden_states)ri   tupler   )r!   r(   rp   rq   ru   stage_moduler$   r$   r%   r)      s   



zRegNetEncoder.forward)FT)
r*   r+   r,   r   r   r   boolr   r)   r/   r$   r$   r"   r%   rg      s    rg   c                   @   s,   e Zd ZU eed< dZdZdgZdd ZdS )RegNetPreTrainedModelr1   regnetr9   rZ   c                 C   s   t |tjrtjj|jddd d S t |tjrMtjj|jt	dd |j
d urKtj|j\}}|dkr=dt	| nd}tj|j
| | d S d S t |tjtjfrhtj|jd tj|j
d d S d S )Nfan_outr   )modenonlinearity   )ar   r   )
isinstancer   r   initkaiming_normal_weightLinearkaiming_uniform_mathsqrtr   _calculate_fan_in_and_fan_outuniform_r   	GroupNorm	constant_)r!   modulefan_inra   boundr$   r$   r%   _init_weights  s   
z#RegNetPreTrainedModel._init_weightsN)	r*   r+   r,   r   __annotations__base_model_prefixmain_input_name_no_split_modulesr   r$   r$   r$   r%   ry     s   
 ry   c                
       sF   e Zd Z fddZe	d
dedee dee defdd	Z	  Z
S )RegNetModelc                    s>   t  | || _t|| _t|| _td| _	| 
  d S )Nr@   )r   r   r1   r0   r5   rg   encoderr   rA   rB   	post_initr6   r"   r$   r%   r     s   

zRegNetModel.__init__Nr9   rp   rq   r=   c                 C   s|   |d ur|n| j j}|d ur|n| j j}| |}| j|||d}|d }| |}|s6||f|dd   S t|||jdS )Nrp   rq   r   r   )rt   pooler_outputru   )r1   rp   use_return_dictr5   r   rB   r   ru   )r!   r9   rp   rq   embedding_outputencoder_outputsrt   pooled_outputr$   r$   r%   r)   &  s    

zRegNetModel.forward)NN)r*   r+   r,   r   r   r   r   rx   r   r)   r/   r$   r$   r"   r%   r     s    	r   z
    RegNet Model with an image classification head on top (a linear layer on top of the pooled features), e.g. for
    ImageNet.
    )custom_introc                       s\   e Zd Z fddZe				ddeej deej dee	 dee	 de
f
d	d
Z  ZS )RegNetForImageClassificationc                    s^   t  | |j| _t|| _tt |jdkr#t|j	d |jnt
 | _|   d S )Nr   )r   r   
num_labelsr   rz   r   rC   Flattenr   rk   r    
classifierr   r6   r"   r$   r%   r   K  s   
$z%RegNetForImageClassification.__init__Nr9   labelsrp   rq   r=   c           
      C   s   |dur|n| j j}| j|||d}|r|jn|d }| |}d}|dur.| ||| j }|sD|f|dd  }	|durB|f|	 S |	S t|||jdS )a0  
        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 classification loss is computed (Cross-Entropy).
        Nr   r   r   )losslogitsru   )r1   r   rz   r   r   loss_functionr	   ru   )
r!   r9   r   rp   rq   outputsr   r   r   outputr$   r$   r%   r)   W  s   
z$RegNetForImageClassification.forward)NNNN)r*   r+   r,   r   r   r   torchFloatTensor
LongTensorrx   r	   r)   r/   r$   r$   r"   r%   r   C  s$    r   )r   r   ry   )$r:   r   typingr   r   r   r   activationsr   modeling_outputsr   r   r	   modeling_utilsr
   utilsr   r   configuration_regnetr   
get_loggerr*   loggerModuler   r0   r;   r>   rI   rZ   r]   rg   ry   r   r   __all__r$   r$   r$   r%   <module>   s8   
!&'.