PyTorch 非确定性辍学

Posted

技术标签:

【中文标题】PyTorch 非确定性辍学【英文标题】:PyTorch non-deterministic dropout 【发布时间】:2020-09-20 23:04:05 【问题描述】:

我正在尝试使 BLSTM 的输出具有确定性,经过调查,似乎我的 dropout 层创建了不确定的 dropout 掩码,因此我正在研究如何修复pytorch 中的随机种子。我找到了this page 和其他建议,尽管我将所有内容都放入了代码中,但没有帮助。这是我的代码:

import sys 
import random 
import datetime as dt 

import numpy as np 
import torch 

torch.manual_seed(42) 
torch.cuda.manual_seed(42) 
np.random.seed(42)
random.seed(42) 
torch.backends.cudnn.deterministic = True  

ex = torch.ones(10) 
torch.nn.functional.dropout(ex, p=0.5, training=True)                  
# Out[29]: tensor([0., 0., 2., 0., 0., 0., 0., 0., 2., 2.])

torch.nn.functional.dropout(ex, p=0.5, training=True)                  
# Out[30]: tensor([0., 2., 0., 2., 2., 0., 0., 2., 2., 2.])

请帮助我从 dropout 中获得相同输入的确定性输出

【问题讨论】:

这能回答你的问题吗? Training PyTorch models on different machines leads to different results 【参考方案1】:

每次您想要相同的输出时,您都需要再次重置随机种子:

>>> import torch

>>> torch.manual_seed(42)
<torch._C.Generator object at 0x127cd9170>

>>> ex = torch.ones(10)

>>> torch.nn.functional.dropout(ex, p=0.5, training=True)
tensor([0., 0., 2., 2., 2., 2., 2., 0., 2., 0.])

>>> torch.manual_seed(42)
<torch._C.Generator object at 0x127cd9170>

>>> torch.nn.functional.dropout(ex, p=0.5, training=True)
tensor([0., 0., 2., 2., 2., 2., 2., 0., 2., 0.])

一般来说,您可能希望继续重置所有这些随机种子,但在 python 中构建神经网络时,您会发现很多不同的随机性

【讨论】:

好收获。我第一次看到这个问题时很困惑。种子确定:随机数的序列在不同的运行之间是相同的。对于相同的种子和运行,每次调用都会得到一个不同的随机数,这是预期的。

以上是关于PyTorch 非确定性辍学的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch - 如何在评估模式下停用辍学

如何在 Pytorch 中实现 dropout,以及在哪里应用它

在 PyTorch 中,是啥让张量具有非连续内存?

是否可以在 transform.compose 中使用非 pytorch 增强

如何在 PyTorch 中高效实现非全连接线性层?

当前向包含多个自动分级节点时,PyTorch 关于使用非完整后向挂钩的警告