有时我会看到一些模型使用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次独立的抛硬币,任何数量的值都可能变为零,从0
到8
。
有时需要做得更多。例如,可能需要沿着0
轴丢弃整个slice
。在这种情况下,noise_shape
是[1, 2, 2]
,dropout只涉及4次独立的随机抛硬币。第一部分将被一起保留或一起丢弃。被置零的元素数量可以是0
、2
、4
、6
或8
。它不能是1
或5
。
另一种看待这一点的方法是想象输入张量实际上是[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等人的使用卷积网络进行高效对象定位。