神經網路-卷積層&池化層
- 一級目錄
- 二級目錄
- 三級目錄
- 1. 神經網路-卷積層
- 2. 神經網路最大池化的應用
一級目錄
二級目錄
三級目錄
1. 神經網路-卷積層
在PyTorch中,torch.nn.Conv2d函數定義了一個二維卷積層,其常用參數包括:
in_channels:輸入圖像的通道數,例如RGB圖像為3。
out_channels:經過卷積運算后,輸出特征映射的數量,即卷積核的數量。
kernel_size:卷積核的大小,可以是一個整數或一個元組指定高度和寬度,例如3或(3, 3)。
stride:卷積核在輸入特征圖上滑動的步長,控制輸出特征圖的大小。
padding:在輸入特征圖的邊緣添加的像素數,用于控制輸出特征圖的大小。
dilation:卷積核元素之間的間距,影響卷積核覆蓋的區域大小,也稱為空洞卷積。
groups:分組卷積中的組數,可以減少參數數量和計算量。
bias:布爾值,指定是否添加偏置項,默認為True。
padding_mode:指定填充類型,例如’zeros’、‘reflect’等,默認為’zeros’。
其中前五個參數比較常用,后四個一般使用默認值就可以了
這些在我上一個博客中也有所解釋
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter#準備測試集
dataset = torchvision.datasets.CIFAR10("./das", train=False, transform=torchvision.transforms.ToTensor(),download = True)dataloader = DataLoader(dataset, batch_size=64)class Test(nn.Module):def __init__(self):super(Test, self).__init__()self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)def forward(self, x):x = self.conv1(x)return xtest = Test()
print(test)
writer = SummaryWriter("logs")
step = 0
for data in dataloader:imgs, targets = dataoutput = test(imgs)# print(output.shape)writer.add_images("input",imgs, step)writer.add_images("output", output, step)step = step + 1
如果運行上述代碼的話會發現這樣的報錯
就是通道數不符造成的,因此我們可以使用reshape操作
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter#準備測試集
dataset = torchvision.datasets.CIFAR10("./das", train=False, transform=torchvision.transforms.ToTensor(),download = True)dataloader = DataLoader(dataset, batch_size=64)class Test(nn.Module):def __init__(self):super(Test, self).__init__()self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)def forward(self, x):x = self.conv1(x)return xtest = Test()
print(test)
writer = SummaryWriter("logs")
step = 0
for data in dataloader:imgs, targets = dataoutput = test(imgs)# print(output.shape)writer.add_images("input",imgs, step)output = torch.reshape(output, (-1,3,30,30)) # 根據錯誤提示進行修改writer.add_images("output", output, step)step = step + 1
我們來看一下size的變化
input[64,3,32,32]
output[64,6,30,30]–(經過reshape)–>[xxx, 3, 30,30]
我們在pytorch官網上面可以找到input/output的形狀的計算方法
input[64,3,32,32]
output[64,6,30,30]
利用上述公式確實得到了output的Hout,Wout為30
2. 神經網路最大池化的應用
在PyTorch中,torch.nn.MaxPool2d
是一個二維最大池化層,用于對輸入信號進行下采樣。以下是該操作的主要參數及其作用:
-
kernel_size:池化窗口的大小,可以是單個整數或兩個整數的元組,分別指定高度和寬度。
-
stride:池化窗口滑動的步長,控制輸出特征圖的大小。可以是單個整數或兩個整數的元組,分別對應高度和寬度。默認值為
kernel_size
。 -
padding:在輸入特征圖的邊緣添加的零填充的數量,用于控制輸出特征圖的大小。可以是單個整數或兩個整數的元組,分別對應高度和寬度。默認值為0。
-
dilation:控制池化窗口中元素之間的間距,影響池化窗口覆蓋的區域大小。可以是單個整數或兩個整數的元組,分別對應高度和寬度。默認值為1。
-
return_indices:如果設置為True,則會返回每個最大值的索引,這在后續使用
torch.nn.MaxUnpool2d
時非常有用。默認值為False。 -
ceil_mode:當設置為True時,輸出形狀的計算會使用向上取整而不是向下取整。默認值為False。
這些參數共同決定了池化操作的行為和輸出特征圖的大小。例如,kernel_size
和stride
決定了池化窗口的大小和移動步長,而padding
和dilation
則影響輸出特征圖的大小和池化窗口的覆蓋范圍。通過合理設置這些參數,可以在保持重要特征的同時減小數據的空間維度,從而降低計算復雜度。
圖片展示了一個5x5的輸入圖像經過最大池化操作后的結果。使用的池化核大小為3x3,并且kernel_size
參數被設置為3。最大池化操作在圖像處理中用于降低特征的空間維度,同時保留最重要的特征信息。
圖片中還展示了兩種不同情況下池化操作的結果,分別是ceil_mode=True
和ceil_mode=False
(默認值)。當ceil_mode=True
時,池化窗口被允許越界,即如果窗口起始于左側填充或輸入區域,則窗口可以超出邊界,而起始于右側填充區域的窗口將被忽略。這會導致輸出特征圖的尺寸可能與默認情況下不同。
當ceil_mode=False
時,輸出特征圖的大小是向下取整計算得到的。而當ceil_mode=True
時,輸出特征圖的大小是向上取整計算得到的。這種設置對于輸出特征圖的尺寸有影響,尤其是在輸入特征圖的尺寸不能被池化窗口整除的情況下。
然后我們可以編寫代碼驗證一下
import torch
from torch import nn
from torch.nn import MaxPool2dinput = torch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]], dtype = torch.float32)
input = torch.reshape(input, (-1,1,5,5))
print(input.shape)class Test(nn.Module):def __init__(self):super(Test, self).__init__()self.maxpool1 = MaxPool2d(3, ceil_mode=True)def forward(self, input):output = self.maxpool1(input)return outputtest = Test()
output = test(input)
print(output)
運行結果是:
然后我們可以更改ceil_mode
class Test(nn.Module):def __init__(self):super(Test, self).__init__()self.maxpool1 = MaxPool2d(3, ceil_mode=False) # 更改ceil_modedef forward(self, input):output = self.maxpool1(input)return output
運行結果是:
在tensorboard中打開
池化操作不會減少圖片數量,但會通過下采樣減小圖片尺寸,從而降低后續層的計算量和參數數量。