当前位置: 首页 > article >正文

深度学习camp-第J7周:对于ResNeXt-50算法的思考

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

📌你需要解决的疑问:这个代码是否有错?对错与否都请给出你的思考
📌打卡要求:请查找相关资料、逐步推理模型、详细写下你的思考过程

代码如下

# 定义残差单元  
def block(x, filters, strides=1, groups=32, conv_shortcut=True):  

    if conv_shortcut:  
        shortcut = Conv2D(filters * 2, kernel_size=(1, 1), strides=strides, padding='same', use_bias=False)(x)  
        # epsilon为BN公式中防止分母为零的值  
        shortcut = BatchNormalization(epsilon=1.001e-5)(shortcut)  
    else:  
        # identity_shortcut  
        shortcut = x  
        
    # 三层卷积层  
    x = Conv2D(filters=filters, kernel_size=(1, 1), strides=1, padding='same', use_bias=False)(x)  
    x = BatchNormalization(epsilon=1.001e-5)(x)  
    x = ReLU()(x)  
    # 计算每组的通道数  
    g_channels = int(filters / groups)  
    # 进行分组卷积  
    x = grouped_convolution_block(x, strides, groups, g_channels)  

    x = Conv2D(filters=filters * 2, kernel_size=(1, 1), strides=1, padding='same', use_bias=False)(x)  
    x = BatchNormalization(epsilon=1.001e-5)(x)  
    x = Add()([x, shortcut])  
    x = ReLU()(x)  
    return x

如果conv_shortcut=False,那么执行“x=Add()…”语句时,通道数不一致的,为什么不会报错呢?

思考

关键点分析:

  1. conv_shortcut=False 时的 shortcut

    • conv_shortcut=False 时,shortcut 直接等于 x,没有经过卷积层处理。也就是说,在 x = Add()([x, shortcut]) 这一行之前,shortcutx 是相同的张量。因此,它们的通道数和空间尺寸应该是相同的,直接相加是没有问题的。
    • 因此,执行 Add() 时,xshortcut 的维度是匹配的。
  2. conv_shortcut=True 时的 shortcut

    • conv_shortcut=True 时,shortcut 会通过一个 1x1 卷积进行通道数调整:
      shortcut = Conv2D(filters * 2, kernel_size=(1, 1), strides=strides, padding='same', use_bias=False)(x)
      
      • 这里 shortcut 的通道数被修改为 filters * 2,使其与主路径输出的通道数一致。
      • 如果步长 strides 是大于1的值(例如2),则 shortcut 的空间尺寸(高度和宽度)也会发生变化,因此需要保证它们的空间尺寸与主路径的输出相匹配。为此,使用 Conv2DBatchNormalization 来调整通道数,并保持 padding='same' 来避免空间尺寸的变化。
  3. Add() 层的作用

    • Add() 层要求输入张量的维度一致。如果 conv_shortcut=Falseshortcutx 在通道数和空间尺寸上已经是相同的,因此直接相加是不会出现维度不匹配的错误的。
    • 但是,如果通道数或空间尺寸不一致,Keras 会抛出错误,提示“维度不匹配”或类似错误。

为什么没有报错:

  • conv_shortcut=False 时,shortcutx 的维度是一样的,因为 shortcut = x,它们在通道数、空间尺寸等维度上都相同,因此 Add() 操作没有问题。
  • Add() 操作本身不会对维度进行任何变换,它只是简单地将两个张量逐元素相加。如果两个张量的维度不一致,Keras 会报错。

结论:

  • conv_shortcut=False 的情况下,shortcut 直接等于 x,因此它们的维度是相同的,Add() 操作能够成功执行。
  • 只有当 conv_shortcut=True 时,shortcut 会通过卷积进行维度调整,这样就确保了通道数和空间尺寸与主路径的输出一致,避免了维度不匹配的问题。

测试:

为了验证,可以在代码中添加调试语句,打印出 x.shapeshortcut.shape,看看它们在执行 Add() 之前是否匹配。例如:

print("x shape:", x.shape)
print("shortcut shape:", shortcut.shape)

这可以帮助进一步确认 xshortcut 在执行加法之前是否一致。


http://www.kler.cn/a/501841.html

相关文章:

  • HTML学习笔记记录---速预CSS(1) 选择器类型
  • Github出现复杂问题 无法合并 分支冲突太多 如何复原
  • 52_Lua数据库访问
  • 从零开始开发纯血鸿蒙应用之处理外部文件
  • 在Proteus软件仿真STM32F103寄存器玩俄罗斯方块之第二篇
  • 在 Azure 100 学生订阅中新建一台 Ubuntu VPS,并通过 Docker 部署 Nginx 服务器
  • 《Java核心技术II》网络使用telnet
  • android四大组件之一——Service
  • MyBatis(一)
  • 阿里云存储图像bug修复
  • 4. scala高阶之隐式转换与泛型
  • vue3+vite+ts集成第三方js
  • 【文件锁】多进程线程安全访问文件demo
  • 【初识扫盲】逆概率加权
  • Windows 10 ARM工控主板连接I2S音频芯片
  • 32_Redis分片集群原理
  • 《零基础Go语言算法实战》【题目 2-26】goroutine 的执行效率问题
  • HDFS 的API的操作
  • 【Rust】函数
  • 【网络协议】EIGRP - 第二部分