如何理解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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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