o
    ={cV                  	   @   s  d Z ddlm  mZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ d
ZdddddddddZda								dFddZdGddZdHd d!ZdId#d$ZdHd%d&Z			'		dJd(d)ZdKd*d+Zed,d-d.						dLd/d0Zed1d2						dLd3d4Zed5d6						dLd7d8Zed9d:dMd;d<Zed=d>dNd@dAZ ej!j"dBej#ej$dCe_ ej j e _ dDZ%e&edEej e%  e&edEej e%  e&edEej e%  dS )OzResNet models for Keras.

Reference:
  - [Deep Residual Learning for Image Recognition](
      https://arxiv.org/abs/1512.03385) (CVPR 2015)
    N)backend)imagenet_utils)training)VersionAwareLayers)
data_utils)layer_utils)keras_exportzDhttps://storage.googleapis.com/tensorflow/keras-applications/resnet/)Z 2cb95161c43110f7111970584f804107Z 4d473c1dd8becc155b73f8504c6f6626)Z f1aeb4b969a6efcfb50fad2f0c20cfc5Z 88cf7a10940856eca736dc7b7e228a21)Z 100835be76be38e30d865e96f2aaae62Z ee4c566cf9a93f14d82f913c2dc6dd0c)Z 3ef43a0b657b3be2300d5770ece849e0Z fac2f116257151a9d068a22e544a4917)Z 6343647c601c52e1368623803854d971Z c0ed64b8031c3730f411d2eb4eea35b5)Z a49b44d1979771252814e80f8ec446f9Z ed17cf2e0169df9d443503ef94b23b33)Z 67a5b30d522ed92f75a1f16eef299d1aZ 62527c363bdd9ec598bed41947b379fc)Z 34fb605428fcc7aa4d62f44404c11509Z 0f678c91647380debd923963594981b3)resnet50	resnet101	resnet152Z
resnet50v2Zresnet101v2Zresnet152v2Z	resnext50Z
resnext101resnetTimagenet  softmaxc                 K   s  d|v r
| dant a|rtd| |dv s%tjj|s%td|dkr3|r3|	dkr3tdtj	|dd	t
 ||d
}|du rKtj|d}nt
|sXtj||d}n|}t
 dkrbdnd}tjddd|}tjddd|dd|}|stj|ddd|}tjddd|}tjdd d|}tjddd!d"|}| |}|rtj|dd#d|}tjdd$d|}|rtjd%d|}t|
| tj|	|
d&d'|}n|d(krtjd%d|}n|d)krtjd*d|}|durt|}n|}tj|||d}|dkr6|tv r6|r|d+ }t| d, }n
|d- }t| d }tj|t| d.|d/}|| |S |dur@|| |S )0a  Instantiates the ResNet, ResNetV2, and ResNeXt architecture.

    Args:
      stack_fn: a function that returns output tensor for the
        stacked residual blocks.
      preact: whether to use pre-activation or not
        (True for ResNetV2, False for ResNet and ResNeXt).
      use_bias: whether to use biases for convolutional layers or not
        (True for ResNet and ResNetV2, False for ResNeXt).
      model_name: string, model name.
      include_top: whether to include the fully-connected
        layer at the top of the network.
      weights: one of `None` (random initialization),
        'imagenet' (pre-training on ImageNet),
        or the path to the weights file to be loaded.
      input_tensor: optional Keras tensor
        (i.e. output of `layers.Input()`)
        to use as image input for the model.
      input_shape: optional shape tuple, only to be specified
        if `include_top` is False (otherwise the input shape
        has to be `(224, 224, 3)` (with `channels_last` data format)
        or `(3, 224, 224)` (with `channels_first` data format).
        It should have exactly 3 inputs channels.
      pooling: optional pooling mode for feature extraction
        when `include_top` is `False`.
        - `None` means that the output of the model will be
            the 4D tensor output of the
            last convolutional layer.
        - `avg` means that global average pooling
            will be applied to the output of the
            last convolutional layer, and thus
            the output of the model will be a 2D tensor.
        - `max` means that global max pooling will
            be applied.
      classes: optional number of classes to classify images
        into, only to be specified if `include_top` is True, and
        if no `weights` argument is specified.
      classifier_activation: A `str` or callable. The activation function to use
        on the "top" layer. Ignored unless `include_top=True`. Set
        `classifier_activation=None` to return the logits of the "top" layer.
        When loading pretrained weights, `classifier_activation` can only
        be `None` or `"softmax"`.
      **kwargs: For backwards compatibility only.

    Returns:
      A `keras.Model` instance.
    layerszUnknown argument(s): >   r   NzThe `weights` argument should be either `None` (random initialization), `imagenet` (pre-training on ImageNet), or the path to the weights file to be loaded.r   r   zWIf using `weights` as `"imagenet"` with `include_top` as true, `classes` should be 1000       )Zdefault_sizeZmin_sizedata_formatZrequire_flattenweightsN)shape)Ztensorr   channels_last      )r   r   r   Z	conv1_padZpaddingname@         Z
