cnn 卷积算法 一、添加 padding 作用1、保持输出尺寸不变2、让边缘像素也能被充分利用如果不 padding边缘像素参与卷积的次数很少。比如左上角的像素如果没有 padding它只能出现在很少几个卷积窗口里而中间像素会被多个窗口反复利用。这会导致模型更重视图像中心而边缘信息容易被弱化。加 padding 后卷积核可以滑到边缘位置边缘像素也能作为卷积窗口的中心参与计算。所以 padding 的第二个意义是保护边缘信息。3、方便深层网络堆叠如果每做一次卷积特征图都变小那么网络层数一深图像尺寸会很快缩小。例如连续做几层 3×3 卷积如果不 padding32×32 → 30×30 → 28×28 → 26×26 → ...很快空间信息就会被压缩掉。如果使用 padding132×32 → 32×32 → 32×32 → 32×32这样网络可以堆得更深同时保持空间结构不丢失。二、卷积层如何降低计算量计算量计算公式卷积核大小 × 输入特征图大小 × 输入通道数 × 输出通道数卷积核数量在大卷积前先用1×1卷积降低通道数可以显著减少计算量计算量减少了接近90%同时尽量保留有用特征。这就是很多经典网络里常见的设计比如Inception 模块和ResNet bottleneck 结构。三、冻结训练怎么解决的梯度消失问题严格说冻结训练不是从数学上“消除”梯度消失而是绕开了一部分梯度消失问题。先看普通深层网络训练时的问题。假设网络是输入 → 第1层 → 第2层 → 第3层 → ... → 第N层 → 输出反向传播时前面层的梯度大致来自很多导数连乘前面层梯度 ≈ 后面很多层的导数 × 损失函数梯度如果这些导数很多都小于 1比如0.5 × 0.5 × 0.5 × 0.5 × ...乘到很深以后就会越来越小最后接近 0。这就是梯度消失。冻结训练的做法是输入 → 冻结的特征提取层 → 可训练的新分类层比如把前面的卷积层冻结只训练最后几层。冻结之后前面的层参数不更新param.requires_grad False也就是说前面那些层不需要计算参数梯度 不需要更新权重所以原本可能发生在前面层的梯度消失问题就被绕开了。可以这样理解假设一个网络有 100 层。从头训练时第100层的误差要传回第1层梯度可能传着传着就没了。冻结前 90 层只训练后 10 层时只需要让梯度在后10层内传播传播路径短很多梯度更不容易消失。但是要注意冻结训练并不是梯度消失的根本解决方法。真正从结构上缓解梯度消失的常见方法有ReLU 激活函数 残差连接 ResNet Batch Normalization 合适的权重初始化 LSTM/GRU 的门控结构 辅助分类器例如 GoogLeNet 里的 auxiliary classifier冻结训练更像是迁移学习里的技巧利用已经训练好的底层特征 减少需要训练的参数 缩短有效反向传播路径 降低梯度消失带来的影响一句话总结冻结训练不是直接修复梯度消失而是通过不训练前面的深层参数减少反向传播深度让训练集中在后面少数层从而绕开梯度消失对早期层更新的影响。冻结层已经提前学好了有用特征所以训练时不用再靠微弱梯度去调整它们。四、logitsLogits 就是模型最后一层通常是全连接层输出的、未经过任何激活函数如 Softmax 或 Sigmoid处理的原始分数Raw Scores。可以把它理解为模型对各个类别的“初始自信度”或“未归一化的对数概率”。