o
    پiuQ                  
   @   s:  d Z ddlZddlmZ ddlmZmZmZmZm	Z	 ddl
Z
ddlmZ ddlm  mZ ddlmZ ddlmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZ ddlm Z m!Z!m"Z" dgZ#G dd dej$Z%G dd dej&Z'G dd dej(Z)G dd dej$Z*de+dee,e
j-f fddZ.de,de/dee/df de0de*f
ddZ1d8d e,dee,ef fd!d"Z2e!e2d#d$d%d&e2d#d$d%d&e2 e2d#d'e2d#d'e2d#d'e2d#d'd(Z3e d9de*fd*d+Z4e d9de*fd,d-Z5e d9de*fd.d/Z6e d9de*fd0d1Z7e d9de*fd2d3Z8e d9de*fd4d5Z9e"e:d6d7i dS ):zPytorch Densenet implementation w/ tweaks
This file is a copy of https://github.com/pytorch/vision 'densenet.py' (BSD-3-Clause) with
fixed kwargs passthrough and addition of dynamic global avg/max pool.
    N)OrderedDict)AnyDictOptionalTupleUnion)ListIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)BatchNormAct2dget_norm_act_layer
BlurPool2dcreate_classifier   )build_model_with_cfg)MATCH_PREV_GROUP
checkpoint)register_modelgenerate_default_cfgsregister_model_deprecationsDenseNetc                       s   e Zd ZdZeddfdededededed	ed
df fddZ	de
ej d
ejfddZde
ej d
efddZejjde
ej d
ejfddZejjdd Zejjdd Zdeeje
ej f d
ejfddZ  ZS )
DenseLayerzbDense layer for DenseNet.

    Implements the bottleneck layer with 1x1 and 3x3 convolutions.
            Fnum_input_featuresgrowth_ratebn_size
norm_layer	drop_rategrad_checkpointingreturnNc                    s   t t|   | d||f | dtj||| ddddf | d||| f | dtj|| |ddddd	f t|| _|| _d
S )ad  Initialize DenseLayer.

        Args:
            num_input_features: Number of input features.
            growth_rate: Growth rate (k) of the layer.
            bn_size: Bottleneck size multiplier.
            norm_layer: Normalization layer class.
            drop_rate: Dropout rate.
            grad_checkpointing: Use gradient checkpointing.
        norm1conv1r   Fkernel_sizestridebiasnorm2conv2   r$   r%   paddingr&   N)	superr   __init__
add_modulennConv2dfloatr   r   )selfr   r   r   r   r   r   	__class__ H/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/densenet.pyr-      s   





zDenseLayer.__init__xsc                 C   s    t |d}| | |}|S )z.Bottleneck function for concatenated features.r   )torchcatr"   r!   )r2   r7   concated_featuresbottleneck_outputr5   r5   r6   bottleneck_fn:   s   zDenseLayer.bottleneck_fnxc                 C   s   |D ]}|j r
 dS qdS )z.Check if any tensor in list requires gradient.TF)requires_grad)r2   r=   tensorr5   r5   r6   any_requires_gradA   s
   zDenseLayer.any_requires_gradc                    s    fdd}t |g|R  S )z5Call bottleneck function with gradient checkpointing.c                     s
     | S N)r<   )r7   r2   r5   r6   closureK   s   
z6DenseLayer.call_checkpoint_bottleneck.<locals>.closure)r   )r2   r=   rC   r5   rB   r6   call_checkpoint_bottleneckH   s   z%DenseLayer.call_checkpoint_bottleneckc                 C      d S rA   r5   r2   r=   r5   r5   r6   forwardP      zDenseLayer.forwardc                 C   rE   rA   r5   rF   r5   r5   r6   rG   U   rH   c                 C   s   t |tjr
|g}n|}| jr#| |r#tj rtd| |}n| 	|}| 
| |}| jdkr?tj|| j| jd}|S )zForward pass.

        Args:
            x: Input features (single tensor or list of tensors).

        Returns:
            New features to be concatenated.
        z%Memory Efficient not supported in JITr   )ptraining)
