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ed Zed Zed Zed Ze Z													d5ddZedd							d6ddZedd							d6d d!Z	d7d$d%Zd8d&d'Zd8d(d)Z d8d*d+Z!ed,d8d-d.Z"ed/d9d1d2Z#ej$j%d3ej&ej'd4e"_ ej#j e#_ dS ):aG  NASNet-A models for Keras.

NASNet refers to Neural Architecture Search Network, a family of models
that were designed automatically by learning the model architectures
directly on the dataset of interest.

Here we consider NASNet-A, the highest performance model that was found
for the CIFAR-10 dataset, and then extended to ImageNet 2012 dataset,
obtaining state of the art performance on CIFAR-10 and ImageNet 2012.
Only the NASNet-A models, and their respective weights, which are suited
for ImageNet 2012 are provided.

The below table describes the performance on ImageNet 2012:
---------------------------------------------------------------------------
Architecture         | Top-1 Acc | Top-5 Acc |  Multiply-Adds |  Params (M)
---------------------|-----------|-----------|----------------|------------
NASNet-A (4 @ 1056)  |   74.0 %  |   91.6 %  |       564 M    |     5.3
NASNet-A (6 @ 4032)  |   82.7 %  |   96.2 %  |      23.8 B    |    88.9

Reference:
  - [Learning Transferable Architectures for Scalable Image Recognition](
      https://arxiv.org/abs/1707.07012) (CVPR 2018)
    N)backend)imagenet_utils)training)VersionAwareLayers)
data_utils)layer_utils)
tf_logging)keras_exportzDhttps://storage.googleapis.com/tensorflow/keras-applications/nasnet/zNASNet-mobile.h5zNASNet-mobile-no-top.h5zNASNet-large.h5zNASNet-large-no-top.h5     `   T   imagenet  softmaxc              	   C   s  |dv st jj|std|dkr|r|
dkrtdt| tr4d| v r4|dkr4tdt|  d |du r:d	}tj	| |d
t
 ||d} t
 dkrZtd t
d d}nd}|du rgtj| d}nt
|sttj|| d}n|}|d|d   dkrtd| t
 dkrdnd}|d }tj|ddddddd|}tj|ddd d!|}d}t||||d  d"d#\}}t|||| d$d#\}}t|D ]}t|||d%| d#\}}qt|||| d&| d#\}}|s|n|}t|D ]}t|||| d%|| d  d#\}}qt||||d  d&d|  d#\}}|s |n|}t|D ]}t||||d  d%d| | d  d#\}}q&td'|}|rat |}t|| tj|
