Pytochの中のdetachとdetach ch ch ch ch u

2935 ワード

本論は次から次へhttp://blog.csdn.net/u012436149/article/details/76714349
pytochのVarableオブジェクトには二つの方法があります.この二つの方法の効果とこの二つの方法で何ができるかを紹介します.
detach
公式文書では、この方法をこう紹介しています.
  • は、現在の図から分離された新しいVarableを返す.
  • が戻ってきたVarableは、勾配を必要としない.
  • detachのVarable volatile=Trueであれば、detachから出たvolatileもTrue
  • である.
  • もう一つの注意事項があります.つまり、帰りのVarableとdetachのVarableは同じtenssor
  • を指します.
    import torch
    from torch.nn import init
    from torch.autograd import Variable
    t1 = torch.FloatTensor([1., 2.])
    v1 = Variable(t1)
    t2 = torch.FloatTensor([2., 3.])
    v2 = Variable(t2)
    v3 = v1 + v2
    v3_detached = v3.detach()
    v3_detached.data.add_(t1) #     v3_detached Variable  tensor   
    print(v3, v3_detached)    # v3  tensor       
    # detach    
    def detach(self):
        result = NoGrad()(self)  # this is needed, because it merges version counters
        result._grad_fn = None
        return result
    detach_
    公式サイトによると、Varableを作成したgraphから分離し、葉っぱのノードとしている.
    ソースからもこの点がわかる.
  • 将Varable的grad_fnはNoneに設定されています.このようにBPの時には、このVarableに行くと、grad_が見つけられません.fnですので、これ以上BPをバックしません.
  • 将requires_gradはFalseに設定されています.この感じは大きいです.でも、ソースに書いてありますから、勾配が必要でしたら、手動でrequires gauを返してもいいです.gradはtrue
  • に設定されています.
    # detach_    
    def detach_(self):
        """Detaches the Variable from the graph that created it, making it a
        leaf.
        """
        self._grad_fn = None
        self.requires_grad = False
    何に使いますか
    もし私たちが二つのネットワークを持っていたら A,BA,B,二つの関係はこうです. y=A(x)、z=B(y)y=A(x)、z=B(y) 今使いたいです Z.backward()z.backward() 来る BB ネットのパラメーターは勾配を求めにきて、しかしまた求めたくありません. AA ネットワークパラメータの勾配.私たちはこうしてもいいです.
    # y=A(x), z=B(y)  B      ,  A      
    #      
    y = A(x)
    z = B(y.detach())
    z.backward()
    
    #      
    y = A(x)
    y.detach_()
    z = B(y)
    z.backward()
    この場合、detach detach_ 全部使えます.でもあなたが使いたいなら yy はい、そうです AA BPは行われますか?最初の方法を使うしかないですね.二つ目の方法はもう AA モデルの出力はdetach(分離)に与えられました.