卷积层

一、卷积操作

代码实现

Conv2d 参数解析

  1. 输入参数 input:

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

    • 卷积核/滤波器的形状为 (out_channels, in_channels/groups, kH, kW),out_channels 是输出特征图通道数量,kH 和 kW 是卷积核的高度和宽度,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,表示全连接。更高的分组数可以减少每组之间的连接数,提高计算效率。

重要性及使用

  • 维度匹配:

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

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

    • 参数 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()

截图:

相关推荐
Είναι η κοπέλα21 小时前
模型量化完全指南:GGUF、GPTQ、AWQ 怎么选
人工智能·pytorch·python
Soonyang Zhang2 天前
根据时戳从pytorch trace中获取kernel信息
pytorch
承渊政道2 天前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(开源大模型ChatGLM使用详解)
人工智能·pytorch·开源·llm·chatglm
129Lab3 天前
电池热管理仿真的AI加速:用Python+PINN物理信息神经网络替代传统CFD的可行性探索
pytorch·python·cfd·pinn·物理信息神经网络·仿真加速·电池热管理
Είναι η κοπέλα3 天前
llama.cpp 与 GGUF 格式:本地大模型的“裸引擎“
开发语言·人工智能·pytorch·python·conda
头发够用的程序员3 天前
TensorRT 自定义算子插件实战(三):手搓 2×2 最大池化 customMaxpool
人工智能·pytorch·python·深度学习·神经网络·边缘计算·jetson
for_ever_love__4 天前
PyTorch 张量与 autograd——自动求导怎么工作
pytorch·python·深度学习·自动求导
Είναι η κοπέλα5 天前
显存计算与模型选择:你的显卡能跑多大的模型
人工智能·pytorch·python·开源·conda
海天一色y6 天前
模型部署的「通用语」:ONNX 转换
pytorch·onnx
Thomas.Sir6 天前
第26课:工业零部件外观缺陷检测系统:从学术Demo到产线工程的重构实战
pytorch·ai