o
    ={cy_                     @   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d
lmZ dZdddddddZe ZdZ												d9ddZed											d:dd Zed!											d:d"d#Zejd d$e_ ejd#d$e_ d%d& Zd'd( Zd)d* Zd;d,d-Zd.d/ Z d0d1 Z!ed2d<d3d4Z"ed5d=d7d8Z#e	j#j e#_ dS )>zMobileNet v3 models for Keras.    N)backend)models)imagenet_utils)VersionAwareLayers)
data_utils)layer_utils)
tf_logging)keras_exportzJhttps://storage.googleapis.com/tensorflow/keras-applications/mobilenet_v3/)Z 765b44a33ad4005b3ac83185abf1d0ebZ 40af19a13ebea4e2ee0c676887f69a2e)Z 59e551e166be033d707958cf9e29a6a7Z 07fb09a5933dd0c8eaafa16978110389)Z 675e7b876c45c57e9e63e6d90a36599cZ ec5221f64a2f6d1ef965a614bdae7973)Z cb65d4e5be93758266aa0a7f2c6708b7Z ebdb5cc8e0b497cd13a7c275d475c819)Z 8768d4c2e7dee89b9d02b2d03d65d862Z d3e8ec802a04aa4fc771ee12a9a9b836)Z 99cd97fb2fcdad2bf028eb838de69e37Z cde8136e733e811080d9fcd8a252f7e4)zlarge_224_0.75_floatzlarge_224_1.0_floatz large_minimalistic_224_1.0_floatzsmall_224_0.75_floatzsmall_224_1.0_floatz small_minimalistic_224_1.0_floata  Instantiates the {name} architecture.

  Reference:
  - [Searching for MobileNetV3](
      https://arxiv.org/pdf/1905.02244.pdf) (ICCV 2019)

  The following table describes the performance of MobileNets v3:
  ------------------------------------------------------------------------
  MACs stands for Multiply Adds

  |Classification Checkpoint|MACs(M)|Parameters(M)|Top1 Accuracy|Pixel1 CPU(ms)|
  |---|---|---|---|---|
  | mobilenet_v3_large_1.0_224              | 217 | 5.4 |   75.6   |   51.2  |
  | mobilenet_v3_large_0.75_224             | 155 | 4.0 |   73.3   |   39.8  |
  | mobilenet_v3_large_minimalistic_1.0_224 | 209 | 3.9 |   72.3   |   44.1  |
  | mobilenet_v3_small_1.0_224              | 66  | 2.9 |   68.1   |   15.8  |
  | mobilenet_v3_small_0.75_224             | 44  | 2.4 |   65.4   |   12.8  |
  | mobilenet_v3_small_minimalistic_1.0_224 | 65  | 2.0 |   61.9   |   12.2  |

  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 MobileNetV3, by default input preprocessing is included as a part of the
  model (as a `Rescaling` layer), and thus
  `tf.keras.applications.mobilenet_v3.preprocess_input` is actually a
  pass-through function. In this use case, MobileNetV3 models expect their
  inputs to be float tensors of pixels with values in the [0-255] range.
  At the same time, preprocessing as a part of the model (i.e. `Rescaling`
  layer) can be disabled by setting `include_preprocessing` argument to False.
  With preprocessing disabled MobileNetV3 models expect their inputs to be float
  tensors of pixels with values in the [-1, 1] range.

  Args:
    input_shape: Optional shape tuple, to be specified if you would
      like to use a model with an input image resolution that is not
      (224, 224, 3).
      It should have exactly 3 inputs channels (224, 224, 3).
      You can also omit this option if you would like
      to infer input_shape from an input_tensor.
      If you choose to include both input_tensor and input_shape then
      input_shape will be used if they match, if the shapes
      do not match then we will throw an error.
      E.g. `(160, 160, 3)` would be one valid value.
    alpha: controls the width of the network. This is known as the
      depth multiplier in the MobileNetV3 paper, but the name is kept for
      consistency with MobileNetV1 in Keras.
      - If `alpha` < 1.0, proportionally decreases the number
          of filters in each layer.
      - If `alpha` > 1.0, proportionally increases the number
          of filters in each layer.
      - If `alpha` = 1, default number of filters from the paper
          are used at each layer.
    minimalistic: In addition to large and small models this module also
      contains so-called minimalistic models, these models have the same
      per-layer dimensions characteristic as MobilenetV3 however, they don't
      utilize any of the advanced blocks (squeeze-and-excite units, hard-swish,
      and 5x5 convolutions). While these models are less efficient on CPU, they
      are much more performant on GPU/DSP.
    include_top: Boolean, whether to include the fully-connected
      layer at the top of the network. Defaults to `True`.
    weights: String, 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.
    pooling: String, 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: Integer, optional number of classes to classify images
      into, only to be specified if `include_top` is True, and
      if no `weights` argument is specified.
    dropout_rate: fraction of the input units to drop on the last layer.
    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"`.
    include_preprocessing: Boolean, whether to include the preprocessing
      layer (`Rescaling`) at the bottom of the network. Defaults to `True`.

  Call arguments:
    inputs: A floating point `numpy.array` or a `tf.Tensor`, 4D with 3 color
      channels, with values in the range [0, 255] if `include_preprocessing`
      is True and in the range [-1, 1] otherwise.

  Returns:
    A `keras.Model` instance.
      ?largeFTimagenet  皙?softmaxc                  C   s\  |dv st jj|std| |dkr#|r#|	dkr#td|	 |d ur|d urzt|}W n& tyX   z
tt|}W n tyU   td|dt	| w Y nw |rt
 dkrzt|d	 |d	 krytd
