
    Ng(                     Z   d Z ddlmZ ddlmZ ddlmZmZmZ 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ededededee         f
dZddZ	 	 	 	 ddedededededee         fdZ G d dej                  Z G d dej                  Z G d dej                  ZdS ) zV Classifier head and layer factory

Hacked together by / Copyright 2020 Ross Wightman
    )OrderedDict)partial)OptionalUnionCallableN)
functional   )SelectAdaptivePool2d)get_act_layer)get_norm_layeravgFnum_featuresnum_classes	pool_typeuse_conv	input_fmtc                 j    | }|sd}t          |||          }| |                                z  }||fS )NF)r   flattenr   )r
   	feat_mult)r   r   r   r   r   flatten_in_poolglobal_poolnum_pooled_featuress           R/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/classifier.py_create_poolr      sZ     #lO  &  K
 ')>)>)@)@@+++    c                     |dk    rt          j                    }n2|rt          j        | |dd          }nt          j        | |d          }|S )Nr   r	   T)bias)nnIdentityConv2dLinear)r   r   r   fcs       r   
_create_fcr#   %   sW    a[]]	 =Y|[!$???Y|[t<<<Ir   NCHW	drop_ratec                     t          | ||||          \  }}t          |||          }|t          j        |          }	||	|fS ||fS )Nr   r   r   )r   r#   r   Dropout)
r   r   r   r   r   r%   r   r   r"   dropouts
             r   create_classifierr+   /   sz     (4( ( ($K$ 

 
 
B
 *Y''GR''?r   c                   r     e Zd ZdZ	 	 	 	 ddededed	ed
edef fdZddede	e         fdZ
ddefdZ xZS )ClassifierHeadz;Classifier head w/ configurable global pooling and dropout.r           Fr$   in_featuresr   r   r%   r   r   c                 \   t          t          |                                            || _        || _        || _        t          |||||          \  }}|| _        t          j	        |          | _
        || _        |r|rt          j        d          nt          j                    | _        dS )a.  
        Args:
            in_features: The number of input features.
            num_classes:  The number of classes for the final classifier layer (output).
            pool_type: Global pooling type, pooling disabled if empty string ('').
            drop_rate: Pre-classifier dropout rate.
        r'   r	   N)superr-   __init__r/   r   r   r+   r   r   r)   dropr"   Flattenr   r   )
selfr/   r   r   r%   r   r   r   r"   	__class__s
            r   r2   zClassifierHead.__init__L   s      	nd##,,...& "+
 
 
R 'Jy))	(0QYQrz!}}}BKMMr   Nc                 r   |w|| j         j        k    rgt          | j        ||| j        | j                  \  | _         | _        | j        r|rt          j        d          nt          j	                    | _
        d S | j        | j                                         z  }t          ||| j                  | _        d S )N)r   r   r   r	   r(   )r   r   r+   r/   r   r   r"   r   r4   r   r   r   r#   )r5   r   r   r   s       r   resetzClassifierHead.resetm   s     Y$2B2L%L%L(9 #.) ) )%Ddg -1MZiZ2:a===R[]]DLLL"&"2T5E5O5O5Q5Q"Q #  DGGGr   
pre_logitsc                     |                      |          }|                     |          }|r|                     |          S |                     |          }|                     |          S N)r   r3   r   r"   r5   xr9   s      r   forwardzClassifierHead.forward   s[    QIIaLL 	#<<??"GGAJJ||Ar   )r   r.   Fr$   r;   F)__name__
__module____qualname____doc__intstrfloatboolr2   r   r8   r>   __classcell__r6   s   @r   r-   r-   I   s        EE #!"#R RR R 	R
 R R R R R R R RB  #    $ T        r   r-   c                        e Zd ZdZ	 	 	 	 	 ddeded	ee         d
ededeee	f         deee	f         f fdZ
dded
ee         fdZddefdZ xZS )NormMlpClassifierHeadzA A Pool -> Norm -> Mlp Classifier Head for '2D' NCHW tensors
    Nr   r.   layernorm2dtanhr/   r   hidden_sizer   r%   
norm_layer	act_layerc           	         t                                                       || _        || _        || _        | | _        t          |          }t          |          }| j        rt          t          j
        d          nt          j        }t          |          | _         ||          | _        |rt          j        d          nt          j                    | _        |rFt          j        t'          d |||          fd |            fg                    | _        || _        nt          j                    | _        t          j        |          | _        |dk    r || j        |          nt          j                    | _        dS )  
        Args:
            in_features: The number of input features.
            num_classes:  The number of classes for the final classifier layer (output).
            hidden_size: The hidden size of the MLP (pre-logits FC layer) if not None.
            pool_type: Global pooling type, pooling disabled if empty string ('').
            drop_rate: Pre-classifier dropout rate.
            norm_layer: Normalization layer type.
            act_layer: MLP activation layer type (only used if hidden_size is not None).
        r	   kernel_sizer   r"   actr   N)r1   r2   r/   rN   r   r   r   r   r   r   r    r!   r
   r   normr4   r   r   