|d(d)|}n|	d*krmt |}n|	d+krxt |}|durt|}n|}tj||d,d-}|dkr|d.kr|rt j!d/t"d0d1d2}n	t j!d3t#d0d4d2}|$| n/|d	kr|rt j!d5t%d0d6d2}n	t j!d7t&d0d8d2}|$| ntd9|dur|$| |rt
| |S ):a  Instantiates a NASNet model.

    Reference:
    - [Learning Transferable Architectures for Scalable Image Recognition](
        https://arxiv.org/abs/1707.07012) (CVPR 2018)

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

    Args:
      input_shape: Optional shape tuple, the input shape
        is by default `(331, 331, 3)` for NASNetLarge and
        `(224, 224, 3)` for NASNetMobile.
        It should have exactly 3 input channels,
        and width and height should be no smaller than 32.
        E.g. `(224, 224, 3)` would be one valid value.
      penultimate_filters: Number of filters in the penultimate layer.
        NASNet models use the notation `NASNet (N @ P)`, where:
            -   N is the number of blocks
            -   P is the number of penultimate filters
      num_blocks: Number of repeated blocks of the NASNet model.
        NASNet models use the notation `NASNet (N @ P)`, where:
            -   N is the number of blocks
            -   P is the number of penultimate filters
      stem_block_filters: Number of filters in the initial stem block
      skip_reduction: Whether to skip the reduction step at the tail
        end of the network.
      filter_multiplier: Controls the width of the network.
        - If `filter_multiplier` < 1.0, proportionally decreases the number
            of filters in each layer.
        - If `filter_multiplier` > 1.0, proportionally increases the number
            of filters in each layer.
        - If `filter_multiplier` = 1, default number of filters from the
             paper are used at each layer.
      include_top: Whether to include the fully-connected
        layer at the top of the network.
      weights: `None` (random initialization) or
          `imagenet` (ImageNet weights)
      input_tensor: Optional Keras tensor (i.e. output of
        `layers.Input()`)
        to use as image input for the model.
      pooling: 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: Optional number of classes to classify images
        into, only to be specified if `include_top` is True, and
        if no `weights` argument is specified.
      default_size: Specifies the default image size of the model
      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"`.

    Returns:
      A `keras.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.r   r   zWIf using `weights` as `"imagenet"` with `include_top` as true, `classes` should be 1000NzWhen specifying the input shape of a NASNet and loading `ImageNet` weights, the input_shape argument must be static (no None entries). Got: `input_shape=z`.K      )default_sizemin_sizedata_formatrequire_flattenweightschannels_lasta  The NASNet family of models is only available for the input data format "channels_last" (width, height, channels). However your settings specify the default data format "channels_first" (channels, width, height). You should set `image_data_format="channels_last"` in your Keras config located at ~/.keras/keras.json. The model being returned right now will expect inputs to follow the "channels_last" data format.channels_first)shape)tensorr      r   r   zwFor NASNet-A models, the `penultimate_filters` must be a multiple of 24 * (`filter_multiplier` ** 2). Current value: %d      r    r   r   validF
stem_conv1	he_normal)stridespaddinguse_biasnamekernel_initializerZڊ?MbP?stem_bn1axismomentumepsilonr(   stem_1block_idstem_2z%dz	reduce_%drelupredictions)
activationr(   avgmaxNASNetr(      znasnet_mobile.h5models 020fb642bf7360b370c678b08e0adf61)cache_subdir	file_hashznasnet_mobile_no_top.h5 1ed92395b5b598bdda52abe5c0dbfd63znasnet_large.h5 11577c9a518f0070763c2b964a382f17znasnet_large_no_top.h5 d81d89dc07e6e56530c4e77faddd61b5zDImageNet weights can only be loaded with NASNetLarge or NASNetMobile)'tfiogfileexists
ValueError
isinstancetuplestrr   obtain_input_shaper   image_data_formatloggingwarningset_image_data_formatlayersInputis_keras_tensorConv2DBatchNormalization_reduction_a_cellrange_normal_a_cell
ActivationGlobalAveragePooling2Dvalidate_activationDenseGlobalMaxPooling2Dr   get_source_inputsr   Modelr   get_fileNASNET_MOBILE_WEIGHT_PATH NASNET_MOBILE_WEIGHT_PATH_NO_TOPload_weightsNASNET_LARGE_WEIGHT_PATHNASNET_LARGE_WEIGHT_PATH_NO_TOP)input_shapepenultimate_filters
num_blocksstem_block_filtersskip_reductionfilter_multiplierinclude_topr   input_tensorpoolingclassesr   classifier_activationold_data_format	img_inputchannel_dimfiltersxpip0inputsmodelweights_path r|   L/var/www/myenv/lib/python3.10/site-packages/keras/src/applications/nasnet.pyr:   @   s6  [	


















r:   z&keras.applications.nasnet.NASNetMobilezkeras.applications.NASNetMobilec                 C   "   t | ddddd|||||d|dS )a
  Instantiates a Mobile NASNet model in ImageNet mode.

    Reference:
    - [Learning Transferable Architectures for Scalable Image Recognition](
        https://arxiv.org/abs/1707.07012) (CVPR 2018)

    Optionally loads weights pre-trained on ImageNet.
    Note that the data format convention used by the model is
    the one specified in your Keras config at `~/.keras/keras.json`.

    Note: each Keras Application expects a specific kind of input preprocessing.
    For NASNet, call `tf.keras.applications.nasnet.preprocess_input` on your
    inputs before passing them to the model.

    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)` for NASNetMobile
            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.
        include_top: Whether to include the fully-connected
            layer at the top of the network.
        weights: `None` (random initialization) or
            `imagenet` (ImageNet weights). For loading `imagenet` weights,
            `input_shape` should be (224, 224, 3)
        input_tensor: Optional Keras tensor (i.e. output of
            `layers.Input()`)
            to use as image input for the model.
        pooling: 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 layer.
            - `avg` means that global average pooling
                will be applied to the output of the
                last convolutional layer, 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.
        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"`.

    Returns:
        A Keras model instance.

    Raises:
        ValueError: In case of invalid argument for `weights`,
            or invalid input shape.
        RuntimeError: If attempting to run this model with a
            backend that does not support separable convolutions.
    i      r   Fr   r<   rg   rh   ri   rj   rk   rl   r   rm   rn   ro   r   rp   r:   rf   rl   r   rm   rn   ro   rp   r|   r|   r}   NASNetMobiled     Gr   z%keras.applications.nasnet.NASNetLargezkeras.applications.NASNetLargec                 C   r~   )a
  Instantiates a NASNet model in ImageNet mode.

    Reference:
    - [Learning Transferable Architectures for Scalable Image Recognition](
        https://arxiv.org/abs/1707.07012) (CVPR 2018)

    Optionally loads weights pre-trained on ImageNet.
    Note that the data format convention used by the model is
    the one specified in your Keras config at `~/.keras/keras.json`.

    Note: each Keras Application expects a specific kind of input preprocessing.
    For NASNet, call `tf.keras.applications.nasnet.preprocess_input` on your
    inputs before passing them to the model.

    Args:
        input_shape: Optional shape tuple, only to be specified
            if `include_top` is False (otherwise the input shape
            has to be `(331, 331, 3)` for NASNetLarge.
            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.
        include_top: Whether to include the fully-connected
            layer at the top of the network.
        weights: `None` (random initialization) or
            `imagenet` (ImageNet weights).  For loading `imagenet` weights,
            `input_shape` should be (331, 331, 3)
        input_tensor: Optional Keras tensor (i.e. output of
            `layers.Input()`)
            to use as image input for the model.
        pooling: 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 layer.
            - `avg` means that global average pooling
                will be applied to the output of the
                last convolutional layer, 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.
        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"`.

    Returns:
        A Keras model instance.

    Raises:
        ValueError: in case of invalid argument for `weights`,
            or invalid input shape.
        RuntimeError: If attempting to run this model with a
            backend that does not support separable convolutions.
    r
   r   r   Tr   r   r   r   r   r|   r|   r}   NASNetLarge  r   r   r   r   r   c              
   C   s  t  dkrdnd}t d| m td| }|dkr1tjt||d| d|}d	}nd
}tj|||d| |ddd|}tj	|ddd| d|}td|}tj||d| d
ddd|}tj	|ddd| d|}W d   |S 1 sw   Y  |S )aF  Adds 2 blocks of [relu-separable conv-batchnorm].

    Args:
        ip: Input tensor
        filters: Number of output filters per layer
        kernel_size: Kernel size of separable convolutions
        strides: Strided convolution for downsampling
        block_id: String block_id

    Returns:
        A Keras tensor
    r   r   r   separable_conv_block_r5   r!   separable_conv_1_pad_r&   r(   r"   sameseparable_conv_1_Fr$   )r%   r(   r&   r'   r)   r*   r+   separable_conv_1_bn_r-   separable_conv_2_)r(   r&   r'   r)   separable_conv_2_bn_N)
r   rM   
name_scoperQ   rY   ZeroPadding2Dr   correct_padSeparableConv2DrU   )iprt   kernel_sizer%   r3   rs   ru   conv_padr|   r|   r}   _separable_conv_block  sl   
	
