嵌入式学习-PyTorch(4)-day21

1、torchvision中数据集的使用

认识官方的一些数据集

Datasets --- Torchvision 0.22 documentation

试了一下CIFAR10数据集,知道了如何下载官方数据集和展示他们去tensorboard中

python 复制代码
import torchvision
from torch.utils.tensorboard import SummaryWriter
#处理数据集
dataset_transform = torchvision.transforms.Compose([
    torchvision.transforms.ToTensor()
])
#下载数据集
train_set = torchvision.datasets.CIFAR10(root='./dataset', train=True,transform=dataset_transform, download=True)
#下载测试集
test_set = torchvision.datasets.CIFAR10(root='./dataset', train=False, transform=dataset_transform, download=True)

#将图片显示到tensorboard上
writer = SummaryWriter("p10")
for i in range(10):
    img,target = test_set[i]
    writer.add_image("test_set", img, i)

print(test_set[0])

writer.close()

DataLoader的使用

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

#准备测试集
test_data = torchvision.datasets.CIFAR10('./dataset', train=False, transform=torchvision.transforms.ToTensor())
#批量输入设置
test_loader = DataLoader(test_data,batch_size=64, shuffle=True,num_workers=0,drop_last=True)

#测试数据集中第一张图片及target
img ,target = test_data[0]
print(img.shape)
print(target)
writer = SummaryWriter("dataloader")
step = 0
for epoch in range(2):
    for data in test_loader:
        imgs ,targets = data
        writer.add_images(f'epoch:{epoch}',imgs,step)
        step += 1
        # print(imgs.shape)
        # print(targets)
writer.close()

DataLoader 是 PyTorch 数据加载的"管家",用来帮你批量(batch)取数据、打乱顺序(shuffle)、多线程提速(num_workers)。

基本用法

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

train_data = torchvision.datasets.CIFAR10(root="./dataset", train=True, transform=..., download=True)

train_loader = DataLoader(dataset=train_data, batch_size=64, shuffle=True, num_workers=2)
参数 作用
dataset 传入 Dataset 对象,比如 CIFAR10
batch_size 一次取多少张图片(例如 64 张一批)
shuffle 是否打乱顺序True 用于训练时打乱数据)
num_workers 使用多少个线程加速数据读取(常见是 0、2、4,根据你电脑配置)

🌟 小建议

  • shuffle=True 👉 训练时常开,防止模型记住样本顺序;

  • shuffle=False 👉 测试时不开,保持固定顺序;

  • num_workers

    • Windows:建议 02(多了容易报错);

    • Linux:可以 48,CPU 核心多可以更高;

  • batch_size 看你显存大小来选,一般 32、64 起步,爆显存就减。

神经网络的基本骨架 nn.Module

torch.nn.Module 是 PyTorch 神经网络模块的核心基类,所有的神经网络模型都应该继承自它。它帮你把模型的参数网络层前向传播逻辑很好地封装起来,同时提供了很多实用功能,比如参数自动管理、模块嵌套、方便的模型保存与加载等。

基本概念

作用:

  • 封装网络结构

  • 封装可训练参数

  • 提供 forward() 方法定义前向传播

所有你写的神经网络模型都应该继承 torch.nn.Module,并且重写 __init__()forward() 方法。

特点 说明
模块化设计 模型由很多子模块组成,可以嵌套
参数自动管理 定义 nn.Linearnn.Conv2d 等时,参数自动注册
forward() 定义前向传播逻辑
保存加载方便 .state_dict() 搭配 torch.save()
  • Module 就是一个"神经网络的容器 🧳",把层、参数、操作逻辑统统塞进去,训练和推理时自动调用,简单省事。

  • 你只负责定义"拼装逻辑",剩下交给 PyTorch 🤖。

python 复制代码
import torch

from torch import nn


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


    def forward(self,input):
        output = input + 1
        return output
tudui = Tudui()
x = torch.tensor(1.0)

output = tudui(x)
print(output)

tudui(x) 本质上等价于 tudui.forward(x),底层走的是 __call__() 魔术方法。

先学一下什么是卷积

📌 一、通俗解释:什么是卷积?

卷积(Convolution)本质上是一种**"滑窗提取特征"**的操作。

你可以想象:

  • 有一张图片(二维矩阵),

  • 有一个小的"滤镜"(也就是卷积核 kernel),

  • 这个滤镜从图片的左上角滑动到右下角,

  • 每次滑动的时候:

    • 截取一小块图像;

    • "乘起来加起来",输出一个特征值;

  • 最终得到一张新的"特征图"。

🎨 类比:

  • 图片 = 原始食材 🍅

  • 卷积核 = 刀工+调料 🧂

  • 卷积 = 切切切 ➡️ 做出不同味道的菜


🧮 二、数学定义

二维卷积的核心公式:

翻译成人话:

  • "输入的一个小窗口" "卷积核"对应元素相乘、求和,得到输出特征图的某个点值。

📌 三、核心关键点

关键词 说明
卷积核(Kernel) 一组小矩阵,自动学习提取特征
滑动窗口(Stride) 每次移动多少步
填充(Padding) 是否对原图边缘补0
特征图(Feature Map) 卷积完得到的新"图片"

🚩 四、为什么用卷积?

稀疏连接 :只关注局部区域,计算量小

参数共享 :同一个 kernel 在整张图上滑动,用的参数一样

自动特征提取:不用人工设计特征,模型自己学!


📈 五、视觉演示(文字版)

假设你有:

输入图片:

1 2 3

4 5 6

7 8 9

卷积核:

1 0

0 -1

第一步:卷积核滑到左上角:

