Pytorch 分析反向梯度檢查網路

2021-10-05 03:49:29 字數 1123 閱讀 8787

當訓練時loss下降效果不理想或自定義損失函式時,需要檢查反向回傳梯度是否正常,網路權重是否在更新。

參考pytorch 列印網路回傳梯度,在loss.backward()後,取出網路各層屬性,並分析權重及其梯度資訊。

for name, weight in net.named_parameters():

# print("weight:", weight) # 列印權重,看是否在變化

if weight.requires_grad:

# print("weight:", weight.grad) # 列印梯度,看是否丟失

# 直接列印梯度會出現太多輸出,可以選擇列印梯度的均值、極值,但如果梯度為none會報錯

print

("weight.grad:"

, weight.grad.mean(

), weight.grad.

min(

), weight.grad.

max(

))

對於自己設計的網路或損失函式,當設計有誤時可能網路中各層都沒有梯度,這時需要通過分析輸入輸出的中間變數tensor來分析梯度是在哪個環節消失的。參考pytorch中的鉤子(hook)有何作用?李斌的回答,如果在訓練中列印中間變數的梯度時會得到none,這是因為

這個問題在pytorch的論壇上有人提問過,開發者說是因為當初開發時設計的是,對於中間變數,一旦它們完成了自身反傳的使命,就會被釋放掉。

因此需要新增hook來列印中間變數的梯度:

# 方法一

defprint_grad

(grad)

:print

(grad)

deftran()

:...

# 對於中間變數 y

y.register_hook(print_grad)

loss.backward().

..# 方法二,適用於python3

y.register_hook(

lambda grad:

print

(grad)

)

pytorch梯度累加反向傳播

傳統的訓練函式,乙個batch是這麼訓練的 for i,images,target in enumerate train loader 1.input output images images.cuda non blocking true target torch.from numpy np.arr...

pytorch 梯度下降與反向傳播

在模型訓練中,損失函式用來衡量 值與真實值之間的誤差,數值越小表示誤差越小。乙個常見的選擇是平方函式。它在評估索引為 i 的樣本誤差的表示式為 可能有人想問這裡為什麼要除以1 2,其實有沒有1 2對於損失函式來說效果是一樣的,加上1 2是為了求導方便 把平方求導的係數變成1 批量樣本的損失函式是單個...

Pytorch自動求解梯度

要理解pytorch求解梯度,首先需要理解pytorch當中的計算圖的概念,在計算圖當中每乙個variable都代表的乙個節點,每乙個節點就可以代表乙個神經元,我們只有將變數放入節點當中才可以對節點當中的變數求解梯度,假設我們有乙個矩陣 1.2.3.4.5.6.我們將這個矩陣 二維張量 首先在pyt...