【问题标题】:PyTorch LSTM dropout vs Keras LSTM dropoutPyTorch LSTM 辍学与 Keras LSTM 辍学
【发布时间】:2020-09-28 02:57:59
【问题描述】:

我正在尝试将我的顺序 Keras 网络移植到 PyTorch。但我在使用 LSTM 单元时遇到了问题:

LSTM(512,
     stateful = False,
     return_sequences = True,
     dropout = 0.5),
LSTM(512,
     stateful = False,
     return_sequences = True,
     dropout = 0.5),

我应该如何在 PyTorch 中进行表述?特别是 dropout 在 PyTorch 中的工作方式与在 Keras 中的工作方式大不相同。

【问题讨论】:

    标签: python keras pytorch lstm


    【解决方案1】:

    以下内容应该适合您。

    lstm = nn.LSTM(
        input_size = ?, 
        hidden_size = 512, 
        num_layers = 1,
        batch_first = True, 
        dropout = 0.5
    )
    

    您需要设置input_size。查看LSTM 上的文档。


    更新

    在 1 层 LSTM 中,分配 dropout 没有意义,因为 dropout 应用于多层 LSTM 模块中的中间层的输出。因此,如果 num_layers 设置为 1,PyTorch 可能会抱怨 dropout。如果我们想在 LSTM 模块的最后一层输出应用 dropout,我们可以执行以下操作。

    lstm = nn.Sequential(
        nn.LSTM(
            input_size = ?, 
            hidden_size = 512, 
            num_layers = 1,
            batch_first = True
        ),
        nn.Dropout(0.5)
    )
    

    根据上面的定义,LSTM的输出会经过一个Dropout层。

    【讨论】:

    • 如果你在单层 LSTM 上设置 dropout 参数,PyTorch 会报错。
    • 我不确定,但我认为这与 TF 中的工作方式不同。关于 dropout 参数,TF 文档说“用于输入线性变换的单位的分数”。所以这是丢弃的输入。但是 PyTorch 文档说“如果非零,则在除最后一层之外的每个 LSTM 层的输出上引入一个 Dropout 层”,所以这里是丢弃的输出。因此,在我看来,dropout 应用于计算的不同步骤。
    • 你能解决这个问题吗? @BjörnLindqvist
    • 我做不到。
    猜你喜欢
    • 2018-10-01
    • 2020-09-28
    • 2017-11-05
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    相关资源
    最近更新 更多