pytorch相關知識(BN、dropoutput+模型載入+損失函式)
一、在模型測試的時候,前面會使用:
model.eval() 語句
但是如果不寫執行也會正確,因為這個方法是針對在訓練網路和測試時採用不同的情況來進行的
如:Batch Normalization 和Dropout
1、Batch Normalization (BN)
主要是針對網路的中間每一層進行批歸一化處理,並且使用變換結構(Batch Normalizing Transform)保證每層所提取的特徵分佈不會被破壞。
在訓練時是針對每個mini-batch的,但是測試卻是針對單張圖片的,不存在minibatch的概念,由於網路訓練完畢後引數都是固定的,因此每個批次的均值和方差都是不變的,因此直接結算所有的Batch的均值和方差。
因此,所有Batch Normalization的訓練和測試時的操作不同
2、Dropout
Dropout能夠克服Overfitting,在每個批次的訓練中,通過忽略一般的特徵檢測器,可以明顯減少過擬合現象。
在訓練中,每個隱層神經元先乘概率P,然後再進行啟用
在測試中,所有的神經元先進行啟用,然後每個隱層神經元的輸出乘以概率p
二、pytorch的模型載入
1、pyTorch中有個包torchvision,其主要由3個子包組成:torchvision.datasets、torchvision.models、torchvision.transforms
其中,torchvision.models這個包中包含alexnet、densenet、inception、resnet、squeezenet、vgg等常用的網路結構,並且提供了預訓練模型,可以通過簡單呼叫來讀取網路結構和預訓練模型。
2、下載和構建
程式碼:
import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
alexnet = models.alexnet(pretrained=True)
squeezenet = models.squeezenet1_0(pretrained=True)
預訓練模型期望的輸入是RGB影象的mini-batch:(batch_size, 3, H, W),並且H和W不能低於224。影象的畫素值必須在範圍[0,1]間,並且用均值mean=[0.485, 0.456, 0.406]和方差std=[0.229, 0.224, 0.225]進行歸一化。
三、損失函式
損失函式、優化器是神經網路模型的兩個必要的引數。
損失函式是用於計算標籤值和預測值之間的差異,典型的有(距離向量、絕對值向量) 平方差、均方差(多維空間中)
Pytorch中的損失函式
3.1、 nn.L1Loss()
取預測值和真實值的絕對誤差的平均數。
程式碼:criterion=nn.L1Loss() loss=criterion(sample,targe) print(loss)
3.2、nn.SmoothL1Loss()
SmoothL1Loss也叫做Huber loss,其誤差在(-1,1)上是平方誤差,其他情況是L1損失
程式碼:criterion=nn.SmoothL1Loss() loss=criterion(sample,target) print(loss)
3.3、NN.BCELoss()
二分類用的交叉熵函式,計算公式比較複雜
程式碼:criterion=nn.BCELoss()
3.4 nn.MSELoss()
平方損失函式 ,計算預測值和真實值之間的平方和的平均數
程式碼:criterion=nn.MSELoss()
3.5 nn.CrossEntropyLoss
交叉熵損失函式, 該公式用的比較多,如在影象分類神經網路模型中
criterion=nn.CrossEntropyLoss() losss=criterion(sample,target) print(loss)
注意:此函式是用於影象的識別和驗證的,對於輸入的引數有格式的要求
4.6、 nn.LLLoss()
負對數死然後損失函式(Negative log LIkelihood)
在前面接上一個 LogSoftMax 層就等價於交叉熵損失了。注意這裡的 xlabel 和上個交叉熵損失裡的不一樣,這裡是經過 log 運算後的數值。這個損失函式一般也是用在影象識別模型上。
程式碼:
criterion = F.nll_loss()
loss = criterion(sample, target)
print(loss)
loss=F.nll_loss(sample,target)
注意:Nn.NLLLoss 和 nn.CrossEntropyLoss 的功能是非常相似的!通常都是用在多分類模型中,實際應用中我們一般用 NLLLoss 比較多。
4.7 nn.NLLLoss2d
和上面類似,只是多了幾個維度,一般用在圖片上
-
input, (N, C, H, W)
-
target, (N, H, W)
比如用全卷積網路做分類時,最後圖片的每個點都會預測一個類別標籤
程式碼:criterion=nn.NLLLoss2d()
使用有格式要求