pytorch梯度累加反向傳播

2021-10-05 23:35:32 字數 1650 閱讀 3528

傳統的訓練函式,乙個batch是這麼訓練的:

for i,(images,target) in enumerate(train_loader):

# 1. input output

images = images.cuda(non_blocking=true)

target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=true)

outputs = model(images)

loss = criterion(outputs,target)

# 2. backward

optimizer.zero_grad() # reset gradient

loss.backward()

optimizer.step()

獲取loss:輸入影象和標籤,通過infer計算得到**值,計算損失函式;

optimizer.zero_grad() 清空過往梯度;

loss.backward() 反向傳播,計算當前梯度;

optimizer.step() 根據梯度更新網路引數

簡單的說就是進來乙個batch的資料,計算一次梯度,更新一次網路

使用梯度累加是這麼寫的:

for i,(images,target) in enumerate(train_loader):

# 1. input output

images = images.cuda(non_blocking=true)

target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=true)

outputs = model(images)

loss = criterion(outputs,target)

# 2.1 loss regularization

loss = loss/accumulation_steps

# 2.2 back propagation

loss.backward()

# 3. update parameters of net

if((i+1)%accumulation_steps)==0:

# optimizer the net

optimizer.step() # update parameters of net

optimizer.zero_grad() # reset gradient

獲取loss:輸入影象和標籤,通過infer計算得到**值,計算損失函式;

loss.backward() 反向傳播,計算當前梯度;

多次迴圈步驟1-2,不清空梯度,使梯度累加在已有梯度上;

梯度累加了一定次數後,先optimizer.step() 根據累計的梯度更新網路引數,然後optimizer.zero_grad() 清空過往梯度,為下一波梯度累加做準備;

一定條件下,batchsize越大訓練效果越好,梯度累加則實現了batchsize的變相擴大,如果accumulation_steps為8,則batchsize '變相' 擴大了8倍,是我們這種乞丐實驗室解決視訊記憶體受限的乙個不錯的trick,使用時需要注意,學習率也要適當放大。

pytorch 梯度下降與反向傳播

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

反向傳播和梯度消失

統計機器學習演算法由模型 策略和演算法三個要素構成,當選擇了一種演算法模型後,下一步就要考慮選擇什麼樣的策略或準則來最優化模型 損失函式是機器學習中用於衡量模型一次 結果好壞的目標函式 常用的損失函式有 1 0 1損失函式 非凸函式,只關心 值和真實值是否相同,沒有關係他們之間的距離或誤差,有很多不...

pytorch學習 反向傳播backward

pytorch學習 反向傳播backward backward函式屬於torch.autograd函式庫,在深度學習過程中對函式進行反向傳播,計算輸出變數關於輸入變數的梯度。其輸入變數自然應滿足autograd 的要求,為variable型別而不是tensor型別。常見的使用方法為 此時分為兩種情況...