conv1_convstridesuse_biasr   >Zconv1_bnZaxisepsilonr   reluZ
conv1_relur   r   r   r(   Z	pool1_padZ
pool1_poolr    r   Zpost_bnZ	post_reluZavg_poolZpredictions)Z
activationr   ZavgmaxZmax_poolz&_weights_tf_dim_ordering_tf_kernels.h5r   z,_weights_tf_dim_ordering_tf_kernels_notop.h5Zmodels)Zcache_subdir	file_hash) popr   r   
ValueErrortfioZgfileexistsr   Zobtain_input_shaper   image_data_formatZInputZis_keras_tensorZeroPadding2DConv2DBatchNormalization
ActivationMaxPooling2DZGlobalAveragePooling2DZvalidate_activationZDenseZGlobalMaxPooling2Dr   Zget_source_inputsr   ZModelWEIGHTS_HASHESr   Zget_fileBASE_WEIGHTS_PATHZload_weights)stack_fnpreactr!   Z
model_nameinclude_topr   input_tensorinput_shapepoolingclassesZclassifier_activationkwargsZ	img_inputbn_axisxZinputsZmodel	file_namer+   Zweights_path rD   9lib/python3.10/site-packages/keras/applications/resnet.pyResNetL   s   >	



rF   r   r   c                 C   sJ  t  dkrdnd}|r(tjd| d||d d| }tj|d|d d	|}n| }tj|d||d
 d| } tj|d|d d	| } tjd|d d| } tj||d|d d| } tj|d|d d	| } tjd|d d| } tjd| d|d d| } tj|d|d d	| } tj|d d|| g} tjd|d d| } | S )a  A residual block.

    Args:
      x: input tensor.
      filters: integer, filters of the bottleneck layer.
      kernel_size: default 3, kernel size of the bottleneck layer.
      stride: default 1, stride of the first layer.
      conv_shortcut: default True, use convolution shortcut if True,
          otherwise identity shortcut.
      name: string, block label.

    Returns:
      Output tensor for the residual block.
    r   r   r      _0_convr)   r"   _0_bnr#   _1_conv_1_bnr%   _1_relur&   ZSAME_2_convr   _2_bn_2_relu_3_conv_3_bn_add_out)r   r1   r   r3   r4   r5   Add)rB   filterskernel_sizestrideconv_shortcutr   rA   shortcutrD   rD   rE   block1   sP   



rZ   r   c                 C   sH   t | |||d d} td|d D ]}t | |d|d t| d} q| S )ad  A set of stacked residual blocks.

    Args:
      x: input tensor.
      filters: integer, filters of the bottleneck layer in a block.
      blocks: integer, blocks in the stacked blocks.
      stride1: default 2, stride of the first layer in the first block.
      name: string, stack label.

    Returns:
      Output tensor for the stacked blocks.
    _block1rW   r   r   r   F_blockrX   r   )rZ   rangestrrB   rU   blocksstride1r   irD   rD   rE   stack1(  s   re   Fc           	      C   sf  t  dkrdnd}tj|d|d d| }tjd|d d	|}|r3tjd
| d||d d|}n|dkr@tjd|d| n| }tj|ddd|d d|} tj|d|d d| } tjd|d d	| } tjd|d d| } tj|||d|d d| } tj|d|d d| } tjd|d d	| } tjd
| d|d d	| } tj|d d	|| g} | S )a  A residual block.

    Args:
        x: input tensor.
        filters: integer, filters of the bottleneck layer.
        kernel_size: default 3, kernel size of the bottleneck layer.
        stride: default 1, stride of the first layer.
        conv_shortcut: default False, use convolution shortcut if True,
          otherwise identity shortcut.
        name: string, block label.

    Returns:
      Output tensor for the residual block.
    r   r   r   r"   Z
