PyTorch 两种卷积写法彻底对比:F.conv2d 函数式 vs nn.Conv2d 类实战(超详细入门笔记)

PyTorch 两种卷积写法彻底对比:F.conv2d 函数式 vs nn.Conv2d 类实战(超详细入门笔记) 一、前言本文对比手动卷积演示代码和标准模型卷积实战代码区分torch.nn.functional.conv2d函数式卷积与torch.nn.Conv2d类形式卷积层的用法、场景、底层逻辑同时梳理张量维度、网络执行流程、数据集调用等全套知识点适合深度学习入门复习。二、代码 1函数式卷积F.conv2d手动卷积演示完整代码python运行import torch import torch.nn.functional as F # 1. 定义原始二维输入矩阵模拟单通道图像 input torch.tensor([[1,2,0,3,1], [0,1,2,3,1], [1,2,1,0,0], [5,2,3,1,1], [2,1,0,1,1]]) # 2. 手动定义卷积核 kernel torch.tensor([[1,2,1], [0,1,0], [2,1,0]]) # 3. 维度变换转为卷积要求的 4 维格式 [N, C, H, W] # N1(批次), C1(通道), H5(高), W5(宽) input torch.reshape(input,(1,1,5,5)) # 卷积核也转为4维[out_C, in_C, kH, kW] kernel torch.reshape(kernel,(1,1,3,3)) # 4. 调用函数式卷积完成计算 output F.conv2d(input, kernel, stride1) # 5. 打印卷积结果 print(output)逐行详细解析1. 库导入python运行import torch import torch.nn.functional as Ftorch基础张量运算库用来创建矩阵、变形、计算torch.nn.functional简写为F函数式神经网络算子库内部包含卷积、激活、池化等纯计算函数无内置可训练参数。2. 定义输入与卷积核python运行# 原始输入二维张量 [H, W] 5行5列 input torch.tensor([[1,2,0,3,1],...]) # 手动自定义 3×3 卷积核 kernel torch.tensor([[1,2,1],...])此处是纯数学矩阵模拟一张 5×5 单通道灰度图卷积核由用户手动指定固定数值不是模型自动训练出来的参数。3.reshape维度扩充核心重点python运行input torch.reshape(input,(1,1,5,5))PyTorch 二维卷积conv2d强制要求输入为 4 维张量格式规定[batch_size, channels, height, width]→ 简写[N, C, H, W]参数解释第一个1batch_size批次大小代表一批只有 1 张图第二个1channels通道数代表单通道灰度图5, 5图像原始高度、宽度。python运行kernel torch.reshape(kernel,(1,1,3,3))卷积核标准 4 维格式[out_channels, in_channels, kH, kW]第 1 个1输出通道数第 2 个1输入通道数和输入图像通道一致3,3卷积核尺寸。核心规则只要使用卷积算子必须补全 4 个维度哪怕只有 1 张图、1 个通道。4.F.conv2d函数调用python运行output F.conv2d(input, kernel, stride1)函数特点纯计算函数不持有参数必须手动传入输入张量、卷积核、步长stride1卷积核每次滑动 1 个像素默认padding0图像外围不补 0。5. 输出形状计算三、代码 2类形式卷积nn.Conv2d 数据集实战完整代码python运行import torch.nn import torchvision from torch import nn from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter # 1. 加载CIFAR10测试集 torch_dataset torchvision.datasets.CIFAR10( root../dataset, trainFalse, transformtorchvision.transforms.ToTensor(), downloadTrue ) # 2. 批量数据加载器 dataloader DataLoader(datasettorch_dataset, batch_size64) # 3. 自定义卷积网络继承nn.Module class f1(nn.Module): def __init__(self): super().__init__() # 定义卷积层类形式卷积 self.conv2dtorch.nn.Conv2d(in_channels3,out_channels6,kernel_size3,stride1) # 前向传播数据运算逻辑 def forward(self, x): xself.conv2d(x) return x # 4. TensorBoard日志器 writer SummaryWriter(logs3) # 5. 实例化网络 ff1() step0 # 6. 循环遍历批次数据 for data in dataloader: imgs,targetdata # 传入图像执行卷积运算 output f(imgs) # 可视化原始图片 writer.add_images(input,imgs,step) # 重塑维度适配TensorBoard显示 output torch.reshape(output,(-1,3,30,30)) writer.add_images(output,output,step) step1 # 关闭日志 writer.close()逐行详细解析1. 库导入python运行import torchvision # 视觉库数据集、图像预处理 from torch import nn # 神经网络模块网络层、模型基类 from torch.utils.data import DataLoader # 批量加载数据 from torch.utils.tensorboard import SummaryWriter # 可视化2. 加载 CIFAR10 数据集python运行torch_dataset torchvision.datasets.CIFAR10( root../dataset, # 数据集存放路径../ 代表上一级目录 trainFalse, # False 加载测试集10000张 transformToTensor(), # 预处理PIL图 → 张量 归一化 维度转换 downloadTrue # 本地无文件则自动下载 )单张图像形状[3, 32, 32]3 通道 RGB 彩色图像素范围[0, 1]。3. DataLoader 批量打包python运行dataloader DataLoader(datasettorch_dataset, batch_size64)batch_size64每一批取出 64 张图片输出数据形状[64, 3, 32, 32]标准 4 维卷积输入格式。4. 自定义网络类PyTorch 标准模型写法python运行class f1(nn.Module): def __init__(self): super().__init__() # 定义卷积层类形式 Conv2d self.conv2dtorch.nn.Conv2d(in_channels3,out_channels6,kernel_size3,stride1)nn.Module所有自定义网络必须继承的基类负责参数管理、反向传播、模型保存__init__初始化函数仅在模型创建时执行 1 次作用定义网络层、自动创建可训练参数卷积核 偏置此阶段不做任何图像运算。nn.Conv2d核心参数详解表格参数取值含义in_channels33输入通道数对应 RGB 三通道图像out_channels66输出通道数代表使用 6 个卷积核输出 6 组特征图kernel_size33卷积核大小 3×3stride11卷积核滑动步长为 1默认参数padding0不补 0。5.forward前向传播函数python运行def forward(self, x): xself.conv2d(x) return x网络真正执行运算的地方规则外部调用模型实例(输入)时PyTorch 会自动执行 forward每一批数据都会走一遍该函数完成卷积计算。6. 模型实例化 循环推理python运行ff1() # 创建模型执行 __init__初始化卷积核参数 for data in dataloader: imgs,targetdata # 解包图像张量 标签 output f(imgs) # 传入图像 → 自动调用forward → 执行卷积f(imgs)是整套代码的运算入口卷积输入[64, 3, 32, 32]卷积输出尺寸计算 \((32-3)\div1 1 30\) 输出形状[64, 6, 30, 30]7.reshape与 TensorBoard 可视化python运行output torch.reshape(output,(-1,3,30,30))原始输出通道为 6TensorBoard 仅支持 1/3 通道图片渲染直接使用会报警告(-1, 3, 30, 30)-1自动推导批次维度3强制改为 3 通道适配 RGB 可视化注意reshape返回新张量必须用变量接收否则修改无效。8.writer.close()将内存中日志完整写入本地文件防止日志丢失。四、两段代码核心对比重点总结1. 卷积 API 本质区别最核心表格对比项代码 1F.conv2d函数式代码 2nn.Conv2d类形式所属模块torch.nn.functionaltorch.nn参数持有无内置参数卷积核手动传入、固定不变自带weight/bias可训练参数框架自动初始化使用位置任意位置多用于临时计算、原理演示写在__init__中标准网络层写法训练属性卷积核不参与反向传播、无法训练参数被模型收集可配合优化器训练更新适用场景学习卷积原理、手动验证计算、固定特征提取搭建深度学习模型、模型训练、工程实战2. 输入数据形式对比代码 1输入手动定义 5×5 二维矩阵模拟单张灰度图维度手动reshape为[1, 1, 5, 5]单批次、单通道数据来源手动构造张量。代码 2输入CIFAR10 标准数据集RGB 彩色图维度[64, 3, 32, 32]多批次、三通道数据来源torchvision官方数据集 DataLoader批量加载。3. 代码结构与执行流程对比代码 1 流程简单流程创建矩阵 卷积核统一转为 4 维张量调用F.conv2d直接计算输出结果特点一步计算无网络结构、无循环、无训练逻辑。代码 2 流程标准深度学习流程加载数据集 → DataLoader 分批定义网络类继承nn.Module__init__搭建卷积层仅执行 1 次forward定义运算逻辑循环执行实例化模型循环遍历每一批数据 → 送入模型推理TensorBoard 可视化特点工业级标准流程可直接扩展为训练网络。4. 通道数差异代码 1单通道图像C1输出单通道特征图代码 2RGB 三通道图像C3卷积输出 6 通道特征图。5.reshape作用差异代码 1补全卷积必需的 4 维格式为了正常执行卷积代码 2修改通道数为了适配 TensorBoard 可视化。五、通用知识点汇总复习必背卷积统一要求无论哪种卷积方式输入必须是 4 维张量[N, C, H, W]批次、通道、高、宽。卷积尺寸通用公式\(H_{out} \frac{H_{in} - kH}{stride} 1 \quad (padding0)\)使用选择建议学习卷积原理、手写验证 → 用F.conv2d搭建模型、训练网络、项目开发 → 用nn.Conv2d。PyTorch 网络固定分工__init__定义层、初始化参数只执行一次forward数据前向运算每一条数据都执行。TensorBoard 限制图像可视化仅支持1 通道灰度、3 通道RGB多通道特征图需要维度转换才能显示。六、易错点整理卷积算子必须 4 维输入二维矩阵一定要用reshape扩维reshape不会原地修改张量必须接收返回值nn.Module不要拼写错误禁止写成MoudleF.conv2d卷积核固定nn.Conv2d卷积核可训练输入通道数必须和上一层输出通道数保持一致。