Pytorch深度学习-----神经网络之卷积层用法详解

系列文章目录

PyTorch深度学习------Anaconda和PyTorch安装
Pytorch深度学习-----数据模块Dataset类
Pytorch深度学习------TensorBoard的使用
Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop)
Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)
Pytorch深度学习-----DataLoader的用法
Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用
Pytorch深度学习-----神经网络的卷积操作


文章目录


一、卷积层是什么?

卷积层是CNN(Convolutional Neural Networks)中的基本网络层,主要用于对图像进行特征提取操作 。关于卷积操作实例也可参考上一篇文章-卷积操作

官网对卷积的描述如下:

其中Conv1d就表示一维卷积,2d为后缀就表示二维卷积,下面主要以二维卷积Conv2d为例。

二、torch.nn.Conv2d参数介绍

附上官网对参数的解释:

python 复制代码
Parameters:
in_channels (int) -- Number of channels in the input image

out_channels (int) -- Number of channels produced by the convolution

kernel_size (int or tuple) -- Size of the convolving kernel

stride (int or tuple, optional) -- Stride of the convolution. Default: 1

padding (int, tuple or str, optional) -- Padding added to all four sides of the input. Default: 0

padding_mode (str, optional) -- 'zeros', 'reflect', 'replicate' or 'circular'. Default: 'zeros'

dilation (int or tuple, optional) -- Spacing between kernel elements. Default: 1

groups (int, optional) -- Number of blocked connections from input channels to output channels. Default: 1

bias (bool, optional) -- If True, adds a learnable bias to the output. Default: True

从上述可知,总共有9个参数,具体解释如下:

in_channels:表示输入的图片通道数目。

out_channels:表示输出的图片通道数目。

kernel_size:表示卷积核的大小,当卷积是正方形的时候,只需要一个整数 边长即可,卷积不是正方形,要输入一个元组 表示高和宽。

stride:表示每次卷积核移动的步长值。

padding:表示是否添加边界,一旦设置就是四周都添加。在原始的行列基础上,行增加2行,列增加2列。

dilation:表示控制卷积核之间的间距。

groups:表示控制输入和输出之间的连接。

bias:表示是否将一个 bias 增加到输出。

padding_mode:表示接收'zeros', 'reflect', 'replicate' or 'circular'. Default: 'zeros',默认是'zeros',即默认在padding操作时,在外一圈是填充的0。
注意 :常用的参数为:in_channels ,out_channels ,kernel_size ,stride ,padding,且kernel_size,stride,padding,dilation这几个可以使一个整数或一个元组,如果是元组的形式就是代表高度和宽度,如果是一个值就是代表高度和宽度是相等的。

三、卷积层操作实践

下面代码以CIFAR10数据集为例进行实践

1.自定义卷积,查看创建的卷积参数

python 复制代码
import torch
import torchvision
from torch.utils.data import DataLoader

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super().__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
print(LGL())  # 打印创建的卷积参数


从输出结果可知,输入通道为3,输出通道为6,卷积核结构为3×3,步长为1。

2.对比卷积前后的图片shape

python 复制代码
import torch
import torchvision
from torch.utils.data import DataLoader

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super(LGL,self).__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
# print(LGL())  # 打印创建的卷积参数
# 输出卷积前后的图片大小
for data in dataloader:
    img, target = data
    # 卷积前
    print(img.shape)
    # 卷积后
    outputs = LGL().conv2(img)
    print(outputs.shape)


torch.Size([64, 3, 32, 32]) 表示一次性读64张图片,原始图像为3通道,大小为3232
torch.Size([64, 6, 30, 30]) 表示一次性读64张图片,原始图像为6通道,大小为30
30
为什么大小会变成30*30?

有官网关于h和w的计算公式如下图所示:

得:
输入图像是32×32,即h=30,w=30,
卷积尺寸是3×3,即kernel_size=3
没有填充,即padding=0
控制卷积核之间的间距也没有,即dilation=0
步长为1,即stride=1
于是输出图像的尺寸为:32-3+1=30,也就是30×30

3.Tensorboard可视化显示效果

代码如下:

python 复制代码
import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super(LGL,self).__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
# print(LGL())  # 打印创建的卷积参数
# 输出卷积前后的图片大小
writer = SummaryWriter("logs")
step=0
for data in dataloader:
    img, target = data
    # 卷积前
    print(img.shape)
    writer.add_images("input",img,step)
    # 卷积后
    outputs = LGL().conv2(img)
    writer.add_images("output",outputs,step)
    step = step+1
    print(outputs.shape)
writer.close()

结果报错:

原因如下:

因为由前面可以知道,经过卷积后图片的通道变为了6,此时在Tensorboard可视化中无法显示通道为6的图片,所以需要进行reshape进行重新设定。
outputs = torch.reshape(outputs,(-1,3,30,30)) 将批次设定为-1,此时程序会自动匹配批次大小。

修改后代码如下:

python 复制代码
import torch
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 准备数据集
dataset = torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集,每次从数据集中取64
dataloader = DataLoader(dataset,batch_size=64)
# 创建自己的神经网络类
class LGL(torch.nn.Module):
    def __init__(self):
        super(LGL,self).__init__()
        # 即输入通道设定为RGB3层,输出通道设定为6,卷积核大小为3,步长设定1,不进行填充
        self.conv2 = torch.nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)

    def forward(self,x):
        return self.conv2(x)
# print(LGL())  # 打印创建的卷积参数
# 输出卷积前后的图片大小
writer = SummaryWriter("logs")
step=0
for data in dataloader:
    img, target = data
    # 卷积前
    print(img.shape)
    writer.add_images("input",img,step)
    # 卷积后
    outputs = LGL().conv2(img)
    outputs=outputs.reshape(-1,3,30,30)
    writer.add_images("output",outputs,step)
    step = step+1
    print(outputs.shape)
writer.close()

Tensorboard可视化显示效果如下:

声明:本篇文章未经许可,谢绝转载。

相关推荐
CoovallyAIHub4 分钟前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
CoovallyAIHub39 分钟前
开源的消逝与新生:从 TensorFlow 的落幕到开源生态的蜕变
pytorch·深度学习·llm
CoovallyAIHub6 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
惯导马工1 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
隐语SecretFlow2 天前
国人自研开源隐私计算框架SecretFlow,深度拆解框架及使用【开发者必看】
深度学习
Billy_Zuo2 天前
人工智能深度学习——卷积神经网络(CNN)
人工智能·深度学习·cnn
羊羊小栈2 天前
基于「YOLO目标检测 + 多模态AI分析」的遥感影像目标检测分析系统(vue+flask+数据集+模型训练)
人工智能·深度学习·yolo·目标检测·毕业设计·大作业
l12345sy2 天前
Day24_【深度学习—广播机制】
人工智能·pytorch·深度学习·广播机制
九章云极AladdinEdu3 天前
超参数自动化调优指南:Optuna vs. Ray Tune 对比评测
运维·人工智能·深度学习·ai·自动化·gpu算力