Sequentialr   r9   r)   r3   r"   )
r5   r/   r   rN   r   r%   rO   rP   linear_layerr6   s
            r   r2   zNormMlpClassifierHead.__init__   se   ( 	&&'%#J//
!),,	<@MXwrya8888ry/)DDDJ{++	(1Drz!}}}r{}} 	, mK||K==>		$9 - -  DO !,D kmmDOJy))	BMPQ//,,t0+>>>WYWbWdWdr   c                    |Ct          |          | _        |rt          j        d          nt          j                    | _        | j                                        | _        | j        rt          t          j	        d          nt          j
        }| j        rt          | j        j        t          j	                  r| j        r+t          | j        j        t          j
                  r| j        rt          j                    5   || j        | j                  }|j                            | j        j        j                            |j        j                             |j                            | j        j        j                   || j        _        d d d            n# 1 swxY w Y   |dk    r || j        |          nt          j                    | _        d S )NrU   r	   rS   r   )r
   r   r   r4   r   r   is_identityr   r   r    r!   rN   
isinstancer9   r"   torchno_gradr/   weightcopy_reshapeshaper   r   )r5   r   r   rY   new_fcs        r   r8   zNormMlpClassifierHead.reset   s    3iHHHD,5H2:a===2;==DL(4466<@MXwrya8888ry 	0DO.	:: 04= 0 2BI>>0CG=0]__ 0 0)\$*:D<LMMFM''(:(A(I(I&-J](^(^___K%%do&8&=>>>)/DO&	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 CNPQ//,,t0+>>>WYWbWdWds   BF!!F%(F%Fr9   c                 
   |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|r|S |                     |          }|S r;   )r   rW   r   r9   r3   r"   r<   s      r   r>   zNormMlpClassifierHead.forward   st    QIIaLLLLOOOOAIIaLL 	HGGAJJr   )Nr   r.   rL   rM   r;   r?   )r@   rA   rB   rC   rD   r   rE   rF   r   r   r2   r8   rG   r>   rH   rI   s   @r   rK   rK      s         *."!/<.4)e )e)e )e "#	)e
 )e )e c8m,)e S(]+)e )e )e )e )e )eVe e e# e e e e 	 	T 	 	 	 	 	 	 	 	r   rK   c                        e Zd ZdZ	 	 	 	 	 	 dded	ed
ee         dededeee	f         deee	f         def fdZ
dd	edee         defdZd ZddefdZ xZS )ClNormMlpClassifierHeadz@ A Pool -> Norm -> Mlp Classifier Head for n-D NxxC tensors
    Nr   r.   	layernormgeluNHWCr/   r   rN   r   r%   rO   rP   r   c	           	         t                                                       || _        || _        || _        |dv sJ || _        |dv sJ |dk    rdnd| _        t          |          }t          |          } ||          | _	        |rOt          j        t          dt          j        ||          fd |            fg                    | _        || _        nt          j                    | _        t          j        |          | _        |dk    rt          j        | j        |          nt          j                    | _        d	S )
rR   ) r   maxavgmax)ri   NLCrn   r	   )r	      r"   rV   r   N)r1   r2   r/   rN   r   r   pool_dimr   r   rW   r   rX   r   r!   r9   r   r)   r3   r"   )
r5   r/   r   rN   r   r%   rO   rP   r   r6   s
            r   r2   z ClNormMlpClassifierHead.__init__   sG   * 	&&'88888"O++++&%//V#J//
!),,	J{++	 	, mKryk::;		$9 - -  DO !,D kmmDOJy))	?JQ")D-{;;;TVT_TaTar   Freset_otherc                     ||| _         |r0t          j                    | _        t          j                    | _        |dk    rt          j        | j        |          nt          j                    | _        d S )Nr   )r   r   r   r9   rW   r!   r   r"   )r5   r   r   rq   s       r   r8   zClNormMlpClassifierHead.reset  sb     &DN 	& kmmDODI?JQ")D-{;;;TVT_TaTar   c                 :   | j         r| j         dk    r|                    | j                  }nl| j         dk    r|                    | j                  }nE| j         dk    r:d|                    | j                  |                    | j                  z   z  }|S )Nr   )dimrl   rm   g      ?)r   meanrp   amax)r5   r=   s     r   _global_poolz$ClNormMlpClassifierHead._global_pool	  s    > 	R~&&FFt}F--5((FFt}F--8++166dm644qvv$-v7P7PPQr   r9   c                     |                      |          }|                     |          }|                     |          }|                     |          }|r|S |                     |          }|S r;   )rw   rW   r9   r3   r"   r<   s      r   r>   zClNormMlpClassifierHead.forward  se    a  IIaLLOOAIIaLL 	HGGAJJr   )Nr   r.   rg   rh   ri   )NFr?   )r@   rA   rB   rC   rD   r   rE   rF   r   r   r2   rG   r8   rw   r>   rH   rI   s   @r   rf   rf      s>         *."!/:.4#*b *b*b *b "#	*b
 *b *b c8m,*b S(]+*b *b *b *b *b *b *bXb b b# bTX b b b b   T        r   rf   )r   FNr?   )r   Fr$   N)rC   collectionsr   	functoolsr   typingr   r   r   r]   torch.nnr   r   Fadaptive_avgmax_poolr
   
create_actr   create_normr   rD   rE   rG   r   r#   rF   r+   Moduler-   rK   rf    r   r   <module>r      s%    $ # # # # #       , , , , , , , , , ,        $ $ $ $ $ $ 6 6 6 6 6 6 % % % % % % ' ' ' ' ' ' #', ,,, , 	,
 C=, , , ,&    %)   	
  E?   4< < < < <RY < < <~G G G G GBI G G GTI I I I Ibi I I I I Ir   