目錄
一、數(shù)據(jù)準備
二、創(chuàng)建卷積神經網絡模型
三、可視化卷積前后的圖像
一、數(shù)據(jù)準備
首先,需要準備一個數(shù)據(jù)集來演示卷積層的應用。在這個示例中,使用了CIFAR-10數(shù)據(jù)集,該數(shù)據(jù)集包含了10個不同類別的圖像數(shù)據(jù),用于分類任務。使用PyTorch的torchvision
庫來加載CIFAR-10數(shù)據(jù)集,并進行必要的數(shù)據(jù)轉換。
import torch
import torchvision
from torch.utils.data import DataLoader
# 數(shù)據(jù)集準備
dataset = torchvision.datasets.CIFAR10(root="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)建卷積神經網絡模型
接下來,創(chuàng)建一個簡單的卷積神經網絡模型,以演示卷積層的使用。這個模型包含一個卷積層,其中設置了輸入通道數(shù)為3(因為CIFAR-10中的圖像是彩色的,有3個通道),卷積核大小為3x3,輸出通道數(shù)為6,步長為1,填充為0。
import torch.nn as nn
from torch.nn import Conv2d
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)
def forward(self, x):
x = self.conv1(x)
return x
tudui = Tudui()
print(tudui)
上述代碼定義了一個Tudui
類,該類繼承了nn.Module
,并在初始化方法中創(chuàng)建了一個卷積層。forward
方法定義了數(shù)據(jù)在模型中的前向傳播過程。
三、可視化卷積前后的圖像
卷積層通常會改變圖像的維度和特征。使用TensorBoard來可視化卷積前后的圖像以更好地理解卷積操作。首先,導入SummaryWriter
類,并創(chuàng)建一個SummaryWriter
對象用于記錄日志。
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs")
然后,使用DataLoader
遍歷數(shù)據(jù)集,對每個批次的圖像應用卷積操作,并將卷積前后的圖像以及輸入的圖像寫入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, 3, 30, 30))
# 將卷積后的圖像寫入TensorBoard
writer.add_images("output", output, step)
step += 1
writer.close()
在上述代碼中,使用writer.add_images
將輸入和輸出的圖像寫入TensorBoard,并使用torch.reshape
來重定義輸出圖像的大小,以滿足TensorBoard的顯示要求。
運行上述代碼后,將在TensorBoard中看到卷積前后的圖像,有助于理解卷積操作對圖像的影響。
完整代碼如下:
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ù)集準備
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__()
# 該神經網絡調用conv2d進行一層卷積,輸入通道為3層(彩色圖像為3通道),卷積核大小為3*3,輸出通道為6,設置步長為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
對于經過卷積后輸出的圖片集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-732866.html
視頻教程:PyTorch深度學習快速入門教程(絕對通俗易懂!)【小土堆】文章來源地址http://www.zghlxwxcb.cn/news/detail-732866.html
到了這里,關于PyTorch入門學習(八):神經網絡-卷積層的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!