news 2026/6/10 0:32:06

DAY 41 图像数据与显存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAY 41 图像数据与显存

一、图像数据的格式

1.灰度图像

基本特性:

  • 单通道:每个像素仅 1 个值 (0~255),表示亮度
  • 存储:8 位 / 像素 (1 字节),文件体积小
  • 视觉效果:从黑 (0) 到白 (255) 的灰度渐变,无色彩信息

2.彩色图像

RGB 色彩模型:

  • 三通道:红 (R)、绿 (G)、蓝 (B),各 8 位 (0~255)
  • 存储:24 位 / 像素 (3 字节),文件体积大
  • 色彩表示:可组合出 1600 万 + 种颜色
  • 示例:纯红 (255,0,0),纯绿 (0,255,0),纯白 (255,255,255)
特征灰度图像彩色图像
通道数1 个3 个 (RGB)
存储大小1 字节 / 像素3 字节 / 像素
色彩表现仅亮度 (黑白灰)全彩 (1600 万 + 色)
典型文件医学影像、扫描文档照片、网页图像

处理速度

快 (数据量小)慢 (数据量大)

结构化数据与图像数据差异点:

结构化数据(如表格)的形状通常是 (样本数, 特征数),例如 (1000, 5) 表示 1000 个样本,每个样本有 5 个特征。图像数据的形状更复杂,需要保留空间信息(高度、宽度、通道),因此不能直接用一维向量表示。其中颜色信息往往是最开始输入数据的通道的含义,因为每个颜色可以用红绿蓝三原色表示,因此一般输入数据的通道数是 3。

在 PyTorch 中,图像数据的形状通常遵循 (通道数, 高度, 宽度) 的格式(即 Channel First 格式),这与常见的 (高度, 宽度, 通道数)(Channel Last,如 NumPy 数组)不同。---注意顺序关系

注意点:

1. 如果用matplotlib库来画图,需要转换下顺序。

2. 模型输入通常需要批次维度(Batch Size),形状变为 (批次大小, 通道数, 高度, 宽度)。例如,批量输入 10 张 MNIST图像时,形状为 (10, 1, 28, 28)。

二、图像相关的神经网络的定义

1.黑白图像模型的定义

黑白图像模型是针对 “黑白 / 灰度图像”(单通道像素矩阵)设计的神经网络,核心还是 CNN,但输入层只接收 “单个通道” 的像素数据(区别于彩色图像的 3 个通道)。
这里的 “黑白图像” 包含两类:

  • 灰度图:每个像素用 0~255 的数值表示亮度(黑 = 0,白 = 255,中间是灰色);
  • 二值图:每个像素只有 0 或 1(纯黑或纯白,比如扫描的文档、铁路轨道的轮廓图)。

简单说:黑白图像模型是 “专门看黑白画布的智能眼睛”,因为输入数据更简单(单通道),模型通常更轻量化、训练更快。

2.彩色图像模型的定义

彩色图像模型是专门处理彩色图像(多通道像素矩阵)的深度学习神经网络,核心仍是「卷积神经网络(CNN)」,但输入数据是包含颜色信息的多通道像素矩阵(最常用 RGB 三通道),能同时提取图像的「亮度特征」和「颜色特征」,最终实现彩色图像的分类、检测、分割等任务。
简单说:彩色图像模型是 “能看懂彩色画布的智能眼睛”—— 相比黑白图像模型(只看亮度),它多了 “识别颜色” 的能力,能利用颜色信息提升任务准确率(比如区分红色、黄色、绿色的铁路信号)。

3.模型定义与batchsize的关系

模型定义(网络结构本身)与 BatchSize 完全无关——BatchSize 是 “训练 / 推理时每次喂给模型的样本数量”,仅影响模型的输入数据维度、训练效率、显存占用、收敛效果,但不会改变模型的层结构、参数数量等核心定义。
简单说:模型定义是 “造一辆车的设计图纸”(确定车的骨架、发动机、轮子),BatchSize 是 “每次往车里装多少货物”—— 图纸不会因为装的货物多少而改变,但装货量会影响车的行驶效率、油耗、运输速度。

class MLP(nn.Module): def __init__(self): super().__init__() self.flatten = nn.Flatten() # nn.Flatten()会将每个样本的图像展平为 784 维向量,但保留 batch 维度。 self.layer1 = nn.Linear(784, 128) self.relu = nn.ReLU() self.layer2 = nn.Linear(128, 10) def forward(self, x): x = self.flatten(x) # 输入:[batch_size, 1, 28, 28] → [batch_size, 784] x = self.layer1(x) # [batch_size, 784] → [batch_size, 128] x = self.relu(x) x = self.layer2(x) # [batch_size, 128] → [batch_size, 10] return x

三、显存占用的主要组成部分

显存一般被以下内容占用:

  • 模型参数与梯度:模型的权重(Parameters)和对应的梯度(Gradients)会占用显存,尤其是深度神经网络(如 Transformer、ResNet 等),一个 1 亿参数的模型(如 BERT-base),单精度(float32)参数占用约 400MB(1e8×4Byte),加上梯度则翻倍至 800MB(每个权重参数都有其对应的梯度)。
  • 部分优化器(如 Adam)会为每个参数存储动量(Momentum)和平方梯度(Square Gradient),进一步增加显存占用(通常为参数大小的 2-3 倍)
  • 其他开销。

1.模型参数与梯度(FP32 精度)

2.优化器状态

SGD

- SGD优化器**不存储额外动量**,因此无额外显存占用。

- SGD 随机梯度下降,最基础的优化器,直接沿梯度反方向更新参数。

- 参数更新公式:w = w - learning_rate * gradient

Adam

- Adam优化器:自适应学习率优化器,结合了动量(Momentum)和梯度平方的指数移动平均。

- 每个参数存储动量(m)和平方梯度(v),占用约 `101,770 × 8 Byte ≈ 806 KB`

- 动量(m):每个参数对应一个动量值,数据类型与参数相同(float32),占用 403 KB。

- 梯度平方(v):每个参数对应一个梯度平方值,数据类型与参数相同(float32),占用 403 KB。

3.数据批量(batch_size)的显存占用

单张图像尺寸:1×28×28(通道×高×宽),归一化转换为张量后为float32类型

- 单张图像显存占用:1×28×28×4 Byte = 3,136 Byte ≈ 3 KB

批量数据占用:batch_size × 单张图像占用

- 例如:batch_size=64`时,数据占用为 64×3 KB ≈ 192 KB

- batch_size=1024 时,数据占用为 1024×3 KB ≈ 3 MB

4.前向/反向传播中间变量

对于两层MLP,中间变量(如layer1的输出)占用较小:

- batch_size×128维向量:batch_size×128×4 Byte = batch_size×512 Byte

- 例如batch_size=1024时,中间变量约512 KB

在 PyTorch 中,在使用DataLoader加载数据时,如果不指定batch_size参数,默认值是1。即每次迭代返回一个样本。这与一次性使用全部数据进行训练是完全不同的概念。如果想要一次性使用全部数据进行训练,需要手动将batch_size设置为数据集的大小,但对于大型数据集,这样做通常会导致内存不足,因为一次性将所有数据加载到内存中可能会超出硬件的内存限制。

大规模数据时,通常从16开始测试,然后逐渐增加,确保代码运行正常且不报错,直到出现 内存不足(OOM)报错 或训练效果下降,此时选择略小于该值的 batch_size。

训练时候搭配 nvidia-smi 监控显存占用,合适的 batch_size = 硬件显存允许的最大值 × 0.8(预留安全空间),并通过训练效果验证调整。

@浙大疏锦行

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 22:16:14

32、深入探索 Django:构建 Web 应用与数据库应用

深入探索 Django:构建 Web 应用与数据库应用 1. 引言 在当今数字化的时代,Web 应用无处不在,它们为人们的日常生活和工作提供了极大的便利。对于系统管理员而言,构建 Web 应用可以帮助他们更好地进行系统、应用和用户的监控与报告。Python 作为一种功能强大且易于学习的编…

作者头像 李华
网站建设 2026/6/9 23:43:33

取一个奶奶辈的微信昵称[特殊字符],好听到爆

🌸 俏皮日常类 • 广场舞C位💃快乐翻倍✨ • 超市薅羊毛🛒满载而归🍬 • 追剧不停歇📺零食管够🍪 • 公园遛弯儿🚶‍♀️偶遇老友👵 •晒衣晒太阳🌞心情亮堂堂☀️ &…

作者头像 李华
网站建设 2026/6/9 9:50:36

生日祝福语音定制服务商业模式探讨

生日祝福语音定制服务的商业实践与技术融合 在某个深夜,一位用户上传了一段8秒的录音——那是他已故母亲生前在家庭聚会中的一句玩笑话。他输入了这样一段文字:“宝贝,生日快乐,妈妈永远爱你。”点击生成后,熟悉的音色…

作者头像 李华
网站建设 2026/6/8 14:55:18

49、基于 Pthreads 的多线程编程 II - 同步

基于 Pthreads 的多线程编程 II - 同步 在多线程编程中,同步是一个至关重要的话题。本文将深入探讨使用互斥锁(mutex)进行线程同步的相关内容,包括优先级反转问题、看门狗定时器、优先级继承以及互斥锁的其他变体。 1. 进程间通信与互斥锁 在进行进程间通信(IPC)时,建…

作者头像 李华
网站建设 2026/6/7 3:48:46

56、Linux 系统中的 CPU 调度与高级文件 I/O 技术

Linux 系统中的 CPU 调度与高级文件 I/O 技术 1. Linux 中的 CPU 调度 在 Linux 系统里,设置线程(或进程)的调度策略和优先级时,需要以 root 权限运行。现代为线程赋予特权的方式是通过 Linux 能力模型(Linux Capabilities model),具备 CAP_SYS_NICE 能力的线程可以…

作者头像 李华
网站建设 2026/6/9 9:38:00

59、高级文件 I/O 技术全解析

高级文件 I/O 技术全解析 在 Linux 系统编程中,高效的文件 I/O 操作至关重要。本文将深入介绍几种高级文件 I/O 技术,包括内存映射、直接 I/O(DIO)、异步 I/O(AIO)等,并对它们进行详细的比较和分析。 1. 内存映射(mmap) 内存映射(mmap)是一种将文件或设备映射到进…

作者头像 李华