>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客**
>- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)**
首先用通俗的语言解释一下什么是C3模块,以及它在 YOLOv5算法中的作用(以下转自chatGPT)
C3模块的主要构建思路和组成部分:
-
Bottleneck(瓶颈)结构:
- 瓶颈结构是YOLOv5网络中的一个重要组件,它通常由1x1卷积和3x3卷积组成,目的是减少特征图的通道数,从而降低计算量。(下图中的Conv就是卷积,Conv包括Conv2d 代表二维卷积层、Batch Normalization 是一种用于加速神经网络训练并提高稳定性的方法、SiLU,也称为 Swish,是一种激活函数)
- 瓶颈结构通过先使用1x1卷积层减少特征图的通道数,然后使用3x3卷积层进行特征提取,最后再通过1x1卷积层恢复特征图的通道数。
-
残差连接(Residual Connection):
- 残差连接是深度学习网络中的一种技术,用于解决深层网络训练中的梯度消失问题。
- 残差连接通过跳过一些网络层,将输入直接加到输出上,从而形成一种快捷路径,这使得梯度可以直接反向传播到前面的层,促进网络的训练。
-
C3模块:
- C3模块在YOLOv5中结合了多个瓶颈结构和残差连接,形成一种高效的特征提取模块。
- C3模块通常由一个初始的1x1卷积层、多个瓶颈结构、一个残差连接以及一个最终的1x1卷积层组成。
- 在C3模块中,特征图会通过多个瓶颈结构进行特征提取,并通过残差连接将初始特征和提取的特征相加,从而形成最终的输出特征图。
结合上图,用通俗的语言解释就是,想象一下你在整理一个非常凌乱的房间。你有很多东西需要分类和整理,但你想要尽量少地移动它们,同时确保最终的整理结果是整齐和有条理的,Bottleneck结构就像是先把数据压缩成更少的类别,以便更容易处理, 如将所有东西分类,比如书籍、衣物、杂物等。卷积操作类似于对每一类进行详细整理,把书籍按大小、类别摆放整齐。在整理过程中,你可能发现一些东西不需要重新整理,可以直接放回原处。残差连接就是这样的一种机制,它直接保留了一些原始的信息,让处理过程更加高效。
是否可以尝试通过增加/调整C3模块与Conv模块来提高准确率?
答:调整Conv模块:
增加卷积层数量:添加更多的卷积层可以帮助网络提取更丰富的特征
调整卷积核大小:不同大小的卷积核可以捕捉不同尺度的特征。尝试使用混合大小的卷积核(例如3x3和5x5)来捕获更多样的特征
增加卷积核数量:增加每层卷积核的数量(通道数)可以提取更多特征,从而可能提高模型的表现
调整C3模块:
增加瓶颈结构数量:增加C3模块中瓶颈结构的数量,可以使网络学到更多的复杂特征
调整瓶颈结构内部的卷积核和层数:在瓶颈结构内部,可以尝试不同的卷积核大小和层数,以找到最佳的特征提取方案
增加或调整残差连接:通过增加或调整残差连接的位置和方式,可以进一步提高网络的学习能力和稳定性
增加C3模块的数量:在网络中增加更多的C3模块,可以更深入地提取特征
一、前期准备
import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision
from torchvision import transforms, datasets
import os,PIL,pathlib,warnings
warnings.filterwarnings("ignore") #忽略警告信息
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
import os,PIL,random,pathlib
data_dir = 'autodl-tmp/weather_photos'
data_dir = pathlib.Path(data_dir)
data_paths = list(data_dir.glob('*'))
classeNames = [path.name for path in data_paths]
print(classeNames)
# 关于transforms.Compose的更多介绍可以参考:https://blog.csdn.net/qq_38251616/article/details/124878863
train_transforms = transforms.Compose([
transforms.Resize([224, 224]), # 将输入图片resize成统一尺寸