_preact_bnr#   r%   Z_preact_relur&   rG   rH   r)   )r    FrJ   r   rK   rL   r'   _2_padr   rM   rN   rO   rP   rS   )	r   r1   r   r4   r5   r3   r6   r2   rT   )	rB   rU   rV   rW   rX   r   rA   r:   rY   rD   rD   rE   block2=  sZ   


rg   c                 C   s^   t | |d|d d} td|D ]}t | ||d t| d} qt | |||d t| d} | S )ap  A set of stacked residual blocks.

    Args:
        x: input tensor.
        filters: integer, filters of the bottleneck layer in a block.
        blocks: integer, blocks in the stacked blocks.
        stride1: default 2, stride of the first layer in the first block.
        name: string, stack label.

    Returns:
        Output tensor for the stacked blocks.
    Tr[   r^   r   r]   r&   r\   )rg   r_   r`   ra   rD   rD   rE   stack2v  s
   rh   r   c           
   	      s  t  dkrdnd}|r+tjd| | d|d|d d| }tj|d|d	 d
|}n| }tj|dd|d d| } tj|d|d d
| } tjd|d d| } ||  tjd|d d| } tj|| d|d d| } t | dd }	t 	| t 
|	|  fg} tj fdd|d d| } t 	| t 
|	|fg} tj|d|d d
| } tjd|d d| } tjd| | dd|d d| } tj|d|d d
| } tj|d d|| g} tjd|d  d| } | S )!a  A residual block.

    Args:
      x: input tensor.
      filters: integer, filters of the bottleneck layer.
      kernel_size: default 3, kernel size of the bottleneck layer.
      stride: default 1, stride of the first layer.
      groups: default 32, group size for grouped convolution.
      conv_shortcut: default True, use convolution shortcut if True,
          otherwise identity shortcut.
      name: string, block label.

    Returns:
      Output tensor for the residual block.
    r   r   r   r   FrH   r   r"   rI   r#   rJ   )r!   r   rK   r%   rL   r&   r'   rf   r   rM   )r    Zdepth_multiplierr!   r   Nc                    s   t  fddtD S )Nc                 3   s2    | ]} d d d d d d d d |f V  qd S NrD   ).0rd   rB   rD   rE   	<genexpr>  s   0 z+block3.<locals>.<lambda>.<locals>.<genexpr>)sumr_   rl   crl   rE   <lambda>  s    zblock3.<locals>.<lambda>Z	_2_reducerN   rO   rP   rQ   rR   rS   )r   r1   r   r3   r4   r5   r2   ZDepthwiseConv2Dr   ZreshapeZconcatenateZLambdarT   )
rB   rU   rV   rW   groupsrX   r   rA   rY   Zx_shaperD   ro   rE   block3  s~   





rs   c              	   C   sL   t | ||||d d} td|d D ]}t | ||d|d t| d} q| S )a  A set of stacked residual blocks.

    Args:
      x: input tensor.
      filters: integer, filters of the bottleneck layer in a block.
      blocks: integer, blocks in the stacked blocks.
      stride1: default 2, stride of the first layer in the first block.
      groups: default 32, group size for grouped convolution.
      name: string, stack label.

    Returns:
      Output tensor for the stacked blocks.
    r[   )rW   rr   r   r   r   Fr]   )rr   rX   r   )rs   r_   r`   )rB   rU   rb   rc   rr   r   rd   rD   rD   rE   stack3  s   rt   z$keras.applications.resnet50.ResNet50z"keras.applications.resnet.ResNet50zkeras.applications.ResNet50c                 K   *   dd }t |ddd| |||||f
