目錄
一、數(shù)據(jù)準(zhǔn)備
二、創(chuàng)建神經(jīng)網(wǎng)絡(luò)模型
三、可視化最大池化效果
一、數(shù)據(jù)準(zhǔn)備
首先,需要準(zhǔn)備一個數(shù)據(jù)集來演示最大池化層的應(yīng)用。在本例中,使用了CIFAR-10數(shù)據(jù)集,這是一個包含10個不同類別圖像的數(shù)據(jù)集,用于分類任務(wù)。我們使用PyTorch的torchvision
庫來加載CIFAR-10數(shù)據(jù)集并進行必要的數(shù)據(jù)轉(zhuǎn)換。
import torch
import torchvision
from torch.utils.data import DataLoader
# 數(shù)據(jù)集準(zhǔn)備
dataset = torchvision.datasets.CIFAR10("D:\\Python_Project\\pytorch\\dataset2", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 使用DataLoader加載數(shù)據(jù)集,每批次包含64張圖像
dataLoader = DataLoader(dataset, batch_size=64)
二、創(chuàng)建神經(jīng)網(wǎng)絡(luò)模型
接下來,創(chuàng)建一個簡單的神經(jīng)網(wǎng)絡(luò)模型,其中包含一個卷積層和一個最大池化層。這個模型將幫助演示最大池化層的效果。首先定義一個Tudui
類,該類繼承了nn.Module
,并在初始化方法中創(chuàng)建了一個卷積層和一個最大池化層。
import torch.nn as nn
from torch.nn import Conv2d
from torch.nn.functional import max_pool2d
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init()
# 卷積層
self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
# 最大池化層
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
def forward(self, x):
x = self.conv1(x)
x = self.pool(x)
return x
tudui = Tudui()
print(tudui)
上述代碼中,定義了Tudui
類,包括了一個卷積層和一個最大池化層。在forward
方法中,數(shù)據(jù)首先經(jīng)過卷積層,然后通過最大池化層,以減小圖像的維度。
三、可視化最大池化效果
最大池化層有助于減小圖像的維度,提取圖像中的主要特征。接下來將使用TensorBoard來可視化最大池化的效果,以更好地理解它。首先,導(dǎo)入SummaryWriter
類并創(chuàng)建一個SummaryWriter
對象。
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs")
然后,遍歷數(shù)據(jù)集,對每個批次的圖像應(yīng)用卷積和最大池化操作,并將卷積前后的圖像寫入TensorBoard。
step = 0
for data in dataLoader:
imgs, targets = data
# 卷積和最大池化操作
output = tudui(imgs)
# 將輸入圖像寫入TensorBoard
writer.add_images("input", imgs, step)
# 由于TensorBoard不能直接顯示多通道圖像,我們需要重定義輸出圖像的大小
output = torch.reshape(output, (-1, 6, 15, 15))
# 將卷積和最大池化后的圖像寫入TensorBoard
writer.add_images("output", output, step)
step += 1
writer.close()
在上述代碼中,使用writer.add_images
將輸入和輸出的圖像寫入TensorBoard,并使用torch.reshape
來重定義輸出圖像的大小,以適應(yīng)TensorBoard的顯示要求。
運行上述代碼后,將在TensorBoard中看到卷積和最大池化的效果。最大池化層有助于提取圖像中的關(guān)鍵信息,減小圖像維度,并提高模型的計算效率。
完整代碼如下:
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
#數(shù)據(jù)集準(zhǔn)備
dataset = torchvision.datasets.CIFAR10("D:\\Python_Project\\pytorch\\dataset2",train=False,transform=torchvision.transforms.ToTensor(),download=True)
#使用dataloader加載數(shù)據(jù)集,批次數(shù)為64
dataLoader = DataLoader(dataset,batch_size=64)
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
# 該神經(jīng)網(wǎng)絡(luò)調(diào)用conv2d進行一層卷積,輸入通道為3層(彩色圖像為3通道),卷積核大小為3*3,輸出通道為6,設(shè)置步長為1,padding為0,不進行填充。
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 x
tudui = Tudui()
print(tudui)
# 生成日志
writer = SummaryWriter("logs")
step = 0
# 輸出卷積前的圖片大小和卷積后的圖片大小
for data in dataLoader:
imgs,targets = data
# 卷積操作
output = tudui(imgs)
print(imgs.shape)
print(output.shape)
writer.add_images("input",imgs,step)
"""
注意:使用tensorboard輸出時需要重新定義圖片大小
對于輸入的圖片集imgs來說,tensor.size([64,3,32,32]),即一批次為64張,一張圖片為三個通道,大小為32*32
對于經(jīng)過卷積后輸出的圖片集output來說,tensor.size([64,6,30,30]),通道數(shù)變成了6,tensorboard不知道怎么顯示通道數(shù)為6的圖片,所以如果直接輸出會報錯
解決方案:
使用reshape方法對outputs進行重定義,把通道數(shù)改成3,如果不知道批次數(shù)大小,可以使用-1代替,程序會自動匹配批次大小。
"""
#重定義輸出圖片的大小
output = torch.reshape(output,(-1,3,30,30))
# 顯示輸出的圖片
writer.add_images("output",output,step)
step = step + 1
writer.close()
參考資料:文章來源:http://www.zghlxwxcb.cn/news/detail-732861.html
視頻教程:PyTorch深度學(xué)習(xí)快速入門教程(絕對通俗易懂?。拘⊥炼选?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-732861.html
到了這里,關(guān)于PyTorch入門學(xué)習(xí)(九):神經(jīng)網(wǎng)絡(luò)-最大池化使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!