o
    OeJ                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
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m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mZ ddgZ				dddZ G dd deZ!dS )    N)partialreduce)	framework)initializer)Layer	LayerList)utils)LayerHelper)convert_dtype)	ParamAttr)_C_ops_legacy_C_opsresnet_basic_blockResNetBasicBlockFTc"           @      C   sL  t j rg d|d|d|d|d|d|d|d|d	|d
|d|d|d|d|d|d| d| ddd|!R }"ttd| |||||||||	|
||||||||	|
||g|"R  \}#}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$}$|#S td<i t }%t jjj	j
}&t jjj	j
}'|%j| jdd}#|%j| jdd}(|%j|&dd})|%j|&dd}*|d u r|%j|&ddn|}+|d u r|%j|&ddn|},|%j| jdd}-|%j| jdd}.|%j|&dd}/|%j|&dd}0|	d u r|%j|&ddn|	}1|
d u r|%j|&ddn|
}2|%j| jdd}3|%j|&dd}4|%j|&dd}5|d u r6|%j|&ddn|}6|d u rD|%j|&ddn|}7|%j|'dd}8|%j|'dd}9|%j|'dd}:|%j|'dd};|%j|'dd}<|%j|'dd}=i d| d|d|d|d|d|d|d|d |d!|	d"|
d#|d$|d%|d&|d'|}>i d|d|d|d|d|d|d|d|d	|d
|d|d|d|d|d|d| d| d|!d(}"i d)|#d*|(d+|)d,|*d-|+d.|,d/|-d0|/d1|0d2|1d3|2d4|.d5|3d6|4d7|5d8|6d9|7|8|9|:|;|<|=d:}?|%jd|>|?|"d; |#S )=Nstride1stride2stride3padding1padding2padding3	dilation1	dilation2	dilation3groupmomentumepsilondata_formathas_shortcutuse_global_statstrainable_statisticsis_testact_typerelufind_conv_input_maxr   T)dtypestop_gradientXZFilter1ZScale1ZBias1ZMean1ZVar1ZFilter2ZScale2ZBias2ZMean2ZVar2ZFilter3ZScale3ZBias3ZMean3ZVar3)r!   r#   YZConv1Z
SavedMean1ZSavedInvstd1ZMean1OutZVar1OutZConv2Z
SavedMean2ZSavedInvstd2ZMean2OutZVar2OutZ
Conv2InputZConv3Z
SavedMean3ZSavedInvstd3ZMean3OutZVar3Out)Z	MaxInput1Z
MaxFilter1Z	MaxInput2Z
MaxFilter2Z	MaxInput3Z
MaxFilter3)typeinputsoutputsattrs)r   )fluidr   Zin_dygraph_modegetattrr   r	   localscoreVarDescVarTypeFP32Z"create_variable_for_type_inferencer$   Z	append_op)@xZfilter1Zscale1Zbias1Zmean1Zvar1Zfilter2Zscale2Zbias2Zmean2Zvar2Zfilter3Zscale3Zbias3Zmean3Zvar3r   r   r   r   r   r   r   r   r   groupsr   epsr   r   r   trainingr   find_conv_maxr+   out_helperbn_param_dtypeZ	max_dtypeZconv1Zsaved_mean1Zsaved_invstd1Zrunning_mean1Zrunning_var1Zconv2Zconv2_inputZsaved_mean2Zsaved_invstd2Zrunning_mean2Zrunning_var2Zconv3Zsaved_mean3Zsaved_invstd3Zrunning_mean3Zrunning_var3Zconv1_input_maxZconv1_filter_maxZconv2_input_maxZconv2_filter_maxZconv3_input_maxZconv3_filter_maxr)   r*    r<   PD:\Projects\ConvertPro\env\Lib\site-packages\paddle/incubate/xpu/resnet_block.pyr   '   s4  
#0



	
	
	
c                       sl   e Zd ZdZ																																				
d fdd	Zdd Z  ZS )r   aM  
    ResNetBasicBlock is designed for optimize the performence of the basic unit of ssd resnet block.
    The fusion op architecture like this:
            has_shortcut = True:       else:
                    X                         X
                  /                         /
                |       |                 |       |
              CONV1     |               CONV1     |
                |       |                 |       |
               BN1      |                BN1      |
                |       |                 |       |
              RELU1     |               RELU1     |
                |       |                 |       |
              CONV2   CONV3             CONV2     |
                |       |                 |       |
               BN2     BN3               BN2      |
                 \     /                   \     /
                   ADD                       ADD
                    |                         |
                   RELU                      RELU
                    |                         |
                    Y                         Y
       r"   ?h㈵>NCHWFNr   Tc+           4         sB  t t|   |
