U
    ,-eQJ                     @   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"ddddg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-50i      z	tiger catc                       s<   e Zd Zd
eeeeed fddZeeddd	Z  ZS )ResNetConvLayerr   r   relu)in_channelsout_channelskernel_sizestride
activationc                    sP   t    tj|||||d dd| _t|| _|d k	rBt| nt | _	d S )N   F)r   r   paddingbias)
super__init__r   Conv2dconvolutionBatchNorm2dnormalizationr	   Identityr   )selfr   r   r   r   r   	__class__ k/var/www/html/Darija-Ai-Train/env/lib/python3.8/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   r4   __classcell__r,   r,   r*   r-   r   >   s            
r   c                       s6   e Zd ZdZed fddZeed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   Z	MaxPool2dpoolerr)   r=   r*   r,   r-   r#   U   s    
    zResNetEmbeddings.__init__)pixel_valuesr0   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>   
ValueErrorrA   rB   )r)   rD   r>   Z	embeddingr,   r,   r-   r4   ]   s    



zResNetEmbeddings.forward)	r5   r6   r7   __doc__r   r#   r   r4   r:   r,   r,   r*   r-   r;   P   s   r;   c                       s<   e Zd ZdZd	eeed fddZeed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.   c                 C   s   |  |}| |}|S r1   )r%   r'   r2   r,   r,   r-   r4   s   s    

zResNetShortCut.forward)r   )	r5   r6   r7   rG   r8   r#   r   r4   r:   r,   r,   r*   r-   rH   h   s   rH   c                       s6   e Zd ZdZd	eeeed 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   s.   |}|  |}| |}||7 }| |}|S r1   rO   rM   r   r)   r3   Zresidualr,   r,   r-   r4      s    


zResNetBasicLayer.forward)r   r   	r5   r6   r7   rG   r8   r9   r#   r4   r:   r,   r,   r*   r-   rI   y   s   rI   c                       s8   e Zd ZdZd
eeeeed 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`.
    r   r      )r   r   r   r   	reductionc              
      s|   t    ||kp|dk}|| }|r4t|||dnt | _tt||ddt|||dt||dd d| _t	| | _
d S )Nr   rJ   )r   )r   r   rL   )r)   r   r   r   r   rV   rP   Zreduces_channelsr*   r,   r-   r#      s    
zResNetBottleNeckLayer.__init__c                 C   s.   |}|  |}| |}||7 }| |}|S r1   rQ   rR   r,   r,   r-   r4      s    


zResNetBottleNeckLayer.forward)r   r   rU   rS   r,   r,   r*   r-   rT      s            rT   c                       s@   e Zd ZdZd	eeeeed fddZeedddZ  Z	S )
ResNetStagez4
    A ResNet stage composed by stacked layers.
    r   )r=   r   r   r   depthc                    sZ   t     jdkrtnttj|| jdf fddt|d D  | _	d S )NZ
bottleneck)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#   Z
layer_typerT   rI   r   rN   r@   rangelayers)r)   r=   r   r   r   rX   r*   r[   r-   r#      s    
zResNetStage.__init__r.   c                 C   s   |}| j D ]}||}q
|S r1   )r^   )r)   r/   r3   rO   r,   r,   r-   r4      s    

zResNetStage.forward)r   r   )
r5   r6   r7   rG   r   r8   r#   r   r4   r:   r,   r,   r*   r-   rW      s   	  rW   c                       s8   e Zd Zed fddZd	eeeedddZ  Z	S )
ResNetEncoderr<   c              	      s   t    tg | _| jt||j|jd |j	r6dnd|j
d d t|j|jdd  }t||j
dd  D ]$\\}}}| jt||||d qrd S )Nr   r   r   )r   rX   )rX   )r"   r#   r   Z
ModuleListstagesappendrW   r?   hidden_sizesZdownsample_in_first_stageZdepthszip)r)   r=   Zin_out_channelsr   r   rX   r*   r,   r-   r#      s    
	 zResNetEncoder.__init__FT)r3   output_hidden_statesreturn_dictr0   c                 C   sb   |rdnd }| j D ]}|r$||f }||}q|r<||f }|sVtdd ||fD S t||dS )Nr,   c                 s   s   | ]}|d k	r|V  qd S r1   r,   )rY   vr,   r,   r-   	<genexpr>   s      z(ResNetEncoder.forward.<locals>.<genexpr>)last_hidden_statehidden_states)r`   tupler   )r)   r3   rd   re   ri   Zstage_moduler,   r,   r-   r4      s    



zResNetEncoder.forward)FT)
r5   r6   r7   r   r#   r   boolr   r4   r:   r,   r,   r*   r-   r_      s        r_   c                   @   s2   e Zd ZdZeZdZdZdZdd Z	ddd	Z
d
S )ResNetPreTrainedModelz
    An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
    models.
    resnetrD   Tc                 C   sX   t |tjr"tjj|jddd n2t |tjtjfrTtj|jd tj|j	d d S )NZfan_outr   )modeZnonlinearityr   r   )

isinstancer   r$   initZkaiming_normal_weightr&   Z	GroupNormZ	constant_r!   )r)   moduler,   r,   r-   _init_weights  s
    z#ResNetPreTrainedModel._init_weightsFc                 C   s   t |tr||_d S r1   )ro   r_   Zgradient_checkpointing)r)   rr   valuer,   r,   r-   _set_gradient_checkpointing  s    
