
    2Vhx                        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
z   Zedz   Zedz   Zedz   Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ eddg      	 	 	 	 	 	 	 	 d d       Z eddg      	 	 	 	 	 	 	 	 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j8                  j;                  dej<                  ej>                        e_         ej6                  j@                  e_         y)%    N)backend)layers)keras_export)imagenet_utils)
Functional)operation_utils)
file_utilszDhttps://storage.googleapis.com/tensorflow/keras-applications/nasnet/zNASNet-mobile.h5zNASNet-mobile-no-top.h5zNASNet-large.h5zNASNet-large-no-top.h5c           
         t        j                         dk(  rt        d      |dv s t        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d       |t        j                  |       }n/t        j                  |      st        j                  ||       }n|}|d|dz  z  z  dk7  rt        d|       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'        |||| %      \  }} t#        ||||z  d'| %      \  }}|s|n|}t%        |      D ]  }t'        ||||z  ||z   dz    %      \  }}  t#        ||||dz  z  d'd|z   %      \  }}|s|n|}t%        |      D ]$  }t'        ||||dz  z  d|z  |z   dz    %      \  }}&  t        j(                  d(      |      }|rO t        j*                         |      }t        j,                  ||        t        j.                  |
|d)*      |      }n?|	d+k(  r t        j*                         |      }n|	d,k(  r t        j0                         |      }|t3        j4                  |      }n|}t7        |||-      }|dk(  r|d.k(  rP|rt        j8                  d/t:        d0d12      }nt        j8                  d3t<        d0d42      }|j?                  |       |S |dk(  rP|rt        j8                  d5t@        d0d62      }nt        j8                  d7tB        d0d82      }|j?                  |       |S t        d9      ||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 Keras Application expects a specific kind of input preprocessing.
    For NasNet, call `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"`.
        name: The name of the model (string).

    Returns:
        A model instance.
    channels_firstzNASNet does not support the `channels_first` image data format. Switch to `channels_last` by editing your local config file at ~/.keras/keras.json>   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 Keras config located at ~/.keras/keras.json. The model being returned right now will expect inputs to follow the "channels_last" data format.   )
