如何理解SpatialDropout1D及其使用时机?

有时我会看到一些模型使用SpatialDropout1D而不是Dropout。例如,在词性标注神经网络中,他们使用的是:

model = Sequential()model.add(Embedding(s_vocabsize, EMBED_SIZE,                    input_length=MAX_SEQLEN))model.add(SpatialDropout1D(0.2)) ##Thismodel.add(GRU(HIDDEN_SIZE, dropout=0.2, recurrent_dropout=0.2))model.add(RepeatVector(MAX_SEQLEN))model.add(GRU(HIDDEN_SIZE, return_sequences=True))model.add(TimeDistributed(Dense(t_vocabsize)))model.add(Activation("softmax"))

根据Keras的文档,它说明:

这个版本执行的功能与Dropout相同,但是它会丢弃整个1D特征图而不是单个元素。

然而,我无法理解整个1D特征的含义。更具体地说,我无法在quora中解释的相同模型中可视化SpatialDropout1D。能有人使用quora中的相同模型来解释这个概念吗?

另外,在什么情况下我们会使用SpatialDropout1D而不是Dropout


回答:

噪声形状

为了理解SpatialDropout1D,你应该熟悉噪声形状的概念。在普通的dropout中,每个元素都被独立地保留或丢弃。例如,如果张量是[2, 2, 2],8个元素中的每一个都有可能根据随机的抛硬币(以一定的“正面”概率)被置零;总共会有8次独立的抛硬币,任何数量的值都可能变为零,从08

有时需要做得更多。例如,可能需要沿着0轴丢弃整个slice。在这种情况下,noise_shape[1, 2, 2],dropout只涉及4次独立的随机抛硬币。第一部分将被一起保留或一起丢弃。被置零的元素数量可以是02468。它不能是15

另一种看待这一点的方法是想象输入张量实际上是[2, 2],但每个值都是双精度(或多精度)。层不会丢弃中间的字节,而是丢弃整个多字节值。

为什么有用?

上面的例子只是为了说明,并不常见于实际应用。更现实的例子是:shape(x) = [k, l, m, n]noise_shape = [k, 1, 1, n]。在这种情况下,每个批次和通道组件将被独立保留,但每一行和每一列将一起被保留或不保留。换句话说,整个[l, m]特征图将被保留或丢弃。

你可能希望这样做来考虑相邻像素的相关性,特别是在早期的卷积层中。实际上,你希望防止像素与其邻居在特征图之间共适应,并使它们学习得像是没有其他特征图存在一样。这正是SpatialDropout2D所做的:它促进了特征图之间的独立性。

SpatialDropout1D非常相似:给定shape(x) = [k, l, m],它使用noise_shape = [k, 1, m]并丢弃整个1-D特征图。

参考:Jonathan Tompson等人的使用卷积网络进行高效对象定位

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注