o
    ={cC                     @   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
Zed Zed Zed Zed Zed Zed Ze Zdd Zdd Zdd Z							d4ddZedd							d4dd Zed!d"							d4d#d$Zed%d&							d4d'd(Z ed)d5d*d+Z!ed,d6d.d/Z"ej#j$d0ej%ej&d1e!_ ej"j e"_ d2Z'e(ed3ej e'  e(ed3ej e'  e(e d3e j e'  dS )7zDenseNet models for Keras.

Reference:
  - [Densely Connected Convolutional Networks](
      https://arxiv.org/abs/1608.06993) (CVPR 2017)
    N)backend)imagenet_utils)training)VersionAwareLayers)
data_utils)layer_utils)keras_exportzFhttps://storage.googleapis.com/tensorflow/keras-applications/densenet/1densenet121_weights_tf_dim_ordering_tf_kernels.h57densenet121_weights_tf_dim_ordering_tf_kernels_notop.h51densenet169_weights_tf_dim_ordering_tf_kernels.h57densenet169_weights_tf_dim_ordering_tf_kernels_notop.h51densenet201_weights_tf_dim_ordering_tf_kernels.h57densenet201_weights_tf_dim_ordering_tf_kernels_notop.h5c                 C   s0   t |D ]}t| d|d t|d  d} q| S )zA dense block.

    Args:
      x: input tensor.
      blocks: integer, the number of building blocks.
      name: string, block label.

    Returns:
      Output tensor for the block.
        Z_block   name)range
conv_blockstr)xblocksr   i r   ;lib/python3.10/site-packages/keras/applications/densenet.pydense_block?   s    r   c                 C   s   t  dkrdnd}tj|d|d d| } tjd|d d	| } tjtt | | | dd
|d d| } tjdd|d d| } | S )zA transition block.

    Args:
      x: input tensor.
      reduction: float, compression rate at transition layers.
      name: string, block label.

    Returns:
      output tensor for the block.
    channels_last   r   >Z_bnaxisepsilonr   reluZ_relur   FZ_convuse_biasr      Z_poolstridesr   )	r   image_data_formatlayersBatchNormalization
ActivationConv2DintZ	int_shapeZAveragePooling2D)r   Z	reductionr   bn_axisr   r   r   transition_blockO   s"   
r/   c                 C   s   t  dkrdnd}tj|d|d d| }tjd|d d	|}tjd
| dd|d d|}tj|d|d d|}tjd|d d	|}tj|ddd|d d|}tj||d d| |g} | S )zA building block for a dense block.

    Args:
      x: input tensor.
      growth_rate: float, growth rate at dense layers.
      name: string, block label.

    Returns:
      Output tensor for the block.
    r   r   r   r   Z_0_bnr   r"   Z_0_relur      FZ_1_convr#   Z_1_bnZ_1_reluZsameZ_2_conv)paddingr$   r   Z_concat)r    r   )r   r(   r)   r*   r+   r,   ZConcatenate)r   Zgrowth_rater   r.   Zx1r   r   r   r   i   s2   

r   Timagenet  softmaxc                 C   s  |dv st jj|std|dkr|r|dkrtdtj|ddt ||d}|d	u r5t	j
|d
}nt|sBt	j
||d}n|}t dkrLdnd}	t	jdd|}
t	jdddddd|
}
t	j|	ddd|
}
t	jddd|
}
t	jdd|
}
t	jdddd|
}
t|
| d  d!d}
t|
d"d#d}
t|
| d d$d}
t|
d"d%d}
t|
| d d&d}
t|
d"d'd}
t|
| d d(d}
t	j|	dd)d|
}
t	jddd|
}
|rt	jd*d|
}
t|| t	j||d+d,|
}
n|d-krt	jd*d|
}
n|d.krt	jd/d|
}
|d	urt|}n|}| g d0kr%tj||
d1d}n(| g d2kr5tj||
d3d}n| g d4krEtj||
d5d}ntj||
d6d}|dkr|r| g d0krftjd7td8d9d:}nT| g d2krwtjd;td8d<d:}nC| g d4krtjd=td8d>d:}n2| g d0krtjd?t d8d@d:}n!| g d2krtjdAt!d8dBd:}n| g d4krtjdCt"d8dDd:}|#| |S |d	ur|#| |S )Eaz  Instantiates the DenseNet architecture.

    Reference:
    - [Densely Connected Convolutional Networks](
        https://arxiv.org/abs/1608.06993) (CVPR 2017)

    This function returns a Keras image classification model,
    optionally loaded with weights pre-trained on ImageNet.

    For image classification use cases, see
    [this page for detailed examples](
      https://keras.io/api/applications/#usage-examples-for-image-classification-models).

    For transfer learning use cases, make sure to read the
    [guide to transfer learning & fine-tuning](
      https://keras.io/guides/transfer_learning/).

    Note: each Keras Application expects a specific kind of input preprocessing.
    For DenseNet, call `tf.keras.applications.densenet.preprocess_input` on your
    inputs before passing them to the model.
    `densenet.preprocess_input` will scale pixels between 0 and 1 and then
    will normalize each channel with respect to the ImageNet dataset statistics.

    Args:
      blocks: numbers of building blocks for the four dense layers.
      include_top: whether to include the fully-connected
        layer at the top of the network.
      weights: one of `None` (random initialization),
        'imagenet' (pre-training on ImageNet),
        or the path to the weights file to be loaded.
      input_tensor: optional Keras tensor
        (i.e. output of `layers.Input()`)
        to use as image input for the model.
      input_shape: optional shape tuple, only to be specified
        if `include_top` is False (otherwise the input shape
        has to be `(224, 224, 3)` (with `'channels_last'` data format)
        or `(3, 224, 224)` (with `'channels_first'` data format).
        It should have exactly 3 inputs channels,
        and width and height should be no smaller than 32.
        E.g. `(200, 200, 3)` would be one valid value.
      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.
      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.
    >   r2   NzThe `weights` argument should be either `None` (random initialization), `imagenet` (pre-training on ImageNet), or the path to the weights file to be loaded.r2   r3   zWIf using `weights` as `"imagenet"` with `include_top` as true, `classes` should be 1000   r   )Zdefault_sizeZmin_sizedata_formatZrequire_flattenweightsN)shape)Ztensorr8   r   r   r   )r   r   r9   )r1   @      r%   Fz
