卷积层

一、卷积操作

代码实现

Conv2d 参数解析

  1. 输入参数 input:

    • 输入张量的形状为 (minibatch, in_channels, iH, iW),其中 minibatch 是批次大小,in_channels 是输入图像的通道数,iHiW 是图像的高度和宽度。
  2. 权重参数 weight:

    • 卷积核/滤波器的形状为 (out_channels, in_channels/groups, kH, kW)out_channels 是输出特征图通道数量,kHkW 是卷积核的高度和宽度,groups 用于控制输入与输出的连接方式。
  3. 偏置参数 bias:

    • 是一个可选的张量,形状为 (out_channels),表示为输出特征图每一通道的偏置,默认值为 None
  4. 步幅 stride:

    • 定义卷积核在输入上进行滑动步长,参数可以是单个数字或二元元组 (sH, sW),默认值为 1,即每次移动一步。
  5. 填充 padding:

    • 表示在输入的两边添加的像素数,参数可以是单个数字或二元元组 (padH, padW),默认值为 0。填充有助于在进行卷积操作时保留输入的空间维度。
  6. 扩展 dilation:

    • 卷积核中元素的间隔,参数可以是单个数字或二元元组 (dH, dV),默认值为 1。扩展卷积有助于增加感受野而不增加参数量。
  7. 分组 groups:

    • 控制输入和输出之间的连接分组数,in_channels 应该被 groups 整除。默认值为 1,表示全连接。更高的分组数可以减少每组之间的连接数,提高计算效率。

重要性及使用

  • 维度匹配:

    • 为了保证卷积操作的正确执行,输入张量形状、卷积核形状、步幅、填充及输出特征图都需要在维度上适配。
  • 灵活性:

    • 通过调整 stridepaddingdilation 可以自定义卷积层的感受野和输出尺寸,适应不同规模的输入数据。
  • 性能优化:

    • 参数 groups 可以用于实现深度可分离卷积(Depthwise Separable Convolutions),提高卷积操作的计算效率。

二、 卷积层

Conv2d 类介绍

Conv2d 类通常用于深度学习框架(如 PyTorch 和 TensorFlow)以实现二维卷积层,其作用是对输入的二维数据应用卷积操作。

基本功能
  • 卷积操作:

    • Conv2d 实现了卷积神经网络(CNNs)中的基本卷积层,对输入的多通道特征图进行卷积运算。
  • 特征提取:

    • 通过卷积核(或称过滤器)扫描输入图像,可以提取出特定模式的特征,例如边缘、角点等。
常用参数
  • in_channels:

    • 输入的通道数,例如,对于RGB图像,该值为3。
  • out_channels:

    • 输出的通道数,即卷积核的数量。这个参数决定了输出特征图的深度。
  • kernel_size:

    • 卷积核的大小,可以是单个整数或二元组。例如,kernel_size=3 表示使用 3x3 的卷积核。
  • stride:

    • 步长,卷积核在每个方向上滑动的步幅大小。默认为1。
  • padding:

    • 填充,决定了在输入特征图的边界补零的数量,用于控制输出的空间尺寸。
  • dilation:

    • 空洞卷积的参数,用于控制卷积核元素之间的间距。
  • groups:

    • 连接的卷积组数,允许对输入通道和输出通道进行分组卷积。
  • bias:

    • 是否包含偏置项,默认为 True,表示每个卷积核的输出都加上一个偏置。

三、实操

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

# 下载CIFAR-10数据集并转换为Tensor格式,存储在指定路径中。
dataset = torchvision.datasets.CIFAR10("./cifar-10", train=False, transform=torchvision.transforms.ToTensor(), download=True)

# 创建DataLoader,用于批量加载数据。这里的批量大小为64。
dataloader = DataLoader(dataset, batch_size=64)

# 定义一个简单的卷积神经网络模型Xzx。
class Xzx(nn.Module):
    def __init__(self):
        super(Xzx, self).__init__()
        # 添加一个二维卷积层,从输入的3个通道(RGB图像)变为输出的6个通道。
        # 使用3x3的卷积核,步长为1,边界不填充(padding=0)。
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
    
    def forward(self, x):
        # 定义前向传播过程,输入x经过卷积层conv1。
        x = self.conv1(x)
        return x

# 实例化模型
xzx = Xzx()

# 创建TensorBoard的SummaryWriter,指定记录日志的目录为"logs"。
writer = SummaryWriter("logs")

# 初始化步骤计数器
step = 0

# 遍历DataLoader,处理每个批次的数据
for data in dataloader:
    # 从DataLoader中获取批量数据,其中包含图像和对应的目标标签
    imgs, targets = data
    # 通过卷积神经网络前向传播获取输出
    output = xzx(imgs)
    
    # 打印输入和输出的形状以进行验证
    print(imgs.shape)  # torch.Size([64, 3, 32, 32])
    print(output.shape)  # torch.Size([64, 6, 30, 30])
    
    # 将输入图像写入TensorBoard记录,标签为"input"
    writer.add_images("input", imgs, step)

    # 对卷积层的输出进行重新塑性以使得它能作为图像记录到TensorBoard。
    # 这里将输出的形状变为(-1, 3, 30, 30),即重新调整为具有3个通道的图像。
    output = torch.reshape(output, (-1, 3, 30, 30))
    # 将重新塑性的输出图像写入TensorBoard记录,标签为"输出"
    writer.add_images("输出", output, step)
    
    # 增加步骤计数器
    step = step + 1

# 关闭SummaryWriter以释放资源
writer.close()

截图:

相关推荐
zzywxc78718 小时前
PyTorch分布式训练深度指南
人工智能·pytorch·分布式·深度学习·wpf·技术栈深潜计划
codelancera18 小时前
Pytorch-04 搭建神经网络架构工作流
人工智能·pytorch·神经网络
DeniuHe18 小时前
Pytorch实现一个简单的贝叶斯卷积神经网络模型
pytorch·深度学习·机器学习
老鱼说AI18 小时前
Vision Transformer(ViT)模型实例化PyTorch逐行实现
pytorch·深度学习·transformer
点云SLAM1 天前
PyTorch 应用于3D 点云数据处理汇总和点云配准示例演示
人工智能·pytorch·深度学习·3d·点云目标检测·点云补全·点云分类
瘦的可以下饭了1 天前
Transformers
pytorch
golitter.1 天前
pytorch的 Size[3] 和 Size[3,1] 区别
人工智能·pytorch·python
盼小辉丶1 天前
PyTorch生成式人工智能(24)——使用PyTorch构建Transformer模型
pytorch·深度学习·transformer
旧时光巷1 天前
【机器学习③】 | CNN篇
人工智能·pytorch·python·机器学习·cnn·卷积神经网络·lenet-5