文章目录VGG与AlexNet的对比VGG构造的features部分主要升级点为什么 3×3 堆叠是重要升级也要看到 VGG 的代价与GoogLeNet的对比三者核心差异GoogLeNet 最关键的三个升级1. Inception 模块并行多尺度卷积2. 1×1 卷积先降维再计算3. 全局平均池化替代全连接层一句话总结疑问感受野与参数量是不一样的先看感受野再看参数量卷积核里的权重就是神经网络自己要学的参数它不是人写死的训练时怎么学一个 3×3 卷积核有多少权重在深度学习项目中全联接层会更占内存吗1. 参数量卷积层通常比全连接层少很多2. 训练显存卷积层的激活值可能很大3. 可以这样记上面说的中间激活值是什么用一个例子理解为什么训练时要存下来为什么卷积层的激活值可能很大总结卷积核的通道数和上一层的通道数是一样的卷积核的组数能够改变其通道数对吗1. 普通卷积卷积核通道数 输入通道数2. 分组卷积卷积核通道数不一定等于完整输入通道数更准确的总结VGG与AlexNet的对比VGG 相比 AlexNet 最大的升级不是“多几层”那么简单而是把卷积神经网络从AlexNet 那种大卷积核、结构不太统一的深度模型升级成了全 3×3 小卷积核、可重复堆叠、更规整的深度网络范式。VGG构造的features部分其中16与19在下方可以展示出来VGG-16全过程VGG-16占用的内存后面的全联接层占用将近90%主要升级点方面AlexNetVGG卷积核11×11、5×5 等大卷积核全部主要用 3×3 小卷积核网络深度5 层卷积 3 层全连接VGG16 有 13 层卷积 3 层全连接VGG19 更深感受野靠大卷积核直接获得多个 3×3 堆叠等效大感受野非线性每层后接 ReLU更多 3×3 层意味着更多 ReLU非线性更强池化有 3×3 池化统一用 2×2 最大池化归一化使用 LRN去掉 LRN结构风格有效但不统一高度规整易于复现和迁移为什么 3×3 堆叠是重要升级VGG 用多个 3×3 卷积代替 AlexNet 中的大卷积核比如2 个 3×3 卷积≈ 1 个 5×5 卷积的感受野3 个 3×3 卷积≈ 1 个 7×7 卷积的感受野。这样做有三个好处参数更少在相同通道数下多个 3×3 卷积的参数量通常低于单个大卷积核。比如一个 7×7 卷积相当于 49 倍通道平方级参数而 3 个 3×3 卷积只有 27 倍。非线性更强每加一层 3×3 卷积就会多一次 ReLU网络表达能力更强能学习更复杂的特征。结构更统一AlexNet 第一层用 11×11后面又有 5×5结构比较杂VGG 基本统一成 3×3 卷积 2×2 池化模块感很强后面很多骨干网络都受它影响。也要看到 VGG 的代价VGG 虽然结构更漂亮、特征提取能力更强但参数量很大。VGG16 大约有1.38 亿参数其中大部分集中在最后的全连接层所以显存占用和推理成本都比 AlexNet 高很多。可以把它理解成AlexNet 证明了“深度 CNN 有用”VGG 则证明了“用统一的小卷积核不断加深网络能进一步提升性能”。再往后ResNet 才真正解决了“网络太深反而难训练”的问题。与GoogLeNet的对比GoogLeNet 和 AlexNet、VGG 最大的区别不是“更深”而是从“堆层数”转向“设计模块”。它用Inception 模块、1×1 卷积降维、全局平均池化来让网络更深、更准同时参数反而更少。三者核心差异维度AlexNetVGGGoogLeNet层数8 层VGG1616 层VGG1919 层22 层卷积核11×11、5×5 等大核几乎全部 3×31×1、3×3、5×5 并行设计思路加深 LeNet证明 CNN 有效用多个 3×3 堆叠获得更大感受野用 Inception 模块做多尺度特征提取参数量约 6000 万约 1.38 亿约 500 万–700 万尾部结构大尺寸全连接层大尺寸全连接层用全局平均池化替代大 FC特点引入 ReLU、Dropout、多 GPU结构统一、可复现、但参数多高效、多尺度、参数少、结构复杂GoogLeNet 最关键的三个升级1. Inception 模块并行多尺度卷积AlexNet 和 VGG 主要是串行堆叠卷积层一层接一层。GoogLeNet 则把一层设计成一个Inception 模块对同一个输入同时做1×1 卷积3×3 卷积5×5 卷积3×3 最大池化然后把这四路输出在通道维度上拼接起来。这样网络就能在同一层同时捕获小尺度细节中等尺度结构大尺度上下文显著性特征相当于让网络自己选择“用多大感受野看这张图”。2. 1×1 卷积先降维再计算如果直接对很多通道做 5×5 卷积计算量会很大。GoogLeNet 在 3×3、5×5 卷积之前先加1×1 卷积做通道压缩。比如输入 64 通道直接做 5×5 卷积计算量很大先用 1×1 卷积压到 32 通道再做 5×5计算量大幅下降。1×1 卷积还能增加非线性因为后面还会接激活函数。3. 全局平均池化替代全连接层AlexNet 和 VGG 最后都有很大的全连接层参数量非常夸张。VGG16 的全连接层就占了绝大多数参数。GoogLeNet 最后不用大 FC而是用全局平均池化把每个通道的特征图直接平均成一个值再接分类层。这就是它参数量只有几百万的重要原因。一句话总结AlexNet证明深度 CNN 可行VGG证明小卷积核堆深有效但参数很重GoogLeNet证明结构设计和计算效率同样重要用 Inception 模块和 1×1 卷积让网络既深又轻。后面 ResNet 再解决“网络太深难训练”的问题GoogLeNet 其实已经为“高效深度网络”打下了很重要的基础。疑问感受野与参数量是不一样的32 27这个数在 VGG 里确实会反复出现但它不是“感受野大小”而是3 个 3×3 卷积核里每个核有 9 个权重3 层一共 3 × 9 27 个权重系数。先看感受野感受野是指输出上的一个点能“看到”输入上多大的区域。1 个 3×3 卷积感受野 32 个 3×3 堆叠感受野 53 个 3×3 堆叠感受野 7所以 VGG 说3 个 3×3 卷积堆叠感受野 ≈ 1 个 7×7 卷积。这里说的是“看得一样大”不是“参数一样多”。再看参数量假设输入通道数和输出通道数都是C并且只算卷积核权重不算 bias。一个 7×7 卷积层的参数量是7 × 7 × C × C 49C²三个 3×3 卷积层的参数量是3 × (3 × 3 × C × C) 27C²所以27C² 49C²也就是说在获得相同 7×7 感受野的前提下3 个 3×3 卷积比 1 个 7×7 卷积少约45%的参数。如果考虑通道数一个卷积核的参数量是kernel_h × kernel_w × in_channels × out_channels所以 VGG 里“参数更少”的意思是用3 个 3×3达到和1 个 7×7相同的感受野但权重参数从49C²降到27C²。而且每层后面都会接一次 ReLU所以 3 个 3×3 还比 1 个 7×7 多了两次非线性变换表达能力更强。卷积核里的权重就是神经网络自己要学的参数和全连接层里的权重本质一样的它不是人写死的传统图像处理里卷积核可以是人工设计的比如边缘检测核模糊核锐化核这些值是工程师根据经验写好的训练时不会变。但在 CNN 里卷积核的值一开始是随机初始化的比如用 Xavier 或 He 初始化。训练时怎么学训练过程大致是初始化给每个卷积核随机赋一组小数值。前向传播用这些卷积核对图像做卷积得到特征图。算损失看模型预测和真实标签差多少。反向传播计算损失对每个权重的梯度。更新权重按梯度方向微调卷积核里的每个值。反复很多轮以后卷积核就不再是随机噪声了会逐渐变成能提取边缘、纹理、形状等特征的“过滤器”。一个 3×3 卷积核有多少权重如果输入有C_in个通道输出有C_out个通道那么一个卷积层会学C_out × C_in × 3 × 3个权重比如输入 3 通道、输出 16 通道、卷积核 3×316 × 3 × 3 × 3 432 个权重每个卷积核不是只有 9 个数而是9 × 输入通道数个数。所以可以把它理解成卷积核 一组可学习的权重矩阵网络通过训练自动决定每个位置该取什么值。在深度学习项目中全联接层会更占内存吗要看说的“内存”是哪一种。按参数量/模型权重来看卷积层通常远小于全连接层但按训练时中间激活值来看卷积层不一定少。1. 参数量卷积层通常比全连接层少很多卷积层之所以参数少是因为它共享卷积核权重同一个 3×3 卷积核会在整张特征图上滑动复用。全连接层则是每个输入维度都有独立权重所以一旦输入维度很大参数量会爆炸。以 VGG16 为例输入是 224×224×3总参数量约1.38 亿卷积层部分约1470 万全连接层部分约1.236 亿全连接层占参数量约90%尤其是第一个全连接层输入是 7×7×512 25088输出是 4096仅这一层就有约1.02 亿参数。所以如果只看“模型权重占多少内存”你的直觉基本正确卷积层参数少全连接层参数多。2. 训练显存卷积层的激活值可能很大训练时 GPU 显存不只存参数还要存模型参数每层输出的激活值反向传播的梯度优化器状态其中激活值往往很占显存。卷积层输出的是特征图比如形状是[batch_size, channels, height, width]如果分辨率高、batch size 大激活值就会很大。比如前面几层卷积输出可能是224×224×64这种空间尺寸很大激活值显存并不小。而全连接层输出通常只是一个一维向量比如 4096 维激活值本身不大但它前面的权重矩阵非常大所以参数显存高。3. 可以这样记比较维度卷积层全连接层参数量少因为权重共享多每个输入都有独立权重参数显存通常较小通常较大激活值显存可能很大尤其高分辨率时通常较小计算量可能很高因为要在空间上滑动取决于输入维度所以更准确的说法是卷积层的参数量和参数显存通常远小于全连接层但卷积层在训练时产生的中间激活值可能很多尤其输入图像分辨率高、batch size 大时显存占用不一定低。这也是为什么后来很多网络比如 ResNet、GoogLeNet会用全局平均池化替代大尺寸全连接层能显著减少参数量。上面说的中间激活值是什么中间激活值就是网络前向传播时每一层算出来的“输出结果”。用一个例子理解假设输入一张224×224×3的图片经过第一层卷积后输出可能是112×112×64的张量。这个张量就是第一层的激活值。它会被送到第二层继续计算第二层又输出一个新的张量——这就是第二层的激活值。一层一层往下传每一层都会产生一个“中间结果”这些就是中间激活值。为什么训练时要存下来因为反向传播需要它们。反向传播计算梯度时要用到前向传播时每一层的输出。如果前向时没存反向就没法算。所以训练过程中所有层的激活值都要同时留在显存里直到反向传播结束才能释放。为什么卷积层的激活值可能很大卷积层输出的是三维特征图高 × 宽 × 通道数比如112 × 112 × 64 802,816个数值如果 batch size 是 32那这一层的激活值就有802,816 × 32 ≈ 2569 万个数值按 FP324 字节算约100 MB仅一层就占这么多。而全连接层输出只是一个一维向量比如 4096 维激活值本身很小。总结卷积层全连接层参数量少权重共享多每个输入独立权重激活值可能很大空间分辨率高通常很小一维向量所以之前说的“卷积层显存不一定少”指的是激活值显存不是参数显存。卷积核的通道数和上一层的通道数是一样的卷积核的组数能够改变其通道数对吗理解基本方向是对的但要分两种情况看。1. 普通卷积卷积核通道数 输入通道数在标准卷积里每个卷积核的通道数必须等于上一层输出的通道数卷积核的个数决定输出通道数。比如输入是64通道用128个3×3卷积核每个卷积核形状是3 × 3 × 64输出就是128通道。所以这里你说的“卷积核的通道数和上一层的通道数一样”是对的。2. 分组卷积卷积核通道数不一定等于完整输入通道数如果用了分组卷积 groups 1就不一样了。假设输入64通道输出128通道groups4输入被分成 4 组每组16通道每组卷积核只负责对应的那16个输入通道所以每个卷积核的通道数是64 / 4 16而不是完整的64。这时可以说通过改变组数确实可以改变每个卷积核实际连接的通道数。更准确的总结情况卷积核通道数输出通道数普通卷积等于输入通道数等于卷积核个数分组卷积等于输入通道数 / groups仍等于卷积核个数深度可分离卷积每组只处理 1 个通道取决于后面逐点卷积所以更严谨的说法是普通卷积中单个卷积核的通道数等于输入通道数输出通道数由卷积核个数决定。分组卷积中每个卷积核只连接输入的一部分通道组数会影响每个卷积核实际处理的通道数。