40

偶尔我会看到一些模型正在使用SpatialDropout1D而不是Dropout. 例如,在词性标注神经网络中,他们使用:

model = Sequential()
model.add(Embedding(s_vocabsize, EMBED_SIZE,
                    input_length=MAX_SEQLEN))
model.add(SpatialDropout1D(0.2)) ##This
model.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 特征图而不是单个元素。

但是,我无法理解entrie 1D feature的含义。更具体地说,我无法在quoraSpatialDropout1D中解释的同一模型中进行可视化。有人可以使用与 quora 中相同的模型来解释这个概念吗?

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

4

2 回答 2

43

为了简单起见,我首先要注意所谓的特征图(1D、2D 等)是我们的常规通道。让我们看一些例子:

  1. Dropout():让我们定义二维输入:[[1, 1, 1], [2, 2, 2]]。Dropout 将独立考虑每个元素,并可能导致类似 [[1, 0, 1], [0, 2, 2]]

  2. SpatialDropout1D():在这种情况下,结果将类似于 [[1, 0, 1], [2, 0, 2]]。请注意,第二个元素沿所有通道归零。

于 2019-03-19T15:48:20.683 回答
34

噪音形状

为了理解SpatialDropout1D,您应该习惯噪声形状的概念。在普通的 vanilla dropout 中,每个元素都是独立保留或删除的。例如,如果张量是[2, 2, 2],则可以根据随机硬币翻转(具有一定的“正面”概率)将 8 个元素中的每一个都归零;总共会有 8 次独立的硬币翻转,并且任意数量的值都可能变为零,从08

有时还需要做更多的事情。例如,可能需要沿轴放置整个切片。0noise_shape这种情况下[1, 2, 2],dropout 只涉及 4 次独立的随机硬币翻转。第一个组件将保持在一起或一起丢弃。零元素的数量可以是024或。它不能是或。6815

另一种看待这一点的方法是想象输入张量实际上是[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]并丢弃了整个一维特征图。

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

于 2018-05-17T16:41:13.440 回答