| dt| nt|d |d	 krtd| dt| ntd|d|d u r|d urzt| W n ty   td|dt	|dw t|rt
 dkrt|d }t|d }d||f}nt|d	 }t|d }||df}|d u r|d u rd}t
 dkrd\}}nd\}}|| }|| }|r&|r&|dk s|dk r&td| d|dkrN|s3|dvs;|r?|dkr?td||ksI|dkrNtd |d u rZtj|d}nt|shtj||d }n|}t
 dkrsd	nd!}|rd}t}d }nd"}t}d#}|}|rtjd$d%d&|}tjd'dd(d)d*d+d,|}tj|d-d.d/d0|}||}| ||||}tt|| d1 }|dkrt|| }tj|d	d)d*d2d3|}tj|d-d.d4d0|}||}|r/tjd5d6|}tj|d	d)d5d7d3|}||}|d8krt||}tj|	d	d)d9d:|}t |}t|| tj|d;d<|}n|
d=kr=tjd>d?|}n|
d@krJtjdAd?|}|d urUt|}n|}tj||dB| d?}|dkrdC||rndDndEt |}|rdF| dG }t!| d8 }ndF| dH }t!| d	 }t"j#|t$| dI|dJ}|%| |S |d ur|%| |S )KN>   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.  Received weights=r   r   zkIf using `weights` as `"imagenet"` with `include_top` as true, `classes` should be 1000.  Received classes=zinput_tensor: z7is not type input_tensor.  Received type(input_tensor)=channels_first   zWhen backend.image_data_format()=channels_first, input_shape[1] must equal backend.int_shape(input_tensor)[1].  Received input_shape=z", backend.int_shape(input_tensor)=   zTinput_shape[1] must equal backend.int_shape(input_tensor)[2].  Received input_shape=zinput_tensor specified: zis not a keras tensorz	is type: zwhich is not a valid type   )NNr   Zchannels_last)r   r   )r   r       z9Input size must be at least 32x32; Received `input_shape=`)g      ?r
   r
   z|If imagenet weights are being loaded, alpha can be one of `0.75`, `1.0` for non minimalistic or `1.0` for minimalistic only.   z`input_shape` is undefined or non-square, or `rows` is not 224. Weights for input shape (224, 224) will be loaded as the default.)shape)Ztensorr      g      ?g?g      )Zscaleoffset   )r   r   sameFZConv)kernel_sizestridespaddinguse_biasnameMbP?+?zConv/BatchNormZaxisepsilonZmomentumr!      ZConv_1r   r   r    r!   zConv_1/BatchNormT)keepdimsZConv_2r   ZLogitsr   r   r!   ZPredictions)
activationr!   ZavgZavg_poolr!   maxZmax_poolZMobilenetV3z{}{}_224_{}_floatZ_minimalistic Zweights_mobilenet_v3_z.h5z_no_top_v2.h5r   )Zcache_subdir	file_hash)&tfioZgfileexists
ValueErrorr   Zis_keras_tensorr   Zget_source_inputstypeimage_data_format	int_shapeloggingZwarninglayersZInputrelu
hard_swishZ	RescalingConv2DBatchNormalization_depthGlobalAveragePooling2DZDropoutZFlattenr   Zvalidate_activationZ
ActivationZGlobalMaxPooling2Dr   ZModelformatstrWEIGHTS_HASHESr   Zget_fileBASE_WEIGHT_PATHZload_weights) stack_fnZlast_point_chinput_shapealphaZ
model_typeminimalisticinclude_topweightsinput_tensorclassespoolingdropout_rateclassifier_activationinclude_preprocessingZis_input_t_tensorZrowsZcolsZrow_axisZcol_axisZ	img_inputchannel_axiskernelr*   se_ratioxZlast_conv_chinputsZmodelZ
model_name	file_namer.   Zweights_path rT   ?lib/python3.10/site-packages/keras/applications/mobilenet_v3.pyMobileNetV3   s  
	
	

 












