當訓練時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...