我遇到了許多類似以下用于選擇操作的代碼片段,其中包括torch.no_grad和detach(actor某些演員在哪里,SomeDistribution您的首選分布)的混合,我想知道它們是否有意義:
def f():
with torch.no_grad():
x = actor(observation)
dist = SomeDistribution(x)
sample = dist.sample()
return sample.detach()
detach是否不需要在 return 陳述句中使用,因為 xrequires_grad已經設定為 False,所以所有使用的計算x都應該已經從圖形中分離出來?或者torch.no_grad包裝器之后的計算是否以某種方式再次出現在圖表上,所以我們最終需要再次分離它們(在這種情況下,在我看來no_grad這是不必要的)?另外,如果我是對的,我想不是省略detach一個也可以省略torch.no_grad,并最終得到相同的功能,但性能更差,所以torch.no_grad是首選嗎?
uj5u.com熱心網友回復:
雖然它可能是多余的,但它取決于 和 的內部actor結構SomeDistribution。一般來說,我能想到的三種情況detach在這段代碼中哪里是必要的。由于您已經觀察到,案例x2和 3 不適用于您的具體案例。requires_gradFalse
- 如果
SomeDistribution具有內部引數(帶有 的葉張量requires_grad=True),則dist.sample()可能會導致計算圖連接sample到這些引數。如果不分離,包括那些引數在內的計算圖在回傳后將不必要地保存在記憶體中。 torch.no_grad背景關系中的默認行為是回傳requires_grad設定為的張量運算的結果False。但是,如果actor(observation)由于某種原因在回傳之前將requires_grad其回傳值顯式設定為True,則可能會創建一個連接x到的計算圖sample。如果不分離,包括 在內的計算圖x在回傳后將不必要地保存在記憶體中。- 這似乎更不可能,但如果
actor(observation)實際上只是回傳對 的參考observation,并且observation.requires_grad是True,那么從observation到的計算圖sample可能會在 期間構建dist.sample()。
至于洗掉no_gradleu 中的背景關系的建議detach,這可能會導致構建連接observation(如果需要梯度)和/或分布引數(如果有的話)的計算圖x。該圖將在 之后被丟棄detach,但創建計算圖確實需要時間和記憶體,因此可能會降低性能。
總之,兩者都做no_grad和更安全detach,盡管兩者的必要性取決于分布和參與者的細節。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/416631.html
標籤:
上一篇:UNET預測
