如何理解 SpatialDropout1D 以及何时使用它?
Posted
技术标签:
【中文标题】如何理解 SpatialDropout1D 以及何时使用它?【英文标题】:How to understand SpatialDropout1D and when to use it? 【发布时间】:2018-10-27 20:28:24 【问题描述】:有时我看到一些模型使用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 的含义。更具体地说,我无法在quora 中解释的同一模型中可视化SpatialDropout1D
。
有人可以使用与 quora 中相同的模型来解释这个概念吗?
另外,在什么情况下我们会使用SpatialDropout1D
而不是Dropout
?
【问题讨论】:
【参考方案1】:为了简单起见,我首先要注意所谓的特征图(1D、2D 等)是我们的常规通道。我们来看例子:
Dropout()
:让我们定义二维输入:[[1, 1, 1], [2, 2, 2]]。 Dropout 将独立考虑每个元素,并可能导致类似 [[1, 0, 1], [0, 2, 2]]
SpatialDropout1D()
:在这种情况下,结果将类似于 [[1, 0, 1], [2, 0, 2]]。请注意,第二个元素沿所有通道归零。
【讨论】:
【参考方案2】:噪声形状
为了理解SpatialDropout1D
,您应该习惯噪声形状的概念。在普通的 vanilla dropout 中,每个元素都是独立保留或删除的。例如,如果张量是[2, 2, 2]
,则可以根据随机硬币翻转(具有一定的“正面”概率)将 8 个元素中的每一个都归零;从0
到8
,总共会有8次独立的硬币翻转,任意数量的值都可能为零。
有时需要做更多的事情。例如,可能需要沿0
轴放置整个切片。在这种情况下,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]
。在这种情况下,每个批次和通道组件将独立保存,但每行和列将保持或不保持在一起。换句话说,whole [l, m]
feature map 要么被保留要么被丢弃。
您可能希望这样做以考虑相邻像素的相关性,尤其是在早期的卷积层中。实际上,您希望防止像素与其相邻特征图的共同适应,并让它们像不存在其他特征图一样学习。这正是SpatialDropout2D
正在做的事情:它促进了特征图之间的独立性。
SpatialDropout1D
非常相似:给定shape(x) = [k, l, m]
,它使用noise_shape = [k, 1, m]
并丢弃整个一维特征图。
参考:Efficient Object Localization Using Convolutional Networks 乔纳森·汤普森等人。
【讨论】:
在阅读了 Tensorflow 文档中的相同描述后,我正在检查源代码,我的强烈印象是该描述与代码的实际作用完全相反...... @DanielMöller 你的意思是[k, 1, 1, n]
没有丢弃特征图吗?我的实验表明确实如此。我会说 keras doc 有点误导。
我不确定“特征图”在尺寸方面的含义,但从this code 可以看出,这是掩盖“样本”和“通道”。 (但我也应该在得出结论之前对此进行试验)。
通过代码,[k,1,1,n]
似乎正在删除某些样本和某些通道,而不涉及任何空间维度。
好的....我认为我的问题是这里的文本解释...当我阅读“独立保留”时,我认为它的意思是“无论如何都不会丢弃”,但实际上它可能意味着“可能独立于其他轴被丢弃”。以上是关于如何理解 SpatialDropout1D 以及何时使用它?的主要内容,如果未能解决你的问题,请参考以下文章