傳統的訓練函式,乙個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型別。常見的使用方法為 此時分為兩種情況...