U
    (d2                     @   s  d dl Z d dlm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 ddlmZ d	d
lmZmZ d	dlmZ d	dlmZmZ dddddgZeddddgZeee ee de_ e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&G dd deZ'ede'j(fddd d!ee' e)e
e#d"d#dZ*d	d$lm+Z+ e+de'j(j,iZ-dS )%    N)
namedtuple)partial)OptionalTupleListCallableAny)Tensor   )ImageClassification)_log_api_usage_once   )WeightsEnumWeights)_IMAGENET_CATEGORIES)handle_legacy_interface_ovewrite_named_param	GoogLeNetGoogLeNetOutputs_GoogLeNetOutputsGoogLeNet_Weights	googlenetlogitsaux_logits2aux_logits1)r   r   r   c                
       s   e Zd ZddgZdeeeee eeed	e	j
f   eedd
 fddZeedddZeeeee ee f dddZejjeeee edddZeedddZ  ZS )r   
aux_logitstransform_input  TFN皙?ffffff?.)num_classesr   r   init_weightsblocksdropoutdropout_auxreturnc                    s  t    t|  |d kr$tttg}|d kr<tdt d}t	|dkrZt
dt	| |d }|d }	|d }
|| _|| _|ddd	ddd
| _tjdddd| _|dddd| _|ddddd| _tjdddd| _|	ddddddd| _|	ddddddd| _tjdddd| _|	ddddddd| _|	ddddddd| _|	ddddddd| _|	ddddddd| _|	ddddddd| _tjdddd| _|	d dddddd| _|	d d!dd!ddd| _|r|
d||d"| _|
d||d"| _ nd | _d | _ t!d#| _"tj#|d$| _$t%d%|| _&|r| ' D ]l}t(|tj)sLt(|tj%rht*jj+j,|j-d&d'd(dd) n.t(|tj.r,tj+/|j-d tj+/|j0d q,d S )*NzThe default weight initialization of GoogleNet will be changed in future releases of torchvision. If you wish to keep the old behavior (which leads to long initialization times due to scipy/scipy#11299), please set init_weights=True.T   z%blocks length should be 3 instead of r   r   r
   @      )kernel_sizestridepadding)r*   	ceil_moder)      r)   r+   `                i     0   i      p            i   i  i@  i@  i  )r#   )r   r   p   g        g{Gz?)ZmeanZstdab)1super__init__r   BasicConv2d	InceptionInceptionAuxwarningswarnFutureWarninglen
ValueErrorr   r   conv1nn	MaxPool2dmaxpool1conv2conv3maxpool2inception3ainception3bmaxpool3inception4ainception4binception4cinception4dinception4emaxpool4inception5ainception5baux1aux2ZAdaptiveAvgPool2davgpoolDropoutr#   Linearfcmodules
isinstanceConv2dtorchinitZtrunc_normal_ZweightBatchNorm2dZ	constant_bias)selfr    r   r   r!   r"   r#   r$   
conv_blockZinception_blockZinception_aux_blockm	__class__ @/tmp/pip-unpacked-wheel-vx7f76es/torchvision/models/googlenet.pyrC       s`    


zGoogLeNet.__init__xr%   c                 C   s|   | j rxt|d d df dd d }t|d d df dd d }t|d d df dd d	 }t|||fd}|S )
Nr   r   gZd;O?gQgy&1?gI+r
   g?gMbȿ)r   rg   Z	unsqueezecat)rk   rs   Zx_ch0Zx_ch1Zx_ch2rp   rp   rq   _transform_inputf   s       zGoogLeNet._transform_inputc                 C   s  |  |}| |}| |}| |}| |}| |}| |}| |}| |}d }| j	d k	rx| j