conv1/conv)r'   r$   r   r   zconv1/bnr   r"   z
conv1/relur   )r   r   r<   Zpool1r&   r   Zconv2g      ?Zpool2Zconv3Zpool3Zconv4Zpool4Zconv5ZbnZavg_poolZpredictions)Z
activationr   ZavgmaxZmax_pool            Zdensenet121r?   r@   r   r   Zdensenet169r?   r@   0   r   Zdensenet201Zdensenetr	   ZmodelsZ 9d60b8095a5708f2dcce2bca79d332c7)Zcache_subdirZ	file_hashr   Z d699b8f76981ab1b30698df4c175e90br   Z 1ceb130c1ea1b78c3bf6114dbdfd8807r
   Z 30ee3e1110167f948a6b9946edeeb738r   Z b8c4d4c20dd625c148057b9ff1c1176br   Z c13680b51ded0fb44dff2d8f86ac8bb1)$tfioZgfileexists
ValueErrorr   Zobtain_input_shaper   r(   r)   ZInputZis_keras_tensorZZeroPadding2Dr,   r*   r+   ZMaxPooling2Dr   r/   ZGlobalAveragePooling2DZvalidate_activationZDenseZGlobalMaxPooling2Dr   Zget_source_inputsr   ZModelr   Zget_fileDENSENET121_WEIGHT_PATHDENSENET169_WEIGHT_PATHDENSENET201_WEIGHT_PATHDENSENET121_WEIGHT_PATH_NO_TOPDENSENET169_WEIGHT_PATH_NO_TOPDENSENET201_WEIGHT_PATH_NO_TOPZload_weights)r   include_topr7   input_tensorinput_shapepoolingclassesclassifier_activationZ	img_inputr.   r   ZinputsZmodelZweights_pathr   r   r   DenseNet   s   I	






rV   z'keras.applications.densenet.DenseNet121zkeras.applications.DenseNet121c              	   C      t g d| ||||||S )z*Instantiates the Densenet121 architecture.r>   rV   rP   r7   rQ   rR   rS   rT   rU   r   r   r   DenseNet121Y     rZ   z'keras.applications.densenet.DenseNet169zkeras.applications.DenseNet169c              	   C   rW   )z*Instantiates the Densenet169 architecture.rC   rX   rY   r   r   r   DenseNet169r  r[   r\   z'keras.applications.densenet.DenseNet201zkeras.applications.DenseNet201c              	   C   rW   )z*Instantiates the Densenet201 architecture.rD   rX   rY   r   r   r   DenseNet201  r[   r]   z,keras.applications.densenet.preprocess_inputc                 C   s   t j| |ddS )NZtorch)r6   mode)r   preprocess_input)r   r6   r   r   r   r_     s   r_   z.keras.applications.densenet.decode_predictions   c                 C   s   t j| |dS )N)top)r   decode_predictions)Zpredsra   r   r   r   rb     s   rb    )r^   reterrora  

  Reference:
  - [Densely Connected Convolutional Networks](
      https://arxiv.org/abs/1608.06993) (CVPR 2017)

  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 DenseNet, call `tf.keras.applications.densenet.preprocess_input` on your
  inputs before passing them to the model.

  Args:
    include_top: whether to include the fully-connected
      layer at the top of the network.
    weights: one of `None` (random initialization),
      'imagenet' (pre-training on ImageNet),
      or the path to the weights file to be loaded.
    input_tensor: optional Keras tensor (i.e. output of `layers.Input()`)
      to use as image input for the model.
    input_shape: optional shape tuple, only to be specified
      if `include_top` is False (otherwise the input shape
      has to be `(224, 224, 3)` (with `'channels_last'` data format)
      or `(3, 224, 224)` (with `'channels_first'` data format).
      It should have exactly 3 inputs channels,
      and width and height should be no smaller than 32.
      E.g. `(200, 200, 3)` would be one valid value.
    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.
    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.
__doc__)Tr2   NNNr3   r4   )N)r`   ))rf   Ztensorflow.compat.v2compatZv2rF   Zkerasr   Zkeras.applicationsr   Zkeras.enginer   Zkeras.layersr   Zkeras.utilsr   r   Z tensorflow.python.util.tf_exportr   ZBASE_WEIGHTS_PATHrJ   rM   rK   rN   rL   rO   r)   r   r/   r   rV   rZ   r\   r]   r_   rb   ZPREPROCESS_INPUT_DOCformatZPREPROCESS_INPUT_RET_DOC_TORCHZPREPROCESS_INPUT_ERROR_DOCZDOCsetattrr   r   r   r   <module>   s    
 S
5