1. drop_last
在使用深度學習,pytorch 的DataLoader 中,
from torch.utils.data import DataLoader# Define your dataset and other necessary configurations
# Create DataLoader
train_loader = DataLoader(dataset, batch_size=batch_size, drop_last=True)
drop_last=True :DataLoader 中的此設置會刪除不完整的最后一批(如果它小于指定的批量大小)。這確保了訓練期間處理的每個批次包含相同數量的樣本。
1.1 drop_last = True
dataset_size = 100
batch_size = 32
train_loader = DataLoader(dataset, batch_size=batch_size, drop_last=True)
使用 drop_last=True ,DataLoader 確保每個批次包含 32 個樣本,刪除不完整的最終批次。例如,在這種情況下,訓練期間將處理 3 個批次(32、32、32),其余 4 個樣本將不會用于訓練。
適用情況:
當網絡模型的初始化中,需要用到
batch size 時, 這種情況下, 需要注意的是此時, drop_last = False , 會影響網絡模型結構
, 由于模型的初始化過程中,使用了batch size 參數, 所有此時應該設置為 True;
1.2 drop_last = False
而當 drop_last = False, 當最后一個批次中, 剩余的樣本個數不足 batch 樣本數目時, 會保留這剩余的樣本,使用剩余的樣本進行訓練。
當數據不均衡, 并且某一類中樣本數量很少時, 此時 drop_last = True
會嚴重影響到模型的精度,此時應該使用 False;
原因是,本身的某個類別中訓練集和測試集的數量就已經小于batch size 時, 此時使用 drop last, 會嚴重該類別的訓練和測試效果。
如下面的情況:
遇到了這樣的問題。一共16類,第15 16類的訓練集數量是15、15,測試集分別為14、5。其他1-14類訓練集分別有50個,測試集均為200左右。
當我在pytorch的dataloader中設置了drop_last=True時,無論怎么訓練,使用怎么樣的數據增強,第15 16類才測試集上的準確率永遠為0.
原因分析:
當dataloader設置了drop_last=True時,在訓練時如果數據總量無法整除batch_size,那么這個dataloader就會丟掉最后一個batch,也就是說訓練的時候有部分數據是被丟掉的。而我遇到的情況可能是正好把第15 16類的測試數據給丟掉了部分,導致模型很好的學習到這兩類的特征。
解決方案:
將drop_last改為False,即可解決該問題。
2. nn.Parameter
在深度學習訓練過程中, 通常需要自己創建出一個初始化的張量, 并且希望通過模型訓練過程中, 更新該張量。
torch.randn(bt, 3, 256)
而普通的使用torch 隨機初始化的方式,如上面的這種方式,
在大多數情況下,隨機初始化張量不會使其參數變得可學習。在沒有任何相關學習過程或梯度更新的情況下隨機初始化的張量在網絡訓練期間不會適應或改變。
2.1 可學習參數
為了使得創建的張量,在網絡訓練過程中,可以得到更新。
在 PyTorch 中, nn.Parameter
是一個繼承自 torch.Tensor
的類。它允許您向框架指示該張量應被視為模型參數的一部分。當您將其分配為 nn.Module
中的屬性時,它在優化過程中變得可訓練。
import torch
import torch.nn as nn# Creating a tensor as a learnable parameter
param_tensor = nn.Parameter(torch.randn(1, 3))
param_tensor 將在訓練過程中進行優化因為它們被視為模型可學習參數的一部分。
放到 cuda 設備上
self.cuda_param = nn.Parameter(torch.randn(1, 2).cuda())
2.2 nn.ParameterList
同樣, 當想創建一個列表都是可學習的參數時, 使用如下的方式;
self.parameters = nn.ParameterList([nn.Parameter(torch.randn(256)) for _ in range(5)])