gpt4 book ai didi

keras - SpatialDropout2D,BatchNormalization和激活函数的正确顺序?

转载 作者:行者123 更新时间:2023-12-03 15:48:46 24 4
gpt4 key购买 nike

对于CNN架构,我想使用SpatialDropout2D层而不是Dropout层。
另外,我想使用BatchNormalization。
到目前为止,我总是直接在卷积层之后但在激活函数之前设置BatchNormalization,就像Ioffe和Szegedy在论文中提到的那样。
我总是在MaxPooling2D层之后设置退出层。

https://machinelearningmastery.com/how-to-reduce-overfitting-with-dropout-regularization-in-keras/中,在卷积层之后直接设置SpatialDropout2D。

我发现我现在应该按这些顺序应用这些层非常困惑。我还曾在Keras页面上阅读过,应该将SpatialDropout直接放置在ConvLayer的后面(但现在找不到此页面)。

以下顺序正确吗?

ConvLayer-SpatialDropout-BatchNormalization-激活函数-MaxPooling

我真的希望有提示,并在此先感谢您

更新
我的目标实际上是将以下CNN架构缺失替换为空间缺失:

model = Sequential()
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(32,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Conv2D(64, (3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(64,(3,3))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Dropout(0.2))

model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.4))
model.add(Dense(10))
model.add(Activation('softmax'))

最佳答案

辍学vs批次归一化-标准偏差问题
混合这些图层时会出现一个大问题,尤其是当BatchNormalization就在Dropout之后时。
辍学尝试使输出的平均值保持不变而没有辍学,但是它确实会更改标准差,这将导致训练和验证之间的BatchNormalization产生巨大差异。 (在训练过程中,BatchNormalization接收更改后的标准偏差,将其累积并存储。在验证期间,辍学功能已关闭,标准偏差不再是已更改的标准偏差,而是原始值。但是BatchNormalization处于验证状态,因此不会使用批处理统计信息,但存储的统计信息与批处理统计信息有很大不同)
因此,第一个也是最重要的规则是:不要将BatchNormalization放在Dropout(或SpatialDropout)之后。
通常,为了避免这种情况,我尝试在应用批处理规范化之前至少保留两个卷积/密集层而不会出现任何丢失。
辍学vs BatchNormalization-将零更改为另一个值
同样重要的是:Dropout的作用是将下一层权重的影响“归零”。如果在辍学之后应用归一化,那么您将不再具有“零”值,而是可以对许多单位重复的某个特定值。并且此值将因批次而异。因此,尽管增加了噪音,但您并没有像纯粹的辍学那样杀死单元。
辍学vs MaxPooling
Dropout之前使用常规MaxPooling的问题是,您将使一些像素归零,然后MaxPooling将采用最大值,从而忽略了部分丢失。如果您的辍学碰巧碰到一个最大像素,那么合并将导致第二个最大值,而不是零。
因此,DropoutMaxPooling之前会降低辍学的效率。
SpatialDropout与MaxPooling
但是,SpatialDropout永远不会命中“像素”,而只会命中 channel 。当它碰到一个 channel 时,它将对该 channel 的所有像素归零,因此MaxPooling也将有效地归零。
因此,池化之前和之后的空间辍学之间没有区别。整个“ channel ”在两个顺序中都将为零。
批量归一化与激活
根据激活功能的不同,在使用批处理规范化之前可能会具有很好的优势。
对于'relu'激活,规范化使模型能够针对“全零卡住relu层”的不幸情况进行故障保护。它还倾向于保证一半的单位为零,另一半为线性。
对于'sigmoid''tahn'BatchNormalization将确保值在健康范围内,避免饱和度和消失的梯度(距离零太远的值会击中这些函数的几乎平坦的区域,从而导致消失的梯度)。
有人说,如果您做相反的事情,还有其他好处,我还没有完全意识到这些好处,我非常喜欢我提到的那些好处。
辍学与激活
使用'relu',没有区别it can be proved that the results are exactly the same
对于未居中的激活(例如'sigmoid'),在激活之前放置辍学将不会导致“零”,但会导致其他值。对于乙状结肠,其下降的最终结果为0.5。
例如,如果在辍学之后添加'tanh',您将得到零,但是该辍学为保持相同平均值而应用的缩放比例会因tanh失真。 (我不知道这是否是个大问题,但可能是)
MaxPooling与激活
我在这里看不到什么。如果激活不是很奇怪,最终结果将是相同的。
结论?
有可能,但有些麻烦。我发现以下顺序很好,并且经常使用它
我会做类似的事情

  • Group1
  • 转换
  • BatchNorm
  • 激活
  • MaxPooling
  • Dropout或SpatialDropout

  • Group2
  • 转换
  • -----(最后一组中有一个辍学者,此处没有BatchNorm)
  • 激活
  • MaxPooling
  • Dropout或SpatialDropout(决定是否使用)

  • 两组未退出后
  • 可以再次使用BatchNorm

  • 关于keras - SpatialDropout2D,BatchNormalization和激活函数的正确顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59634780/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com