当前位置: 首页 > news >正文

Python训练营打卡 Day39

图像数据与显存

知识点回顾

  1. 图像数据的格式:灰度和彩色数据
  2. 模型的定义
  3. 显存占用的4种地方
    1. 模型参数+梯度参数
    2. 优化器参数
    3. 数据批量所占显存
    4. 神经元输出中间状态
  4. batchisize和训练的关系

图像数据与显存

1. 图像数据的格式
  • 灰度图像:就像餐厅只提供黑白两色的菜单,灰度图像只有一种颜色通道,每个像素值表示灰度级别,通常用一个字节(0-255)表示。

  • 彩色图像:就像餐厅提供丰富多彩的菜单,彩色图像通常有三个颜色通道(RGB),每个通道用一个字节表示,分别对应红、绿、蓝三种颜色的强度。

2. 模型的定义
  • 模型定义:就像餐厅的菜谱,详细描述了如何制作每道菜。模型定义包括模型的结构(如神经网络的层数、每层的神经元数量等)和前向传播的过程。

3. 显存占用的四种地方
  • 模型参数和梯度参数:就像餐厅的厨师和他们的烹饪工具,模型参数是模型的核心组成部分,梯度参数是训练过程中用来更新模型参数的数据。这两部分占用了显存。

  • 优化器参数:就像餐厅的管理策略,优化器参数用于指导模型的训练过程,帮助模型更好地学习。

  • 数据批量所占显存:就像餐厅同时服务的顾客数量,数据批量是每次训练时加载到显存中的数据量。

  • 神经元输出中间状态:就像烹饪过程中的中间产物,这些是模型在前向传播过程中产生的临时数据,用于后续计算。

4. Batch Size 和训练的关系
  • Batch Size:就像餐厅一次能服务的顾客数量。较大的 Batch Size 可以让模型看到更多的数据,从而更稳定地更新参数,但会增加显存占用。

  • 训练关系

    • 较大的 Batch Size 可能需要更多的显存,如果显存不足,会导致训练过程出错。

    • 较小的 Batch Size 可能会使训练过程更不稳定,但可以减少显存占用。

    • """
      DAY 39 图像数据与显存
      本节主要介绍深度学习中的图像数据处理和显存管理。
      """import torch
      import torch.nn as nn
      import torch.nn.functional as F
      import torchvision
      import torchvision.transforms as transforms
      import matplotlib.pyplot as plt
      import numpy as np# 设置中文字体(解决中文显示问题)
      plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用黑体字体
      plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
      # 设置随机种子确保结果可复现
      torch.manual_seed(42)#====================== 1. 图像数据的格式 ======================
      """
      1.1 图像数据与结构化数据的区别:
      - 结构化数据(表格数据)形状:(样本数, 特征数),如(1000, 5)
      - 图像数据需要保留空间信息,形状更复杂:(通道数, 高度, 宽度)
      1.2 图像数据的两种主要格式:
      - 灰度图像:单通道,如MNIST数据集 (1, 28, 28)
      - 彩色图像:三通道(RGB),如CIFAR-10数据集 (3, 32, 32)
      """# 定义数据处理步骤
      transforms = transforms.Compose([transforms.ToTensor(),  # 转换为张量并归一化到[0,1]transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 标准化处理
      ])# 加载CIFAR-10数据集作为示例
      trainset = torchvision.datasets.CIFAR10(root='./data', train=True,download=True, transform=transforms)
      trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,shuffle=True)classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')#====================== 2. 模型的定义 ======================
      """
      为了演示显存占用,我们定义一个简单的CNN模型
      """class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()# 第一个卷积层:输入3通道,输出6通道,卷积核5x5self.conv1 = nn.Conv2d(3, 6, 5)# 第二个卷积层:输入6通道,输出16通道,卷积核5x5self.conv2 = nn.Conv2d(6, 16, 5)# 全连接层self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):# 卷积层 -> ReLU -> 最大池化x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))x = F.max_pool2d(F.relu(self.conv2(x)), 2)# 将特征图展平x = x.view(-1, 16 * 5 * 5)# 全连接层x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x#====================== 3. 显存占用分析 ======================
      """
      3.1 模型参数与梯度参数
      - 每个参数需要存储值和梯度
      - 使用float32类型,每个数占4字节
      """
      model = SimpleCNN()
      total_params = sum(p.numel() for p in model.parameters())
      print(f"\n模型总参数量:{total_params}")
      print(f"参数占用显存:{total_params * 4 / 1024 / 1024:.2f} MB")"""
      3.2 优化器参数
      - 如Adam优化器会为每个参数存储额外状态(如动量)
      - 通常是参数量的2-3倍
      """
      optimizer = torch.optim.Adam(model.parameters())
      print(f"优化器额外占用显存:{total_params * 8 / 1024 / 1024:.2f} MB")"""
      3.3 数据批量所占显存
      - 与batch_size成正比
      - 需要考虑输入数据和中间特征图
      """
      # 计算单个CIFAR-10图像占用
      single_image_size = 3 * 32 * 32 * 4  # 通道*高*宽*字节数
      print(f"单张图像占用:{single_image_size / 1024:.2f} KB")
      print(f"batch_size=4时占用:{single_image_size * 4 / 1024:.2f} KB")
      print(f"batch_size=64时占用:{single_image_size * 64 / 1024 / 1024:.2f} MB")"""
      3.4 神经元输出中间状态
      - 前向传播时的特征图
      - 反向传播需要的中间结果
      - 通常比输入数据大很多
      """#====================== 4. batch_size与训练的关系 ======================
      """
      4.1 batch_size的影响:
      - 较大的batch_size:* 计算效率更高* 梯度估计更准确* 需要更多显存* 可能导致泛化性能下降- 较小的batch_size:* 训练更慢* 梯度估计噪声大* 需要更少显存* 可能有更好的泛化性能4.2 选择合适的batch_size:
      - 从小值开始(如16)
      - 逐渐增加直到接近显存限制
      - 通常设置为显存上限的80%
      - 需要在训练效率和模型性能之间权衡
      """# 展示一张样例图片
      def show_sample_image():sample_idx = torch.randint(0, len(trainset), size=(1,)).item()image, label = trainset[sample_idx]print(f"图片形状: {image.shape}")print(f"类别: {classes[label]}")# 显示图片img = image / 2 + 0.5     # 反标准化npimg = img.numpy()plt.imshow(np.transpose(npimg, (1, 2, 0)))plt.title(f'类别: {classes[label]}')plt.show()# 显示样例图片
      show_sample_image()"""
      总结:
      1. 图像数据需要特殊的预处理和格式转换
      2. 显存管理是深度学习中的重要问题
      3. batch_size的选择需要综合考虑多个因素
      4. 合理的显存管理可以提高训练效率
      """
      Files already downloaded and verified模型总参数量:62006
      参数占用显存:0.24 MB
      优化器额外占用显存:0.47 MB
      单张图像占用:12.00 KB
      batch_size=4时占用:48.00 KB
      batch_size=64时占用:0.75 MB
      图片形状: torch.Size([3, 32, 32])
      类别: dog

    • @浙大疏锦行