isinstancer8   Tensorr   r@   jitis_scripting	ExceptionrD   r<   r(   r'   r   FdropoutrJ   )r2   r=   prev_featuresr;   new_featuresr5   r5   r6   rG   \   s   	


)__name__
__module____qualname____doc__r   inttyper1   boolr-   r   r8   rL   r<   r@   rM   unusedrD   _overload_methodrG   r   __classcell__r5   r5   r3   r6   r      s:    


,r   c                       sd   e Zd ZdZdZeddfdedededed	ed
ede	ddf fddZ
dejdejfddZ  ZS )
DenseBlockzTDenseNet Block.

    Contains multiple dense layers with concatenated features.
       r   F
num_layersr   r   r   r   r   r   r    Nc           
   	      sP   t t|   t|D ]}t|||  |||||d}	| d|d  |	 qdS )a  Initialize DenseBlock.

        Args:
            num_layers: Number of layers in the block.
            num_input_features: Number of input features.
            bn_size: Bottleneck size multiplier.
            growth_rate: Growth rate (k) for each layer.
            norm_layer: Normalization layer class.
            drop_rate: Dropout rate.
            grad_checkpointing: Use gradient checkpointing.
        )r   r   r   r   r   zdenselayer%dr   N)r,   r^   r-   ranger   r.   )
r2   r`   r   r   r   r   r   r   ilayerr3   r5   r6   r-   ~   s   
zDenseBlock.__init__init_featuresc                 C   s6   |g}|   D ]\}}||}|| qt|dS )zForward pass through all layers in the block.

        Args:
            init_features: Initial features from previous layer.

        Returns:
            Concatenated features from all layers.
        r   )itemsappendr8   r9   )r2   rd   featuresnamerc   rS   r5   r5   r6   rG      s
   	zDenseBlock.forward)rT   rU   rV   rW   _versionr   rX   rY   r1   rZ   r-   r8   rL   rG   r]   r5   r5   r3   r6   r^   w   s0    	!r^   c                       s@   e Zd ZdZedfdedededee ddf
 fdd	Z  Z	S )
DenseTransitionzfTransition layer between DenseNet blocks.

    Reduces feature dimensions and spatial resolution.
    Nr   num_output_featuresr   aa_layerr    c              
      st   t t|   | d|| | dtj||dddd |dur-| d||dd	 dS | dtjddd
 dS )a  Initialize DenseTransition.

        Args:
            num_input_features: Number of input features.
            num_output_features: Number of output features.
            norm_layer: Normalization layer class.
            aa_layer: Anti-aliasing layer class.
        normconvr   Fr#   Npoolr_   )r%   )r$   r%   )r,   rj   r-   r.   r/   r0   	AvgPool2d)r2   r   rk   r   rl   r3   r5   r6   r-      s   

zDenseTransition.__init__)
rT   rU   rV   rW   r   rX   rY   r   r-   r]   r5   r5   r3   r6   rj      s    	rj   c                       s@  e Zd ZdZ										
					d3dedeedf dedededededededee de	de	de
de
ddf fdd Zejjd4d!e
deeef fd"d#Zejjd5d$e
ddfd%d&Zejjdejfd'd(Zd6dededdfd)d*Zd+ejdejfd,d-Zd4d+ejd.e
dejfd/d0Zd+ejdejfd1d2Z  ZS )7r   a  Densenet-BC model class.

    Based on `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`_

    Args:
        growth_rate: How many filters to add each layer (`k` in paper).
        block_config: How many layers in each pooling block.
        bn_size: Multiplicative factor for number of bottle neck layers
          (i.e. bn_size * k features in the bottleneck layer).
        drop_rate: Dropout rate before classifier layer.
        proj_drop_rate: Dropout rate after each dense layer.
        num_classes: Number of classification classes.
        memory_efficient: If True, uses checkpointing. Much more memory efficient,
          but slower. Default: *False*. See `"paper" <https://arxiv.org/pdf/1707.06990.pdf>`_.
                      r)   avg    relubatchnorm2dNr   FTr   block_config.num_classesin_chansglobal_poolr   	stem_type	act_layerr   rl   r   proj_drop_ratememory_efficientaa_stem_onlyr    c                    s4  || _ tt|   t|	|d}	d|v }|d }|