i |S )z'Instantiates the ResNet50 architecture.c                 S   B   t | ddddd} t | dddd	} t | d
ddd	} t | dddd	S )Nr   r   r   conv2rc   r      rG   conv3r&         conv4   conv5re   rl   rD   rD   rE   r9        zResNet50.<locals>.stack_fnFTr	   rF   r;   r   r<   r=   r>   r?   r@   r9   rD   rD   rE   ResNet50  s   r   z#keras.applications.resnet.ResNet101zkeras.applications.ResNet101c                 K   ru   )z(Instantiates the ResNet101 architecture.c                 S   rv   )Nr   r   r   rw   rx   ry   rG   rz   r&   r{      r}   r~   r   r   rl   rD   rD   rE   r9   &  r   zResNet101.<locals>.stack_fnFTr
   r   r   rD   rD   rE   	ResNet101     r   z#keras.applications.resnet.ResNet152zkeras.applications.ResNet152c                 K   ru   )z(Instantiates the ResNet152 architecture.c                 S   rv   )Nr   r   r   rw   rx   ry      rz   r&   r{   $   r}   r~   r   r   rl   rD   rD   rE   r9   I  r   zResNet152.<locals>.stack_fnFTr   r   r   rD   rD   rE   	ResNet152;  r   r   z,keras.applications.resnet50.preprocess_inputz*keras.applications.resnet.preprocess_inputc                 C   s   t j| |ddS )NZcaffe)r   mode)r   preprocess_input)rB   r   rD   rD   rE   r   ^  s   r   z.keras.applications.resnet50.decode_predictionsz,keras.applications.resnet.decode_predictions   c                 C   s   t j| |dS )N)top)r   decode_predictions)Zpredsr   rD   rD   rE   r   h  s   r    )r   reterrora9
  

  Reference:
  - [Deep Residual Learning for Image Recognition](
      https://arxiv.org/abs/1512.03385) (CVPR 2015)

  For image classification use cases, see
  [this page for detailed examples](
    https://keras.io/api/applications/#usage-examples-for-image-classification-models).

  For transfer learning use cases, make sure to read the
  [guide to transfer learning & fine-tuning](
    https://keras.io/guides/transfer_learning/).

  Note: each Keras Application expects a specific kind of input preprocessing.
  For ResNet, call `tf.keras.applications.resnet.preprocess_input` on your
  inputs before passing them to the model.
  `resnet.preprocess_input` will convert the input images from RGB to BGR,
  then will zero-center each color channel with respect to the ImageNet dataset,
  without scaling.

  Args:
    include_top: whether to include the fully-connected
      layer at the top of the network.
    weights: one of `None` (random initialization),
      'imagenet' (pre-training on ImageNet),
      or the path to the weights file to be loaded.
    input_tensor: optional Keras tensor (i.e. output of `layers.Input()`)
      to use as image input for the model.
    input_shape: optional shape tuple, only to be specified
      if `include_top` is False (otherwise the input shape
      has to be `(224, 224, 3)` (with `'channels_last'` data format)
      or `(3, 224, 224)` (with `'channels_first'` data format).
      It should have exactly 3 inputs channels,
      and width and height should be no smaller than 32.
      E.g. `(200, 200, 3)` would be one valid value.
    pooling: Optional pooling mode for feature extraction
      when `include_top` is `False`.
      - `None` means that the output of the model will be
          the 4D tensor output of the
          last convolutional block.
      - `avg` means that global average pooling
          will be applied to the output of the
          last convolutional block, and thus
          the output of the model will be a 2D tensor.
      - `max` means that global max pooling will
          be applied.
    classes: optional number of classes to classify images
      into, only to be specified if `include_top` is True, and
      if no `weights` argument is specified.
    classifier_activation: A `str` or callable. The activation function to use
      on the "top" layer. Ignored unless `include_top=True`. Set
      `classifier_activation=None` to return the logits of the "top" layer.
      When loading pretrained weights, `classifier_activation` can only
      be `None` or `"softmax"`.

  Returns:
    A Keras model instance.
__doc__)r   Tr   NNNr   r   )r   r   TN)r   N)r   r   FN)r   r   r   TN)r   r   N)Tr   NNNr   rj   )r   )'r   Ztensorflow.compat.v2compatZv2r.   Zkerasr   Zkeras.applicationsr   Zkeras.enginer   Zkeras.layersr   Zkeras.utilsr   r   Z tensorflow.python.util.tf_exportr   r8   r7   r   rF   rZ   re   rg   rh   rs   rt   r   r   r   r   r   ZPREPROCESS_INPUT_DOCformatZPREPROCESS_INPUT_RET_DOC_CAFFEZPREPROCESS_INPUT_ERROR_DOCZDOCsetattrrD   rD   rD   rE   <module>   s   #
 
*
3

9

O   
<