o
    ={cy                     @   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.
    >   r   NzThe `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_sizeZmin_sizedata_formatZrequire_flattenweightsZ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)Z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   validFZ
stem_conv1	he_normal)stridespaddinguse_biasnamekernel_initializerZڊ?MbP?Zstem_bn1axisZmomentumepsilonr#   Zstem_1block_idZstem_2z%dz	reduce_%dreluZpredictions)Z
activationr#   ZavgmaxNASNetr#      znasnet_mobile.h5ZmodelsZ 020fb642bf7360b370c678b08e0adf61)Zcache_subdirZ	file_hashznasnet_mobile_no_top.h5Z 1ed92395b5b598bdda52abe5c0dbfd63znasnet_large.h5Z 11577c9a518f0070763c2b964a382f17znasnet_large_no_top.h5Z d81d89dc07e6e56530c4e77faddd61b5zDImageNet weights can only be loaded with NASNetLarge or NASNetMobile)'tfioZgfileexists
ValueError
isinstancetuplestrr   Zobtain_input_shaper   image_data_formatloggingZwarningZset_image_data_formatlayersZInputZis_keras_tensorConv2DBatchNormalization_reduction_a_cellrange_normal_a_cell
ActivationZGlobalAveragePooling2DZvalidate_activationZDenseZGlobalMaxPooling2Dr   Zget_source_inputsr   ZModelr   Zget_fileNASNET_MOBILE_WEIGHT_PATH NASNET_MOBILE_WEIGHT_PATH_NO_TOPZ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_activationZold_data_formatZ	img_inputchannel_dimfiltersxpiZp0ZinputsZmodelZweights_path rU   9lib/python3.10/site-packages/keras/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   r0   rF   rG   rH   rI   rJ   rK   r   rL   rM   rN   r   rO   r.   rE   rK   r   rL   rM   rN   rO   rU   rU   rV   NASNetMobiled     Gr\   z%keras.applications.nasnet.NASNetLargezkeras.applications.NASNetLargec                 C   rW   )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   rY   rZ   r[   rU   rU   rV   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   Zseparable_conv_block_r,   r   Zseparable_conv_1_pad_r!   r#   r   sameZseparable_conv_1_Fr   )r    r#   r!   r"   r$   r%   r&   Zseparable_conv_1_bn_r'   Zseparable_conv_2_)r#   r!   r"   r$   Zseparable_conv_2_bn_N)
r   r8   
name_scoper:   r@   ZeroPadding2Dr   correct_padZSeparableConv2Dr<   )iprQ   kernel_sizer    r+   rP   rR   Zconv_padrU   rU   rV   _separable_conv_block  sl   
	
((rg   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   NZadjust_blockZadjust_reduction_block_r,   Zadjust_relu_1_r/   r_   r   r   Zadjust_avg_pool_1_r    r!   r#   ra   FZadjust_conv_1_r   )r!   r"   r#   r$   )r   r   rj   )r!   )r   r   rk   )ZcroppingZadjust_avg_pool_2_Zadjust_conv_2_)r(   r%   r&   Z
adjust_bn_r'   Zadjust_projection_block_Zadjust_conv_projection_r    r!   r#   r"   r$   )r   r8   Z	int_shaperb   r:   r@   AveragePooling2Dr;   rc   Z
Cropping2Dconcatenater<   )
rS   re   rQ   r+   rP   Zimg_dimZip_shapeZp_shapeZp1Zp2rU   rU   rV   _adjust_blockP  s   

		,	 
C
C
C
C
CCro   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   Znormal_A_block_r,   r_   ra   Znormal_conv_1_Fr   rl   r%   r&   Znormal_bn_1_r'   block_1   rr   Znormal_left1_)rf   r+   Znormal_right1_r*   Znormal_add_1_r/   Nblock_2Znormal_left2_r   Znormal_right2_Znormal_add_2_block_3Znormal_left3_ri   Znormal_add_3_block_4Znormal_left4_Znormal_right4_Znormal_add_4_block_5Znormal_left5_Znormal_add_5_Znormal_concat_r(   r#   )r   r8   rb   ro   r:   r@   r;   r<   rg   addrm   rn   )re   rS   rQ   r+   rP   hx1_1x1_2x1x2_1x2_2x2x3Zx4_1Zx4_2x4x5rR   rU   rU   rV   r?     s   			
LLr?   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   Zreduction_A_block_r,   r_   ra   Zreduction_conv_1_Fr   rl   r%   r&   Zreduction_bn_1_r'   r   Zreduction_pad_1_r`   rp   rq   r   Zreduction_left1_)r    r+   )   r   Zreduction_right1_Zreduction_add_1_r/   Nrs   r   r   Zreduction_left2_ri   Zreduction_right2_Zreduction_add_2_rt   Zreduction_left3_Zreduction_right3_Zreduction_add3_ru   Zreduction_left4_rv   r*   Zreduction_right5_Zreduction_add4_Zreduction_concat_rw   )r   r8   rb   ro   r:   r@   r;   r<   rc   r   rd   rg   rx   ZMaxPooling2Drm   rn   )re   rS   rQ   r+   rP   ry   Zh3rz   r{   r|   r}   r~   r   Zx3_1Zx3_2r   r   Zx5_1Zx5_2r   rR   rU   rU   rV   r=   	  s   	
	
&r=   z*keras.applications.nasnet.preprocess_inputc                 C   s   t j| |ddS )Nr1   )r   mode)r   preprocess_input)rR   r   rU   rU   rV   r   }  s   r   z,keras.applications.nasnet.decode_predictionsrr   c                 C   s   t j| |dS )N)top)r   decode_predictions)Zpredsr   rU   rU   rV   r     s   r    )r   reterror)Nr
   r   r   Tr   Tr   NNr   Nr   )NTr   NNr   r   )r   r_   N)N)rr   )(__doc__Ztensorflow.compat.v2compatZv2r1   Zkerasr   Zkeras.applicationsr   Zkeras.enginer   Zkeras.layersr   Zkeras.utilsr   r   Ztensorflow.python.platformr   r9   Z tensorflow.python.util.tf_exportr	   ZBASE_WEIGHTS_PATHrA   rB   rC   rD   r:   r.   r\   r^   rg   ro   r?   r=   r   r   ZPREPROCESS_INPUT_DOCformatZPREPROCESS_INPUT_RET_DOC_TFZPREPROCESS_INPUT_ERROR_DOCrU   rU   rU   rV   <module>   s   
  &UV

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