最近在控制台輸出一下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 這難道有區...