z1ResNetPreTrainedModel._set_gradient_checkpointingN)F)r5   r6   r7   rG   r   config_classZbase_model_prefixZmain_input_nameZsupports_gradient_checkpointingrs   ru   r,   r,   r,   r-   rl      s   rl   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                       sT   e Zd Z fddZeeeeee	de
dd	eee ee edddZ  ZS )
ResNetModelc                    s>   t  | || _t|| _t|| _td| _	| 
  d S )N)r   r   )r"   r#   r=   r;   rA   r_   encoderr   ZAdaptiveAvgPool2drB   	post_initrC   r*   r,   r-   r#   0  s    

zResNetModel.__init__Zvision)
checkpointoutput_typerv   Zmodalityexpected_outputNrD   rd   re   r0   c                 C   s|   |d k	r|n| j j}|d k	r |n| j j}| |}| j|||d}|d }| |}|sl||f|dd   S t|||jdS )Nrd   re   r   r   )rh   pooler_outputri   )r=   rd   use_return_dictrA   rx   rB   r   ri   )r)   rD   rd   re   embedding_outputZencoder_outputsrh   pooled_outputr,   r,   r-   r4   9  s$    
  
zResNetModel.forward)NN)r5   r6   r7   r#   r   RESNET_INPUTS_DOCSTRINGr   _CHECKPOINT_FOR_DOCr   _CONFIG_FOR_DOC_EXPECTED_OUTPUT_SHAPEr   r   rk   r4   r:   r,   r,   r*   r-   rw   +  s"   	     rw   z
    ResNet Model with an image classification head on top (a linear layer on top of the pooled features), e.g. for
    ImageNet.
    c                	       s`   e Zd Z fddZeeeeee	e
ddeej eej ee ee edddZ  ZS )	ResNetForImageClassificationc                    s^   t  | |j| _t|| _tt |jdkrFt|j	d |jnt
 | _|   d S )Nr   )r"   r#   
num_labelsrw   rm   r   rN   ZFlattenZLinearrb   r(   
classifierry   rC   r*   r,   r-   r#   e  s    
$z%ResNetForImageClassification.__init__)rz   r{   rv   r|   N)rD   labelsrd   re   r0   c                 C   sl  |dk	r|n| j j}| j|||d}|r.|jn|d }| |}d}|dk	r,| j jdkr| jdkrnd| j _n4| jdkr|jtj	ks|jtj
krd| j _nd| j _| j jdkrt }	| jdkr|	| | }n
|	||}nN| j jdkrt }	|	|d| j|d}n| j jdkr,t }	|	||}|s\|f|dd  }
|dk	rX|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   Z
regressionZsingle_label_classificationZmulti_label_classificationr   r   )losslogitsri   )r=   r   rm   r   r   Zproblem_typer   Zdtypetorchlongr8   r   Zsqueezer   viewr   r   ri   )r)   rD   r   rd   re   outputsr   r   r   Zloss_fctoutputr,   r,   r-   r4   q  s6    



"


z$ResNetForImageClassification.forward)NNNN)r5   r6   r7   r#   r   r   r   _IMAGE_CLASS_CHECKPOINTr   r   _IMAGE_CLASS_EXPECTED_OUTPUTr   r   ZFloatTensorZ
LongTensorrk   r4   r:   r,   r,   r*   r-   r   ]  s&       r   zO
    ResNet backbone, to be used with frameworks like DETR and MaskFormer.
    c                       sN   e Zd Z fddZeeeeedde	e
e e
e edddZ  ZS )	ResNetBackbonec                    sH   t  | t  | |jg|j | _t|| _t|| _	| 
  d S r1   )r"   r#   Z_init_backboner?   rb   Znum_featuresr;   rA   r_   rx   ry   rC   r*   r,   r-   r#     s    

zResNetBackbone.__init__)r{   rv   Nr}   c                 C   s   |dk	r|n| j j}|dk	r |n| j j}| |}| j|ddd}|j}d}t| jD ] \}}	|	| jkrV||| f7 }qV|s|f}
|r|
|jf7 }
|
S t	||r|jn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_mapsri   Z
attentions)
r=   r   rd   rA   rx   ri   	enumerateZstage_namesZout_featuresr
   )r)   rD   rd   re   r   r   ri   r   idxZstager   r,   r,   r-   r4     s(    

zResNetBackbone.forward)NN)r5   r6   r7   r#   r   r   r   r
   r   r   r   rk   r4   r:   r,   r,   r*   r-   r     s   
     r   )5rG   typingr   r   Ztorch.utils.checkpointr   r   Ztorch.nnr   r   r   Zactivationsr	   Zmodeling_outputsr
   r   r   r   Zmodeling_utilsr   utilsr   r   r   r   r   Zutils.backbone_utilsr   Zconfiguration_resnetr   Z
get_loggerr5   loggerr   r   r   r   r   Z$RESNET_PRETRAINED_MODEL_ARCHIVE_LISTModuler   r;   rH   rI   rT   rW   r_   rl   ZRESNET_START_DOCSTRINGr   rw   r   r   r,   r,   r,   r-   <module>   sX   
!).F