1. 程式人生 > >pytorch相關知識(BN、dropoutput+模型載入+損失函式)

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()

使用有格式要求