o
    hK                     @   s  d Z ddlmZ ddlZddlZddlmZmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZ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 eeZ dZ!dZ"g dZ#dZ$dZ%dg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Z/d"Z0d#Z1ed$e0G d%d& d&e/Z2ed'e0G d(d) d)e/Z3ed*e0G d+d, d,e/eZ4dS )-z PyTorch ResNet model.    )OptionalN)Tensornn)BCEWithLogitsLossCrossEntropyLossMSELoss   )ACT2FN)BackboneOutputBaseModelOutputWithNoAttention(BaseModelOutputWithPoolingAndNoAttention$ImageClassifierOutputWithNoAttention)PreTrainedModel)add_code_sample_docstringsadd_start_docstrings%add_start_docstrings_to_model_forwardloggingreplace_return_docstrings)BackboneMixin   )ResNetConfigr   zmicrosoft/resnet-50)r   i      r   z	tiger catc                       sH   e Zd Z	ddededededef
 fd	d
ZdedefddZ  ZS )ResNetConvLayerr   r   reluin_channelsout_channelskernel_sizestride
activationc                    sV   t    tj|||||d dd| _t|| _|d ur$t| | _	d S t | _	d S )N   F)r   r   paddingbias)
super__init__r   Conv2dconvolutionBatchNorm2dnormalizationr	   Identityr   )selfr   r   r   r   r   	__class__ `/var/www/html/ai/venv/lib/python3.10/site-packages/transformers/models/resnet/modeling_resnet.pyr#   ?   s   
$zResNetConvLayer.__init__inputreturnc                 C   s"   |  |}| |}| |}|S N)r%   r'   r   r)   r.   hidden_stater,   r,   r-   forwardI   s   


zResNetConvLayer.forward)r   r   r   )	__name__
__module____qualname__intstrr#   r   r3   __classcell__r,   r,   r*   r-   r   >   s    
r   c                       s8   e Zd ZdZdef fddZdedefddZ  ZS )	ResNetEmbeddingszO
    ResNet Embeddings (stem) composed of a single aggressive convolution.
    configc                    sB   t    t|j|jdd|jd| _tjdddd| _	|j| _d S )Nr   r   )r   r   r   r   r   )r   r   r    )
r"   r#   r   num_channelsembedding_size
hidden_actembedderr   	MaxPool2dpoolerr)   r;   r*   r,   r-   r#   U   s   
zResNetEmbeddings.__init__pixel_valuesr/   c                 C   s4   |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.)shaper<   
ValueErrorr?   rA   )r)   rC   r<   	embeddingr,   r,   r-   r3   ]   s   



zResNetEmbeddings.forward)	r4   r5   r6   __doc__r   r#   r   r3   r9   r,   r,   r*   r-   r:   P   s    r:   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 )ResNetShortCutz
    ResNet 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#   n   s   
zResNetShortCut.__init__r.   r/   c                 C   s   |  |}| |}|S r0   )r%   r'   r1   r,   r,   r-   r3   s   s   

zResNetShortCut.forward)r   )	r4   r5   r6   rG   r7   r#   r   r3   r9   r,   r,   r*   r-   rH   h   s    rH   c                	       s<   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 )ResNetBasicLayerzO
    A classic ResNet's residual layer composed by two `3x3` convolutions.
    r   r   r   r   r   r   c                    sf   t    ||kp|dk}|rt|||dnt | _tt|||dt||d d| _t	| | _
d S )Nr   r   r   r"   r#   rH   r   r(   shortcut
Sequentialr   layerr	   r   )r)   r   r   r   r   should_apply_shortcutr*   r,   r-   r#   ~   s   
zResNetBasicLayer.__init__c                 C   .   |}|  |}| |}||7 }| |}|S r0   rO   rM   r   r)   r2   residualr,   r,   r-   r3         


zResNetBasicLayer.forward)r   r   )	r4   r5   r6   rG   r7   r8   r#   r3   r9   r,   r,   r*   r-   rI   y   s     rI   c                       sL   e Zd ZdZ				ddededed	ed
edef fddZdd Z  Z	S )ResNetBottleNeckLayera  
    A classic ResNet's bottleneck layer composed by three `3x3` convolutions.

    The first `1x1` convolution reduces the input by a factor of `reduction` in order to make the second `3x3`
    convolution faster. The last `1x1` convolution remaps the reduced features to `out_channels`. If
    `downsample_in_bottleneck` is true, downsample will be in the first layer instead of the second layer.
    r   r      Fr   r   r   r   	reductiondownsample_in_bottleneckc           	   
      s   t    ||kp|dk}|| }|rt|||dnt | _tt||d|r)|nddt|||s3|nddt||dd d| _t	| | _
d S )Nr   rJ   )r   r   )r   r   rL   )	r)   r   r   r   r   rX   rY   rP   reduces_channelsr*   r,   r-   r#      s   
	zResNetBottleNeckLayer.__init__c                 C   rQ   r0   rR   rS   r,   r,   r-   r3      rU   zResNetBottleNeckLayer.forward)r   r   rW   F)
r4   r5   r6   rG   r7   r8   boolr#   r3   r9   r,   r,   r*   r-   rV      s(    rV   c                       sN   e Zd ZdZ		ddededededef
 fdd	Zd
edefddZ  Z	S )ResNetStagez4
    A ResNet stage composed by stacked layers.
    r   r;   r   r   r   depthc                    s   t     jdkrtnt jdkr|| j jd}n	|| jd}tj|g fddt	|d D R  | _
d S )N
bottleneck)r   r   rY   )r   r   c                    s   g | ]
} j d qS )rK   )r>   ).0_r;   rO   r   r,   r-   
<listcomp>   s    z(ResNetStage.__init__.<locals>.<listcomp>r   )r"   r#   
layer_typerV   rI   r>   rY   r   rN   rangelayers)r)   r;   r   r   r   r]   first_layerr*   ra   r-   r#      s    

zResNetStage.__init__r.   r/   c                 C   s   |}| j D ]}||}q|S r0   )re   )r)   r.   r2   rO   r,   r,   r-   r3      s   

zResNetStage.forward)r   r   )
r4   r5   r6   rG   r   r7   r#   r   r3   r9   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 )ResNetEncoderr;   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\   r=   hidden_sizesdownsample_in_first_stagedepthszip)r)   r;   in_out_channelsr   r   r]   r*   r,   r-   r#      s   
	 zResNetEncoder.__init__FTr2   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 r0   r,   )r_   vr,   r,   r-   	<genexpr>  s    z(ResNetEncoder.forward.<locals>.<genexpr>)last_hidden_statehidden_states)ri   tupler   )r)   r2   rp   rq   ru   stage_moduler,   r,   r-   r3      s   



zResNetEncoder.forward)FT)
r4   r5   r6   r   r#   r   r[   r   r3   r9   r,   r,   r*   r-   rg      s    rg   c                   @   s$   e Zd ZdZeZdZdZdd ZdS )ResNetPreTrainedModelz
    An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
    models.
    resnetrC   c                 C   s^   t |tjrtjj|jddd d S t |tjtjfr-tj|jd tj|j	d d S d S )Nfan_outr   )modenonlinearityr   r   )

isinstancer   r$   initkaiming_normal_weightr&   	GroupNorm	constant_r!   )r)   moduler,   r,   r-   _init_weights  s   z#ResNetPreTrainedModel._init_weightsN)	r4   r5   r6   rG   r   config_classbase_model_prefixmain_input_namer   r,   r,   r,   r-   rx     s    rx   aH  
    This model is a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. Use it
    as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage and
    behavior.

    Parameters:
        config ([`ResNetConfig`]): Model configuration class with all the parameters of the model.
            Initializing with a config file does not load the weights associated with the model, only the
            configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights.
aF  
    Args:
        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
            Pixel values. Pixel values can be obtained using [`AutoImageProcessor`]. See
            [`ConvNextImageProcessor.__call__`] for details.

        output_hidden_states (`bool`, *optional*):
            Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
            more detail.
        return_dict (`bool`, *optional*):
            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
zOThe bare ResNet model outputting raw features without any specific head on top.c                       s\   e Zd Z fddZeeeeee	de
d	ddedee dee d	efd
dZ  ZS )ResNetModelc                    s>   t  | || _t|| _t|| _td| _	| 
  d S )N)r   r   )r"   r#   r;   r:   r?   rg   encoderr   AdaptiveAvgPool2drA   	post_initrB   r*   r,   r-   r#   <  s   

zResNetModel.__init__vision)
checkpointoutput_typer   modalityexpected_outputNrC   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   )r;   rp   use_return_dictr?   r   rA   r   ru   )r)   rC   rp   rq   embedding_outputencoder_outputsrt   pooled_outputr,   r,   r-   r3   E  s    

zResNetModel.forwardNN)r4   r5   r6   r#   r   RESNET_INPUTS_DOCSTRINGr   _CHECKPOINT_FOR_DOCr   _CONFIG_FOR_DOC_EXPECTED_OUTPUT_SHAPEr   r   r[   r3   r9   r,   r,   r*   r-   r   7  s(    	r   z
    ResNet Model with an image classification head on top (a linear layer on top of the pooled features), e.g. for
    ImageNet.
    c                       sp   e Zd Z fddZeeeeee	e
d				ddeej deej dee dee d	ef
d
dZ  ZS )ResNetForImageClassificationc                    s^   t  | |j| _t|| _tt |jdkr#t|j	d |jnt
 | _|   d S )Nr   )r"   r#   
num_labelsr   ry   r   rN   FlattenLinearrk   r(   
classifierr   rB   r*   r,   r-   r#   q  s   
$z%ResNetForImageClassification.__init__)r   r   r   r   NrC   labelsrp   rq   r/   c                 C   sb  |dur|n| j j}| j|||d}|r|jn|d }| |}d}|dur| j jdu rP| jdkr6d| j _n| jdkrL|jtj	ksG|jtj
krLd| j _nd| j _| j jdkrnt }	| jdkrh|	| | }n+|	||}n%| j jdkrt }	|	|d| j|d}n| j jdkrt }	|	||}|s|f|dd  }
|dur|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   
regressionsingle_label_classificationmulti_label_classificationr   r   )losslogitsru   )r;   r   ry   r   r   problem_typer   dtypetorchlongr7   r   squeezer   viewr   r   ru   )r)   rC   r   rp   rq   outputsr   r   r   loss_fctoutputr,   r,   r-   r3   }  s6   


"


z$ResNetForImageClassification.forward)NNNN)r4   r5   r6   r#   r   r   r   _IMAGE_CLASS_CHECKPOINTr   r   _IMAGE_CLASS_EXPECTED_OUTPUTr   r   FloatTensor
LongTensorr[   r3   r9   r,   r,   r*   r-   r   i  s0    r   zO
    ResNet backbone, to be used with frameworks like DETR and MaskFormer.
    c                       sV   e Zd Z fddZeeeeed	dde	de
e de
e defd	d
Z  ZS )ResNetBackbonec                    sH   t  | t  | |jg|j | _t|| _t|| _	| 
  d S r0   )r"   r#   _init_backboner=   rk   num_featuresr:   r?   rg   r   r   rB   r*   r,   r-   r#     s   

zResNetBackbone.__init__)r   r   NrC   rp   rq   r/   c                 C   s   |dur|n| j j}|dur|n| j j}| |}| j|ddd}|j}d}t| jD ]\}}	|	| jv r;||| f7 }q+|sK|f}
|rI|
|jf7 }
|
S t	||rU|jddS dddS )a3  
        Returns:

        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/resnet-50")
        >>> model = AutoBackbone.from_pretrained(
        ...     "microsoft/resnet-50", 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, 2048, 7, 7]
        ```NTr   r,   )feature_mapsru   
attentions)
r;   r   rp   r?   r   ru   	enumeratestage_namesout_featuresr
   )r)   rC   rp   rq   r   r   ru   r   idxstager   r,   r,   r-   r3     s0   

zResNetBackbone.forwardr   )r4   r5   r6   r#   r   r   r   r
   r   r   r   r[   r3   r9   r,   r,   r*   r-   r     s    
r   )5rG   typingr   r   torch.utils.checkpointr   r   torch.nnr   r   r   activationsr	   modeling_outputsr
   r   r   r   modeling_utilsr   utilsr   r   r   r   r   utils.backbone_utilsr   configuration_resnetr   
get_loggerr4   loggerr   r   r   r   r   $RESNET_PRETRAINED_MODEL_ARCHIVE_LISTModuler   r:   rH   rI   rV   r\   rg   rx   RESNET_START_DOCSTRINGr   r   r   r   r,   r,   r,   r-   <module>   sZ   
*&).F