
    |h                     4   d Z ddlmc 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   Zedz   Zedz   Zedz   Z e       Z	 	 	 	 	 	 	 	 	 	 	 	 	 d!dZ edd      	 	 	 	 	 	 	 d"d       Z edd      	 	 	 	 	 	 	 d"d       Z	 d#dZd$dZd$dZ d$dZ! ed      d$d       Z" ed      d%d       Z#ejH                  jK                  dejL                  ejN                         e"_         ejF                  j                   e#_         y)&aJ  NASNet-A models for TF-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.h5c           
         |dv s4t         j                  j                  j                  |      st	        d      |dk(  r|r|
dk7  rt	        d      t        | t              r#d| v r|dk(  rt	        dt        |       z   dz         |d	}t        j                  | |d
t        j                         ||      } t        j                         dk7  r-t        j                  d       t        j                  d       d}nd}|t        j!                  |       }n/t        j"                  |      st        j!                  ||       }n|}|d|dz  z  z  dk7  rt	        d|z        t        j                         dk(  rdnd}|dz  }t        j%                  |dddddd      |      }t        j'                  |ddd !      |      }d}t)        ||||dz  z  d"#      \  }}t)        ||||z  d$#      \  }}t+        |      D ]  }t-        |||d%|z  #      \  }} t)        ||||z  d&|z  #      \  }}|s|n|}t+        |      D ]   }t-        ||||z  d%||z   dz   z  #      \  }}" t)        ||||dz  z  d&d|z  z  #      \  }}|s|n|}t+        |      D ]&  }t-        ||||dz  z  d%d|z  |z   dz   z  #      \  }}( t        j/                  d'      |      }|rMt        j1                         |      }t        j2                  ||       t        j5                  |
|d()      |      }n=|	d*k(  rt        j1                         |      }n|	d+k(  rt        j7                         |      }|t9        j:                  |      }n|}t=        j>                  ||d,-      }|dk(  r|d.k(  rO|rtA        jB                  d/tD        d0d12      }ntA        jB                  d3tF        d0d42      }|jI                  |       nr|d	k(  rO|rtA        jB                  d5tJ        d0d62      }ntA        jB                  d7tL        d0d82      }|jI                  |       nt	        d9      ||jI                  |       |rt        j                  |       |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 TF-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 TF-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.
    >   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.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 TF-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   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_paths                           _/var/www/html/test/engine/venv/lib/python3.12/site-packages/tf_keras/src/applications/nasnet.pyr8   r8   @   s2   x ))RUU[[-?-?-H<
 	
 *D0
 	
 	;&Kz!4 7:+6FG JNN
 	
  !33!--/#K   "o59
	
 	%%o6*LL{L3	&&|4LLI$Ib$5q$89:a?D!"
 	
 0026FF!BK!R'G& 	 	 	A 	!!64j 	" 			A 	A	1g+Q./(DAq 	1g**XDAq : BaGdajA1B 	1g))K:4NEAr !aA: 
''Z!^a/0	
1
 		#Q&&J/	EAr !aA: 
'**Q^a/!34	
1
 	&!!$A))+A.**+@'JLL 5M  

 e--/2A))+A.A ..|<NN6184E *3)22&-!)@	   *22-4!)@	  |,S )22%,!)@	   *22,3!)@	  |,#  
	7#%%o6L    z&keras.applications.nasnet.NASNetMobilezkeras.applications.NASNetMobilec                 2    t        | 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 TF-Keras config at `~/.keras/keras.json`.

    Note: each TF-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 TF-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 TF-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:   re   rf   rg   rh   ri   rj   r   rk   rl   rm   r   rn   r8   rd   rj   r   rk   rl   rm   rn   s          rz   NASNetMobiler   e  s9    P  !3 r{   z%keras.applications.nasnet.NASNetLargezkeras.applications.NASNetLargec                 2    t        | ddddd|||||d|      S )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 TF-Keras config at `~/.keras/keras.json`.

    Note: each TF-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 TF-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 TF-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.
         `   Tr   r   r~   r   r   s          rz   NASNetLarger     s9    P  !3 r{   c                    t        j                         dk(  rdnd}t        j                  d|       5  t        j	                  d      |       }|dk(  r6t        j                  t        j                  ||      d|       |      }d	}nd
}t        j                  |||d| |dd      |      }t        j                  |ddd|       |      }t        j	                  d      |      }t        j                  ||d| d
dd      |      }t        j                  |ddd|       |      }ddd       |S # 1 sw Y   S xY w)aI  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 TF-Keras tensor
    r   r   r   separable_conv_block_r3   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   rK   
name_scoperO   rW   ZeroPadding2Dr   correct_padSeparableConv2DrS   )iprr   kernel_sizer#   r1   rq   rs   conv_pads           rz   _separable_conv_blockr     s    0026FF!BK			3H:>	? 'f%b)f$$&221kB,XJ7 %  A HH""$XJ/* # 
  %%'z2	 & 

  f%a(""$XJ/* # 
  %%'z2	 & 

 E'P HQ'P Hs   C;D99Ec                    t        j                         dk(  rdnd}t        j                         dk(  rdnd}t        j                  |      }| t        j                  |       }t        j                  d      5  | |} n|   ||   k7  r?t        j                  d|       5  t	        j                  d	d
|       |       } t	        j                  dddd|       |       }t	        j                  |dz  dddd| d      |      }t	        j                  d      |       }	t	        j                  d      |	      }	t	        j                  dddd|       |	      }	t	        j                  |dz  dddd| d      |	      }	t        j                  ||	g|      } t	        j                  |ddd|        |       } ddd       n||   |k7  rt        j                  d!|       5  t	        j                  d	      |       } t	        j                  |dddd"| dd#      |       } t	        j                  |ddd|        |       } ddd       ddd       | S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   | S xY w)$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 TF-Keras tensor
    r   r   r   r   Nadjust_blockadjust_reduction_block_r3   adjust_relu_1_r9   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   rK   	int_shaper   rO   rW   AveragePooling2DrR   r   
Cropping2DconcatenaterS   )
rt   r   rr   r1   rq   img_dimip_shapep_shapep1p2s
             rz   _adjust_blockr   S  s    0026FF!BK,,.2BBaG  $H}##A&			N	+ B9AW'!22##&=hZ$HI *%%f^H:3N%O ,,"#-hZ8	 - 
  ]]qL"")(4'2 #   ))2B)CAF&&0@&A"E,,"#-hZ8	 - 
  ]]qL"")(4'2 #   &&Bxk&B--$# %hZ0	 . 
 K* *X [!W,##&>xj$IJ %%f-a0MM""28*="'2 "   --$# %hZ0	 . 
 eBF H}* *Z eBF Hs>   8+I4#DI)I4*A I(
I4I%	!I4(I1	-I44I>c                    t        j                         dk(  rdnd}t        j                  d|       5  t        || ||      }t	        j                  d      |       }t	        j                  |dddd| d	d
      |      }t	        j                  |ddd|       |      }t        j                  d      5  t        ||dd|       }t        ||d|       }t        j                  ||gd|       }ddd       t        j                  d      5  t        ||dd|       }	t        ||dd|       }
t        j                  |	|
gd|       }ddd       t        j                  d      5  t	        j                  dddd|        |      }t        j                  ||gd!|       }ddd       t        j                  d"      5  t	        j                  dddd#|        |      }t	        j                  dddd$|        |      }t        j                  ||gd%|       }ddd       t        j                  d&      5  t        ||d'|       }t        j                  ||gd(|       }ddd       t        j                  |g|d)| *      }ddd       || fS # 1 sw Y   xY w# 1 sw Y   fxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ixY w# 1 sw Y   | fS xY w)+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 TF-Keras tensor
    r   r   r   normal_A_block_r3   r   r   normal_conv_1_Fr"   r   r(   r)   normal_bn_1_r+   block_1   r   normal_left1_)r   r1   normal_right1_r0   normal_add_1_r9   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   rK   r   r   rO   rW   rR   rS   r   addr   r   )r   rt   rr   r1   rq   hx1_1x1_2x1x2_1x2_2x2x3x4_1x4_2x4x5rs   s                     rz   rV   rV     s    0026FF!BK			ohZ8	9 K
!R(3f%b)MM!(,*  
  %%z*	 & 

  	* 
	K("(
3	D )7~hZ%@D T4Lxj/IJB
	K 	* 	K(7F}XJ-GD )7F~hZ-HD T4Lxj/IJB	K 	* 	F(($XJ/	 ) 
 B RGM(*DEB	F 	* 	K**$XJ/	 + 
 D **%hZ0	 + 
 D T4Lxj/IJB	K 	* 	F&7}XJ%?B RGM(*DEB		F BB#!(,  
OK
X b5Lq
	K 
	K	K 	K	F 	F	K 	K	F 	FCK
X b5Ls   BK+7A J,7K+AJ9K+2>K0K+AK,K+	.K7)K+,J6	1K+9K	>K+K	K+K	K+K(	$K++K7c                    t        j                         dk(  rdnd}t        j                  d|       5  t        || ||      }t	        j                  d      |       }t	        j                  |dddd| d	d
      |      }t	        j                  |ddd|       |      }t	        j                  t        j                  |d      d|       |      }t        j                  d      5  t        ||ddd|       }t        ||ddd|       }t        j                  ||gd|       }	ddd       t        j                  d      5  t	        j                  dddd | !      |      }
t        ||ddd"|       }t        j                  |
|gd#|       }ddd       t        j                  d$      5  t	        j                  dddd%| !      |      }t        ||ddd&|       }t        j                  ||gd'|       }ddd       t        j                  d(      5  t	        j                  dddd)| !      	      }t        j                  |g      }ddd       t        j                  d*      5  t        	|dd)| +      }t	        j                  dddd,| !      |      }t        j                  ||gd-|       }ddd       t        j                  g|d.| /      }|| fcddd       S # 1 sw Y   xY w# 1 sw Y   txY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   hxY w# 1 sw Y   yxY w)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 TF-Keras tensor
    r   r   r   reduction_A_block_r3   r   r   reduction_conv_1_Fr"   r   r(   r)   reduction_bn_1_r+   r   reduction_pad_1_r   r   r   r   reduction_left1_)r#   r1   )   r   reduction_right1_reduction_add_1_r9   Nr   r   r    reduction_left2_r   reduction_right2_reduction_add_2_r   reduction_left3_reduction_right3_reduction_add3_r   reduction_left4_r   r0   reduction_right5_reduction_add4_reduction_concat_r   )r   rK   r   r   rO   rW   rR   rS   r   r   r   r   r   MaxPooling2Dr   r   )r   rt   rr   r1   rq   r   h3r   r   r   r   r   r   x3_1x3_2r   r   x5_1x5_2r   rs   s                        rz   rT   rT     s    0026FF!BK			0
;	< c!R(3f%b)MM$XJ/*  
  %%"8*-	 & 

  !!"..q!4#H:. " 
 
 	* 	N(+H:6D ),XJ7D T4L1A(/LMB	N" 	* 	N&&'z2	 ' 
 D ),XJ7D T4L1A(/LMB	N  	* 	M**'z2	 + 
 D ),XJ7D T4L
/KLB	M  	* 	&(('z2	 ) 
 B RH%B	& 	* 
	M(GV0@
.KD &&(
3	 ' 
 D T4L
/KLB
	M R$XJ/  

 "uGc c0	N 	N"	N 	N 	M 	M 	& 	&
	M 
	Mec cs   B6L?*AL -L?
ALL?8AL	L?&9L'L?<AL3*L? L
	L?L	L?L$	L?'L0	,L?3L<	8L??Mz*keras.applications.nasnet.preprocess_inputc                 2    t        j                  | |d      S )NrB   )r   mode)r   preprocess_input)rs   r   s     rz   r   r     s    **	{ r{   z,keras.applications.nasnet.decode_predictionsc                 0    t        j                  | |      S )N)top)r   decode_predictions)predsr   s     rz   r   r     s    ,,U<<r{    )r   reterror)Nr   r   r   Tr   Tr   NNr   Nsoftmax)NTr   NNr   r   )r   r   N)N)r   )(__doc__tensorflow.compat.v2compatv2rB   tf_keras.srcr   tf_keras.src.applicationsr   tf_keras.src.enginer   tf_keras.src.layersr   tf_keras.src.utilsr   r   tensorflow.python.platformr	   rL    tensorflow.python.util.tf_exportr
   BASE_WEIGHTS_PATHr_   r`   rb   rc   rO   r8   r   r   r   r   rV   rT   r   r   PREPROCESS_INPUT_DOCformatPREPROCESS_INPUT_RET_DOC_TFPREPROCESS_INPUT_ERROR_DOC r{   rz   <module>r     s   0 " !   4 ( 2 ) * = 9 K  .0BB #47P#P  ,/@@ "36N"N 		 #bJ	 ,.O #SSl +-M #SSn ?C9xYxZzqh :; < <== >= *>>EE	22

3
3 F   
 ,>>FF  r{   