data 和detach 的區別

2021-09-29 21:02:50 字數 1299 閱讀 2895

最近在控制台輸出一下loss的時候用到了這倆函式,在這裡記錄一下。

總體上來說tensor.detach()是為了解決tensor.data()的安全性提出的。tensor.detach()相對較為安全。因為當通過.detach()得到的tensor間接修改原來的tensor後繼續在計算圖中使用時會報錯,但是通過.data()得到的tensor間接修改原tensor後繼續在計算圖中使用就會被忽略被修改的過程,例如:

>>> a = torch.tensor([1,2,3.], requires_grad =true)

>>> out = a.sigmoid() #原本是out這個tensor

>>> c = out.data #這裡是data()

>>> c.zero_()

tensor([ 0., 0., 0.])

>>> out # 在這裡out的數值被c.zero_()修改也就是提到的原來的out這個tensor被間接修改了

tensor([ 0., 0., 0.])

>>> out.sum().backward() # 修改後的out參與反向傳播

>>> a.grad # 這個結果很嚴重的錯誤,因為out已經改變了

tensor([ 0., 0., 0.])

但是如果換成.detach()

>>> a = torch.tensor([1,2,3.], requires_grad =true)

>>> out = a.sigmoid() #原本是out這個tensor

>>> c = out.detach() #這裡是detach()

>>> c.zero_()

tensor([ 0., 0., 0.])

>>> out # out的值被c.zero_()修改

tensor([ 0., 0., 0.])

>>> out.sum().backward() # out參與反向傳播,但是已經被c.zero_()了,結果報錯

runtimeerror: one of the variables needed for gradient

computation has been modified by an

thread join和detach的區別

執行緒狀態 在乙個執行緒的生存期內,可以在多種狀態之間轉換,不同的作業系統可以實現不同的執行緒模型,定義許多不同的執行緒狀態,每個狀態還可以包含多個子狀態,但大體來說,如下幾種狀態是通用的 1 就緒 參與排程,等待被執行,一旦被排程選中,立即開始執行 2 執行 占用cpu,正在執行中 3 休眠 暫不...

attr ,prop ,和data 的區別

在面試時遇到了attr prop 和data 的區別這個問題,給胡說八道了一通,感覺很慚愧,特查詢了相關資料,做了一些總結。1 使用方式不同 對於html元素本身就帶有的固有屬性,在處理時,使用prop方法。對於html元素我們自己自定義的dom屬性,在處理時,使用attr方法。這個例子裡元素的do...

string的c str 和data 有區別?

本機windows系統安裝了vs2008環境下,檢視xstring檔案的原始碼發現xstring類的c str data 實現如下 const elem clr or this call c str const const elem clr or this call data const 這難道有區...