| _|| _t|dd| _t|dd| _|&| _	|'| _
|#| _|$| _d| _|| _|| _|| _|| _|| _|| _|| _|)| _|*| _|r[t|	dd| _|%| _|| _|(| _nd | _d| _d| _d| _dh}+||+vrvtd|+|dd	 },tjjj j!}-dd|g}.dd|g}/||||g}0||||g}1| j"|0||,|| jd
| _#| j"|.||-t$%dd| _&| j"|.||-dd| _'| j"t(|t$%ddd|.|-d| _)d| j)_*| j"t(|t$%ddd|.|-d| _+d| j+_*| j"|1||,|| jd
| _,| j"|/||-t$%dd| _-| j"|/||-dd| _.| j"t(|t$%ddd|/|-d| _/d| j/_*| j"t(|t$%ddd|/|-d| _0d| j0_*|rdd|g}2|||	|	g}3| j"|3||,|| jd
| _1| j"|2||-t$%dd| _2| j"|2| |-dd| _3| j"t(|!t$%ddd|2|-d| _4d| j4_*| j"t(|"t$%ddd|2|-d| _5d| j5_*d S d | _1d | _2d | _3d | _4d | _5d S )N   filter1_sizefilter2_sizer>   filter3_sizerA   z5conv_format must be one of {}, but got conv_format={}c                 S   s&   t ||  }d| d }td|S )Ng       @g      ?        )npprodIZNormal)ZchannelsZkernel_sizeZfilter_elem_numZstdr<   r<   r=   _get_default_param_initializerB  s   zAResNetBasicBlock.__init__.<locals>._get_default_param_initializer)shapeattrdefault_initializerg      ?)rK   rL   r$   rM   T)rK   rL   r$   Zis_biasrF   F)namer   Z	trainable)rL   rK   r$   )6superr   __init___stride1_stride2r   Zconvert_to_listZ_kernel1_sizeZ_kernel2_size
_dilation1
_dilation2	_padding1	_padding2_groups	_momentum_eps_data_formatZ_act_has_shortcut_use_global_statsZ_is_test_trainable_statistics_find_conv_maxZ_kernel3_size	_padding3_stride3
_dilation3
ValueErrorformatr,   r/   r0   r1   r2   Zcreate_parameterfilter_1rI   Constantscale_1bias_1r   mean_1r%   var_1filter_2scale_2bias_2mean_2var_2filter_3scale_3bias_3mean_3var_3)4selfZnum_channels1Znum_filter1rC   Znum_channels2Znum_filter2rD   Znum_channels3Znum_filter3rE   r   r   r   Zactr   r5   r   r   r   r    Zfilter1_attrZscale1_attrZ
bias1_attrZmoving_mean1_nameZmoving_var1_nameZfilter2_attrZscale2_attrZ
bias2_attrZmoving_mean2_nameZmoving_var2_nameZfilter3_attrZscale3_attrZ
bias3_attrZmoving_mean3_nameZmoving_var3_namer   r   r   r   r   r   r   r7   Zvalid_formatrJ   r;   Zbn1_param_shapeZbn2_param_shapeZfilter1_shapeZfilter2_shapeZbn3_param_shapeZfilter3_shape	__class__r<   r=   rP      sH  +



zResNetBasicBlock.__init__c                 C   s   t || j| j| j| j| j| j| j| j| j	| j
| j| j| j| j| j| j| j| j| j| j| j| j| j| j| j| j| j| j| jf| j| j| j | j!d}|S )N)r   r6   r   r7   )"r   rd   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rQ   rR   r`   rU   rV   r_   rS   rT   ra   rW   rX   rY   rZ   r[   r\   r6   r]   r^   )rt   r3   r8   r<   r<   r=   forward  sL   #zResNetBasicBlock.forward)!r>   r>   r>   r"   r?   r@   rA   FFFNNNNNNNNNNNNNNNr   r   r   r>   r>   r>   FT)__name__
__module____qualname____doc__rP   rw   __classcell__r<   r<   ru   r=   r      sL    " C)NFFT)"copycollections	itertoolssixmathsyswarnings	functoolsr   r   numpyrG   ZpaddleZpaddle.fluidr,   r   Z	paddle.nnr   rI   r   r   Zpaddle.fluid.layersr   Zpaddle.fluid.layer_helperr	   Zpaddle.fluid.data_feederr
   Zpaddle.fluid.param_attrr   r   r   __all__r   r   r<   r<   r<   r=   <module>   s6   !
 /