【DeepLearning-10】yolo.py文件关键代码parse_model(d, ch)函数

这段代码功能是根据提供的配置字典(d)和输入通道列表(ch)来解析并构建一个YOLOv5模型。函数的核心工作是遍历模型的每一层,并根据配置创建相应的神经网络层。 我们可以在函数中为新增模块配置构造参数设置。

【DeepLearning-10】yolo.py文件关键代码parse_model(d, ch)函数_第1张图片

函数中  for i, (f, n, m, args) in enumerate(d['backbone'] + d['head']):  # from, number, module, args 这一部分对应 yolo.yaml 文件中的各层参数

【DeepLearning-10】yolo.py文件关键代码parse_model(d, ch)函数_第2张图片

在新yaml文件中增模块时要配置好 m 所对应的模块:

【DeepLearning-10】yolo.py文件关键代码parse_model(d, ch)函数_第3张图片

我们以MobileViT模块为例进行演示:

首先判断 解析模块是否属于新增模块MobileViT

        elif m in [MobileViT]:

判断并更新输入输出通道数

            if c2 != no:  
                c2 = make_divisible(c2 * gw, 8)
            args = [c1, c2]

设置模块实例化

            if m in [MobileViT]:
                args.insert(2, n)  
                n = 1

实例化模块多次的影响

  1. 增加网络深度:重复实例化同一个模块可以增加网络的深度,这有助于提高网络的学习能力和表达能力。

  2. 提升特征提取能力:在深度学习中,更深的网络通常能够学习更复杂的特征表示。

  3. 增加参数数量:每次实例化都会引入新的参数,这可能导致模型的总参数数量增加。

  4. 影响计算资源:更多的参数和更深的网络可能需要更多的计算资源和存储空间,这可能导致训练和推理速度变慢。

  5. 风险过拟合:如果网络过于复杂,可能会在有限的训练数据上过拟合。

只实例化一次的原因

  1. 模块内部复杂性:如果一个模块(如 MobileViT)本身已经非常复杂,包含了多个层或子模块,那么实例化一次可能就足够了。

  2. 性能优化:为了保持模型的效率,避免不必要的计算和参数增加,可能选择只实例化一次。

  3. 设计决策:在某些情况下,根据特定任务的需求和经验,可能决定只实例化一次以达到最佳的性能和准确率平衡。

  4. 避免过度复杂化:过多的重复层可能会使模型过于复杂,难以训练和优化。 

 完整代码:

elif m in [MobileViT]:
    c1, c2 = ch[f], args[0]
    if c2 != no:  
        c2 = make_divisible(c2 * gw, 8)
    args = [c1, c2]
    args.insert(2, n)  
    n = 1

你可能感兴趣的:(YOLO)