
    2VhuC                        d dl 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 ed
dg      	 	 	 	 	 	 	 	 	 	 	 dd       ZddZ	 	 	 ddZ ed      dd       Z ed      dd       Zej(                  j+                  dej,                  ej.                        e_        ej&                  j0                  e_        y)    N)backend)layers)keras_export)imagenet_utils)
Functional)operation_utils)
file_utilszGhttps://storage.googleapis.com/tensorflow/keras-applications/mobilenet/z&keras.applications.mobilenet.MobileNetzkeras.applications.MobileNetc                    |dv s#t        j                  |      st        d|       |dk(  r|r|dk7  rt        d|       | d}n:t        j                         dk(  r| d   }| d	   }n
| d
   }| d   }||k(  r|dv r|}nd}t        j                  | |dt        j                         ||      } t        j                         dk(  rd\  }}nd\  }}| |   }| |   }|dk(  rG|dk7  rt        d|       |dvrt        d|       ||k7  s|dvrd}t        j                  dd	       |t        j                  |       }n/t        j                  |      st        j                  ||       }n|}t        |d|d      }t        |d||d      }t        |d||dd	      }t        |d||d      }t        |d||dd       }t        |d||d!      }t        |d"||dd#      }t        |d"||d$      }t        |d"||d%      }t        |d"||d&      }t        |d"||d'      }t        |d"||d(      }t        |d)||dd*      }t        |d)||d+      }|r t        j                  d,-      |      } t        j                  |d./      |      } t        j                   |d0d1d23      |      } t        j"                  |fd4/      |      }t        j$                  |	|        t        j&                  |	d56      |      }n?|d7k(  r t        j                         |      }n|d8k(  r t        j(                         |      }|t+        j,                  |      }n|}|
	d9|d:d;| }
