卷积原理

Conv1d代表一维卷积,Conv2d代表二维卷积,Conv3d代表三维卷积。

kernel_size在训练过程中不断调整,定义为3就是3 * 3的卷积核,实际我们在训练神经网络过程中其实就是对kernel_size不断调整。

可以根据输入的参数获得输出的情况,如下图所示。

搭建卷积层

下载CIFAR10数据集作为训练数据(因为前几节下载过了,所以直接使用)

dataset = torchvision.datasets.CIFAR10("./dataset_transform",train=False,transform=torchvision.transforms.ToTensor(),download=False)

设定dataloader数据处加载方法(每批次为64)

dataloader = DataLoader(dataset,batch_size = 64)

创建Tudui类继承nn.Module类,并继承初始化方法

class Tudui(nn.Module):
    def __init__(self):
        super(Tudui,self).__init__()

设定卷积层,输入为3层,输出为6层,卷积核为3*3,步辐为1,填充为0

self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

定义forward函数,x为conv1的输出

def forward(self,x):
    x = self.conv1(x)
    return x

初始化网络,并输出

tudui = Tudui()
print(tudui)

结果

可以看出网络的格式

将每张图片输入进网络,data由img和target组成,网络输入img返回结果,输出输入的图片的格式和返回的结果的格式,作对比

for data in dataloader:
    imgs,targets = data
    output = tudui(imgs)
    print(imgs.shape)
    print(output.shape)

结果可以看出卷积前后的输出层数和图像尺寸变化

完整代码

import torch
from torch.utils.data import DataLoader
import torchvision
from torch import nn
from torch.nn import Conv2d

dataset = torchvision.datasets.CIFAR10("./dataset_transform",train=False,transform=torchvision.transforms.ToTensor(),download=False)

dataloader = DataLoader(dataset,batch_size = 64)

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)

for data in dataloader:
    imgs,targets = data
    output = tudui(imgs)
    print(imgs.shape)
    print(output.shape)

Tensorboard显示

创建日志并设置步数

writer = SummaryWriter("logs_conv2d")
step = 0

写输入前后的图像日志,步数每轮加一

writer.add_images("input",imgs,step)
writer.add_images("output",output,step)
step += 1

因为输入输出的图像层数不一样,输入为3层,输出为6层,所以用reshape改一下格式

torch.reshape(output,(-1,3,30,30))

将6层改为3层的办法是多加一倍的batch_size,改为三层后64batch放不下的图像就用新的batch输出,batch_size不确定,所以用-1。

在Tensorboard中显示效果(最后一个batch为16)

完整代码

import torch
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
import torchvision
from torch import nn
from torch.nn import Conv2d

dataset = torchvision.datasets.CIFAR10("./dataset_transform",train=False,transform=torchvision.transforms.ToTensor(),download=False)

dataloader = DataLoader(dataset,batch_size = 64)

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)

writer = SummaryWriter("logs_conv2d")

step = 0
for data in dataloader:
    imgs,targets = data
    output = tudui(imgs)
    print(imgs.shape)
    print(output.shape)
    writer.add_images("input",imgs,step)
    output = torch.reshape(output,(-1,3,30,30)) 
    writer.add_images("output",output,step)
    step += 1

更多推荐