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 を指します.
公式サイトによると、Varableを作成したgraphから分離し、葉っぱのノードとしている.
ソースからもこの点がわかる.将Varable的grad_fnはNoneに設定されています.このようにBPの時には、このVarableに行くと、grad_が見つけられません.fnですので、これ以上BPをバックしません. 将requires_gradはFalseに設定されています.この感じは大きいです.でも、ソースに書いてありますから、勾配が必要でしたら、手動でrequires gauを返してもいいです.gradはtrue に設定されています.
もし私たちが二つのネットワークを持っていたら A,BA,B,二つの関係はこうです. y=A(x)、z=B(y)y=A(x)、z=B(y) 今使いたいです Z.backward()z.backward() 来る BB ネットのパラメーターは勾配を求めにきて、しかしまた求めたくありません. AA ネットワークパラメータの勾配.私たちはこうしてもいいです.
pytochのVarableオブジェクトには二つの方法があります.この二つの方法の効果とこの二つの方法で何ができるかを紹介します.
detach
公式文書では、この方法をこう紹介しています.
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から分離し、葉っぱのノードとしている.
ソースからもこの点がわかる.
# 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(分離)に与えられました.