t/        |||
/      }|dk(  r|d<k(  rd=}n|d>k(  rd?}n
|d@k(  rdA}ndB}|r)dC||fz  }t0        |z   }t        j2                  ||dDE      }n(dF||fz  }t0        |z   }t        j2                  ||dDE      }|j5                  |       |S ||j5                  |       |S )Gau  Instantiates the MobileNet architecture.

    Reference:
    - [MobileNets: Efficient Convolutional Neural Networks
       for Mobile Vision Applications](
        https://arxiv.org/abs/1704.04861)

    This function returns a Keras image classification model,
    optionally loaded with weights pre-trained on ImageNet.

    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 MobileNet, call `keras.applications.mobilenet.preprocess_input`
    on your inputs before passing them to the model.
    `mobilenet.preprocess_input` will scale input pixels between -1 and 1.

    Args:
        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. Defaults to `None`.
            `input_shape` will be ignored if the `input_tensor` is provided.
        alpha: Controls the width of the network. This is known as the width
            multiplier in the MobileNet paper.
            - 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. Defaults to `1.0`.
        depth_multiplier: Depth multiplier for depthwise convolution.
            This is called the resolution multiplier in the MobileNet paper.
            Defaults to `1.0`.
        dropout: Dropout rate. Defaults to `0.001`.
        include_top: Boolean, whether to include the fully-connected layer
            at the top of the network. Defaults to `True`.
        weights: One of `None` (random initialization), `"imagenet"`
            (pre-training on ImageNet), or the path to the weights file
            to be loaded. Defaults to `"imagenet"`.
        input_tensor: Optional Keras tensor (i.e. output of `layers.Input()`)
            to use as image input for the model. `input_tensor` is useful
            for sharing inputs between multiple different networks.
            Defaults to `None`.
        pooling: Optional pooling mode for feature extraction when `include_top`
            is `False`.
            - `None` (default) 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. Defaults to `1000`.
        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"`.
        name: String, the name of the model.

    Returns:
        A model instance.
    >   NimagenetzThe `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     zcIf using `weights='imagenet'` with `include_top=True`, `classes` should be 1000.  Received classes=   channels_first      r   )         r       )default_sizemin_sizedata_formatrequire_flattenweightschannels_lastr   r   )r   r   z]If imagenet weights are being loaded, depth multiplier must be 1.  Received depth_multiplier=)g      ?      ?      ?      ?zoIf imagenet weights are being loaded, alpha can be one of`0.25`, `0.50`, `0.75` or `1.0` only.  Received alpha=z`input_shape` is undefined or non-square, or `rows` is not in [128, 160, 192, 224]. Weights for input shape (224, 224) will be loaded as the default.)
stacklevel)shape)tensorr    )r   r   )strides@   )block_idr   )r"   r$               i            	   
      i         T)keepdimsdropoutnamer   r   same
conv_preds)paddingr4   	reshape_2predictions)
activationr4   avgmax
mobilenet_z0.2f_r   1_0r   7_5r   5_02_5zmobilenet_%s_%d_tf.h5models)cache_subdirzmobilenet_%s_%d_tf_no_top.h5)r	   exists
ValueErrorr   image_data_formatr   obtain_input_shapewarningswarnr   Inputis_keras_tensor_conv_block_depthwise_conv_blockGlobalAveragePooling2DDropoutConv2DReshapevalidate_activation
ActivationGlobalMaxPooling2Dr   get_source_inputsr   BASE_WEIGHT_PATHget_fileload_weights)input_shapealphadepth_multiplierr2   include_topr   input_tensorpoolingclassesclassifier_activationr4   r   rowscolsrow_axiscol_axis	img_inputxinputsmodel
alpha_text
model_nameweight_pathweights_paths                           P/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/applications/mobilenet.py	MobileNetrp      s   | ))Z->->w-G  !(y	*
 	
 *D  'y*
 	
 $$&*::q>Dq>Dq>Dq>D4<D$88LL 33!--/#K   "o5#(#(x Dx D*q --=,>@  //" #(*  4<4';;DMM)  LL{3	&&|4LLI$IIr5&9AaU,<qIA	3'!	A 	ae-=JA	3'!	A 	ae-=JA	3'!	A 	ae-=JAae-=JAae-=JAae-=KAae-=KA	4(&2	A 	au.>LA8F))48;3FNN73A6MFMM'66MaP8FNNG:K8;**+@'J
F,=

 e/--/2A+))+A.A  22<@ |E$<q/vqt,E *C<Jd]Jd]JJ0J3EEJ*Z7K%..KhL 8:t:LLJ*Z7K%..KhL 	<( L 
	7#L    c           	      
   t        j                         dk(  rdnd}t        ||z        } t        j                  ||dd|d      |       } t        j
                  |d	      |      } t        j                  d
d      |      S )aD  Adds an initial convolution layer (with batch normalization and relu6).

    Args:
        inputs: Input tensor of shape `(rows, cols, 3)` (with `channels_last`
            data format) or (3, rows, cols) (with `channels_first` data format).
            It should have exactly 3 inputs channels, and width and height
            should be no smaller than 32. E.g. `(224, 224, 3)` would be
            one valid value.
        filters: Integer, the dimensionality of the output space (i.e. the
            number of output filters in the convolution).
        alpha: controls the width of the network. - 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.
        kernel: An integer or tuple/list of 2 integers, specifying the width
            and height of the 2D convolution window.
            Can be a single integer to specify the same value for
            all spatial dimensions.
        strides: An integer or tuple/list of 2 integers, specifying the strides
            of the convolution along the width and height.
            Can be a single integer to specify the same value for all
            spatial dimensions. Specifying any stride value != 1 is
            incompatible with specifying any `dilation_rate`
            value != 1.

    Input shape:
        4D tensor with shape: `(samples, channels, rows, cols)` if
            data_format='channels_first'
        or 4D tensor with shape: `(samples, rows, cols, channels)` if
            data_format='channels_last'. # Output shape
        4D tensor with shape: `(samples, filters, new_rows, new_cols)`
            if data_format='channels_first'
        or 4D tensor with shape: `(samples, new_rows, new_cols, filters)`
            if data_format='channels_last'. `rows` and `cols` values
            might have changed due to stride.

    Returns:
        Output tensor of block.
    r   r   r6   Fconv1r8   use_biasr"   r4   conv1_bnaxisr4         @
conv1_relur3   )r   rH   intr   rR   BatchNormalizationReLU)ri   filtersr\   kernelr"   channel_axisrh   s          ro   rN   rN     s    T  1137GG1RL'E/"G		 	A 	F!!|*EaHA.6;;s.q11rq   c           
      B   t        j                         dk(  rdnd}t        ||z        }|dk(  r| }n  t        j                  dd|z        |       } t        j
                  d|dk(  rd	nd
||dd|z        |      } t        j                  |d|z        |      } t        j                  dd|z        |      } t        j                  |dd	ddd|z        |      } t        j                  |d|z        |      } t        j                  dd|z        |      S )a  Adds a depthwise convolution block.

    A depthwise convolution block consists of a depthwise conv,
    batch normalization, relu6, pointwise convolution,
    batch normalization and relu6 activation.

    Args:
        inputs: Input tensor of shape `(rows, cols, channels)` (with
            `channels_last` data format) or (channels, rows, cols) (with
            `channels_first` data format).
        pointwise_conv_filters: Integer, the dimensionality of the output space
            (i.e. the number of output filters in the pointwise convolution).
        alpha: controls the width of the network. - 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.
        depth_multiplier: The number of depthwise convolution output channels
            for each input channel. The total number of depthwise convolution
            output channels will be equal to `filters_in * depth_multiplier`.
        strides: An integer or tuple/list of 2 integers, specifying the strides
            of the convolution along the width and height.
            Can be a single integer to specify the same value for
            all spatial dimensions. Specifying any stride value != 1 is
            incompatible with specifying any `dilation_rate` value != 1.
        block_id: Integer, a unique identification designating the block number.

    Input shape:
        4D tensor with shape: `(batch, channels, rows, cols)` if
            data_format='channels_first'
        or 4D tensor with shape: `(batch, rows, cols, channels)` if
            data_format='channels_last'. # Output shape
        4D tensor with shape: `(batch, filters, new_rows, new_cols)` if
            data_format='channels_first'
        or 4D tensor with shape: `(batch, new_rows, new_cols, filters)` if
            data_format='channels_last'. `rows` and `cols` values might have
            changed due to stride.

    Returns:
        Output tensor of block.
    r   r   rs   r5   )r   r   zconv_pad_%dr3   r%   r%   r6   validFz
conv_dw_%d)r8   r]   r"   rv   r4   zconv_dw_%d_bnrx   rz   zconv_dw_%d_reluz
conv_pw_%dru   zconv_pw_%d_bnzconv_pw_%d_relu)	r   rH   r|   r   ZeroPadding2DDepthwiseConv2Dr}   r~   rR   )ri   pointwise_conv_filtersr\   r]   r"   r$   r   rh   s           ro   rO   rO   L  s]   d  1137GG1RL !7%!?@&
F  =8#;

	!V+)H$	 		A	!!( :			A 	<C/(:;A>A	H$	 		A	!!( :			A ?6;;s!2X!=>qAArq   z-keras.applications.mobilenet.preprocess_inputc                 2    t        j                  | |d      S )Ntf)r   mode)r   preprocess_input)rh   r   s     ro   r   r     s    **	{ rq   z/keras.applications.mobilenet.decode_predictionsc                 0    t        j                  | |      S )N)top)r   decode_predictions)predsr   s     ro   r   r     s    ,,U<<rq    )r   reterror)Nr   r   gMbP?Tr   NNr   softmaxN)r   r5   )r   r5   r   )N)r(   )rJ   	keras.srcr   r   keras.src.api_exportr   keras.src.applicationsr   keras.src.modelsr   keras.src.opsr   keras.src.utilsr	   rX   rp   rN   rO   r   r   PREPROCESS_INPUT_DOCformatPREPROCESS_INPUT_RET_DOC_TFPREPROCESS_INPUT_ERROR_DOC__doc__ rq   ro   <module>r      s      - 1 ' ) & N 
 0& 
#	{{|52x SBl => ? ?@= A= *>>EE	22

3
3 F   
 ,>>FF  rq   