U c!@s,ddlZddlmZddlmmZdddddddd d d d d dddddddddddgZddZddZddZ Gdddej Z Gdd d e Z Gd!dde Z Gd"ddeje ZGd#ddeje ZGd$ddeje ZGd%dde ZGd&ddeje ZGd'ddeje ZGd(ddeje ZGd)dde ZGd*d d eje ZGd+ddeje ZGd,d d eje ZGd-d d eje ZGd.dde ZGd/dde ZGd0dde ZGd1dde ZGd2dde ZGd3ddejZGd4d d eje ZGd5d d ej e Z Gd6ddej!e Z!dS)7N forward_hookCloneAddCatReLUGELUDropout BatchNorm2dLinear MaxPool2dAdaptiveAvgPool2d AvgPool2dConv2d Sequential safe_divideeinsumSoftmax IndexSelect LayerNormAddEyeTanhMatMulMulcCsP|jdd|jdd}||d|d}|||d|S)N& .>minmaxr)clampeqtypene)abdenr%7D:\Download\graduate-design\LXMERT\lxmert\src\layers.pyr scCsdt|dttfkrDg|_|dD]}|}d|_|j|q"n|d|_d|j_||_dS)NrT)r listtupleXdetach requires_gradappendY)selfinputoutputixr%r%r&rs cCs||_||_dSN) grad_input grad_output)r.r4r5r%r%r& backward_hooksr6cs,eZdZfddZddZddZZS)RelPropcstt||tdSr3)superr7__init__register_forward_hookr)r. __class__r%r&r9$szRelProp.__init__cCstjj|||dd}|S)NT) retain_graph)torchautogradgrad)r.Zr)SCr%r%r&gradprop)szRelProp.gradpropcCs|Sr3r%)r.Ralphar%r%r&relprop-szRelProp.relprop)__name__ __module__ __qualname__r9rDrG __classcell__r%r%r;r&r7#s r7c@seZdZddZdS) RelPropSimplecCs~||j}t||}|||j|}t|jdkrlg}||jd|d||jd|dn|j|d}|SNFr)forwardr)rrDr> is_tensorr,r.rErFrArBrCoutputsr%r%r&rG2s  zRelPropSimple.relpropNrHrIrJrGr%r%r%r&rL1srLc@seZdZddZdS)rcCs"|t|jd||jS)N)r>eyeshape expand_astodevice)r.r/r%r%r&rOAszAddEye.forwardNrHrIrJrOr%r%r%r&r?sc@s eZdZdS)rNrHrIrJr%r%r%r&rDsc@s eZdZdS)rNr[r%r%r%r&rGsc@s eZdZdS)rNr[r%r%r%r&rJsc@seZdZddZdS)rcCs tj|Sr3)r>mulr.inputsr%r%r&rONsz Mul.forwardNrZr%r%r%r&rMsc@s eZdZdS)rNr[r%r%r%r&rQsc@s eZdZdSrNr[r%r%r%r&rSsc@s eZdZdS)rNr[r%r%r%r&rVsc@seZdZddZdS)rcCs tj|Sr3)r>matmulr]r%r%r&rOZszMatMul.forwardNrZr%r%r%r&rYsc@s eZdZdS)r Nr[r%r%r%r&r ]sc@s eZdZdSr_r[r%r%r%r&r`sc@s eZdZdS)r Nr[r%r%r%r&r csc@s eZdZdS)r Nr[r%r%r%r&r gsc@seZdZddZddZdS)rcCs tj|Sr3)r>addr]r%r%r&rOlsz Add.forwardc Cs||j}t||}|||j|}|jd|d}|jd|d}|}|} t||| |} t| || |} |t| |}|t| |}||g} | S)NrrN)rOr)rrDsumabs) r.rErFrArBrCr"r#Za_sumZb_sumZa_factZb_factrRr%r%r&rGos  ""z Add.relpropNrHrIrJrOrGr%r%r%r&rkscs$eZdZfddZddZZS)rcst||_dSr3)r8r9equation)r.rer;r%r&r9s zeinsum.__init__cGstj|jf|Sr3)r>rre)r.operandsr%r%r&rOszeinsum.forward)rHrIrJr9rOrKr%r%r;r&rs c@seZdZddZddZdS)rcCs&|d||d|t|||S)Ndimindices) __setattr__r> index_select)r.r^rgrhr%r%r&rOs  zIndexSelect.forwardcCs||j|j|j}t||}|||j|}t|jdkrtg}||jd|d||jd|dn|j|d}|SrM) rOr)rgrhrrDr>rPr,rQr%r%r&rGs zIndexSelect.relpropNrdr%r%r%r&rsc@seZdZddZddZdS)rcCs,|d|g}t|D]}||q|S)Nnum)riranger,)r.r/rkrR_r%r%r&rOs    z Clone.forwardcCsVg}t|jD]}||jqddt||D}|||j|d}|j|}|S)NcSsg|]\}}t||qSr%)r).0rzr%r%r& sz!Clone.relprop..r)rlrkr,r)ziprD)r.rErFrArmrBrCr%r%r&rGs z Clone.relpropNrdr%r%r%r&rsc@seZdZddZddZdS)rcCs|d|t||S)Nrg)rir>cat)r.r^rgr%r%r&rOs z Cat.forwardc CsV||j|j}t||}|||j|}g}t|j|D]\}}|||q:|Sr3)rOr)rgrrDrrr,) r.rErFrArBrCrRr2cr%r%r&rGs z Cat.relpropNrdr%r%r%r&rsc@seZdZddZdS)rcCs$t|jD]}|||}q|Sr3)reversed_modulesvaluesrG)r.rErFmr%r%r&rGszSequential.relpropNrSr%r%r%r&rsc@seZdZddZdS)r c Csz|j}d|}|jddd|jdddd|jd}||d}||}||}|j|}|S)NrNrrTg?r)r)weight unsqueeze running_varpoweps) r.rErFr)betarzrArBZCar%r%r&rGs(  zBatchNorm2d.relpropNrSr%r%r%r&r sc@seZdZddZdS)r c s|d}tjjdd}tjjdd}tjjdd}tjjdd}fdd}|||||} |||||} || || S)NrNrrrc sht||}t||}t||}t||}||||d}||||d} || S)Nr)FlinearrrD w1w2x1x2ZZ1ZZ2S1S2C1C2rEr.r%r&fs  zLinear.relprop..f)r>rrzr)) r.rErFrpwnwpxnxractivator_relevancesinhibitor_relevancesr%rr&rGs zLinear.relpropNrSr%r%r%r&r sc@seZdZddZddZdS)rcCsd||j}|jd|dd|jdd|jd|jd}tj|||j|j|dS)NrTrNr)stridepaddingoutput_padding)rOr)sizerr kernel_sizerconv_transpose2d)r.ZDYrzrArr%r%r& gradprop2s   0zConv2d.gradprop2csjjddkrFtjjdd}tjjdd}j}jdtjtjtjjdddddddddddd}jdtjtjtjjdddddddddddd}tj|jdjj d tj||djj d tj||djj d d }|} | | j| | || | |} | n|d} tjjdd}tjjdd}tjjdd} tjjdd} fd d }|||| | }|||| | }||| |S) NrNryrrrT)rgkeepdimrTbiasrrrc sxtj||djjd}tj||djjd}t|}t|}||||d}||||d} || S)Nrr)rconv2drrrrDrrr%r&rs  zConv2d.relprop..f) r)rVr>rrzrrrrrr)r.rErFrrr)LHZZarBrCrrrrrrr%rr&rGsL**2 zConv2d.relpropN)rHrIrJrrGr%r%r%r&rs)"r>torch.nnnntorch.nn.functional functionalr__all__rrr6Moduler7rLrrrrrrrrrr r r rrrrrrr r rr%r%r%r&sX