a
    Sic_                     @   sD  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   sx  |dv s$t jj|s$td| |dkrF|rF|	dkrFtd|	 |d ur>|d ur>zt|}W nP ty   ztt|}W n( ty   td|dt	| Y n0 Y n0 |r2t
 dkrt|d	 |d	 krtd
| dt| n2t|d |d	 kr>td| dt| ntd|d|d u r|d urzt| W n( ty   td|dt	|dY n0 t|rt
 dkrt|d }t|d }d||f}n&t|d	 }t|d }||df}|d u r
|d u r
d}t
 dkr"d\}}nd\}}|| }|| }|rj|rj|dk sZ|dk rjtd| d|dkr|s|dvs|r|dkrtd||ks|dkrtd |d u rtj|d}n t|stj||d }n|}t
 dkrd	nd!}|rd}t}d }nd"}t}d#}|}|rDt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<|}n6|
d=krtjd>d?|}n|
d@krtjdAd?|}|d urt|}n|}tj||dB| d?}|dkr`dC||rdDndEt |}|r&dF| dG }t!| d8 }ndF| dH }t!| d	 }t"j#|t$| dI|dJ}|%| n|d urt|%| |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momentumr%      Conv_1r!   r#   r$   r%   zConv_1/BatchNormT)keepdimsZConv_2r   ZLogitsr!   r#   r%   ZPredictions)
activationr%   avgavg_poolr%   maxmax_poolZMobilenetV3z{}{}_224_{}_floatZ_minimalistic Z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_fnZ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kernelr1   se_ratioxZlast_conv_chinputsmodel
model_name	file_namer9   weights_path rw   [/var/www/html/django/DPS/env/lib/python3.9/site-packages/keras/applications/mobilenet_v3.pyMobileNetV3   s   	


 









ry   z#keras.applications.MobileNetV3Smallc                    s.    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                    s   t |   S NrM   dr]   rw   rx   depth  s    z1MobileNetV3Small.<locals>.stack_fn.<locals>.depthr   r   r   r   r   g      @   gUUUUUU@   (   r,   r   0      `      	   
   _inverted_res_blockrH   rq   ro   r1   rp   r   r~   rw   rx   r[     s:    z"MobileNetV3Small.<locals>.stack_fni   smallry   r\   r]   r_   r`   ra   rb   rc   rd   re   rf   rg   r[   rw   r~   rx   MobileNetV3Small  s"    !r   z#keras.applications.MobileNetV3Largec                    s.    fdd}t |d|  d||||||||	|
S )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                    s   t |   S rz   r{   r|   r~   rw   rx   r     s    z1MobileNetV3Large.<locals>.stack_fn.<locals>.depthr   r   r   r   r   r   r   r   r   r,   P   g      @r   gffffff@r   r   p   r                  r   r   r~   rw   rx   r[     s6    z"MobileNetV3Large.<locals>.stack_fni   r   r   r   rw   r~   rx   MobileNetV3Large  s"    r   r4   c                 C   s   t  | S rz   rF   ReLUrq   rw   rw   rx   rH   *  s    rH   c                 C   s   t d| d d S )Ng      @g      @gUUUUUU?r   r   rw   rw   rx   hard_sigmoid.  s    r   c                 C   s   t  | t| gS rz   )rF   Multiplyr   r   rw   rw   rx   rI   2  s    rI   r   c                 C   sB   |d u r|}t |t| |d  | | }|d|  k r>||7 }|S )Nr   g?)r5   int)vdivisor	min_valuenew_vrw   rw   rx   rM   =  s    rM   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/Convr0   zsqueeze_excite/Relur4   zsqueeze_excite/Conv_1zsqueeze_excite/Mul)rF   rN   rK   rM   r   r   r   )rr   filtersrp   prefixrq   rw   rw   rx   	_se_blockG  s2    
r   c                 C   sp  t  dkrdnd}| }	d}
t | | }|r~d|}
tjt|| ddd|
d d	| } tj|d
d|
d d| } || } |dkrtjt	
| ||
d d| } tj|||dkrdndd|
d d| } tj|d
d|
d d| } || } |r
t| t|| ||
} tj|ddd|
d d	| } tj|d
d|
d d| } |dkrl||krlt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%   valid	depthwise)r"   r#   r$   r%   zdepthwise/BatchNormprojectzproject/BatchNormAddr4   )r   rB   rC   rU   rF   rK   rM   rL   ZeroPadding2Dr   correct_padDepthwiseConv2Dr   r   )rq   	expansionr   r!   striderp   r1   block_idrn   shortcutr   Z	infiltersrw   rw   rx   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. 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`.
    rw   )rq   data_formatrw   rw   rx   preprocess_input  s    r   z2keras.applications.mobilenet_v3.decode_predictionsr   c                 C   s   t j| |dS )N)top)r   decode_predictions)predsr   rw   rw   rx   r     s    r   )Nr
   r   FTr   Nr   Nr   r   T)Nr
   FTr   Nr   Nr   r   T)Nr
   FTr   Nr   Nr   r   T)r   N)N)r   )$__doc__Ztensorflow.compat.v2compatv2r:   kerasr   r   Zkeras.applicationsr   keras.layersr   keras.utilsr   r   tensorflow.python.platformr   rD    tensorflow.python.util.tf_exportr	   rY   rW   rF   BASE_DOCSTRINGry   r   r   rU   rH   r   rI   rM   r   r   r   r   rw   rw   rw   rx   <module>   s   m            
 z           @           >

C