pytorch loss反向傳播出錯的解決方案

2022-10-03 15:42:16 字數 2742 閱讀 5764

今天在使用pytorch進行訓練,在執行 loss.backward() 誤差反向傳播時出錯 :

runtimeerror: grad can be implicitly created only for scalar outputs

file "train.py", line 143, in train

loss.backward()

file "/usr/local/lib/python3.6/dist-packages/torch/tensor.py", line 198, in backward

torch.autograd.backward(self, gradient, retaidbqaypkzn_graph, create_graph)

file "/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py", line 94, in backward

grad_tensors = _make_grads(tensors, grad_tensors)

file "/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py", line 35, in _make_grads

raise runtimeerror("grad can be implicitly created only for scalar outputs")

runtimeerror: grad can be implicitly created only for scalar outputs

因為我們在執行 loss.backward() 時沒帶引數,這與 loss.backward(torch.tensor(1.0)) 是相同的,參dbqaypkz數預設就是乙個標量。

但是由於自己的loss不是乙個標量,而是二維的張量,所以就會報錯。

loss = criterion(pred, targets)

loss.backward()

# 改為:

loss = criterion(pred, targets)

loss.backward(loss.clone().detach())

把張量的輸出修改為標量,比如說多多個維度的loss求和或求均值等。此方法對於某些任務不一定適用,可以嘗試自己www.cppcns.com修改。

criterion = nn.l1loss(reduction='none')

# 把引數去掉,改為:

criterion = nn.l1loss()

在新的pytorch版本裡,使用reduction 引數取代了舊版本的size_**erage和reduce引數。

reduction 引數有三種選擇:

'elementwise_mean':為預設情況,表明對n個樣本的loss進行求平均之後返回(相當於reduce=true,size_**erage=true);

'sum':指對n個樣本的loss求和(相當於reduce=true,size_**erage=false);

'none':表示直接返回n分樣本的loss(相當於reduce=false)

補充:在pytorch下,由於反向傳播設定錯誤導致 loss不下降的原因及解決方案

在pytorch下,由於反向傳播設定錯誤導致 loss不下降的原因及解決方案

剛剛接觸深度學習一段時間,一直在研究計算機視覺方面,現在也在嘗試實現自己的idea,從中也遇見了一些問題,這次就專門寫一下,自己由於在反向傳播(backward)過程中引數沒有設定好,而導致的loss不下降的原因。

簡單描述一下我的網路結構,我的網路是有上下兩路,先對第一路網路進行訓練,使用groud truth對這一路的結果進行監督loss_steam1,得到訓練好的feature.然後再將得到的feature級聯到第二路,通過網路得到最後的結果,再用groud truth進行監督loss。

這個問題確實折麼自己一段時間,結果發現自己出現了乙個問題,下面將對這個問題進行分析和解答:

在pytorch中,傳入網路計算的資料型別必須是variable型別, variable包裝了乙個tensor,並且儲存著梯度和建立這個variablefunction的引用,換句話說,就是記錄網路每層的梯度和網路圖,可以實現梯度的反向傳遞.

則根據最後得到的loss可以逐步遞迴的求其每層的梯度,並實現權重更新。

在實現梯度反向傳遞時主要需要三步:

1、初始化梯度值:net.zero_grad()清除網路狀態

2、反向求解梯度:loss.backward()反向傳播求梯度

3、更新引數:optimizer.step()更新引數

自己在寫**的時候,還是沒有對自己的**搞明白。在反向求解梯度時,對第一路沒有進行反向傳播,這樣肯定不能使這一路的更新,所以我就又加了一步:

loss_steam1.backward( retain_graph = true) //因為每次執行一次backward時,如果不加retain_graph = true,執行完後,計算圖都會free掉。

loss.backward()

這樣就夠了麼?我當時也是這麼認為的結果發現loss_s程式設計客棧team1還是沒有降,又愁了好久,結果發現梯度有了,不更新引數,怎麼可能有用!

optimizer_steam1.step() //這項必須加

optimizer.step()

哈哈!這樣就完成了,效果也確實比以前好了很多。

本文標題: pytorch loss反向傳播出錯的解決方案

本文位址: /jiaoben/python/391944.html

反向傳播演算法

首先我們對數學符號做一些約定。我們首先考慮簡單的情況 前饋神經網路,如圖 所示。我們先假設任意兩層之間沒有權值共享。方向傳播演算法本質上就是梯度下降演算法,所以我們要對損失函式關於每個引數求導。設單個輸入例項 x 損失函式為 j x 那麼我們要求解 j wi 和 j bi i 1,2,n 對 j 關...

彈性反向傳播

正常使用的反向傳播演算法有兩個缺點待解決,其一為學習過程中學習率的選擇較難,一旦學習率選擇不當會造成學習效果不好 其二為反向傳播演算法的梯度瀰散作用,即距離輸出層越遠的神經元學習的速度越慢。martin riedmiller也因此提出了彈性反向傳播演算法 rprop 反向傳播演算法中的學習率為使用者...

反向傳播演算法

反向傳播演算法的工作機制為對 錯誤的神經元施以懲罰。從輸出層開始,向上層次查詢 錯誤的神經元,微調這些神經元輸入值的權重,以達到修復輸出錯誤的目的。神經元之所以給出錯誤的 原因在於它前面為其提供輸入的神經元,更確切地說是由兩個神經元之間的權重及輸入值決定的。我們可以嘗試對權重進行微調。每次調整的幅度...