o
    i e_                     @   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/) 765b44a33ad4005b3ac83185abf1d0eb 40af19a13ebea4e2ee0c676887f69a2e) 59e551e166be033d707958cf9e29a6a7 07fb09a5933dd0c8eaafa16978110389) 675e7b876c45c57e9e63e6d90a36599c ec5221f64a2f6d1ef965a614bdae7973) cb65d4e5be93758266aa0a7f2c6708b7 ebdb5cc8e0b497cd13a7c275d475c819) 8768d4c2e7dee89b9d02b2d03d65d862 d3e8ec802a04aa4fc771ee12a9a9b836) 99cd97fb2fcdad2bf028eb838de69e37 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>   Nr   zThe `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   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)tensorr$      g      ?g?g      )scaleoffset   )r   r   sameFConv)kernel_sizestridespaddinguse_biasnameMbP?+?zConv/BatchNormaxisepsilonmomentumr1      Conv_1r-   r/   r0   r1   zConv_1/BatchNormT)keepdimsConv_2r   Logitsr-   r/   r1   Predictions)
activationr1   avgavg_poolr1   maxmax_poolMobilenetV3z{}{}_224_{}_float_minimalistic weights_mobilenet_v3_z.h5z_no_top_v2.h5r   )cache_subdir	file_hash)&tfiogfileexists
ValueErrorr   is_keras_tensorr   get_source_inputstypeimage_data_format	int_shapeloggingwarninglayersInputrelu
hard_swish	RescalingConv2DBatchNormalization_depthGlobalAveragePooling2DDropoutFlattenr   validate_activation
ActivationGlobalMaxPooling2Dr   ModelformatstrWEIGHTS_HASHESr   get_fileBASE_WEIGHT_PATHload_weights) stack_fnlast_point_chinput_shapealpha
model_typeminimalisticinclude_topweightsinput_tensorclassespoolingdropout_rateclassifier_activationinclude_preprocessingis_input_t_tensorrowscolsrow_axiscol_axis	img_inputchannel_axiskernelr@   se_ratioxlast_conv_chinputsmodel
model_name	file_namerK   weights_path r   R/var/www/myenv/lib/python3.10/site-packages/keras/src/applications/mobilenet_v3.pyMobileNetV3   s  
	
	

 












r   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rp   r   r   depth     z1MobileNetV3Small.<locals>.stack_fn.<locals>.depthr   r*   r   r   r   g      @   gUUUUUU@   (   r8   r'   0      `      	   
   _inverted_res_blockrZ   r   r   r@   r   r   r   r   r   rm     s:   z"MobileNetV3Small.<locals>.stack_fni   smallr   ro   rp   rr   rs   rt   ru   rv   rw   rx   ry   rz   rm   r   r   r   MobileNetV3Small  s"   !r   z#keras.applications.MobileNetV3Largec                    r   )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                    r   r   r   r   r   r   r   r     r   z1MobileNetV3Large.<locals>.stack_fn.<locals>.depthr   r*   r   r   r   r   r   r   r'   r8   P   g      @r   gffffff@r   r   p   r                  r   r   r   r   r   rm     s6   z"MobileNetV3Large.<locals>.stack_fni   r   r   r   r   r   r   MobileNetV3Large  s"   r   rC   c                 C   s   t  | S r   rX   ReLUr   r   r   r   rZ   )  r   rZ   c                 C   s   t d| d d S )Ng      @g      @gUUUUUU?r   r   r   r   r   hard_sigmoid-  s   r   c                 C   s   t  | t| gS r   )rX   Multiplyr   r   r   r   r   r[   1  s   r[   r   c                 C   sB   |d u r|}t |t| |d  | | }|d|  k r||7 }|S )Nr   g?)rD   int)vdivisor	min_valuenew_vr   r   r   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;   r1   r   r+   zsqueeze_excite/Convr>   zsqueeze_excite/RelurC   zsqueeze_excite/Conv_1zsqueeze_excite/Mul)rX   r`   r]   r_   r   r   r   )r   filtersr   prefixr   r   r   r   	_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/expanded_conv_/r+   Fexpandr:   r2   r3   zexpand/BatchNormr4   r   zdepthwise/pad)r/   r1   valid	depthwise)r.   r/   r0   r1   zdepthwise/BatchNormprojectzproject/BatchNormAddrC   )r   rT   rU   rX   r]   r_   r^   ZeroPadding2Dr   correct_padDepthwiseConv2Dr   r   )r   	expansionr   r-   strider   r@   block_idr   shortcutr   	infiltersr   r   r   r   \  s   

r   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. `None` means
        the global setting `tf.keras.backend.image_data_format()` is used
        (unless you changed it, it uses "channels_last").
        Defaults to `None`.

    Returns:
      Unchanged `numpy.array` or `tf.Tensor`.
    r   )r   data_formatr   r   r   preprocess_input  s   r   z2keras.applications.mobilenet_v3.decode_predictionsr'   c                 C   s   t j| |dS )N)top)r   decode_predictions)predsr   r   r   r   r     s   r   )Nr   r   FTr   Nr   Nr   r   T)Nr   FTr   Nr   Nr   r   T)r   Nr   )r'   )$__doc__tensorflow.compat.v2compatv2rL   	keras.srcr   r   keras.src.applicationsr   keras.src.layersr   keras.src.utilsr   r   tensorflow.python.platformr   rV    tensorflow.python.util.tf_exportr	   rk   ri   rX   BASE_DOCSTRINGr   r   r   rg   rZ   r   r[   r_   r   r   r   r   r   r   r   r   <module>   s   m
 z@>

C