o
    2huC                     @   s   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dZd%ddZ			d&ddZedd'ddZedd(d d!Zejjd"ejejd#e_ejje_dS ))    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.MobileNet      ?   MbP?Timagenet  softmaxc                 C   s  |dv st |std| |dkr!|r!|dkr!td| | du r(d}n$t dkr7| d	 }| d
 }n| d }| d	 }||krJ|dv rJ|}nd}tj| |dt ||d} t dkrdd\}}nd\}}| | }| | }|dkr|d	krtd| |dvrtd| ||ks|dvrd}tjdd
d |du rt	j
| d}nt|st	j
|| d}n|}t|d|dd}t|d||d	d}t|d||dd
d}t|d||dd}t|d ||dd!d}t|d ||d"d}t|d#||dd$d}t|d#||d%d}t|d#||d&d}t|d#||d'd}t|d#||d(d}t|d#||d)d}t|d*||dd+d}t|d*||d,d}|rot	jd-d.|}t	j|d/d0|}t	j|d1d2d3d4|}t	j|fd5d0|}t|	| t	j|	d6d7|}n|d8kr{t	 |}n|d9krt	 |}|durt|}n|}|
du rd:|d;d<| }
t|||
d0}|dkr|d=krd>}n|d?krd@}n
|dAkrdB}ndC}|rdD||f }t| }t j||dEdF}ndG||f }t| }t j||dEdF}|| |S |dur || |S )Hau  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.
    >   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   zcIf using `weights='imagenet'` with `include_top=True`, `classes` should be 1000.  Received classes=N   channels_firstr
      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      ?      ?      ?r	   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_path ro   [/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/applications/mobilenet.py	MobileNet   s   ^
	












rq   r%   r%   r5   c                 C   s^   t  dkrdnd}t|| }tj||dd|dd| }tj|dd	|}tjd
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   ro   ro   rp   rN     s   *rN   c                 C   s   t  dkrdnd}t|| }|dkr| }ntjdd| d| }tjd|dkr+d	nd
||dd| d|}tj|d| d|}tjdd| d|}tj|dd	ddd| d|}tj|d| d|}tjdd| d|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   rr   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   ro   ro   rp   rO   L  sR   2rO   z-keras.applications.mobilenet.preprocess_inputc                 C   s   t j| |ddS )Ntf)r   mode)r   preprocess_input)rh   r   ro   ro   rp   r     s   r   z/keras.applications.mobilenet.decode_predictionsr(   c                 C   s   t j| |dS )N)top)r   decode_predictions)predsr   ro   ro   rp   r     s   r    )r   reterror)Nr	   r
   r   Tr   NNr   r   N)rr   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   rq   rN   rO   r   r   PREPROCESS_INPUT_DOCformatPREPROCESS_INPUT_RET_DOC_TFPREPROCESS_INPUT_ERROR_DOC__doc__ro   ro   ro   rp   <module>   sV     
<
V