stacklevel)shape)tensorr      r   zuFor NASNet-A models, the `penultimate_filters` must be a multiple of 24 * (`filter_multiplier` ** 2). Current value:       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_2reduce_relupredictions)
activationr&   avgmax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)"r   image_data_format
ValueErrorr	   exists
isinstancetuplestrr   obtain_input_shapewarningswarnr   Inputis_keras_tensorConv2DBatchNormalization_reduction_a_cellrange_normal_a_cell
ActivationGlobalAveragePooling2Dvalidate_activationDenseGlobalMaxPooling2Dr   get_source_inputsr   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_activationr&   	img_inputchannel_dimfiltersxpip0inputsmodelweights_paths                           M/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/applications/nasnet.pyNASNetrt      s8   |   "&661
 	

 ))Z->->w-G<
 	
 *D0
 	
 	;&Kz!4 7:+6FG JNN
 	
  !33!--/#K   "o59 	
 LL{3	&&|4LLI$Ib$5q$89:a?124
 	
 0026FF!BK!R'G	&	 	A	!!64j			A 	A	1g+Q./(DAq 	1g**XDAq : >aG=1> 	1g))gj\4JEAr !aA: 
''"Q*+	
1
 		#Q&&1z>*+	EAr !aA: 
'**J*Q./	
1
 	"&!!$A+F))+A.**+@'J
FLL 5M

 e/--/2A+))+A.A  22<@vqt,E *3)22&-!)@	   *22-4!)@	  |,2 L1 S )22%,!)@	   *22,3!)@	  |, L #  
	7#L    z&keras.applications.nasnet.NASNetMobilezkeras.applications.NASNetMobilec                     t        j                          dk(  rt        d      |s| d} 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 Keras config at `~/.keras/keras.json`.

    Note: each Keras Application expects a specific kind of input preprocessing.
    For NASNet, call `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"`.
        name: The name of the model (string).

    Returns:
        A Keras model instance.
    torchz}NASNetMobile is not available with the torch backend at this time due to an outstanding bug. If interested, please open a PR.)r:   r:   r   i      r   Fr   r:   r_   r`   ra   rb   rc   rd   r   re   rf   rg   r   rh   r&   )r   rC   rt   r^   rd   r   re   rf   rg   rh   r&   s           rs   NASNetMobiler{   ;  sl    L G#/
 	

 ;.# !3 ru   z%keras.applications.nasnet.NASNetLargezkeras.applications.NASNetLargec                 4    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 Keras config at `~/.keras/keras.json`.

    Note: each Keras Application expects a specific kind of input preprocessing.
    For NASNet, call `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"`.
        name: The name of the model (string).

    Returns:
        A Keras model instance.
         `   Tr   r   ry   )rt   rz   s           rs   NASNetLarger     s<    L  !3 ru   c           
         t        j                         dk(  rdnd}t        j                  d|       5   t        j                  d      |       }|dk(  r7 t        j
                  t        j                  ||      d|       |      }d	}nd
} t        j                  |||d| |d      |      } t        j                  |ddd|       |      } t        j                  d      |      } t        j                  ||d| d
d      |      } t        j                  |ddd|       |      }ddd       |S # 1 sw Y   S xY w)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_r4   r   separable_conv_1_pad_r$   r&   r    sameseparable_conv_1_F)r#   r&   r$   r%   r(   r)   separable_conv_1_bn_r+   separable_conv_2_)r&   r$   r%   separable_conv_2_bn_N)
r   rB   
name_scoper   rR   ZeroPadding2Dr   correct_padSeparableConv2DrN   )iprk   kernel_sizer#   r1   rj   rl   conv_pads           rs   _separable_conv_blockr     s    0026FF!BK			3H:>	? %%Ff%b)f$$&221kB,XJ7 A HH
F""$XJ/
 
F%%'z2	

  &Ff%a(
F""$XJ/
 
F%%'z2	

 A%L HM%L Hs   D D>>Ec                    t        j                         dk(  rdnd}t        j                         dk(  rdnd}t        j                  d      5  | |} n| j                  |   |j                  |   k7  rGt        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| j                  |   |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 Keras tensor
    r   r   r   r   adjust_blockNadjust_reduction_block_r4   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   rB   r   r   r   rR   AveragePooling2DrM   r   
Cropping2DconcatenaterN   )rm   r   rk   r1   rj   img_dimp1p2s           rs   _adjust_blockr   -  s    0026FF!BK,,.2BBaG			N	+ B9AWWW'!22##&=hZ$HI *OF%%f^H:3NOV,,"#-hZ8	
 V]]qL"")(4'2  DV))2BCAFAV&&0@A"EV,,"#-hZ8	
 V]]qL"")(4'2  &&BxkBF--$# %hZ0	
 K* *X WW[!W,##&>xj$IJ -F%%f-a0FMM""28*="'2 F--$# %hZ0	
 eBF H}* *Z eBF Hs>   ?I1D&I13I1$A#I%I1I"	I1%I.	*I11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   ix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 Keras tensor
    r   r   r   normal_A_block_r4   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   rB   r   r   r   rR   rM   rN   r   addr   r   )r   rm   rk   r1   rj   hx1_1x1_2x1x2_1x2_2x2x3x4_1x4_2x4x5rl   s                     rs   rQ   rQ     s    0026FF!BK			ohZ8	9 K
!R(3%Ff%b)
FMM!(,*
 
F%%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6**$XJ/	
 D6**%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K1:A J2:K1AJ?K15?K4K1A!K2K1.K%=)K12J<	7K1?K		K1K	K1K"	K1%K.	*K11K=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   wx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 Keras tensor
    r   r   r   reduction_A_block_r4   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   rB   r   r   r   rR   rM   rN   r   r   r   r   r   MaxPooling2Dr   r   )r   rm   rk   r1   rj   r   h3r   r   r   r   r   r   x3_1x3_2r   r   x5_1x5_2r   rl   s                        rs   rO   rO     s    0026FF!BK			0
;	< c!R(3%Ff%b)
FMM$XJ/*
 
F%%"8*-	

 
V!!"..q!4#H:.
 
 	* 	N(+H:6D ),XJ7D T4L1A(/LMB	N" 	* 	N6&&'z2	
 D ),XJ7D T4L1A(/LMB	N  	* 	M6**'z2	
 D ),XJ7D T4L
/KLB	M  	* 	&(('z2	
 B RH%B	& 	* 
	M(GV0@
.KD6&&(
3	
 D T4L
/KLB
	M R$XJ/

 "uGc c0	N 	N"	N 	N 	M 	M 	& 	&
	M 
	Mec cs   B:M.AL1MAL M=AL"M,:L/&MAL;*ML	ML	M"L,	'M/L8	4M;M	 MMz*keras.applications.nasnet.preprocess_inputc                 2    t        j                  | |d      S )Ntf)r   mode)r   preprocess_input)rl   r   s     rs   r   r   U  s    **	{ ru   z,keras.applications.nasnet.decode_predictionsc                 0    t        j                  | |      S )N)top)r   decode_predictions)predsr   s     rs   r   r   \  s    ,,U<<ru    )r   reterror)Nr}   r~   r   Tr   Tr   NNr   Nsoftmaxrt   )NTr   NNr   r   nasnet_mobile)NTr   NNr   r   nasnet_large)r   r   N)N)r   )!rI   	keras.srcr   r   keras.src.api_exportr   keras.src.applicationsr   keras.src.modelsr   keras.src.opsr   keras.src.utilsr	   BASE_WEIGHTS_PATHrY   rZ   r\   r]   rt   r{   r   r   r   rQ   rO   r   r   PREPROCESS_INPUT_DOCformatPREPROCESS_INPUT_RET_DOC_TFPREPROCESS_INPUT_ERROR_DOC__doc__ ru   rs   <module>r     s      - 1 ' ) & K  .0BB #47P#P  ,/@@ "36N"N  #	dN	 0) #	WWt /( #	OOf ?C7tTnZzqh :; < <== >= *>>EE	22

3
3 F   
 ,>>FF  ru   