Python Day39
Task:
1.图像数据的格式:灰度和彩色数据
2.模型的定义
3.显存占用的4种地方
a.模型参数+梯度参数
b.优化器参数
c.数据批量所占显存
d.神经元输出中间状态
4.batchisize和训练的关系
1. 图像数据的格式:灰度和彩色数据
图像数据是深度学习,尤其是计算机视觉领域,最常见的一种输入。它的格式决定了模型如何理解和处理这些视觉信息。
a. 灰度图像 (Grayscale Image)
- 定义: 灰度图像仅表示像素的亮度或强度信息,不包含颜色信息。
- 通道数: 1个通道。
- 像素值: 通常是一个单一的数值,表示该像素的灰度级别。
- 范围:
- 最常见的是 0-255 的整数(无符号8位整数),其中 0 表示纯黑,255 表示纯白,中间值表示不同程度的灰色。
- 在深度学习中,为了数值稳定性,常常会将其归一化到 0.0-1.0 之间浮点数。
- 数据形状 (Shape): (高度 H, 宽度 W) 或 (高度 H, 宽度 W, 1) 或 (1, 高度 H, 宽度 W)。在深度学习框架中,通常会额外增加一个批次 (batch) 维度,例如 (BatchSize, H, W, 1) 或 (BatchSize, 1, H, W)。
- 应用场景: 医学影像(如X光、CT)、文本识别、一些早期图像处理算法、作为彩色图像处理的中间步骤。
b. 彩色图像 (Color Image)
- 定义: 彩色图像包含像素的颜色信息,通常通过组合不同颜色通道来表示。
- 通道数: 最常见的是3个通道,通常是 RGB (Red, Green, Blue) 格式。
- 每个通道独立地表示对应颜色分量的强度。
- 像素值: 对于每个像素,有3个数值,分别对应红、绿、蓝三个通道的强度。
- 范围: 同样是 0-255 整数或 0.0-1.0 浮点数。
- 数据形状 (Shape):
- (高度 H, 宽度 W, 通道数 C) - 常用于 OpenCV 或 TensorFlow/Keras 的图像处理。
- (通道数 C, 高度 H, 宽度 W) - 常用于 PyTorch。
- 同样会增加批次维度,例如 (BatchSize, H, W, C) 或 (BatchSize, C, H, W)。
- 其他颜色空间: 除了RGB,还有CMYK(印刷用,4通道)、HSV/HSL(色相、饱和度、亮度)、YCbCr(视频和JPEG压缩用)等,但深度学习模型通常以RGB作为输入。
- 应用场景: 几乎所有的日常照片、视频、图像识别、目标检测、图像生成等。
总结: 图像数据是多维数组(张量),其维度通常包括高度、宽度和通道数。理解这些格式是构建和训练图像相关深度学习模型的基础。
2. 模型的定义
在深度学习中,“模型”是指一个能够从输入数据中学习并做出预测的数学结构。它是一个可学习的函数,将输入映射到输出。
核心构成:
-
架构/结构 (Architecture):
- 层 (Layers): 模型由一系列相互连接的层组成。常见的层包括:
- 全连接层 (Fully Connected/Dense Layer): 每个输入都连接到下一个层的所有神经元。
- 卷积层 (Convolutional Layer): 通过卷积核提取局部特征,尤其适用于图像数据。
- 池化层 (Pooling Layer): 降低特征图的空间维度,减少计算量并增强特征的鲁棒性。
- 激活函数 (Activation Function): 非线性函数,引入非线性能力,使模型能够学习复杂的模式(如ReLU, Sigmoid, Tanh)。
- 循环层 (Recurrent Layer): 处理序列数据(如RNN, LSTM, GRU)。
- Transformer层: 基于自注意力机制,处理序列数据(如文本、图像块)。
- 归一化层 (Normalization Layer): 如Batch Normalization, Layer Normalization,用于加速训练和提高稳定性。
- Dropout层: 防止过拟合。
- 连接方式: 各层之间如何连接,数据如何在网络中流动(前向传播路径)。
- 网络深度与宽度: 层的数量(深度)和每层神经元/通道的数量(宽度)。
-
参数 (Parameters):
- 权重 (Weights): 各层神经元之间连接的强度。这些是模型真正学习到的“知识”。
- 偏置 (Biases): 独立于输入,用于调整神经元输出的截距项。
- 这些参数在模型初始化时通常是随机的,并在训练过程中通过优化器根据损失函数的梯度不断调整和更新。
- 层 (Layers): 模型由一系列相互连接的层组成。常见的层包括:
模型的工作原理 (简化):
- 前向传播 (Forward Pass): 给定一个输入数据,数据沿着模型的架构从输入层到输出层流动,每一层对数据进行转换,最终产生一个预测结果。
- 反向传播 (Backward Pass): 根据预测结果与真实标签之间的差异(由损失函数计算),计算模型参数对损失的梯度。
- 参数更新 (Parameter Update): 优化器利用这些梯度来调整模型的权重和偏置,以期在下一次预测时减少误差。
总结: 模型可以被看作一个参数化的函数 f(x; θ),其中 x 是输入数据,θ 是模型的所有可学习参数(权重和偏置),f 是由模型架构定义的运算。通过训练,模型的目标是找到最佳的 θ,使得 f(x; θ) 能够准确地预测目标 y。
(图片来源网络,侵删)3. 显存占用的4种地方
在深度学习训练过程中,GPU 显存(VRAM)是有限且宝贵的资源。理解显存是如何被占用的,对于优化训练过程、选择合适的模型和批次大小至关重要。
a. 模型参数 + 梯度参数 (Model Parameters + Gradient Parameters)
- 模型参数 (Model Parameters): 指的是模型中所有可学习的权重 (weights) 和偏置 (biases)。这些参数在整个训练过程中都需要常驻显存。
- 大小: 取决于模型的复杂度(层数、神经元/滤波器数量)。每个参数通常存储为 float32(4字节)或 float16(2字节)。
- 梯度参数 (Gradient Parameters): 在反向传播过程中,为每个模型参数计算其对应的梯度。这些梯度用于更新参数,计算完成后通常会被清空(但在优化器更新前必须存在)。
- 大小: 通常与模型参数的大小相同(每个参数一个梯度)。
- 总占用: 粗略估计为 2倍模型参数大小(参数本身 + 对应的梯度)。
b. 优化器参数 (Optimizer Parameters)
- 定义: 许多先进的优化器(如 Adam, RMSprop, Adagrad 等)需要维护额外的状态变量来帮助参数更新。
- 例子 (以 Adam 为例): Adam 优化器为每个模型参数维护两个额外的状态变量:动量 (momentum) m 和自适应学习率 (adaptive learning rate) v。
- m 存储了梯度的一阶矩估计(平均值)。
- v 存储了梯度的二阶矩估计(非中心方差)。
- 大小: 对于每个模型参数,Adam 通常需要存储两个与参数形状和数据类型相同的额外张量。
- 总占用: 粗略估计为 2倍模型参数大小(仅优化器部分),加上模型参数和梯度。例如,一个 float32 的模型,如果使用 Adam 优化器,总显存占用可能是 (1 + 1 + 2) * 参数数量 * 4字节,即 4倍模型参数大小。如果使用 float16 混合精度训练,则可以减半。
c. 数据批量所占显存 (Data Batch Memory)
- 定义: 当前正在处理的一批输入数据(例如图像、文本序列等)和对应的标签。
- 大小: 取决于 batch_size(批次大小)、输入数据的维度(如图像的高度、宽度、通道数)和数据类型。
- 计算: batch_size * 输入数据 H * W * C * 数据类型字节数
- 特点: 这部分显存占用是动态的,一个批次处理完后,其内存可以被释放或重用。在训练过程中,新的批次会不断加载。
d. 神经元输出中间状态 (Intermediate Activations/Neuron Outputs)
- 定义: 在模型前向传播过程中,每一层计算出的输出结果(即激活值)。这些中间结果需要存储起来,以便在反向传播时计算梯度(根据链式法则)。
- 大小: 这部分占用可能非常大,尤其是对于深层网络和包含大量特征图的卷积网络。它取决于 batch_size 以及网络每一层的输出张量形状。
- 计算: 累加所有层输出的 batch_size * 对应的特征图 H * W * C * 数据类型字节数。
- 重要性: 往往是显存占用的主要限制因素之一,尤其是在使用大批次或高分辨率输入时。
- 优化: 一些技术(如梯度检查点 Gradient Checkpointing)可以牺牲计算时间来减少这部分的显存占用,通过在反向传播时重新计算某些中间激活而不是存储它们。
总结: 当显存不足时,通常首先考虑减小 batch_size,因为它可以同时减少数据批量和中间激活的显存占用。其次,考虑使用 float16 混合精度训练。
(图片来源网络,侵删)4. Batch Size 和训练的关系
Batch Size(批次大小)是指在神经网络训练过程中,一次前向传播和反向传播(即进行一次参数更新)所使用的样本数量。它是深度学习训练中一个非常关键的超参数,对训练过程和最终模型性能有显著影响。
定义:
- 一次迭代 (Iteration): 处理一个批次数据的过程,包括前向传播、损失计算、反向传播和参数更新。
- 一个 epoch (Epoch): 当所有训练样本都至少被模型看到并用于一次参数更新后,我们称完成了一个 epoch。
- 迭代次数: 每个 epoch 的迭代次数 = 总训练样本数 / Batch Size。
Batch Size 对训练的影响:
-
梯度估计的噪声和稳定性:
(图片来源网络,侵删)- 小 Batch Size (例如 1, 4, 8, 16):
- 每次更新的梯度是基于少量样本计算的,所以梯度估计的噪声较大。
- 高噪声的梯度可以帮助模型跳出局部最优,可能发现更平坦、泛化能力更好的最小值。
- 训练过程可能不稳定,损失函数波动较大。
- 大 Batch Size (例如 64, 128, 256, 512+):
- 每次更新的梯度是基于大量样本计算的,梯度估计更准确、噪声更小。
- 训练过程更稳定,损失函数下降更平滑。
- 更容易收敛到尖锐的局部最小值,可能导致泛化能力下降(所谓的“泛化鸿沟”)。
-
训练速度和效率:
- 小 Batch Size:
- 每个 epoch 内的迭代次数更多。
- 虽然每次迭代的计算量小,但频繁的参数更新和数据加载/卸载可能导致整体训练时间不一定快。
- GPU 利用率可能不高,因为不足以完全利用其并行计算能力。
- 大 Batch Size:
- 每个 epoch 内的迭代次数更少。
- 每次迭代处理的数据量大,可以充分利用GPU的并行计算能力,提高计算效率。
- 在一定范围内,增大 Batch Size 可以显著减少每个 epoch 的总训练时间。
- 但达到一定程度后,受限于GPU性能和数据I/O,效率提升会趋于平缓。
-
泛化能力 (Generalization Ability):
- 经验上,较小的 Batch Size 通常被认为能带来更好的泛化能力,因为它们在训练过程中引入的噪声有助于模型探索更广泛的解空间,找到更“平坦”的损失函数最小值。
- 较大的 Batch Size 则可能收敛到更“尖锐”的最小值,虽然在训练集上表现可能很好,但在未见过的数据上表现可能不佳。
-
显存占用 (GPU Memory Usage):
- 小 Batch Size: 占用显存少,因为每次加载的数据量和中间激活值都较小。这使得训练大模型或高分辨率数据成为可能。
- 大 Batch Size: 占用显存多。这通常是限制 Batch Size 的主要因素。当显存不足时,会引发“CUDA out of memory”错误。
-
学习率 (Learning Rate) 的选择:
- 通常情况下,较大的 Batch Size 常常需要配合较大的学习率。
- 一种常见的启发式方法是线性缩放规则:新的学习率 = 原始学习率 * (新的 Batch Size / 原始 Batch Size)。这是因为大批次梯度更新的频率降低,每次更新需要更大的步长来覆盖相同的参数空间。
- 小 Batch Size:
- 小 Batch Size (例如 1, 4, 8, 16):
选择 Batch Size 的建议:
- 从GPU显存限制开始: 尽可能选择能被你的GPU显存容纳的最大 Batch Size。
- 常用范围: 32, 64, 128 都是比较常见的起始点。
- 实验: 针对特定任务和数据集,尝试不同的 Batch Size,观察训练曲线和验证集性能。
- 调整学习率: 当调整 Batch Size 时,务必考虑同步调整学习率。
- 特殊情况: 对于某些任务,如生成对抗网络 (GANs),小 Batch Size(如1或4)可能表现更好。
总结: Batch Size 是一个需要权衡的参数。没有一个“最优”的 Batch Size 适用于所有情况。它需要在训练效率、显存限制、梯度稳定性以及最终模型的泛化能力之间找到一个平衡点。
-
- 模型参数 (Model Parameters): 指的是模型中所有可学习的权重 (weights) 和偏置 (biases)。这些参数在整个训练过程中都需要常驻显存。
-
- 范围: