DAY 39 超大力王爱学Python
知识点回顾
- 图像数据的格式:灰度和彩色数据
- 模型的定义
- 显存占用的4种地方
- 模型参数+梯度参数
- 优化器参数
- 数据批量所占显存
- 神经元输出中间状态
- batchisize和训练的关系
作业:今日代码较少,理解内容即可
以下是根据你提供的 4 个核心要点进行的总结,结合历史对话中的技术细节和代码示例:
一、图像数据的格式:灰度与彩色图像
1. 灰度图像(以 MNIST 为例)
- 通道数:1(仅亮度信息,无颜色)。
- 形状:
(通道, 高, 宽)
,如 MNIST 为(1, 28, 28)
。 - 数据范围:原始像素值为
0-255
(uint8
),经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
。
- 例:MNIST 的 MLP 参数总量
- 梯度:反向传播时自动计算,占用与参数相同空间(总占用≈806 KB)。
2. 优化器状态(可选,如 Adam)
- SGD:无额外占用。
- Adam:每个参数存储动量(
m
)和平方梯度(v
),额外占用2×参数大小
。- 例:MNIST 模型使用 Adam 时,额外占用
101770×8≈806 KB
。
- 例:MNIST 模型使用 Adam 时,额外占用
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) |
模型输入维度 | 784 | 3072 |
显存占用(batch=64) | 约 1 MB | 约 5 MB |
典型 batch_size | 128-1024 | 64-512 |
通过合理设计模型结构、优化显存占用,并根据硬件调整batch_size
,可在保证训练稳定性的同时最大化计算效率。
@浙大疏锦行