http://www.xdnf.cn/news/715267.html

相关文章:

  • 4 串电池保护芯片创芯微CM1341-DAT使用介绍
  • 板凳-------Mysql cookbook学习 (八--2)
  • [yolov11改进系列]基于yolov11引入倒置残差块块注意力机制iEMA的python源码+训练源码
  • 面向低端设备的移动网页调试策略:WebDebugX 在性能瓶颈分析中的应用
  • 1 µs = 10⁻⁶ s
  • 目标检测预测框置信度(Confidence Score)计算方式
  • ComfyUI+阿里Wan2.1+内网穿透技术:本地AI视频生成系统搭建实战
  • postgresql 流复制中指定同步的用户
  • AI如何让你的智能设备电池更“聪明”?——Python实现智能电池管理
  • 共享内存(SharedArrayBuffer)的使用,以及兼容性情况
  • 【Python零基础入门系列】第5篇:Python 中的函数、模块和文件读写
  • C语言——获取变量所在地址(uint8和uint32的区别)
  • 【Linux网络篇】:初步理解应用层协议以及何为序列化和反序列化
  • Go语言中flag包的用法详解
  • 23、Swift框架微调实战(3)-Qwen2.5-VL-7B LORA微调OCR数据集
  • 计算机视觉---YOLOv4
  • jdk 国内下载镜像站
  • 数据结构 -- 判断正误
  • 微信小程序学习目录
  • 《合同管理系统业务设计》系列三:合同创建与起草流程
  • Cursor系列(1):Cursor安装、虚拟环境
  • 每日算法-250529
  • 【深度学习】13. 图神经网络GCN,Spatial Approach, Spectral Approach
  • 【C语言练习】071. 理解C语言中的信号处理
  • 华为OD机试真题——求最多可以派出多少支队伍(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Android高级开发第一篇 - JNI(初级入门篇)
  • function reorder in binary
  • 支持selenium的chrome driver更新到137.0.7151.55
  • 如何选择适合团队的项目管理工具
  • 替代ADS1299的LH7909芯片应用方案