- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于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
将采用最大值,从而忽略了部分丢失。如果您的辍学碰巧碰到一个最大像素,那么合并将导致第二个最大值,而不是零。
因此,Dropout
在MaxPooling
之前会降低辍学的效率。
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与激活
我在这里看不到什么。如果激活不是很奇怪,最终结果将是相同的。
结论?
有可能,但有些麻烦。我发现以下顺序很好,并且经常使用它
我会做类似的事情
关于keras - SpatialDropout2D,BatchNormalization和激活函数的正确顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59634780/
BatchNormalization 和 TimeDistributed(BatchNormalization) 是否对顺序数据(例如视频)有相同的影响?如果不是有什么区别? 最佳答案 在 tf.ke
我正在尝试将预训练的 BN 权重从 pytorch 模型复制到其等效的 Keras 模型,但我不断得到不同的输出。 我阅读了 Keras 和 Pytorch BN 文档,我认为区别在于它们计算“均值”
我有两种类型的灰度图像,比如汽车和飞机。在我的训练集中,我有 1000 张图像(大约 50/50 分割)。在这个训练集中,我所有的飞机示例都在白色背景上,而所有汽车示例都在黑色背景上(这是故意的,模型
我正在训练一个 CNN,为了调试我的问题,我正在研究实际训练数据的一小部分。 在训练期间,损失和准确性似乎非常合理且相当不错。 (在示例中我使用了相同的小子集进行验证,问题已经在这里显示了) 适合 x
我有这些 Backprop 更新,请让我知道 dx 部分哪里出了问题。在计算图中,我使用X、sample_mean 和sample_var。感谢您的帮助 (x, norm, sample_mean,
我对如何使用/插入"BatchNorm"有点困惑我的模型中的图层。 我看到了几种不同的方法,例如: ResNets : "BatchNorm"+"Scale" (无参数共享) “BatchNorm”
我想弄清楚 Keras 中的批量归一化究竟做了什么。现在我有以下代码。 for i in range(8): c = Convolution2D(128, 3, 3, border_mode
我正在尝试将批量规范添加到 Keras 中的 vgg 样式模型。当我添加 batch norm 层时,出现错误: FailedPreconditionError: Attempting to use
keras BatchNormalization layer使用 axis=-1 作为默认值,并说明特征轴通常是归一化的。为什么会这样? 我想这很令人惊讶,因为我更熟悉使用类似 StandardSca
是 batchnorm momentum convention (默认值=0.1)与其他库一样正确,例如Tensorflow 好像一般默认是 0.9 或者 0.99?或者也许我们只是使用了不同的约定?
在 Keras 中实现 Residual Network 时出现错误。下面是给我错误的代码(错误来自函数定义最后一步的第一行): 加载包: import numpy as np from keras
我正在尝试保存模型,然后稍后加载它以进行一些预测;发生的事情是训练后模型的准确率是95%+ ,但是当我保存它然后加载它时,准确度下降到接近 10%在 同 数据集。 要重现此错误结果,您可以运行 thi
我有以下代码。 x = keras.layers.Input(batch_shape = (None, 4096)) hidden = keras.layers.Dense(512, activati
我正在通过时间序列数据训练 LSTM 网络,并希望对数据进行标准化,因为我的特征具有不同的规模。 我的数据形状是 (n_samples x n_timestamps x n_features) 我想使
我目前正在学习在我的项目中使用 Tensorflow-2.0。我想使用卷积神经网络(CNN)完成一个语义分割任务,在编码时发现一个奇怪的错误。 首先,构建了一个简单的模型并且运行良好。 X_train
我的问题是 BatchNormalization (BN) 正在标准化什么。 我问,BN 是单独对每个像素的 channel 进行归一化,还是对所有像素一起归一化。它是在每个图像的基础上还是在整个批处
我的 LSTM 网络有 5 个输入。第一个输入的典型值为 1000 到 3000。其余输入的值为 -1 到 1。 我想插入 BatchNormalization 作为第一层。但输入 2-5 已经在 -
inputs = Input((img_height, img_width, img_ch)) conv1 = Conv2D(n_filters, (k, k), padding=padding)(i
我正在尝试使用 Tensorflow 从 GAN 保存生成器模型。我正在使用的模型有几个批量归一化层。当我保存权重时,只有运行全局变量初始值设定项才能成功恢复它们,但我不必这样做,因为所有变量都正在恢
过了一段时间我又回到了tensorflow,看起来情况已经完全改变了。 但是,之前我曾经在训练循环中使用 tf.contrib....batch_normalization 并进行以下操作: upda
我是一名优秀的程序员,十分优秀!