o
    Vh2                     @   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mZ d	dlmZ d	dlmZmZ g dZedg d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 ede(j)fddddde	e( de*d ed!e$fd"d#Z+dS )$    N)
namedtuple)partial)AnyCallableListOptionalTuple)Tensor   )ImageClassification)_log_api_usage_once   )register_modelWeightsWeightsEnum)_IMAGENET_CATEGORIES)_ovewrite_named_paramhandle_legacy_interface)	GoogLeNetGoogLeNetOutputs_GoogLeNetOutputsGoogLeNet_Weights	googlenetr   )logitsaux_logits2aux_logits1c                       s   e Zd ZddgZ							dd	ededed
ee deeede	j
f   dededdf fddZdedefddZdedeeee ee f fddZejjdededee defddZdedefddZ  ZS )r   
aux_logitstransform_input  TFN皙?ffffff?num_classesinit_weightsblocks.dropoutdropout_auxreturnc                    s  t    t|  |d u rtttg}|d u rtdt d}t	|dkr-t
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%|| _&|rM| ' D ]9}t(|tj)s%t(|tj%r4t*jj+j,|j-d&d'd(dd) qt(|tj.rKtj+/|j-d tj+/|j0d qd S 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?)mean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aux2AdaptiveAvgPool2davgpoolDropoutr$   Linearfcmodules
isinstanceConv2dtorchinittrunc_normal_weightBatchNorm2d	constant_bias)selfr!   r   r   r"   r#   r$   r%   
conv_blockinception_blockinception_aux_blockm	__class__ P/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/models/googlenet.pyrF       sf   


zGoogLeNet.__init__xc                 C   s|   | j r<t|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   rk   	unsqueezecat)rr   r{   x_ch0x_ch1x_ch2ry   ry   rz   _transform_inputf   s      zGoogLeNet._transform_inputc                 C   s  |  |}| |}| |}| |}| |}| |}| |}| |}| |}d }| j	d ur<| j
r<| 	|}| |}| |}| |}d }| jd urZ| j
rZ| |}| |}| |}| |}| |}| |}t|d}| |}| |}|||fS Nr   )rO   rR   rS   rT   rU   rV   rW   rX   rY   ra   trainingrZ   r[   r\   rb   r]   r^   r_   r`   rd   rk   flattenr$   rg   )rr   r{   ra   rb   ry   ry   rz   _forwardn   s:   























zGoogLeNet._forwardrb   ra   c                 C   s   | j r| jrt|||S |S N)r   r   r   )rr   r{   rb   ra   ry   ry   rz   eager_outputs   s   zGoogLeNet.eager_outputsc                 C   sX   |  |}| |\}}}| jo| j}tj r%|std t	|||S | 
|||S )Nz8Scripted GoogleNet always returns GoogleNetOutputs Tuple)r   r   r   r   rk   jitis_scriptingrJ   rK   r   r   )rr   r{   rb   ra   aux_definedry   ry   rz   forward   s   


zGoogLeNet.forward)r   TFNNr   r    )__name__
__module____qualname____constants__intboolr   r   r   rP   ModulefloatrF   r	   r   r   r   rk   r   unusedr   r   r   __classcell__ry   ry   rw   rz   r      s>    	F$7 r   c                       s|   e Zd Z	ddededededededed	eed
ejf  ddf fddZde	de
e	 fddZde	de	fddZ  ZS )rH   Nin_channelsch1x1ch3x3redch3x3ch5x5redch5x5	pool_projrs   .r&   c	           	   	      s   t    |d u 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'   r0   T)r*   r+   r,   r-   )
rE   rF   rG   branch1rP   
Sequentialbranch2branch3rQ   branch4)	rr   r   r   r   r   r   r   r   rs   rw   ry   rz   rF      s   

zInception.__init__r{   c                 C   s8   |  |}| |}| |}| |}||||g}|S r   )r   r   r   r   )rr   r{   r   r   r   r   outputsry   ry   rz   r      s   



zInception._forwardc                 C   s   |  |}t|dS r   )r   rk   r}   )rr   r{   r   ry   ry   rz   r      s   
zInception.forwardr   )r   r   r   r   r   r   rP   r   rF   r	   r   r   r   r   ry   ry   rw   rz   rH      s.    
	
 	rH   c                       sX   e Zd Z		ddededeedejf  deddf
 fd	d
Z	de
de
fddZ  ZS )rI   Nr    r   r!   rs   .r$   r&   c                    sT   t    |d u rt}||ddd| _tdd| _td|| _tj|d| _	d S )Nr2   r   r.   i   r?   r=   )
rE   rF   rG   convrP   rf   fc1fc2re   r$   )rr   r   r!   rs   r$   rw   ry   rz   rF      s   
zInceptionAux.__init__r{   c                 C   sN   t |d}| |}t|d}t j| |dd}| |}| |}|S )N)   r   r   Tinplace)	Fadaptive_avg_pool2dr   rk   r   relur   r$   r   rr   r{   ry   ry   rz   r      s   


zInceptionAux.forward)Nr    )r   r   r   r   r   r   rP   r   r   rF   r	   r   r   ry   ry   rw   rz   rI      s    rI   c                       s@   e Zd Zdedededdf fddZdedefd	d
Z  ZS )rG   r   out_channelskwargsr&   Nc                    s8   t    tj||fddi|| _tj|dd| _d S )Nrq   FgMbP?)eps)rE   rF   rP   rj   r   ro   bn)rr   r   r   r   rw   ry   rz   rF     s   
zBasicConv2d.__init__r{   c                 C   s"   |  |}| |}tj|ddS )NTr   )r   r   r   r   r   ry   ry   rz   r     s   

zBasicConv2d.forward)	r   r   r   r   r   rF   r	   r   r   ry   ry   rw   rz   rG   
  s    rG   c                   @   sB   e Zd Zedeeddddedddd	d
idddddZeZdS )r   z:https://download.pytorch.org/models/googlenet-1378be20.pthr:   )	crop_sizeie )   r   zOhttps://github.com/pytorch/vision/tree/main/references/classification#googlenetzImageNet-1KgoqQ@gRaV@)zacc@1zacc@5g+?g!rhH@z1These weights are ported from the original paper.)
num_paramsmin_size
categoriesrecipe_metrics_ops
_file_size_docs)url
transformsmetaN)	r   r   r   r   r   r   r   IMAGENET1K_V1DEFAULTry   ry   ry   rz   r     s&    
r   
pretrained)weightsT)r   progressr   r   r   r&   c                 K   s   t | } |dd}| dur0d|vrt|dd t|dd t|dd t|dt| jd  tdi |}| durW|| j|dd	 |sRd|_	d|_
d|_|S 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   
check_hashz`auxiliary heads in the pretrained googlenet model are NOT pretrained, so make sure to train themry   )r   verifygetr   rM   r   r   load_state_dictget_state_dictr   ra   rb   rJ   rK   )r   r   r   original_aux_logitsmodelry   ry   rz   r   -  s(   
r   ),rJ   collectionsr   	functoolsr   typingr   r   r   r   r   rk   torch.nnrP   torch.nn.functional
functionalr   r	   transforms._presetsr   utilsr   _apir   r   r   _metar   _utilsr   r   __all__r   __annotations__r   r   r   rH   rI   rG   r   r   r   r   ry   ry   ry   rz   <module>   s4     /#.