a
    ==ic                     @   sF   d dl mZ g dg dg dg ddZG dd dZdddZd	S )    )brew)   0   `         )r   t      i  r   )r      i`  i  r   )r      i  i  i   )z0.5x1.0xz1.5xz2.0xc                   @   sL   e Zd ZdddZdd Zdd	d
ZdddZdddZdd Zdd Z	dS )ShuffleNetV2Builder   r   Fh㈵>c
           
      C   sH   || _ || _|| _|| _|| _t| | _g d| _|| _|| _	|	| _
d S )N)      r   )model	prev_blobnum_input_channels
num_labels
num_groupsOUTPUT_CHANNELSoutput_channelsstage_repeatsis_test	detection
bn_epsilon)
selfr   datar   r   r   widthr   r   r    r    p/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/models/shufflenet.py__init__   s    

zShuffleNetV2Builder.__init__c              
   C   s(  | j d }tj| j| jd| j|di fddd| _tj| j| jdddd| _tt| j d	d
 | j	D ]^\}\}}d
|d d}| ||| |}t|D ]&}d
|d d	|d	 }| || qqdtj| j| jd|| j d
 d	d| _| jj| jddd| _t| j| jd
| j| j d
 | j| _d S )Nr   Zstage1_convMSRAFillr   r   )weight_initkernelstrideZstage1_pool)r%   r&         zstage{}_stride{}zstage{}_stride{}_repeat{}Zconv5)r%   avg_poolr   zlast_out_L{})r   r   convr   r   r   Zmax_pool	enumeratezipr   formatadd_spatial_ds_unitrangeadd_basic_unitZ	last_convZAveragePoolr)   Zfcr   last_out)r   in_channelsidxout_channelsZ	n_repeatsprefixir    r    r!   create/   sB    


zShuffleNetV2Builder.createc                 C   s   | j  }}|d }| jr,| ||d ||}| ||d ||}| ||d ||}| jrn| ||d ||}| ||d ||}| ||d ||}| ||d ||}t| j||g|d	 | _ | jjj	| j |d
 | j
dd| _ d S )Nr   Z_left_detectionZleft_dwconvZ_left_conv1_right_detection_right_conv1_right_dwconv_right_conv2_concat_ch_shuffler'   groupr%   )r   r   add_detection_unitadd_dwconv3x3_bnadd_conv1x1_bnr   concatr   netChannelShuffler   )r   r5   r2   r4   r&   rightleftr    r    r!   r.   R   s@    

z'ShuffleNetV2Builder.add_spatial_ds_unitr'   c                 C   s   |d }|d }|d }| j j| j||g | jrH| ||d ||}| ||d ||}| ||d ||}| ||d ||}t	| j ||g|d | _| j jj
| j|d	 | jd
d| _d S )Nr   _left_rightr8   r9   r:   r;   r<   r=   r'   r>   )r   rD   ZSplitr   r   r@   rB   rA   r   rC   rE   r   )r   r5   r2   r&   rG   rF   r    r    r!   r0   s   s0    
z"ShuffleNetV2Builder.add_basic_unitr   c                 C   sJ   t j| j||d |||di f||d	}t j| j||d || j| jd}|S )NZ_convr#   )r%   r$   r?   pad_bnepsilonr   r   r*   r   
spatial_bnr   r   )r   r   r5   r2   r4   r%   rJ   Zout_blobr    r    r!   r@      s    z&ShuffleNetV2Builder.add_detection_unitc              	   C   sR   t j| j||||ddi fd}t j| j||d || j| jd}t | j||}|S )Nr'   r#   )r%   r$   rK   rL   )r   r*   r   rO   r   r   Zrelu)r   r   blobr2   r4   r    r    r!   rB      s    z"ShuffleNetV2Builder.add_conv1x1_bnc                 C   sH   t j| j||||ddi f||dd
}t j| j||d || j| jd}|S )Nr   r#   r'   )r%   r$   r&   r?   rJ   rK   rL   rN   )r   r   rP   Zchannelsr&   r    r    r!   rA      s    
z$ShuffleNetV2Builder.add_dwconv3x3_bnN)r   r   FFr   )r   )r'   )r   r'   )
__name__
__module____qualname__r"   r7   r.   r0   r@   rB   rA   r    r    r    r!   r      s        
#
!
 
r   NFc           
      C   sR   t | ||||d}|  |r$|jS |d urN| |j|gddg\}}	||	fS d S )N)r   softmaxloss)r   r7   r1   ZSoftmaxWithLoss)
r   r   r   r   labelr   Zno_lossbuilderrT   rU   r    r    r!   create_shufflenet   s    	rX   )NFF)Zcaffe2.pythonr   r   r   rX   r    r    r    r!   <module>   s       