((r   c           
      C   sz  t  dkrdnd}t  dkrdnd}t |}| dur"t | }t d
 | du r0|} n|| || krt d| { tjd	d
| d| } tjdddd| d| }tj|d dddd| dd|}tjdd| }	tj	dd|	}	tjdddd| d|	}	tj|d dddd| dd|	}	tj
||	g|d} tj|ddd| d | } W d   n1 sw   Y  n^|| |krt d!| . td	| } tj|dddd"| ddd#| } tj|ddd| d | } W d   n)1 sw   Y  W d   | S W d   | S W d   | S W d   | S W d   | S 1 s6w   Y  | S )$a  Adjusts the input `previous path` to match the shape of the `input`.

    Used in situations where the output number of filters needs to be changed.

    Args:
        p: Input tensor which needs to be modified
        ip: Input tensor whose shape needs to be matched
        filters: Number of output filters to be matched
        block_id: String block_id

    Returns:
        Adjusted Keras tensor
    r   r   r   r   Nadjust_blockadjust_reduction_block_r5   adjust_relu_1_r;   r   r!   r"   adjust_avg_pool_1_r%   r&   r(   r   Fadjust_conv_1_r$   )r&   r'   r(   r)   )r   r   r   )r&   )r   r   r   )croppingadjust_avg_pool_2_adjust_conv_2_)r.   r*   r+   
adjust_bn_r-   adjust_projection_block_adjust_conv_projection_r%   r&   r(   r'   r)   )r   rM   	int_shaper   rQ   rY   AveragePooling2DrT   r   
Cropping2DconcatenaterU   )
rv   r   rt   r3   rs   img_dimip_shapep_shapep1p2r|   r|   r}   _adjust_blockP  s   

		,	 
C
C
C
C
CCr   c              
   C   s  t  dkrdnd}t d| O t|| ||}td| }tj|dddd| d	d
