U
    d                     @   s^   d dl mZ dddddgdddd	dgdd
dddgdddddgdZG dd dZdddZdS )    )brew   0   `      i   t      i     i`  i     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   sJ   || _ || _|| _|| _|| _t| | _dddg| _|| _|| _	|	| _
d S )N      )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   C/tmp/pip-unpacked-wheel-ua33x9lu/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/   sR    
        
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   r4   r1   r3   r%   rightleftr   r   r    r-   R   sP    
        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   _leftZ_rightr7   r8   r9   r:   r;   r<   r&   r=   )r   rC   ZSplitr   r   r?   rA   r@   r   rB   rD   r   )r   r4   r1   r%   rF   rE   r   r   r    r/   s   s<          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   r4   r1   r3   r$   rH   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#   rI   rJ   )r   r)   r   rM   r   r   Zrelu)r   r   blobr1   r3   r   r   r    rA      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>   rH   rI   rJ   rL   )r   r   rN   Zchannelsr%   r   r   r    r@      s       
z$ShuffleNetV2Builder.add_dwconv3x3_bnN)r   r   FFr   )r   )r&   )r   r&   )
__name__
__module____qualname__r!   r6   r-   r/   r?   rA   r@   r   r   r   r    r      s        
#
!
   
r   NFc           
      C   sR   t | ||||d}|  |r$|jS |d k	rN| |j|gddg\}}	||	fS d S )N)r   softmaxloss)r   r6   r0   ZSoftmaxWithLoss)
r   r   r   r   labelr   Zno_lossZbuilderrR   rS   r   r   r    create_shufflenet   s    	rU   )NFF)Zcaffe2.pythonr   r   r   rU   r   r   r   r    <module>   s       