du r%tjdddd}ntjtjdddd|
|ddg }|r| }}d	|v rRd|d
  }d|v rL|nd|d
  }ttdtj	||dddddfd|	|fdtj	||dddddfd|	|fdtj	||dddddfd|	|fd|fg| _
nttdtj	||dddddfd|	|fd|fg| _
t|dd|rdnd dg| _d
}|}t|D ]_\}}t|||||	||d}d|d  }| j
|| |||  }|rdn|
}|t|d kr$|  jt||d| dg7  _|d9 }t||d |	|d}| j
d|d  | |d }q| j
d |	| |  jt||d!dg7  _| | _| _t| j| j |d"\}}|| _t|| _|| _|  D ];}t|tj	rntj|j q\t|tjrtj|jd tj|j d q\t|tj!rtj|j d q\dS )#aj  Initialize DenseNet.

        Args:
            growth_rate: How many filters to add each layer (k in paper).
            block_config: How many layers in each pooling block.
            num_classes: Number of classification classes.
            in_chans: Number of input channels.
            global_pool: Global pooling type.
            bn_size: Multiplicative factor for number of bottle neck layers.
            stem_type: Type of stem ('', 'deep', 'deep_tiered').
            act_layer: Activation layer.
            norm_layer: Normalization layer.
            aa_layer: Anti-aliasing layer.
            drop_rate: Dropout rate before classifier layer.
            proj_drop_rate: Dropout rate after each dense layer.
            memory_efficient: If True, uses checkpointing for memory efficiency.
            aa_stem_only: Apply anti-aliasing only to stem.
        )r   deepr_   Nr)   r   )r$   r%   r+   )channelsr%   tieredry   narrowrs   conv0F)r%   r+   r&   norm0r"   r!   r(   r'   pool0   r*   zfeatures.normr   )num_chs	reductionmodule)r`   r   r   r   r   r   r   