d|}tj|ddd| d|}t d) t||dd| d}t||d| d}tj	||gd| d}W d   n1 srw   Y  t d* t||dd| d}	t||dd| d}
tj	|	|
gd| d}W d   n1 sw   Y  t d" tj
dddd| d |}tj	||gd!| d}W d   n1 sw   Y  t d"0 tj
dddd#| d |}tj
dddd$| d |}tj	||gd%| d}W d   n	1 sw   Y  t d& t||d'| d}tj	||gd(| d}W d   n	1 sBw   Y  tj||||||g|d)| d*}W d   || fS 1 sfw   Y  || fS )+zAdds a Normal cell for NASNet-A (Fig. 4 in the paper).

    Args:
        ip: Input tensor `x`
        p: Input tensor `p`
        filters: Number of output filters
        block_id: String block_id

    Returns:
        A Keras tensor
    r   r   r   normal_A_block_r5   r   r   normal_conv_1_Fr$   r   r*   r+   normal_bn_1_r-   block_1   r   normal_left1_)r   r3   normal_right1_r2   normal_add_1_r;   Nblock_2normal_left2_r   normal_right2_normal_add_2_block_3normal_left3_r   normal_add_3_block_4normal_left4_normal_right4_normal_add_4_block_5normal_left5_normal_add_5_normal_concat_r.   r(   )r   rM   r   r   rQ   rY   rT   rU   r   addr   r   )r   rv   rt   r3   rs   hx1_1x1_2x1x2_1x2_2x2x3x4_1x4_2x4x5ru   r|   r|   r}   rX     s   			
LLrX   c              
   C   s  t  dkrdnd}t d| m t|| ||}td| }tj|dddd| d	d
d|}tj|ddd| d|}tjt	
|dd| d|}t d, t||ddd| d}t||ddd| d}tj||gd| d}	W d   n1 sw   Y  t d. tjdddd | d!|}
t||ddd"| d}tj|
|gd#| d}W d   n1 sw   Y  t d$. tjdddd%| d!|}t||ddd&| d}tj||gd'| d}W d   n1 sw   Y  t d( tjdddd)| d!|	}t||g}W d   n	1 s&w   Y  t d*- t|	|dd)| d+}tjdddd,| d!|}tj||gd-| d}W d   n	1 saw   Y  tj||||g|d.| d/}|| fW  d   S 1 sw   Y  dS )0zAdds a Reduction cell for NASNet-A (Fig. 4 in the paper).

    Args:
      ip: Input tensor `x`
      p: Input tensor `p`
      filters: Number of output filters
      block_id: String block_id

    Returns:
      A Keras tensor
    r   r   r   reduction_A_block_r5   r   r   reduction_conv_1_Fr$   r   r*   r+   reduction_bn_1_r-   r    reduction_pad_1_r   r   r   r!   reduction_left1_)r%   r3   )   r   reduction_right1_reduction_add_1_r;   Nr   r   r"   reduction_left2_r   reduction_right2_reduction_add_2_r   reduction_left3_reduction_right3_reduction_add3_r   reduction_left4_r   r2   reduction_right5_reduction_add4_reduction_concat_r   )r   rM   r   r   rQ   rY   rT   rU   r   r   r   r   r   MaxPooling2Dr   r   )r   rv   rt   r3   rs   r   h3r   r   r   r   r   r   x3_1x3_2r   r   x5_1x5_2r   ru   r|   r|   r}   rV   	  s   	
	
&rV   z*keras.applications.nasnet.preprocess_inputc                 C   s   t j| |ddS )NrD   )r   mode)r   preprocess_input)ru   r   r|   r|   r}   r   }  s   r   z,keras.applications.nasnet.decode_predictionsr   c                 C   s   t j| |dS )N)top)r   decode_predictions)predsr   r|   r|   r}   r     s   r    )r   reterror)Nr
   r   r   Tr   Tr   NNr   Nr   )NTr   NNr   r   )r   r   N)N)r   )(__doc__tensorflow.compat.v2compatv2rD   	keras.srcr   keras.src.applicationsr   keras.src.enginer   keras.src.layersr   keras.src.utilsr   r   tensorflow.python.platformr   rN    tensorflow.python.util.tf_exportr	   BASE_WEIGHTS_PATHra   rb   rd   re   rQ   r:   r   r   r   r   rX   rV   r   r   PREPROCESS_INPUT_DOCformatPREPROCESS_INPUT_RET_DOC_TFPREPROCESS_INPUT_ERROR_DOCr|   r|   r|   r}   <module>   s   
  &UV

<
\
]t