如何理解 SpatialDropout1D 以及何时使用它?
How to understand SpatialDropout1D and when to use it?
偶尔我看到一些模型使用 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 的文档,它说:
This version performs the same function as Dropout, however it drops
entire 1D feature maps instead of individual elements.
但是,我无法理解entrie 1D feature的含义。更具体地说,我无法在 quora 中解释的同一模型中可视化 SpatialDropout1D
。
有人可以使用与 quora 中相同的模型来解释这个概念吗?
还有,什么情况下我们会用SpatialDropout1D
代替Dropout
?
噪声形状
为了理解 SpatialDropout1D
,您应该习惯 噪声形状 的概念。在普通的 vanilla dropout 中,每个元素都是独立保留或丢弃的。例如张量为[2, 2, 2]
,8个元素中的每一个都可以通过随机抛硬币(有一定的"heads"概率)归零;总共将有 8 次独立的硬币翻转,任何数量的值都可能变为零,从 0
到 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
乔纳森·汤普森 (Jonathan Tompson) 在 al.
为了简单起见,我首先要说明的是,所谓的特征图(一维,二维等)是我们的常规渠道。让我们看例子:
Dropout()
:让我们定义二维输入:[[1, 1, 1], [2, 2, 2]]。 Dropout 将独立考虑每个元素,并可能导致类似于 [[1, 0, 1], [0, 2, 2]]
SpatialDropout1D()
:在这种情况下,结果将类似于 [[1, 0, 1], [2, 0, 2]]。请注意,第二个元素沿 all 通道归零。
偶尔我看到一些模型使用 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 的文档,它说:
This version performs the same function as Dropout, however it drops entire 1D feature maps instead of individual elements.
但是,我无法理解entrie 1D feature的含义。更具体地说,我无法在 quora 中解释的同一模型中可视化 SpatialDropout1D
。
有人可以使用与 quora 中相同的模型来解释这个概念吗?
还有,什么情况下我们会用SpatialDropout1D
代替Dropout
?
噪声形状
为了理解 SpatialDropout1D
,您应该习惯 噪声形状 的概念。在普通的 vanilla dropout 中,每个元素都是独立保留或丢弃的。例如张量为[2, 2, 2]
,8个元素中的每一个都可以通过随机抛硬币(有一定的"heads"概率)归零;总共将有 8 次独立的硬币翻转,任何数量的值都可能变为零,从 0
到 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 乔纳森·汤普森 (Jonathan Tompson) 在 al.
为了简单起见,我首先要说明的是,所谓的特征图(一维,二维等)是我们的常规渠道。让我们看例子:
Dropout()
:让我们定义二维输入:[[1, 1, 1], [2, 2, 2]]。 Dropout 将独立考虑每个元素,并可能导致类似于 [[1, 0, 1], [0, 2, 2]]SpatialDropout1D()
:在这种情况下,结果将类似于 [[1, 0, 1], [2, 0, 2]]。请注意,第二个元素沿 all 通道归零。