1×1+2×0+4×0+5×(−1)=1−5=−41×1 + 2×0 + 4×0 + 5×(-1) = 1 - 5 = -41×1+2×0+4×0+5×(−1)=1−5=−4

然后继续滑动......

输出就是一个新的小矩阵(特征图)。


📌 总结:

"卷积是一个滑动窗口,乘加求和,输出特征的操作,用于提取局部特征,让神经网络自己学会抓重点。"

卷积对神经网络有啥用

卷积的作用用一句话总结:

"卷积帮神经网络自动提取特征 ,让网络看懂图片、视频、音频的局部模式。"


🟣 一、卷积的三大核心价值

作用 解释 通俗类比
1️⃣ 局部特征提取 卷积只看输入的一小块区域,能抓住边缘、纹理、角落特征 人眼不会每次全局看图,先看局部细节
2️⃣ 参数共享 一个卷积核滑遍整张图,参数大大减少(不用每个像素都单独学参数) 用同一把尺子测量不同区域,简单省事
3️⃣ 平移不变性 卷积对图像的位移/平移不敏感,核心特征能被稳定抓取 你走到房间不同角落,认识椅子的能力不变

🟢 二、对神经网络的作用

神经网络 有了卷积后 实际表现
无卷积(全连接层) 参数量超大,训练慢,特征难以提取 很难直接处理图片等高维输入
有卷积 参数少,学特征快,模型更稳健 成功应用于图像识别、目标检测、语音识别

🎁 三、直观例子

  • 第一层卷积学:边缘、轮廓

  • 第二层卷积学:角、纹理

  • 第三层卷积学:简单物体形状

  • 深层卷积学:复杂物体(猫脸、车轮...)

例子 ✅:

  • 卷积神经网络 CNN:图片分类(ResNet、VGG)

  • YOLO/SSD:目标检测

  • U-Net/SegNet:图像分割

  • WaveNet:语音生成


✅ 四、核心总结:

| 卷积 = 特征提取神器 ✅ |

| 它让神经网络具备看懂图片捕捉特征少参数高效率三大核心竞争力。|

torch.nn.functional.conv2d

📌 一、作用总结

torch.nn.functional.conv2d() = 手动卷积操作,不自动管理参数

核心用途:

  • 想手动传入卷积核 weight/bias;

  • 用自定义的卷积逻辑;

  • 实现轻量推理、特定卷积算法。


📝 二、标准用法

python 复制代码
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

📊 三、参数详解

参数 含义 常见用法
input 输入张量 [batch, in_channels, height, width] [1, 3, 32, 32]
weight 卷积核 [out_channels, in_channels // groups, kernel_h, kernel_w] 你得自己准备
bias 可选,偏置 [out_channels] 默认 None
stride 步长,单个数字或 (h, w) 默认 1
padding 填充 默认 0,不补零
dilation 卷积核膨胀系数 默认 1,标准卷积
groups 分组卷积 默认 1,group conv 或 depthwise 用
python 复制代码
import torch
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]])

kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

input = torch.reshape(input,(1, 1, 5, 5))
kernel = torch.reshape(kernel ,(1, 1, 3, 3))

output = torch.nn.functional.conv2d(input, kernel,stride=1)
print(output)

结果:

python 复制代码
E:\Anaconda3\envs\pytorch\python.exe E:\pytorch_learn\nn.conv.py 
tensor([[[[10, 12, 12],
          [18, 16, 16],
          [13,  9,  3]]]])

进程已结束,退出代码为 0

stride(步长)等于2时:

python 复制代码
E:\Anaconda3\envs\pytorch\python.exe E:\pytorch_learn\nn.conv.py 
tensor([[[[10, 12],
          [13,  3]]]])

进程已结束,退出代码为 0

padding就是在举证四周填充

python 复制代码
import torch
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]])

kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

input = torch.reshape(input,(1, 1, 5, 5))
kernel = torch.reshape(kernel ,(1, 1, 3, 3))

output = torch.nn.functional.conv2d(input, kernel,stride=1, padding=1)
print(output)

结果:

python 复制代码
E:\Anaconda3\envs\pytorch\python.exe E:\pytorch_learn\nn.conv.py 
tensor([[[[ 1,  3,  4, 10,  8],
          [ 5, 10, 12, 12,  6],
          [ 7, 18, 16, 16,  8],
          [11, 13,  9,  3,  4],
          [14, 13,  9,  7,  4]]]])

进程已结束,退出代码为 0
相关推荐
霖0019 分钟前
C++学习笔记五
开发语言·c++·笔记·学习·青少年编程·个人开发
Fuction.23 分钟前
使⽤Pytorch构建⼀个神经⽹络
pytorch·深度学习·学习
东京老树根1 小时前
SAP学习笔记 - 开发45 - RAP开发 Managed App New Service Definition,Metadata Extension
笔记·学习
落羽的落羽2 小时前
【C++】神奇的AVL树
开发语言·数据结构·c++·学习
知识分享小能手3 小时前
Vue3 学习教程,从入门到精通,Vue 3 表单控件绑定详解与案例(7)
前端·javascript·vue.js·学习·前端框架·vue3·anti-design-vue
amazinging3 小时前
北京-4年功能测试2年空窗-报培训班学测开-第五十天
python·学习·面试
没有羊的王K3 小时前
SSM框架学习DI入门——day2
java·spring boot·学习
公子绝3 小时前
JAVA学习笔记 使用notepad++开发JAVA-003
java·学习·notepad++·java开发环境
本杰明1523 小时前
2025/7/14——java学习总结
java·开发语言·学习