rx| 	|}| |}| |}| |}d }| jd k	r| j
r| |}| |}| |}| |}| |}| |}t|d}| |}| |}|||fS Nr   )rL   rO   rP   rQ   rR   rS   rT   rU   rV   r^   trainingrW   rX   rY   r_   rZ   r[   r\   r]   r`   rg   flattenr#   rc   )rk   rs   r^   r_   rp   rp   rq   _forwardn   s:    






















zGoogLeNet._forward)rs   r_   r^   r%   c                 C   s    | j r| jrt|||S |S d S N)rw   r   r   )rk   rs   r_   r^   rp   rp   rq   eager_outputs   s    zGoogLeNet.eager_outputsc                 C   s\   |  |}| |\}}}| jo$| j}tj rJ|s>td t	|||S | 
|||S d S )Nz8Scripted GoogleNet always returns GoogleNetOutputs Tuple)ru   ry   rw   r   rg   jitZis_scriptingrG   rH   r   r{   )rk   rs   r^   r_   Zaux_definedrp   rp   rq   forward   s    


zGoogLeNet.forward)r   TFNNr   r   )__name__
__module____qualname__Z__constants__intboolr   r   r   rM   ModulefloatrC   r	   ru   r   ry   rg   r|   Zunusedr   r{   r}   __classcell__rp   rp   rn   rq   r      s.          F"7c                       sf   e Zd Zdeeeeeeeeedejf  dd	 fddZe	e
e	 dddZe	e	dd	d
Z  ZS )rE   N.)	in_channelsch1x1ch3x3redch3x3ch5x5redch5x5	pool_projrl   r%   c	           	   	      s   t    |d krt}|||dd| _t|||dd|||ddd| _t|||dd|||ddd| _ttjddddd|||dd| _	d S )Nr   r-   r&   r/   T)r)   r*   r+   r,   )
rB   rC   rD   branch1rM   Z
Sequentialbranch2branch3rN   branch4)	rk   r   r   r   r   r   r   r   rl   rn   rp   rq   rC      s     
 zInception.__init__rr   c                 C   s8   |  |}| |}| |}| |}||||g}|S rz   )r   r   r   r   )rk   rs   r   r   r   r   outputsrp   rp   rq   ry      s    



zInception._forwardc                 C   s   |  |}t|dS rv   )ry   rg   rt   )rk   rs   r   rp   rp   rq   r}      s    
zInception.forward)N)r~   r   r   r   r   r   rM   r   rC   r	   r   ry   r}   r   rp   rp   rn   rq   rE      s   
  	rE   c                       sJ   e Zd Zd
eeeedejf  edd fddZ	e
e
ddd	Z  ZS )rF   Nr   .)r   r    rl   r#   r%   c                    sT   t    |d krt}||ddd| _tdd| _td|| _tj|d| _	d S )Nr1   r   r-   i   r>   r<   )
rB   rC   rD   convrM   rb   fc1fc2ra   r#   )rk   r   r    rl   r#   rn   rp   rq   rC      s    
zInceptionAux.__init__rr   c                 C   sN   t |d}| |}t|d}t j| |dd}| |}| |}|S )N)   r   r   TZinplace)	FZadaptive_avg_pool2dr   rg   rx   relur   r#   r   rk   rs   rp   rp   rq   r}      s    


zInceptionAux.forward)Nr   )r~   r   r   r   r   r   rM   r   r   rC   r	   r}   r   rp   rp   rn   rq   rF      s     rF   c                       s8   e Zd Zeeedd fddZeedddZ  ZS )rD   N)r   out_channelskwargsr%   c                    s8   t    tj||fddi|| _tj|dd| _d S )Nrj   FgMbP?)Zeps)rB   rC   rM   rf   r   ri   bn)rk   r   r   r   rn   rp   rq   rC     s    
zBasicConv2d.__init__rr   c                 C   s"   |  |}| |}tj|ddS )NTr   )r   r   r   r   r   rp   rp   rq   r}     s    

zBasicConv2d.forward)	r~   r   r   r   r   rC   r	   r}   r   rp   rp   rn   rq   rD   
  s   rD   c                   @   s>   e Zd Zedeeddddedddd	d
idddZeZdS )r   z:https://download.pytorch.org/models/googlenet-1378be20.pthr9   )Z	crop_sizeie )   r   zOhttps://github.com/pytorch/vision/tree/main/references/classification#googlenetzImageNet-1KgoqQ@gRaV@)zacc@1zacc@5z1These weights are ported from the original paper.)Z
num_paramsZmin_size
categoriesZrecipeZ_metricsZ_docs)urlZ
transformsmetaN)	r~   r   r   r   r   r   r   IMAGENET1K_V1DEFAULTrp   rp   rp   rq   r     s    
Z
pretrained)weightsT)r   progress)r   r   r   r%   c                 K   s   t | } |dd}| dk	r`d|kr2t|dd t|dd t|dd t|dt| jd  tf |}| dk	r|| j|d	 |sd|_	d|_
d|_n
td
 |S )a  GoogLeNet (Inception v1) model architecture from
    `Going Deeper with Convolutions <http://arxiv.org/abs/1409.4842>`_.

    Args:
        weights (:class:`~torchvision.models.GoogLeNet_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.GoogLeNet_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.GoogLeNet``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/googlenet.py>`_
            for more details about this class.
    .. autoclass:: torchvision.models.GoogLeNet_Weights
        :members:
    r   FNr   Tr!   r    r   )r   z`auxiliary heads in the pretrained googlenet model are NOT pretrained, so make sure to train them)r   verifygetr   rJ   r   r   Zload_state_dictZget_state_dictr   r^   r_   rG   rH   )r   r   r   Zoriginal_aux_logitsmodelrp   rp   rq   r   +  s&    

)
_ModelURLs).rG   collectionsr   	functoolsr   typingr   r   r   r   r   rg   Ztorch.nnrM   Ztorch.nn.functionalZ
functionalr   r	   Ztransforms._presetsr   utilsr   Z_apir   r   Z_metar   _utilsr   r   __all__r   __annotations__r   r   r   rE   rF   rD   r   r   r   r   r   r   Z
model_urlsrp   rp   rp   rq   <module>   s<    /#". 