tensorflow - LSTM 之前或之后的 Dropout 层。有什么区别?

标签 tensorflow keras lstm dropout

假设我们有一个用于时间序列预测的 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 之前添加它,它是在时间步长(时间序列的不同滞后)或不同的输入特征上应用 dropout,还是两者兼而有之?
  • 如果我们在 LSTM 之后添加它并且因为 return_sequencesFalse ,那么 dropout 在这里做什么?
  • dropout 中的 LSTM 选项和 LSTM 层之前的 dropout 层之间有什么不同吗?
  • 最佳答案

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

    如果需要,您可以使用 noise_shape 属性,该属性将定义随机张量的形状。然后您可以选择是否要删除步骤、特征或样本,或者可能是组合。

  • 丢弃时间步长:noise_shape = (1,steps,1)
  • 丢弃特征:noise_shape = (1,1, features)
  • 丢弃样本:noise_shape = (None, 1, 1)

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

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

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

    此外,还有 recurrent_dropout 选项,它将生成 4 个 dropout 掩码,但将应用于状态而不是输入,循环计算的每一步。

    关于tensorflow - LSTM 之前或之后的 Dropout 层。有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58748732/

    相关文章:

    tensorflow - Keras 展平层输入形状

    tensorflow - LSTM 单元的单元数和内存 "distance"之间有关系吗?

    python - 减少 LSTM keras 上的输出维度

    tensorflow - 类型错误 : __init__() got multiple values for argument 'kernel_size'

    python - ValueError : You called `set_weights(weights)` on optimizer RMSprop with a weight list of length 3, 但优化器期望权重为 0

    python - 如何在 Keras 中实现 Salt&Pepper 层?

    python - 如何使用 Keras.to_Categorical 在 dataFrame 中一次对多列进行 One-Hot 编码?

    python - 实现双向 LSTM-CRF 网络

    python - Tensorflow ArgumentError 运行 CIFAR-10 示例

    keras - pytorch 中的 keras.layers.Masking 相当于什么?