深度学习Day-24:ResNeXt-50算法思考

  🍨 本文为:[🔗365天深度学习训练营] 中的学习记录博客
 🍖 原作者:[K同学啊 | 接辅导、项目定制]

要求:

  1. 阅读给出代码,判断是否存在错误,正确与否都请给出你的思考;
  2. 查找相关资料、逐步推理模型、写下思考过程
# 定义残差单元
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
 
# 堆叠残差单元
def stack(x, filters, blocks, strides, groups=32):
# 每个stack的第一个block的残差连接都需要使用1*1卷积升维
x = block(x, filters, strides=strides, groups=groups)
for i in range(blocks):
x = block(x, filters, groups=groups, conv_shortcut=False)
return x

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

思考分析

        在ResNext网络中,将conv_shortcut参数设置为False,表示使用identity_shortcut而不是Conv2D层作为快捷连接。

        对于定义残差单元block模块,Add()是x和shortcut相加,x通道数是filter*2。对于shortcut,conv_shortcut为True则是filters*2,否则是原始输入通道数。

        最后对于堆叠残差模块stack,第二次调用block时,conv_shortcut参数是False,使用的是identity_shortcut,这种情况下,快捷连接将直接传递输入x给块的最后一层。因此,在执行“x=Add()…”语句时,快捷连接的通道数与该层的通道数不一致。

        但是,由于Add()层在通道数不同时会自动对快捷连接进行零填充,所以不会出现尺寸不匹配的错误。此外,这种零填充不会对训练产生任何影响,因为填充的值不会接收任何梯度更新。

        总之,Add 层具有自动广播机制,可以在计算时自动扩展较小张量的形状以匹配较大张量的形状,因此即使通道数不一致也不会报错。

相关推荐

  1. 深度学习Day-24ResNeXt-50算法思考

    2024-07-10 18:46:02       23 阅读
  2. Python实现深度迁移学习-CIFAR100-ResNet50

    2024-07-10 18:46:02       42 阅读
  3. 深度学习Top10算法ResNet

    2024-07-10 18:46:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 18:46:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 18:46:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 18:46:02       45 阅读
  4. Python语言-面向对象

    2024-07-10 18:46:02       55 阅读

热门阅读

  1. 完全背包求具体方案(c++题解)

    2024-07-10 18:46:02       22 阅读
  2. Pull Request

    2024-07-10 18:46:02       18 阅读
  3. stm32使用硬件SPI

    2024-07-10 18:46:02       16 阅读
  4. Elasticsearch7.10集群搭建

    2024-07-10 18:46:02       16 阅读
  5. 串口工具推荐

    2024-07-10 18:46:02       19 阅读
  6. Python实现Mybatis Plus

    2024-07-10 18:46:02       23 阅读
  7. 管理客户的10个CRM系统技巧

    2024-07-10 18:46:02       24 阅读
  8. 四、Python日志系统之日志文件的备份和删除

    2024-07-10 18:46:02       18 阅读
  9. ZC2205-24V500mAUltralow-Quiescent-Current LDO

    2024-07-10 18:46:02       13 阅读
  10. 六、golang基础之面向对象特征

    2024-07-10 18:46:02       19 阅读