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

DAY 39 超大力王爱学Python

知识点回顾

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

作业:今日代码较少,理解内容即可

以下是根据你提供的 4 个核心要点进行的总结,结合历史对话中的技术细节和代码示例:

一、图像数据的格式:灰度与彩色图像

1. 灰度图像(以 MNIST 为例)
  • 通道数:1(仅亮度信息,无颜色)。
  • 形状(通道, 高, 宽),如 MNIST 为(1, 28, 28)
  • 数据范围:原始像素值为0-255uint8),经ToTensor()转换后归一化为[0, 1]float32类型。
  • 显示方式:需反归一化并调整维度顺序(PyTorch 默认通道优先,Matplotlib 需转为(高, 宽, 通道))。
2. 彩色图像(以 CIFAR-10 为例)
  • 通道数:3(RGB 三通道)。
  • 形状(3, 32, 32)(CIFAR-10),展平后为3×32×32=3072维向量。
  • 标准化:通常使用transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))将像素值从[0, 1]缩放到[-1, 1]

二、模型的定义:以 MLP 为例

1. 灰度图像模型(MNIST)

python

class MLP(nn.Module):def __init__(self):super().__init__()self.flatten = nn.Flatten()  # 展平为784维self.fc1 = nn.Linear(784, 128)self.relu = nn.ReLU()self.fc2 = nn.Linear(128, 10)  # 10个数字类别def forward(self, x):x = self.flatten(x)  # 输入形状:(batch, 1, 28, 28) → (batch, 784)x = self.fc1(x) → (batch, 128)x = self.relu(x)x = self.fc2(x) → (batch, 10)
2. 彩色图像模型(CIFAR-10)

python

class MLP(nn.Module):def __init__(self):super().__init__()self.flatten = nn.Flatten()  # 展平为3×32×32=3072维self.fc1 = nn.Linear(3072, 128)self.relu = nn.ReLU()self.fc2 = nn.Linear(128, 10)  # 10个物体类别
关键差异
  • 输入维度:灰度图展平后为784维,彩色图为3072维。
  • 模型参数:彩色图模型参数更多(如第一层权重:3072×128 vs 784×128)。
  • batch 维度:模型定义不涉及batch_size,由DataLoader处理,如DataLoader(dataset, batch_size=64)

三、显存占用的 4 个主要部分

1. 模型参数与梯度(必占)
  • 参数:模型权重(如fc1.weight),单精度(float32)下每个参数占 4 字节。
    • 例:MNIST 的 MLP 参数总量101,770,占用约101770×4≈403 KB
  • 梯度:反向传播时自动计算,占用与参数相同空间(总占用≈806 KB)。
2. 优化器状态(可选,如 Adam)
  • SGD:无额外占用。
  • Adam:每个参数存储动量(m)和平方梯度(v),额外占用2×参数大小
    • 例:MNIST 模型使用 Adam 时,额外占用101770×8≈806 KB
3. 数据批量(batch_size 直接影响)
  • 单张图像:灰度图(1×28×28×4)占 3 KB,彩色图(3×32×32×4)占 12 KB。
  • 批量占用batch_size×单张占用
    • 例:batch_size=1024时,CIFAR-10 数据占用1024×12 KB≈12 MB
4. 中间变量(前向 / 反向传播)
  • 隐藏层输出:如 MLP 的fc1输出为(batch, 128),占batch×128×4字节。
    • 例:batch_size=1024时,中间变量占1024×128×4≈512 KB

四、batch_size 与训练的关系

1. 核心影响
batch_size优势风险 / 缺点
小(如 16)显存占用小,适合小显存设备梯度噪声大,训练波动大,迭代次数多
大(如 1024)并行计算效率高,梯度更稳定(平均效应)可能触发 OOM,收敛速度可能变慢
2. 最佳实践
  • 显存限制:通过nvidia-smi监控显存,设置batch_size为显存允许的最大值的 80%(预留安全空间)。
  • 动态调整:从较小值(如 16)开始,逐步增加直至出现 OOM,选择略小值。
  • 优化器选择:Adam 比 SGD 占用更多显存,大batch_size需注意优化器状态开销。
3. 代码示例(设置 batch_size)

总结对比

要点灰度图像彩色图像
数据形状(1, 28, 28)(3, 32, 32)
模型输入维度7843072
显存占用(batch=64)约 1 MB约 5 MB
典型 batch_size128-102464-512
 

通过合理设计模型结构、优化显存占用,并根据硬件调整batch_size,可在保证训练稳定性的同时最大化计算效率。

@浙大疏锦行

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

相关文章:

  • ThreadLocal ,底层原理,强引用,弱引用,内存泄漏
  • Ⅲ-1.计算机二级选择题(三大结构之基本语句)
  • C++11 : 智能指针
  • FreeCAD源码分析: 单位制系统
  • 量子物理:初步认识量子物理
  • 车载软件更新 --- 数据完整性和正确性策略(数据验签事宜汇总)
  • 香橙派3B学习笔记5:Linux文件系统分区_A/B系统分区
  • C++ - 标准库之 <sstream> ostringstream(ostringstream 概述、基本使用、清空内容、进阶使用)
  • torch.randn vs torch.rand
  • 《深度探索C++对象模型》阅读笔记(完整版)
  • DAY 41 超大力王爱学Python
  • 回文字符串
  • window 显示驱动开发-支持多个处理器
  • unidbg patch 初探 微博deviceId 案例
  • STL解析——list的使用
  • 如何增加 cPanel中的 PHP 最大上传大小?
  • CSP使用严格设置
  • 【PhysUnits】15.9 引入P1后的右移运算(shr.rs)
  • C++ 简介
  • 基于 STM32 的医疗垃圾运输小车智能控制系统设计与实现
  • 房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块
  • 思维链提示:激发大语言模型推理能力的突破性方法
  • 论文略读:Auto-Regressive Moving Diffusion Models for Time Series Forecasting
  • 资源预加载+懒加载组合拳:从I/O拖慢到首帧渲染的全面优化方案
  • IPtables部署和使用
  • SCAU8640--希尔排序
  • 产品设计法则:用「人性引擎」驱动7层产品进化
  • OVD开放词汇检测中COCO数据集的属性
  • 数论——约数和倍数
  • 平滑技术(数据处理,持续更新...)