Scheaven
2021-09-18 291deeb1fcf45dbf39a24aa72a213ff3fd6b3405
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
U
_cã@sŠdZddlZddlmZddlmZddlmZmZddlm    Z    Gdd„dej
ƒZ Gd    d
„d
ej
ƒZ d d „Z d d„Zdd„Zddd„ZdS)z9
@author:  liaoxingyu
@contact: sherlockliao01@gmail.com
éN)Únn)Ú BatchNorm2d)ÚReLUÚ    LeakyReLU)Ú    Parametercs4eZdZ‡fdd„Zdd„Zdd„Zdd„Z‡ZS)    ÚTLUcs0tt|ƒ ¡||_tt |¡ƒ|_| ¡dS)z9max(y, tau) = max(y - tau, 0) + tau = ReLU(y - tau) + tauN)    ÚsuperrÚ__init__Ú num_featuresrÚtorchÚTensorÚtauÚreset_parameters)Úselfr
©Ú    __class__©ú./layers/frn.pyr    sz TLU.__init__cCstj |j¡dS©N)rÚinitÚzeros_r ©rrrrrszTLU.reset_parameterscCsdjf|jŽS)Nznum_features={num_features}©ÚformatÚ__dict__rrrrÚ
extra_reprszTLU.extra_reprc    Cst ||j d|jdd¡¡S)Né)r Úmaxr Úviewr
)rÚxrrrÚforwardsz TLU.forward©Ú__name__Ú
__module__Ú __qualname__r    rrr Ú __classcell__rrrrrs rcs6eZdZd ‡fdd„    Zdd„Zdd„Zd    d
„Z‡ZS) ÚFRNçíµ ÷ư>Fcsvtt|ƒ ¡||_||_||_tt |¡ƒ|_    tt |¡ƒ|_
|rVtt d¡ƒ|_ n|  dt |g¡¡|  ¡dS)zë
        weight = gamma, bias = beta
        beta, gamma:
            Variables of shape [1, 1, 1, C]. if TensorFlow
            Variables of shape [1, C, 1, 1]. if PyTorch
        eps: A scalar constant or learnable variable.
        rÚepsN)rr&r    r
Úinit_epsÚis_eps_leanablerr r ÚweightÚbiasr(Úregister_bufferr)rr
r(r*rrrr    !sz FRN.__init__cCs8tj |j¡tj |j¡|jr4tj |j|j    ¡dSr)
rrÚones_r+rr,r*Ú    constant_r(r)rrrrr7szFRN.reset_parameterscCsdjf|jŽS)Nz+num_features={num_features}, eps={init_eps}rrrrrr=szFRN.extra_reprcCs`| d¡jddgdd}|t ||j ¡¡}|j d|jdd¡||j     d|jdd¡}|S)ai
        0, 1, 2, 3 -> (B, H, W, C) in TensorFlow
        0, 1, 2, 3 -> (B, C, H, W) in PyTorch
        TensorFlow code
            nu2 = tf.reduce_mean(tf.square(x), axis=[1, 2], keepdims=True)
            x = x * tf.rsqrt(nu2 + tf.abs(eps))
            # This Code include TLU function max(y, tau)
            return tf.maximum(gamma * x + beta, tau)
        ééT)ÚdimÚkeepdimr)
ÚpowÚmeanr Úrsqrtr(Úabsr+rr
r,)rrZnu2rrrr @s ,z FRN.forward)r'Fr!rrrrr& sr&cCs–|}d}d}d}| ¡D]x\}}|rnt|ttfƒrnt|tƒrR| |t|jd¡ntƒ‚| |t    |jd¡n| |t
|ƒ¡|}|}t|tƒ}q|S)z5
    Convert 'BatchNorm2d + ReLU' to 'FRN + TLU'
    NF©r
) Únamed_childrenÚ
isinstancerrrÚ
add_moduler&r
ÚNotImplementedErrorrÚ bnrelu_to_frn)ÚmoduleÚmodZ before_nameZ before_childÚ is_before_bnÚnameÚchildrrrr=Vs$
 
ÿ r=cCsŠ|}d}| ¡D]t\}}t||ƒrrt||ƒrrt|tƒrP|j}| |t|jd¡t|tt    fƒr„| |t
|d¡q| |t ||ƒ¡q|S)Nr8) r9ÚhasattrÚgetattrr:rr
r;r&rrrÚconvert)r>Ú    flag_namer?Z    before_chrArBrrrrEss
rEcCsT|}| ¡D]B\}}t|dƒr<t||ƒ| |t||ƒ¡q | |t||ƒ¡q |S)NÚis_convert_frn)r9rCÚdelattrr;Ú remove_flags)r>rFr?rArBrrrrIƒs
 
rI©r1é€rKr0rGc    sÆtƒ‰tƒ‰dg‰‡‡‡‡fdd„}dg‰‡‡‡‡fdd„}t|tƒrL|g}‡fdd„|Dƒ}ˆ |¡ˆ |¡ˆ|Ž}| ¡ ¡ˆD] }| ¡qŠˆD] }| ¡qœtˆˆd‰tˆˆd‰ˆS)    NFcs&‡‡‡‡fdd„}ˆ ˆ |¡¡dS)Ncsbtˆtjtjfƒsˆˆkr(ˆ d¡dSˆdo<t|ttfƒ}|rNt|ˆdƒˆ t|tƒ¡dS©NFéÿÿÿÿT)    r:rÚ
SequentialÚ
ModuleListÚappendrrÚsetattrr©rÚinputÚoutputZ is_converted)rFr@Úmodelr>rrÚhook•s
 z;bnrelu_to_frn2.<locals>.register_forward_hook.<locals>.hook)rPÚregister_forward_hook©r>rV)rFÚ forard_hooksr@rU©r>rrW”s z-bnrelu_to_frn2.<locals>.register_forward_hookcs&‡‡‡‡fdd„}ˆ ˆ |¡¡dS)Ncsbtˆtjtjfƒsˆˆkr(ˆ d¡dSˆdo8t|tƒ}|rJt|ˆdƒˆ t|ttfƒ¡dSrL)    r:rrNrOrPrrQrrrR)rFÚis_before_relurUr>rrrV¥s
 z<bnrelu_to_frn2.<locals>.register_backward_hook.<locals>.hook)rPÚregister_backward_hookrX)Úbackward_hooksrFr[rUrZrr\¤s    z.bnrelu_to_frn2.<locals>.register_backward_hookcsg|]}tjˆf|žŽ‘qSr)r Úrand)Ú.0Zin_size)Ú
batch_sizerrÚ
<listcomp>µsz"bnrelu_to_frn2.<locals>.<listcomp>)rF)    Úlistr:ÚtupleÚapplyÚsumÚbackwardÚremoverErI)    rUÚ
input_sizer`rFrWr\rrTÚhr)r]r`rFrYr@r[rUrÚbnrelu_to_frn2Žs(
 
 
 
 
  rj)rJr0rG)Ú__doc__r rZtorch.nn.modules.batchnormrÚtorch.nnrrZtorch.nn.parameterrÚModulerr&r=rErIrjrrrrÚ<module>s   6