rV   z#keras.applications.MobileNetV3Smallc                    .    fdd}t |d|  d||||||||	|
S )Nc              	      s.   fdd}t | d|ddd|td} t | d|d	ddd td} t | d
|d	ddd td} t | d|d|d||d} t | d|d|d||d} t | d|d|d||d} t | d|d|d||d} t | d|d|d||d} t | d|d|d||d} t | d|d|d||d} t | d|d|d||d} | S )Nc                       t |   S Nr<   drD   rT   rU   depth     z1MobileNetV3Small.<locals>.stack_fn.<locals>.depthr   r   r   r   r   g      @   gUUUUUU@   (   r&   r   0      `      	   
   _inverted_res_blockr8   rQ   rO   r*   rP   r^   r]   rT   rU   rB     s:   z"MobileNetV3Small.<locals>.stack_fni   ZsmallrV   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rB   rT   r]   rU   MobileNetV3Small  s"   !rn   z#keras.applications.MobileNetV3Largec                    rW   )Nc              	      s   fdd}t | d|dddd td} t | d|ddd	d td} t | d|dddd td	} t | d|d
|d	|td} t | d|d
|d|td} t | d|d
|d|td} t | d|ddd	d |d} t | d|dddd |d} t | d|dddd |d} t | d|dddd |d} t | d|ddd||d} t | d|ddd||d} t | d|d|d	||d} t | d|d|d||d} t | d|d|d||d} | S )Nc                    rX   rY   rZ   r[   r]   rT   rU   r^     r_   z1MobileNetV3Large.<locals>.stack_fn.<locals>.depthr   r   r   r   ra   r`   r   rb   r   r&   P   g      @rd   gffffff@rf   rg   p   rh                  ri   rk   r]   rT   rU   rB     s6   z"MobileNetV3Large.<locals>.stack_fni   r   rl   rm   rT   r]   rU   MobileNetV3Large  s"   rv   r+   c                 C   s   t  | S rY   r7   ReLUrQ   rT   rT   rU   r8   )  r_   r8   c                 C   s   t d| d d S )Ng      @g      @gUUUUUU?rw   ry   rT   rT   rU   hard_sigmoid-  s   rz   c                 C   s   t  | t| gS rY   )r7   Multiplyrz   ry   rT   rT   rU   r9   1  s   r9   rf   c                 C   sB   |d u r|}t |t| |d  | | }|d|  k r||7 }|S )Nr   g?)r,   int)vZdivisorZ	min_valueZnew_vrT   rT   rU   r<   <  s   r<   c                 C   s   t jd|d d| }t jt|| dd|d d|}t j|d d	|}t j|dd|d
 d|}t|}t j|d d	| |g}|S )NTzsqueeze_excite/AvgPool)r(   r!   r   r   zsqueeze_excite/Convr)   zsqueeze_excite/Relur+   zsqueeze_excite/Conv_1zsqueeze_excite/Mul)r7   r=   r:   r<   rx   rz   r{   )rR   filtersrP   prefixrQ   rT   rT   rU   	_se_blockF  s2   
r   c                 C   sl  t  dkrdnd}| }	d}
t | | }|r@d| d}
tjt|| ddd|
d	 d
| } tj|dd|
d d| } || } |dkrStjt	| ||
d d| } tj
|||dkr]dndd|
d d| } tj|dd|
d d| } || } |rt| t|| ||
} tj|ddd|
d d
| } tj|dd|
d d| } |dkr||krtj|
d d|	| g} | S )Nr   r   r   zexpanded_conv/Zexpanded_conv_/r   Fexpandr'   r"   r#   zexpand/BatchNormr$   r   zdepthwise/pad)r   r!   ZvalidZ	depthwise)r   r   r    r!   zdepthwise/BatchNormZprojectzproject/BatchNormAddr+   )r   r4   r5   r7   r:   r<   r;   ZZeroPadding2Dr   Zcorrect_padZDepthwiseConv2Dr   r   )rQ   Z	expansionr~   r   ZstriderP   r*   Zblock_idrN   Zshortcutr   Z	infiltersrT   rT   rU   rj   \  s   

rj   z0keras.applications.mobilenet_v3.preprocess_inputc                 C   s   | S )a  A placeholder method for backward compatibility.

    The preprocessing logic has been included in the mobilenet_v3 model
    implementation. Users are no longer required to call this method to
    normalize the input data. This method does nothing and only kept as a
    placeholder to align the API surface between old and new version of model.

    Args:
      x: A floating point `numpy.array` or a `tf.Tensor`.
      data_format: Optional data format of the image tensor/array. Defaults to
        None, in which case the global setting
        `tf.keras.backend.image_data_format()` is used (unless you changed it,
        it defaults to "channels_last").{mode}

    Returns:
      Unchanged `numpy.array` or `tf.Tensor`.
    rT   )rQ   Zdata_formatrT   rT   rU   preprocess_input  s   r   z2keras.applications.mobilenet_v3.decode_predictionsr   c                 C   s   t j| |dS )N)top)r   decode_predictions)Zpredsr   rT   rT   rU   r     s   r   )Nr
   r   FTr   Nr   Nr   r   T)Nr
   FTr   Nr   Nr   r   T)rf   NrY   )r   )$__doc__Ztensorflow.compat.v2compatZv2r/   Zkerasr   r   Zkeras.applicationsr   Zkeras.layersr   Zkeras.utilsr   r   Ztensorflow.python.platformr   r6   Z tensorflow.python.util.tf_exportr	   rA   r@   r7   ZBASE_DOCSTRINGrV   rn   rv   r>   r8   rz   r9   r<   r   rj   r   r   rT   rT   rT   rU   <module>   s   m
 z@>

C