denseblockz	features.)r   rk   r   rl   
transitionnorm5zfeatures.norm5	pool_type)"r~   r,   r   r-   r   r/   	MaxPool2d
Sequentialr   r0   rg   dictfeature_info	enumerater^   r.   lenrj   num_featureshead_hidden_sizer   r   Dropout	head_drop
classifiermodulesrK   initkaiming_normal_weightBatchNorm2d	constant_r&   Linear)r2   r   r}   r~   r   r   r   r   r   r   rl   r   r   r   r   	deep_stemnum_init_features	stem_pool
stem_chs_1
stem_chs_2current_strider   rb   r`   blockmodule_nametransition_aa_layertransr   mr3   r5   r6   r-      s   #






	
zDenseNet.__init__coarsec                 C   s    t d|rdnddtfgd}|S )z"Group parameters for optimization.z<^features\.conv[012]|features\.norm[012]|features\.pool[012]z)^features\.(?:denseblock|transition)(\d+))z+^features\.denseblock(\d+)\.denselayer(\d+)Nz^features\.transition(\d+))stemblocks)r   r   )r2   r   matcherr5   r5   r6   group_matcher^  s   zDenseNet.group_matcherenablec                 C   s$   | j  D ]
}t|tr||_qdS )z)Enable or disable gradient checkpointing.N)rg   r   rK   r   r   )r2   r   br5   r5   r6   set_grad_checkpointingj  s
   
zDenseNet.set_grad_checkpointingc                 C   s   | j S )zGet the classifier head.)r   rB   r5   r5   r6   get_classifierq  s   zDenseNet.get_classifierc                 C   s$   || _ t| j| j |d\| _| _dS )zReset the classifier head.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        r   N)r~   r   r   r   r   )r2   r~   r   r5   r5   r6   reset_classifierv  s   
zDenseNet.reset_classifierr=   c                 C   s
   |  |S )z/Forward pass through feature extraction layers.)rg   rF   r5   r5   r6   forward_features  s   
zDenseNet.forward_features
pre_logitsc                 C   s&   |  |}| |}|r|S | |S )zForward pass through classifier head.

        Args:
            x: Feature tensor.
            pre_logits: Return features before final classifier.

        Returns:
            Output tensor.
        )r   r   r   )r2   r=   r   r5   r5   r6   forward_head  s   


zDenseNet.forward_headc                 C   s   |  |}| |}|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )r   r   rF   r5   r5   r6   rG     s   
	
zDenseNet.forward)rq   rr   rw   r)   rx   ry   rz   r{   r|   Nr   r   FTF)T)rx   )rT   rU   rV   rW   rX   r   strr   rY   r1   rZ   r-   r8   rM   ignorer   r   r   r   r/   Moduler   r   rL   r   r   rG   r]   r5   r5   r3   r6   r      sr    
	

state_dictr    c                 C   sT   t d}t|  D ]}||}|r'|d|d }| | | |< | |= q| S )zFilter torchvision pretrained state dict for compatibility.

    Args:
        state_dict: State dictionary from torchvision checkpoint.

    Returns:
        Filtered state dictionary.
    z]^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$r   r_   )recompilelistkeysmatchgroup)r   patternkeyresnew_keyr5   r5   r6   _filter_torchvision_pretrained  s   	
r   variantr   r}   .
pretrainedc                 K   s0   ||d< ||d< t t| |ftddtd|S )a.  Create a DenseNet model.

    Args:
        variant: Model variant name.
        growth_rate: Growth rate parameter.
        block_config: Block configuration.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        DenseNet model instance.
    r   r}   T)flatten_sequential)feature_cfgpretrained_filter_fn)r   r   r   r   )r   r   r}   r   kwargsr5   r5   r6   _create_densenet  s   r   rz   urlc                 K   s   | dddddt tddd
|S )	z1Create default configuration for DenseNet models.rw   )r)      r   )r   r   g      ?bicubiczfeatures.conv0r   )
r   r~   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_convr   r	   )r   r   r5   r5   r6   _cfg  s   r   ztimm/)r)      r   gffffff?)	hf_hub_idtest_input_sizetest_crop_pct)r   )zdensenet121.ra_in1kzdensenetblur121d.ra_in1kzdensenet264d.untraineddensenet121.tv_in1kzdensenet169.tv_in1kzdensenet201.tv_in1kzdensenet161.tv_in1kFc                 K   .   t ddd}tdd| it |fi |}|S )ztDensenet-121 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    rq   rr   r   r}   densenet121r   N)r   r   r   r   r   
model_argsmodelr5   r5   r6   r        r   c                 K   s2   t dddtd}tdd| it |fi |}|S )	zDensenet-121 w/ blur-pooling & 3-layer 3x3 stem
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    rq   rr   r   )r   r}   r   rl   densenetblur121dr   N)r   )r   r   r   r   r5   r5   r6   r     s   r   c                 K   r   )ztDensenet-169 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    rq   )rs   rt   rq   rq   r   densenet169r   N)r   r   r   r5   r5   r6   r     r   r   c                 K   r   )ztDensenet-201 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    rq   )rs   rt   0   rq   r   densenet201r   N)r   r   r   r5   r5   r6   r     r   r   c                 K   r   )ztDensenet-161 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r   )rs   rt   $   ru   r   densenet161r   N)r   r   r   r5   r5   r6   r     r   r   c                 K   s0   t dddd}tdd| it |fi |}|S )	ztDensenet-264 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r   )rs   rt   @   r   r   )r   r}   r   densenet264dr   N)r   r   r   r5   r5   r6   r      s   r   tv_densenet121r   )rz   r   );rW   r   collectionsr   typingr   r   r   r   r   r8   torch.nnr/   torch.nn.functional
functionalrP   torch.jit.annotationsr   	timm.datar
   r   timm.layersr   r   r   r   _builderr   _manipulater   r   	_registryr   r   r   __all__r   r   
ModuleDictr^   r   rj   r   r   r   rL   r   rX   rZ   r   r   default_cfgsr   r   r   r   r   r   rT   r5   r5   r5   r6   <module>   s|    `8 T


						
