当前位置: 首页 > 知识库问答 >
问题:

LSTM之前或之后的脱落层。有什么区别?

马峻
2023-03-14

假设我们有一个用于时间序列预测的LSTM模型。此外,这是一个多变量的情况,因此我们使用多个特性来训练模型。

ipt   = Input(shape = (shape[0], shape[1])
x     = Dropout(0.3)(ipt) ## Dropout before LSTM.
x     = CuDNNLSTM(10, return_sequences = False)(x)
out   = Dense(1, activation='relu')(x)

我们可以在LSTM之前(如上面的代码)或LSTM之后添加Dropout层。

>

  • 如果我们在LSTM之前添加它,它是在时间步长(时间序列的不同延迟)上应用退出,还是在不同的输入特性上应用退出,或者两者都应用?

    如果我们将它添加到LSTM之后,并且因为返回\u序列,那么辍学者在这里做什么?

    LSTM中的dropout选项与LSTM层之前的dropout层之间是否有任何不同?

  • 共有2个答案

    戚俊人
    2023-03-14

    您将辍学与它的变体SpatialDropoutND(要么1D2D要么3D)混淆。请参阅文档(显然,您无法链接特定的类)。

    >

    在这里,如果return\u sequences=False,您只能从上一个时间步获得输出,因此在您的情况下,它的大小将是[batch,10]。Dropout将从第二个维度随机删除值

    是的,这是有区别的,因为dropout是指当LSTM产生序列时的时间步长(例如,10的序列通过未滚动的LSTM,并且在进入下一个单元之前删除了一些特性)。Dropout将删除随机元素(批处理维度除外)。Sspace alDropout1D将删除整个通道,在这种情况下,一些时间步长将完全删除(在卷积情况下,您可以使用Sspace alDropout2D删除通道,输入或沿着网络)。

    顾鸣
    2023-03-14

    默认情况下,Dropout创建一个0和1的随机张量。没有模式,就没有特权轴。所以,你不能说一个特定的东西被丢弃了,只是张量中的随机坐标。(嗯,它删除了一些特性,但每个步骤的特性不同,每个示例的特性也不同)

    如果需要,可以使用noise\u shape属性,该属性将定义随机张量的形状。然后,您可以选择是否要删除步骤、功能或示例,或者可能是一个组合。

    • 下降时间步长:noise\u shape=(1,步长,1)
    • 拖放功能:noise\u shape=(1,1,功能)
    • 丢弃样本:noise\u shape=(无,1,1)

    还有Sspace alDropout1D层,它自动使用noise_shape=(input_shape[0],1,input_shape[2])。这将删除所有时间步骤的相同特征,但将单独处理每个样本(每个样本将删除不同的特征组)。

    LSTM之后,您有form=(No,10)。因此,您使用Dropout的方式与在任何完全连接的网络中使用的方式相同。它为每个样本删除了一组不同的特征。

    退出作为LSTM参数有很多不同之处。它生成4个不同的辍学掩码,用于为每个不同的门创建不同的输入。(您可以查看LSTMCell代码来检查这一点)。

    此外,还有递归_dropout选项,该选项将生成4个辍学掩码,但将应用于递归计算的每个步骤中的状态而不是输入。

     类似资料:
    • 以下是我在Rust文档中看到的两个函数签名: 为什么<code>mut</code>的位置不同? 似乎第一个函数也可以声明为

    • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

    • 问题内容: 查看下面的示例代码 和 当我问到代码差异时,我并不是在说执行流程,这是显而易见的。 那么这些代码之间的 真正 区别是什么?建议何时 在 通话 前 使用您的代码,何时 在 通话 后 使用您的代码?我想在某些情况下这很重要。 问题答案: 您不应在之前放置任何代码,因为此方法可以使系统执行正确暂停应用程序所需的操作。您要在回调中执行的所有代码都应放在调用之后。希望这可以帮助。 活动报价: 注

    • 问题内容: 和之间有什么区别 例如,当你查看类时,构造函数具有以下签名: 对于方法之一: 问题答案: 第一个说是“是E的祖先的某种类型”。第二个说是“某种类型,它是E的子类”。(在两种情况下,本身都可以。) 因此,构造函数使用该? 形式,以确保在从集合中获取值时,它们将全部为E或某个子类(即,它是兼容的)。该方法试图将值放入集合中,因此集合必须具有 或超类的元素类型。 例如,假设你有一个这样的类层

    • 我正在浏览微软的Rust教程,它是关于 实现函数,以便返回对插入向量中的值的引用 这里给出了解决方案,但它与我的不同之处在于它使用了 除了返回类型之外,我的和标准解决方案之间的另一个区别是,我只是简单地返回了参数,而标准解决方案使用复杂方式)。 我想知道我的解决方案是否有任何问题,本教程采取了另一种方式? 虽然@Masklin为我的问题提供了一个很好的答案,但它有点特定于我给出的示例,但没有直接解

    • 我在玩Keras,我在想线性激活层和无激活层之间的区别是什么?它不是有同样的行为吗?如果是这样,那么线性激活的意义是什么呢? 我指的是这两段代码之间的区别: 和